การใช้ Z-score เพื่อตรวจจับความผิดปกติ

การตรวจจับความผิดปกติใน Python

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

Z-score คืออะไร?

  • Z-score บอกว่า:
    • ค่าอยู่ห่างจากค่าเฉลี่ยกี่ STD

ตัวอย่าง:

  • การแจกแจงที่มี $\mu=10$ และ $\sigma=3$:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

สูตรคำนวณ Z-score

การตรวจจับความผิดปกติใน Python

Empirical Rule และค่าผิดปกติ

กฎเชิงประจักษ์ (Empirical Rule):

  • 68% อยู่ภายใน 1 STD
  • 95% อยู่ภายใน 2 STD
  • 99.7% อยู่ภายใน 3 STD

ค่าผิดปกติ (Outliers):

  • อยู่นอกขีดจำกัด 3 STD
  • กระจายสู่หางของการแจกแจง (บริเวณสีชมพูทั้งสองด้าน)

ภาพ Empirical Rule จาก Wikipedia แสดงการแจกแจงปกติพร้อมการระบุช่วง 68%, 95% และ 99.7%

1 ภาพจากหน้า Empirical Rule บน Wikipedia
การตรวจจับความผิดปกติใน Python

Z-score ในโค้ด

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
การตรวจจับความผิดปกติใน Python

Z-score ในโค้ด

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
การตรวจจับความผิดปกติใน Python

Z-score ในโค้ด

outliers = sales[is_over_3]

print(len(outliers))
90
การตรวจจับความผิดปกติใน Python

ข้อจำกัดของ Z-score

  • ให้ผลดีที่สุดกับข้อมูลที่แจกแจงแบบปกติ
  • ค่าเฉลี่ยและ STD ถูกกระทบอย่างมากจากค่าผิดปกติ
  • ประสิทธิภาพลดลงเมื่อมีค่าผิดปกติจำนวนมาก
การตรวจจับความผิดปกติใน Python

Median Absolute Deviation (MAD)

  • วัดการกระจาย (ความแปรปรวน)
  • ทนทานต่อค่าผิดปกติมากกว่า
  • ใช้ค่ามัธยฐาน (median) เป็นหลัก

สูตรคำนวณคะแนน Median Absolute Deviation

การตรวจจับความผิดปกติใน Python

คะแนน MAD

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
การตรวจจับความผิดปกติใน Python

แนะนำ PyOD

  • Modified z-score แบบ MAD ถูกนำไปใช้งานใน PyOD
  • PyOD - ไลบรารี Python สำหรับตรวจจับค่าผิดปกติ:
    • มีอัลกอริทึมมากกว่า 40 แบบ
    • ทุกอัลกอริทึมใช้ syntax แบบเดียวกับ sklearn
การตรวจจับความผิดปกติใน Python

Modified z-score ในโค้ด

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)
การตรวจจับความผิดปกติใน Python

Modified z-score ในโค้ด

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
การตรวจจับความผิดปกติใน Python

มาฝึกกันเถอะ!

การตรวจจับความผิดปกติใน Python

Preparing Video For Download...