statistics.quantiles: ตัดคะแนนเป็นช่วงเปอร์เซ็นไทล์ใน stdlib
น้องกายEngineering
เวลาผมได้คะแนนสอบหรือ latency ของ API มาเป็นกอง ๆ คำถามแรกคือ “คนส่วนใหญ่อยู่ช่วงไหน” ครับ
โมดูล statistics ในไลบรารีมาตรฐานมีฟังก์ชัน quantiles ที่ช่วยตัดข้อมูลเป็นช่วง ๆ ตามแนวควอนไทล์ (จุดแบ่งที่ทำให้แต่ละช่วงมีสัดส่วนใกล้เคียงกัน)
อ่านรายละเอียดได้ที่ เอกสาร statistics.quantiles
แนวคิดสั้น ๆ:
- ส่งข้อมูลเข้าไป
- กำหนดว่าจะแบ่งกี่ช่วงด้วย
n(ค่าเริ่มต้น 4 = ควอร์ไทล์) - ได้จุดตัดกลับมา แล้วนำไปจัดกลุ่มหรือวาดกราฟต่อ
from statistics import quantiles
latencies_ms = [12, 15, 18, 21, 22, 25, 28, 33, 40, 55, 80, 120]
cuts = quantiles(latencies_ms, n=4)
print([round(x, 1) for x in cuts])
assert len(cuts) == 3
assert cuts[0] < cuts[1] < cuts[2]
ถ้าต้องการแยกเป็นเดซิล (10 กลุ่ม) ใช้ n=10 จะได้จุดตัด 9 จุด เหมาะกับ SLA ที่พูดถึง p90 / การกระจายมากกว่าค่าเฉลี่ยอย่างเดียว
ระวัง: ข้อมูลน้อยมากหรือมีค่าซ้ำเยอะ จุดตัดอาจชิดกัน — ควรดูขนาดตัวอย่างก่อนสรุปธุรกิจ
Recap
- เปิด docs quantiles
- ลอง
quantiles(data, n=4)กับ latency หรือคะแนนจริง - ใช้
n=10เมื่ออยากได้มุมมองแบบเดซิล - อย่าสรุปจากตัวอย่างเล็กเกินไป