Outlier — Z-Score
outlier_zscore · outlier · number, text
2026-09-23
กำลังประมวลผล…
outlier_zscore · outlier · number, text
2026-09-23
Z-Score บอกว่าค่าหนึ่งอยู่ห่างจากค่าเฉลี่ยกี่เท่าของส่วนเบี่ยงเบนมาตรฐาน เป็นวิธีที่คุ้นเคยที่สุดในงานสถิติ แต่มีจุดอ่อนสำคัญคือค่าสุดโต่งเองจะดึงค่าเฉลี่ยและส่วนเบี่ยงเบนขึ้นไปด้วย จนบางครั้งจับตัวเองไม่ได้
outlier_iqr หรือ outlier_mad แทนthreshold เท่าของส่วนเบี่ยงเบนaction เริ่มต้นคือ flag เช่นเดียวกับเทคนิคหาค่าผิดปกติทุกตัว| Parameter | Type | Default |
|---|---|---|
column | string | — |
action | flag | remove | clamp | null | "flag" |
newColumnName | string | — |
threshold | number | 3 |
import json
import math
def outlier_zscore(values, threshold=3.0):
numbers = [v for v in values if isinstance(v, (int, float)) and not isinstance(v, bool)]
mean = sum(numbers) / len(numbers)
variance = sum((v - mean) ** 2 for v in numbers) / len(numbers)
deviation = math.sqrt(variance)
if deviation == 0:
return {'bounds': None, 'flags': [None for _ in values]}
lower, upper = mean - threshold * deviation, mean + threshold * deviation
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]
result = {
'threshold_3': outlier_zscore(values, 3.0),
'threshold_2': outlier_zscore(values, 2.0),
}
print(json.dumps(result, ensure_ascii=False))
สังเกตผลของโค้ดด้านบน ค่า 100 ที่เห็นชัดว่าผิดปกติ ไม่ถูกจับ ที่เกณฑ์ 3 เพราะมันดึงค่าเฉลี่ยและส่วนเบี่ยงเบนขึ้นไปเอง แต่ถูกจับที่เกณฑ์ 2 นี่คือเหตุผลที่หน้า Outlier Review ให้เปลี่ยนวิธีและเกณฑ์แล้วดูผลทันที เมื่อเจอกรณีแบบนี้ ให้เปลี่ยนไปใช้ outlier_mad ซึ่งทนต่อค่าสุดโต่งมากกว่า
ใช้ outlier_mad เมื่อค่าสุดโต่งกลบตัวเอง ใช้ outlier_iqr เป็นค่าเริ่มต้นทั่วไป และใช้ clamp_value เมื่อรู้ช่วงที่ถูกต้องตามกฎธุรกิจอยู่แล้ว