Python statistics.multimode: รายงานอันดับหนึ่งร่วมโดยไม่ทิ้งคำตอบ
ข้อมูลจริงไม่ได้มีผู้ชนะคนเดียวเสมอ สีสินค้าสองสีอาจขายเท่ากัน หรือ error code หลายตัวอาจเกิดถี่เท่ากัน statistics.multimode คืนค่าที่มีความถี่สูงสุดทุกตัว แทนการเลือกตัวแรกแล้วทำให้รายงานดูเด็ดขาดเกินข้อมูลครับ
WHY: อันดับหนึ่งร่วมต้องอยู่ในรายงาน
เหมือนการแข่งขันที่มีคะแนนเท่ากันสองทีม การยกถ้วยให้ทีมที่อ่านชื่อก่อนเป็น bias จากลำดับข้อมูล ไม่ใช่ข้อสรุปทางสถิติ multimode ทำให้ downstream ต้องตัดสินใจตรง ๆ ว่าจะโชว์ทุกค่า ขอข้อมูลเพิ่ม หรือใช้กฎ tie-break ที่มีเหตุผลทางธุรกิจ
import statistics
import unittest
def leaders(values: list[str]) -> list[str]:
return statistics.multimode(values)
class MultimodeTests(unittest.TestCase):
def test_tie_keeps_first_seen_order(self) -> None:
values = ["amber", "green", "green", "amber", "blue"]
self.assertEqual(leaders(values), ["amber", "green"])
def test_single_mode_and_empty(self) -> None:
self.assertEqual(leaders(["green", "amber", "green"]), ["green"])
self.assertEqual(leaders([]), [])
if __name__ == "__main__":
unittest.main()
HOW: ลำดับผลลัพธ์ตามที่พบครั้งแรก
ผลลัพธ์เรียงตามลำดับที่ค่าแต่ละตัวปรากฏครั้งแรก ถ้ารายงานต้อง deterministic ข้ามแหล่งข้อมูลที่ส่งลำดับต่างกัน ให้ sort ผลลัพธ์ด้วยกฎโดเมนหลังเรียก และอย่า sort ก่อนถ้าลำดับเวลาเป็นข้อมูลสำคัญ กรณี input ว่างจะได้ list ว่าง ไม่ได้ raise จึงต้องออกแบบ empty state เอง
Mode เหมาะกับข้อมูลเชิงหมวดหมู่ แต่ไม่ได้บอกว่าความต่างมีนัยสำคัญ และไม่ควรใช้แทน distribution ทั้งชุด ถ้าอันดับหนึ่งพบ 11 ครั้งและอันดับสอง 10 ครั้ง รายงานเพียง mode ยังซ่อนความสูสี ควรแนบ count หรือสัดส่วนเมื่อผู้อ่านต้องตัดสินใจ
Recap
- ใช้
multimodeเมื่อ tie เป็นผลลัพธ์ที่เป็นไปได้ - แสดงทุกค่าหรือกำหนด tie-break ที่อธิบายได้
- จัดการ empty list อย่างชัดเจน
- sort ผลลัพธ์เมื่อแหล่งข้อมูลไม่มีลำดับคงที่
- แนบความถี่เมื่อ mode อย่างเดียวอาจทำให้เข้าใจผิด