TL;DR
Outlier adalah nilai data yang jauh menyimpang dari sebagian besar nilai lain di kumpulan yang sama. Dua cara deteksi paling umum: metode IQR (nilai di luar Q1 - 1.5×IQR sampai Q3 + 1.5×IQR) dan z-score (nilai dengan skor absolut di atas 3). Outlier boleh dibuang cuma kalau kamu bisa buktikan itu error: salah input, alat rusak, atau duplikasi. Outlier yang nyata (pembeli grosir, transaksi Harbolnas) jangan dihapus, karena justru di situ sering ada insight paling berharga.
Outlier adalah nilai data yang jauh menyimpang dari sebagian besar nilai lain di kumpulan data yang sama.
Contoh gampangnya: 999 transaksi di toko kamu nilainya antara Rp 20 ribu sampai Rp 500 ribu. Terus ada satu transaksi Rp 45 juta. Itu outlier.
Pertanyaan yang lebih penting bukan "gimana cara deteksinya". Itu gampang. Yang bikin orang salah langkah: apakah outlier itu boleh dibuang?
Outlier bikin masalah karena dia narik rata-rata. Sembilan orang punya gaji Rp 8 juta, satu orang Rp 200 juta. Rata-ratanya Rp 27,2 juta. Angka yang nggak menggambarkan siapa pun di ruangan itu.
Ini kenapa median sering lebih jujur dari mean kalau ada outlier. Median dari data tadi: Rp 8 juta. Jauh lebih masuk akal.
Outlier juga bikin model prediksi meleset, bikin grafik gepeng (satu batang tinggi, sisanya kelihatan rata), dan bikin standar deviasi meledak.
IQR (Interquartile Range) adalah jarak antara kuartil 1 dan kuartil 3, alias rentang di mana 50% data tengah berada.
Rumusnya:
IQR = Q3 - Q1
Batas bawah = Q1 - (1.5 × IQR)
Batas atas = Q3 + (1.5 × IQR)
Nilai di luar dua batas itu = outlier
Angka 1.5 itu konvensi, bukan hukum alam. Kalau kamu mau lebih ketat, pakai 3. Itu nangkep outlier yang benar-benar ekstrem doang.
Di SQL, deteksinya gini:
WITH nilai AS (
SELECT
transaksi_id,
kota,
qty * harga_satuan AS total
FROM transaksi
WHERE status = 'selesai'
),
kuartil AS (
SELECT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY total) AS q1,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY total) AS q3
FROM nilai
)
SELECT
n.transaksi_id,
n.kota,
n.total,
k.q3 - k.q1 AS iqr
FROM nilai n
CROSS JOIN kuartil k
WHERE n.total > k.q3 + 1.5 * (k.q3 - k.q1)
OR n.total < k.q1 - 1.5 * (k.q3 - k.q1)
ORDER BY n.total DESC;
Di Excel atau Google Sheets, tinggal pakai QUARTILE:
Q1 =QUARTILE(A2:A1000; 1)
Q3 =QUARTILE(A2:A1000; 3)
IQR =Q3 - Q1
Batas atas =Q3 + 1.5 * IQR
Flag outlier:
=IF(OR(A2 > $E$4; A2 < $E$5); "OUTLIER"; "")
Z-score ngukur berapa standar deviasi sebuah nilai jauhnya dari rata-rata.
z = (nilai - rata_rata) / standar_deviasi
z absolut > 3 → outlier
Ambang 3 dipakai karena di distribusi normal, cuma sekitar 0,3% data yang jatuh di luar 3 standar deviasi. Penjelasan sebarannya ada di NIST Engineering Statistics Handbook.
Tapi ada jebakan: rata-rata dan standar deviasi sendiri bisa ditarik sama outlier. Satu nilai ekstrem bisa bikin standar deviasi membengkak, dan tiba-tiba outlier itu jadi punya z-score cuma 2,4. Lolos dari deteksi.
Aturan praktisnya:
| Kondisi data | Pakai |
|---|---|
| Distribusi miring (nilai transaksi, pendapatan) | IQR |
| Distribusi mendekati normal (tinggi badan, skor tes) | Z-score |
| Ada outlier ekstrem yang udah keliatan | IQR |
| Data bisnis Indonesia (umumnya miring ke kanan) | IQR |
Cuma kalau kamu bisa buktikan itu error. Tiga kategori yang jelas boleh:
Yang nggak boleh dibuang: outlier yang nyata.
Transaksi Rp 45 juta itu bisa jadi reseller yang belanja grosir. Kalau kamu hapus, kamu baru aja ngebuang pelanggan paling berharga dari analisis kamu.
Aturan yang aku pakai: investigasi dulu, baru putuskan. Buka barisnya, lihat siapa pelanggannya, cek tanggalnya. Kalau setelah dilihat masih masuk akal sebagai kejadian nyata, biarin.
Waktu jalanin deteksi IQR di dataset toko_berkah (24.500 transaksi), hasilnya: Q1 = Rp 28.500, Q3 = Rp 96.000, jadi IQR = Rp 67.500.
Batas atasnya: Rp 96.000 + (1.5 × 67.500) = Rp 197.250.
Yang lewat batas itu: 1.183 transaksi, alias 4,8% dari total. Kedengeran banyak, tapi wajar buat data yang miring ke kanan.
Yang menarik ada di ujung ekstrem. Ada 3 transaksi di atas Rp 40 juta. Waktu aku buka barisnya, ketahuan semua dari pelanggan yang sama, semua di bulan yang sama, semua produknya beras dan minyak dalam qty ratusan.
Itu bukan error. Itu warung yang kulakan.
Kalau 3 baris itu aku hapus sebagai "outlier", aku bakal kehilangan satu-satunya sinyal bahwa toko_berkah punya segmen B2B yang belum pernah digarap.
Outlier itu pertanyaan, bukan sampah.
Tiga pilihan yang lebih aman.
Winsorize. Ganti nilai ekstrem dengan batas persentil. Semua yang di atas persentil 99 diganti jadi nilai persentil 99. Datanya tetap ada, tapi pengaruhnya ke rata-rata dijinakkan.
Transformasi log. Ubah nilai jadi log. Ini bikin selisih antara Rp 100 ribu dan Rp 45 juta jadi lebih rapat. Sering dipakai buat data pendapatan dan harga rumah.
Laporkan dua versi. Kasih hasil dengan dan tanpa outlier, tulis selisihnya. Ini paling jujur, dan paling gampang dipertanggungjawabkan waktu ditanya bos.
Hapus outlier sebelum dilihat. Ini kesalahan nomor satu. Deteksi dulu, buka barisnya, baru putuskan.
Pakai z-score di data yang miring. Data nilai transaksi hampir selalu miring ke kanan. Z-score bakal ngasih hasil yang nggak konsisten di sini.
Buang outlier tanpa nyatat. Kalau kamu hapus 40 baris, tulis di dokumentasi: berapa baris, kriterianya apa, alasannya apa. Tanpa catatan itu, hasil analisis kamu nggak bisa direproduksi.
Anggap semua outlier itu gangguan. Di deteksi fraud, outlier justru yang kamu cari.
Outlier adalah nilai data yang jauh menyimpang dari sebagian besar nilai lain di kumpulan data yang sama. Kalau 999 transaksi nilainya Rp 20 ribu sampai Rp 500 ribu, lalu ada satu transaksi Rp 45 juta, itu outlier. Penyebabnya bisa error input, alat rusak, atau kejadian nyata yang luar biasa.
Cuma kalau kamu bisa buktikan itu error: umur 250 tahun, harga minus, atau baris duplikat. Outlier yang nyata (pembeli grosir, lonjakan Harbolnas, gaji CEO di data karyawan) jangan dihapus. Kalau kamu hapus, kamu bukan lagi menganalisis realitas.
IQR pakai kuartil, jadi tahan terhadap outlier itu sendiri dan cocok buat data yang miring, kayak nilai transaksi. Z-score pakai rata-rata dan standar deviasi, yang bisa ditarik oleh outlier ekstrem, jadi cuma pas buat data mendekati normal. Buat data bisnis Indonesia, IQR lebih aman.
Nggak. Di deteksi fraud, outlier justru yang kamu cari. Di analisis pelanggan, outlier belanja sering ternyata reseller yang bisa kamu jadikan mitra. Outlier itu pertanyaan, bukan sampah.
Winsorize (ganti nilai ekstrem dengan batas persentil), transformasi log (bikin skala lebih rapat), atau laporkan dua versi hasil (dengan dan tanpa outlier) biar pembaca lihat pengaruhnya.
IQR buat data miring, z-score buat data normal. Deteksi bukan berarti hapus. Buka barisnya dulu, lihat siapa dan kapan. Outlier yang nyata sering jadi insight paling mahal di dataset kamu.
Ambil satu kolom angka di data kamu, hitung IQR-nya hari ini, terus buka 5 baris teratas yang lewat batas. Lihat ceritanya apa.
Kalau kamu mau lanjut ke pembersihan data secara menyeluruh, baca checklist data cleaning. Buat konsep dasarnya, cek glossary outlier dan fungsi MEDIAN.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Cara pakai pandas rolling buat hitung moving average dan haluskan data time series yang naik-turun. Lengkap dengan contoh penjualan harian UMKM.
Data transaksi harian sering terlalu ramai buat dilihat. Pandas resample ngeringkasnya jadi total per minggu atau per bulan cuma dengan satu baris, asal indeksnya tanggal.
Kolom tanggal yang kebaca sebagai teks bikin sortir dan hitung selisih hari jadi kacau. Ini cara pd.to_datetime ubah teks jadi tanggal asli, plus tangani format berantakan.