Kolom numerik menyimpan masalah yang berbeda dari teks. Nilainya selalu bisa dibandingkan, tetapi justru karena itu satu angka janggal mudah lolos tanpa terlihat: transaksi jutaan rupiah akibat salah ketik atau jumlah barang minus. Nilai ekstrem semacam ini disebut outlier. Pada chapter ini kita belajar mendeteksi outlier dengan statistik deskriptif dan metode IQR; keputusan tentang apa yang dilakukan terhadap outlier justru disimpan untuk chapter berikutnya.

Membaca Sinyal Outlier dari describe #

Langkah deteksi pertama tidak butuh rumus: cukup membaca .describe(). Dua angka patut dicermati, yaitu mean (rata-rata) dan 50% (median). Ketika mean jauh lebih besar dari median dan nilai max terpaut jauh dari 75%, kolom tersebut kemungkinan memuat nilai ekstrem. Skrip berikut mendemonstrasikan deteksi lengkap pada kolom belanja sepuluh pelanggan.

python
import pandas as pd

belanja = pd.Series(
    [250000, 310000, 275000, 480000, 290000, 265000, 2750000, 300000, 255000, 285000],
    name="belanja",
)

print("Statistik deskriptif kolom belanja:")
print(belanja.describe().to_string(float_format="%.0f"))
print()

q1 = belanja.quantile(0.25)
q3 = belanja.quantile(0.75)
iqr = q3 - q1
batas_bawah = q1 - 1.5 * iqr
batas_atas = q3 + 1.5 * iqr

print("Q1 =", q1, "| Q3 =", q3, "| IQR =", iqr)
print("Batas bawah =", batas_bawah, "| Batas atas =", batas_atas)
print()

mask_outlier = (belanja < batas_bawah) | (belanja > batas_atas)
print("Baris dengan nilai di luar batas:")
print(belanja[mask_outlier])

Output yang Dihasilkan:

text
Statistik deskriptif kolom belanja:
count        10
mean     546000
std      777213
min      250000
25%      267500
50%      287500
75%      307500
max     2750000

Q1 = 267500.0 | Q3 = 307500.0 | IQR = 40000.0
Batas bawah = 207500.0 | Batas atas = 367500.0

Baris dengan nilai di luar batas:
3     480000
6    2750000
Name: belanja, dtype: int64

Bagian pertama output menunjukkan sinyalnya dengan jelas: mean 546000 hampir dua kali lipat median 287500, dan max 2750000 melompat jauh dari 75% yang hanya 307500. Artinya sebagian besar nilai mengelompok di kisaran 250000-480000, sementara satu nilai menarik rata-rata ke atas. Panduan .describe() ada di pandas.DataFrame.describe ; versi Series yang dipakai skrip berperilaku sama.

Menghitung Batas dengan Metode IQR #

Metode paling umum untuk menandai outlier adalah aturan IQR (interquartile range). Rumusnya terdiri atas tiga baris: IQR = Q3 − Q1, batas bawah = Q1 − 1.5 × IQR, dan batas atas = Q3 + 1.5 × IQR. Nilai yang berada di luar kedua batas itu dianggap ekstrem.

Mari kita telaah kode pada skrip di atas:

  1. Baris 12-13 (q1 = belanja.quantile(0.25) dan q3 = belanja.quantile(0.75)): method .quantile() menghitung kuartil pertama dan ketiga; dokumentasinya ada di pandas.Series.quantile .
  2. Baris 14-16 (iqr = q3 - q1 dan dua baris batas): IQR dihitung sebagai rentang kuartil, lalu kedua batas diperoleh dengan menggeser Q1 dan Q3 sejauh 1.5 kali IQR.
  3. Baris 18-19 (print("Q1 =", q1, ...)): output menampilkan Q1 267500.0, Q3 307500.0, IQR 40000.0, batas bawah 207500.0, dan batas atas 367500.0.
  4. Baris 22 (mask_outlier = (belanja < batas_bawah) | (belanja > batas_atas)): mask boolean dibentuk dari dua perbandingan yang digabung operator |; tanda kurung di sekitar tiap perbandingan wajib agar pandas tidak salah membaca urutan operasi.
  5. Baris 24 (print(belanja[mask_outlier])): mask dipakai menyaring Series sehingga hanya baris bernilai ekstrem yang tampil.

Menafsirkan Hasil Deteksi #

Mask outlier menandai dua nilai, tetapi keduanya tidak bisa diperlakukan sama. Nilai 480000 hanya sedikit di atas batas atas dan masih masuk akal untuk pelanggan belanja besar; nilai 2750000 melebihi batas hampir delapan kali lipat dan patut dicurigai sebagai kesalahan ketik. Deteksi hanya menghasilkan daftar kandidat; keputusan mempertahankan, memeriksa ulang sumber, atau mengoreksi nilai adalah keputusan domain bisnis yang diambil setelah melihat konteks.

Kasus 2750000 menyerupai kesalahan ketik skala, sedangkan pada chapter ini kita belum menyentuhnya. Kapan sebuah nilai boleh dikoreksi dan bagaimana caranya adalah topik chapter berikutnya, Menangani Nilai Tidak Valid.