Outlier — Modified Z-Score (MAD)
outlier_mad · outlier · number, text
2026-09-23
กำลังประมวลผล…
outlier_mad · outlier · number, text
2026-09-23
Modified Z-Score แทนค่าเฉลี่ยด้วยมัธยฐาน และแทนส่วนเบี่ยงเบนมาตรฐานด้วย MAD ซึ่งคือมัธยฐานของระยะห่างจากมัธยฐาน ผลคือค่าสุดโต่งไม่กระทบเกณฑ์ที่ใช้ตัดสินตัวมันเอง วิธีนี้จับค่าผิดปกติได้ในกรณีที่ Z-Score พลาด
threshold คูณ MAD หารด้วยค่าคงที่ 0.6745 ซึ่งทำให้เทียบกับ Z-Score ปกติได้| Parameter | Type | Default |
|---|---|---|
column | string | — |
action | flag | remove | clamp | null | "flag" |
newColumnName | string | — |
threshold | number | 3.5 |
import json
MAD_SCALE = 0.6745
def median(values):
ordered = sorted(values)
middle = len(ordered) // 2
if len(ordered) % 2:
return ordered[middle]
return (ordered[middle - 1] + ordered[middle]) / 2
def outlier_mad(values, threshold=3.5):
numbers = [v for v in values if isinstance(v, (int, float)) and not isinstance(v, bool)]
center = median(numbers)
mad = median([abs(v - center) for v in numbers])
if mad == 0:
return {'bounds': None, 'flags': [None for _ in values]}
spread = threshold * mad / MAD_SCALE
lower, upper = center - spread, center + spread
flags = [None if not isinstance(v, (int, float)) or isinstance(v, bool) else (v < lower or v > upper) for v in values]
return {'bounds': [round(lower, 3), round(upper, 3)], 'flags': flags}
values = [10, 10, 11, 11, 12, 12, 13, 13, 100]
print(json.dumps(outlier_mad(values), ensure_ascii=False))
ใช้ข้อมูลชุดเดียวกับหน้า Z-Score ค่า 100 ถูกจับได้ตั้งแต่เกณฑ์เริ่มต้น 3.5 เพราะมัธยฐานและ MAD ไม่ถูกมันดึงไป เมื่อพบค่าที่หลุดช่วง ให้ตรวจก่อนว่าเป็นการพิมพ์ผิด หน่วยผิด หรือเป็นเหตุการณ์จริงที่สำคัญ อย่าเพิ่งลบทิ้งเพียงเพราะตัวเลขบอกว่าผิดปกติ
ใช้ outlier_iqr เป็นตัวเปรียบเทียบ ใช้ outlier_zscore เมื่อต้องรายงานด้วยเกณฑ์มาตรฐาน และใช้ bucket_values เมื่อจะจัดกลุ่มค่าหลังตรวจสอบเสร็จ