← ทำไมตาถึงอ่านกราฟนี้ได้เร็วกว่า
LEVEL 1 · พื้นฐานที่ใช้ทุกวัน
ลำดับความแม่น — การทดลองที่วัดกับคนจริง
บทที่แล้วจบลงด้วยคำถามค้าง เรขาคณิตบอกได้ว่าช่องทางไหนบีบความต่าง ช่องทางไหนขยาย แต่มันตอบไม่ได้ว่า คนจริงถอดค่าออกมาผิดพลาดเท่าไหร่
บทนี้คือบทที่คำถามนั้นได้คำตอบ และคำตอบไม่ได้มาจากการนั่งคิด แต่มาจากการจับคนมาวัด
5.1 จุดที่เรขาคณิตมองไม่เห็น
ลองใช้เรขาคณิตล้วน ๆ ตัดสินดูก่อนว่าช่องทางไหนดีกว่ากัน สคริปต์นี้ (channels.py) เอาชุดข้อมูลเดิมมาไล่ทุกช่องทาง แล้วบอกว่าความต่างที่แคบที่สุดในชุดจะได้ส่วนแบ่งเท่าไหร่
"""ตรวจชุดข้อมูลของคุณเองกับทุกช่องทาง — วัดเฉพาะเรขาคณิต ไม่ได้วัดสายตาคน"""
DATA = [("ก", 22), ("ข", 18), ("ค", 25), ("ง", 16), ("จ", 19)]
K = 0.05 # เกณฑ์: ความต่างต้องกินอย่างน้อยกี่ส่วนของช่วง ถึงจะหวังให้ตาแยกออก
def share_of_range(gap, vals, channel):
"""ความต่าง gap หน่วย ได้ส่วนแบ่งเท่าไหร่ของช่วงที่ช่องทางนั้นมีให้ใช้"""
hi, total = max(vals), sum(vals)
if channel in ("ตำแหน่งบนแกนร่วม", "ความยาว"):
return gap / hi # ทั้งคู่ยืดตามค่าเชิงเส้นเหมือนกัน
if channel == "มุม":
return gap / total # วงกลมต้องหารด้วยผลรวม ไม่ใช่ค่าสูงสุด
if channel == "พื้นที่":
lo = hi - gap
return (hi ** 0.5 - lo ** 0.5) / hi ** 0.5 # ตาอ่านพื้นที่ จึงคิดที่รากที่สอง
raise ValueError(channel)
vals = [v for _, v in DATA]
ranked = sorted(DATA, key=lambda kv: -kv[1])
gaps = [(ranked[i][0], ranked[i + 1][0], ranked[i][1] - ranked[i + 1][1])
for i in range(len(ranked) - 1)]
print("ช่องว่างระหว่างอันดับที่ติดกัน")
for a, b, g in gaps:
print(f" {a} - {b} = {g}")
gap = min(g for _, _, g in gaps)
print(f"\nช่องว่างที่แคบที่สุด = {gap} หน่วย")
print("ถ้าช่องทางไหนทำช่องว่างนี้ให้เห็นไม่ได้ กราฟนั้นก็บอกลำดับไม่ครบ\n")
print(f"{'ช่องทาง':<20}{'ส่วนแบ่งของช่วง':>18} {'ผล (เกณฑ์ ' + str(int(K * 100)) + '%)'}")
for ch in ("ตำแหน่งบนแกนร่วม", "ความยาว", "มุม", "พื้นที่"):
share = share_of_range(gap, vals, ch)
print(f"{ch:<20}{share * 100:>15.2f}% {'ผ่าน' if share >= K else 'ไม่ผ่าน'}")
print("\nสองข้อที่ตารางนี้บอกไม่ได้:")
print("1. ตำแหน่งกับความยาวได้เท่ากันเป๊ะ เพราะเรขาคณิตแยกสองอย่างนี้ไม่ออก")
print(" ที่แยกออกคือการวัดกับคนจริง ซึ่งเป็นคนละเครื่องมือ")
print("2. เกณฑ์ K ไม่ใช่ค่าคงที่ของธรรมชาติ มันขึ้นกับงานและขนาดของภาพ")ผลรันจริง
ช่องว่างระหว่างอันดับที่ติดกัน
ค - ก = 3
ก - จ = 3
จ - ข = 1
ข - ง = 2
ช่องว่างที่แคบที่สุด = 1 หน่วย
ถ้าช่องทางไหนทำช่องว่างนี้ให้เห็นไม่ได้ กราฟนั้นก็บอกลำดับไม่ครบ
ช่องทาง ส่วนแบ่งของช่วง ผล (เกณฑ์ 5%)
ตำแหน่งบนแกนร่วม 4.00% ไม่ผ่าน
ความยาว 4.00% ไม่ผ่าน
มุม 1.00% ไม่ผ่าน
พื้นที่ 2.02% ไม่ผ่าน
สองข้อที่ตารางนี้บอกไม่ได้:
1. ตำแหน่งกับความยาวได้เท่ากันเป๊ะ เพราะเรขาคณิตแยกสองอย่างนี้ไม่ออก
ที่แยกออกคือการวัดกับคนจริง ซึ่งเป็นคนละเครื่องมือ
2. เกณฑ์ K ไม่ใช่ค่าคงที่ของธรรมชาติ มันขึ้นกับงานและขนาดของภาพผลรันนี้มีของแถมสองอย่างที่ไม่ได้ตั้งใจให้เป็นบทเรียน แต่มันเป็นบทเรียนที่ดีกว่าที่ตั้งใจไว้
อย่างแรก ตำแหน่งบนแกนร่วมกับความยาวได้ 4.00% เท่ากันเป๊ะ เพราะทั้งคู่ยืดตามค่าแบบเชิงเส้นเหมือนกัน เรขาคณิตจึงไม่มีทางบอกได้ว่าอันไหนดีกว่า ทั้งที่ในชีวิตจริงมันไม่เท่ากัน
อย่างที่สอง ชุดข้อมูลนี้ ไม่ผ่านสักช่องทางเดียว เพราะช่องว่างที่แคบที่สุดคือ 1 หน่วย ซึ่งเล็กเกินไปสำหรับทุกช่องทาง เราจะกลับมาที่ข้อนี้ในหัวข้อ 5.4
5.2 การทดลองปี 1984
ปี 1984 William Cleveland กับ Robert McGill ตีพิมพ์งานที่กลายเป็นจุดอ้างอิงของสายนี้ วิธีของเขาเรียบง่ายมาก
ให้ผู้เข้าร่วมดูกราฟหนึ่งภาพ ชี้ไปที่สององค์ประกอบในภาพนั้น แล้วถามคำถามเดียว — ชิ้นที่เล็กกว่าเป็นกี่เปอร์เซ็นต์ของชิ้นที่ใหญ่กว่า จากนั้นเก็บคำตอบไปเทียบกับค่าจริง
พอทำซ้ำกับกราฟหลายชนิดที่เข้ารหัสด้วยช่องทางต่างกัน ก็ได้สิ่งที่เรขาคณิตให้ไม่ได้ คือ ความคลาดเคลื่อนเฉลี่ยของมนุษย์ต่อช่องทาง แล้วเอามาเรียงลำดับได้
💡 ทำไมเล่มนี้ไม่พิมพ์ตัวเลขความคลาดเคลื่อนของงานนั้น — เพราะเราไม่ได้วัดเอง และการทดลองกับคนก็ไม่ใช่สิ่งที่รันซ้ำได้บนโน้ตบุ๊ก เล่มนี้จึงหยิบมาแค่ อันดับ ซึ่งเป็นข้อค้นพบที่ยืนยันซ้ำแล้วในงานรุ่นหลัง · กติกาของเล่มนี้คือ ตัวเลขที่คำนวณเองได้ ต้องมาจากสคริปต์ที่คุณรันตรวจได้ทุกตัว ส่วนค่าที่มาจากงานวิจัยจะบอกที่มาไว้เสมอ — และในเล่มนี้มีอยู่สองที่เท่านั้นคือบทนี้กับเรื่องความไวของสายตาในบทที่ 2 และ 8
5.3 บันไดเจ็ดขั้น
สองขั้นบนสุดชนะเพราะเหตุผลเดียวกัน คือมี เส้นอ้างอิงร่วม ให้ตาใช้ พอทุกจุดวางอยู่บนแกนเดียวกัน การเทียบก็กลายเป็นการดูว่าอันไหนอยู่สูงกว่า ซึ่งเป็นงานที่ระบบสายตาทำได้แม่นมาก
มุมแพ้เพราะสองอย่างพร้อมกัน — ไม่มีเส้นอ้างอิงให้เทียบ และตาคนไวกับมุมที่ใกล้แนวตั้งหรือแนวนอนมากกว่ามุมเฉียง ความแม่นจึงไม่สม่ำเสมอแม้แต่ภายในวงกลมเดียวกัน ชิ้นที่วางอยู่ตรงหกนาฬิกากับชิ้นที่วางเฉียง ๆ ถูกอ่านด้วยความแม่นไม่เท่ากัน ทั้งที่มุมเท่ากัน
พื้นที่กับสีอยู่ท้ายบันไดไม่ได้แปลว่าห้ามใช้ มันแปลว่า อย่าเอาไปแบกตัวเลขที่คนต้องอ่านให้ตรง ใช้บอกกลุ่ม บอกคร่าว ๆ บอกว่า "อันนี้เยอะกว่ามาก" ได้สบาย
5.4 เมื่อคำตอบคืออย่าทำกราฟ
กลับไปที่ผลรันในหัวข้อ 5.1 ชุดข้อมูลของเราไม่ผ่านสักช่องทาง เพราะมีคู่ที่ต่างกันแค่ 1 หน่วย
สิ่งที่คนส่วนใหญ่ทำตอนเจอแบบนี้คือไล่เปลี่ยนชนิดกราฟไปเรื่อย ๆ หวังว่าจะเจออันที่ "เห็นชัดกว่า" แต่บันไดบอกเราแล้วว่าเพดานอยู่ตรงไหน — ถ้าช่องทางที่แม่นที่สุดยังทำไม่ได้ ก็ไม่มีช่องทางไหนทำได้
ทางออกจริงมีสามทาง และไม่มีทางไหนเป็นการเปลี่ยนชนิดกราฟ
| ทางออก | ทำยังไง | เหมาะเมื่อ |
|---|---|---|
| พิมพ์ตัวเลขไปเลย | ใส่ค่าที่แท่ง หรือทำเป็นตาราง | ความต่าง 1 หน่วยนั้นสำคัญจริง |
| เปลี่ยนสิ่งที่วัด | แสดงส่วนต่างจากค่าเป้าหมาย แทนค่าดิบ | สิ่งที่คนอ่านสนใจคือส่วนต่าง ไม่ใช่ระดับ |
| ยอมรับว่ามันเท่ากัน | จัดกลุ่มเป็น "พอ ๆ กัน" แล้วเน้นที่ต่างจริง | ความต่าง 1 หน่วยไม่มีความหมายในทางปฏิบัติ |
ทางที่สองคือทางที่คนมองข้ามบ่อยที่สุด ถ้าค่าจริงคือ 100 กับ 102 แต่เป้าหมายคือ 100 ทั้งคู่ การพล็อต "ส่วนต่างจากเป้า" จะได้ 0 กับ 2 ซึ่งช่องว่างกลายเป็น 100% ของช่วงทันที ข้อมูลชุดเดิม คำถามใหม่ ช่องว่างใหม่
5.5 บันไดนี้ไม่ใช่คำสั่ง
ก่อนจบบท มีข้อจำกัดที่ต้องพูดให้ชัด บันไดนี้วัดงานอย่างเดียว คือการอ่านค่าให้ตรง
ถ้าเป้าหมายของภาพเปลี่ยนไป ลำดับก็อาจเปลี่ยนตาม — จะหาค่าผิดปกติในข้อมูลหมื่นแถว สีบน heatmap ชนะขาดทั้งที่อยู่ขั้นล่างสุด จะดูว่ารูปร่างการกระจายเป็นยังไง ตำแหน่งชนะแต่ด้วยเหตุผลคนละข้อกับที่บันไดบอก
อันดับนี้ไม่ใช่ความเห็น มันคือผลการวัด — แต่มันวัดงานเดียว คือการอ่านค่าให้ตรง
นี่คือเหตุผลที่เล่มนี้ยืนยันจะสอนกลไกแทนที่จะให้กฎ ถ้าคุณจำแค่ว่า "ห้ามใช้วงกลม" คุณจะใช้ไม่เป็นในวันที่งานเปลี่ยน แต่ถ้าคุณรู้ว่ามุมแพ้เพราะไม่มีเส้นอ้างอิง คุณจะรู้เองว่าวันไหนมันไม่สำคัญ
บทถัดไปจะลงไปอีกชั้น — ทำไมสายตาถึงถอดค่าได้ไม่แม่นตั้งแต่แรก