Dùng z-score để phát hiện bất thường

Phát hiện bất thường với Python

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

Z-score là gì?

  • Z-score cho biết:
    • số độ lệch chuẩn (STD) so với mean

Ví dụ:

  • Với phân phối có $\mu=10$ và $\sigma=3$:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

Công thức tính z-score.

Phát hiện bất thường với Python

Quy tắc kinh nghiệm và ngoại lệ

Quy tắc kinh nghiệm:

  • 68% nằm trong 1 STD
  • 95% nằm trong 2 STD
  • 99,7% nằm trong 3 STD

Ngoại lệ:

  • nằm ngoài ngưỡng 3 STD
  • ở phần đuôi (vùng hồng hai bên)

Hình Quy tắc Kinh nghiệm từ Wikipedia minh họa phân phối chuẩn với phần 68%, 95% và 99,7% được chú thích.

1 Hình từ trang Quy tắc Kinh nghiệm trên Wikipedia
Phát hiện bất thường với Python

Z-score trong mã

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
Phát hiện bất thường với Python

Z-score trong mã

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Phát hiện bất thường với Python

Z-score trong mã

outliers = sales[is_over_3]

print(len(outliers))
90
Phát hiện bất thường với Python

Hạn chế của z-score

  • Tốt nhất với dữ liệu phân phối chuẩn
  • Mean và STD bị ảnh hưởng mạnh bởi ngoại lệ
  • Quá nhiều ngoại lệ làm giảm hiệu quả
Phát hiện bất thường với Python

Median Absolute Deviation (MAD)

  • Đo độ phân tán (biến thiên)
  • Chống chịu ngoại lệ tốt hơn
  • Dựa trên median

Công thức tính điểm Độ lệch tuyệt đối theo median (MAD).

Phát hiện bất thường với Python

Điểm MAD

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Phát hiện bất thường với Python

Giới thiệu PyOD

  • Z-score sửa đổi với MAD có trong PyOD
  • PyOD - thư viện Python Outlier Detection:
    • hơn 40 thuật toán
    • cú pháp giống sklearn cho mọi thuật toán
Phát hiện bất thường với Python

Z-score sửa đổi trong mã

from pyod.models.mad import MAD

# threshold mặc định là 3.5
mad = MAD(threshold=3.5)


# Reshape sales sales_reshaped = sales.values.reshape(-1, 1)
Phát hiện bất thường với Python

Z-score sửa đổi trong mã

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Phát hiện bất thường với Python

Ayo berlatih!

Phát hiện bất thường với Python

Preparing Video For Download...