แท่งข้อมูลเรียงสูงขึ้นมีเส้นประสีอำพันสามเส้นแบ่งช่วงควอนไทล์

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 เมื่ออยากได้มุมมองแบบเดซิล
  • อย่าสรุปจากตัวอย่างเล็กเกินไป