Menggunakan z-score untuk Deteksi Anomali

Deteksi Anomali dengan Python

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

Apa itu z-score?

  • Z-score menyatakan:
    • jumlah STD dari mean

Contoh:

  • Dalam distribusi dengan $\mu=10$ dan $\sigma=3$:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

Rumus untuk menghitung z-score.

Deteksi Anomali dengan Python

Empirical Rule dan outlier

Empirical Rule:

  • 68% berada dalam satu STD
  • 95% berada dalam dua STD
  • 99,7% berada dalam tiga STD

Outlier:

  • di luar batas tiga STD
  • berada di ekor (area merah muda di sisi)

Gambar Empirical Rule dari Wikipedia yang menunjukkan distribusi normal dengan bagian 68%, 95%, dan 99,7% diberi anotasi dengan penopang.

1 Gambar dari halaman Empirical Rule di Wikipedia
Deteksi Anomali dengan Python

Z-score dalam kode

from scipy.stats import zscore


scores = zscore(sales) scores[:5]
0    0.910601
1   -1.018440
2   -0.049238
3    0.849103
4   -0.695373
Deteksi Anomali dengan Python

Z-score dalam kode

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Deteksi Anomali dengan Python

Z-score dalam kode

outliers = sales[is_over_3]

print(len(outliers))
90
Deteksi Anomali dengan Python

Kelemahan z-score

  • Paling efektif untuk data berdistribusi normal
  • Mean dan STD sangat dipengaruhi outlier
  • Kinerja menurun jika outlier terlalu banyak
Deteksi Anomali dengan Python

Median Absolute Deviation (MAD)

  • Mengukur dispersi (variabilitas)
  • Lebih tangguh terhadap outlier
  • Berbasis median

Rumus untuk menghitung skor Median Absolute Deviation.

Deteksi Anomali dengan Python

Skor MAD

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Deteksi Anomali dengan Python

Pengenalan PyOD

  • Z-score termodifikasi dengan MAD tersedia di PyOD
  • PyOD - pustaka Python untuk Deteksi Outlier:
    • menawarkan lebih dari 40 algoritme
    • seluruh algoritme bersintaks mirip sklearn
Deteksi Anomali dengan Python

Z-score termodifikasi dalam kode

from pyod.models.mad import MAD

# threshold defaults to 3.5
mad = MAD(threshold=3.5)


# Reshape sales sales_reshaped = sales.values.reshape(-1, 1)
Deteksi Anomali dengan Python

Z-score termodifikasi dalam kode

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Deteksi Anomali dengan Python

Ayo berlatih!

Deteksi Anomali dengan Python

Preparing Video For Download...