ข้ามไปยังเนื้อหา
Tayakorn

ทำไมตาถึงอ่านกราฟนี้ได้เร็วกว่า

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 บันไดเจ็ดขั้น

แม่นที่สุด — ใช้เมื่อคนอ่านต้องเทียบค่าให้ตรง1ตำแหน่งบนแกนร่วมจุดบนแกนเดียวกัน · dot plot2ตำแหน่งบนแกนคนละตัวภาพชุดเรียงข้างกัน3ความยาวแท่งที่เริ่มจากฐานเดียวกัน4ทิศทาง / ความชันเส้นแนวโน้ม5มุมวงกลม · โดนัท6พื้นที่ฟอง · treemap7ความเข้ม / สีheatmap · แบ่งกลุ่มแม่นน้อยที่สุด — ใช้บอกว่าเป็นกลุ่มไหน ไม่ใช่บอกว่าเท่าไหร่
FIG 5.1 อันดับนี้มาจากการวัดกับคนจริง ไม่ใช่ความเห็น — ตั้งต้นจากงานของ Cleveland กับ McGill ปี 1984 และงานที่ต่อยอดภายหลัง · ภาพนี้เก็บแค่ อันดับ ไม่ได้เก็บคะแนน เพราะเราไม่ได้วัดเอง · และสังเกตว่ามันเข้ารหัสอันดับด้วย ตำแหน่ง ซึ่งก็คือช่องทางอันดับหนึ่งในภาพเอง

สองขั้นบนสุดชนะเพราะเหตุผลเดียวกัน คือมี เส้นอ้างอิงร่วม ให้ตาใช้ พอทุกจุดวางอยู่บนแกนเดียวกัน การเทียบก็กลายเป็นการดูว่าอันไหนอยู่สูงกว่า ซึ่งเป็นงานที่ระบบสายตาทำได้แม่นมาก

มุมแพ้เพราะสองอย่างพร้อมกัน — ไม่มีเส้นอ้างอิงให้เทียบ และตาคนไวกับมุมที่ใกล้แนวตั้งหรือแนวนอนมากกว่ามุมเฉียง ความแม่นจึงไม่สม่ำเสมอแม้แต่ภายในวงกลมเดียวกัน ชิ้นที่วางอยู่ตรงหกนาฬิกากับชิ้นที่วางเฉียง ๆ ถูกอ่านด้วยความแม่นไม่เท่ากัน ทั้งที่มุมเท่ากัน

พื้นที่กับสีอยู่ท้ายบันไดไม่ได้แปลว่าห้ามใช้ มันแปลว่า อย่าเอาไปแบกตัวเลขที่คนต้องอ่านให้ตรง ใช้บอกกลุ่ม บอกคร่าว ๆ บอกว่า "อันนี้เยอะกว่ามาก" ได้สบาย

5.4 เมื่อคำตอบคืออย่าทำกราฟ

กลับไปที่ผลรันในหัวข้อ 5.1 ชุดข้อมูลของเราไม่ผ่านสักช่องทาง เพราะมีคู่ที่ต่างกันแค่ 1 หน่วย

สิ่งที่คนส่วนใหญ่ทำตอนเจอแบบนี้คือไล่เปลี่ยนชนิดกราฟไปเรื่อย ๆ หวังว่าจะเจออันที่ "เห็นชัดกว่า" แต่บันไดบอกเราแล้วว่าเพดานอยู่ตรงไหน — ถ้าช่องทางที่แม่นที่สุดยังทำไม่ได้ ก็ไม่มีช่องทางไหนทำได้

ทางออกจริงมีสามทาง และไม่มีทางไหนเป็นการเปลี่ยนชนิดกราฟ

ทางออกทำยังไงเหมาะเมื่อ
พิมพ์ตัวเลขไปเลยใส่ค่าที่แท่ง หรือทำเป็นตารางความต่าง 1 หน่วยนั้นสำคัญจริง
เปลี่ยนสิ่งที่วัดแสดงส่วนต่างจากค่าเป้าหมาย แทนค่าดิบสิ่งที่คนอ่านสนใจคือส่วนต่าง ไม่ใช่ระดับ
ยอมรับว่ามันเท่ากันจัดกลุ่มเป็น "พอ ๆ กัน" แล้วเน้นที่ต่างจริงความต่าง 1 หน่วยไม่มีความหมายในทางปฏิบัติ

ทางที่สองคือทางที่คนมองข้ามบ่อยที่สุด ถ้าค่าจริงคือ 100 กับ 102 แต่เป้าหมายคือ 100 ทั้งคู่ การพล็อต "ส่วนต่างจากเป้า" จะได้ 0 กับ 2 ซึ่งช่องว่างกลายเป็น 100% ของช่วงทันที ข้อมูลชุดเดิม คำถามใหม่ ช่องว่างใหม่

5.5 บันไดนี้ไม่ใช่คำสั่ง

ก่อนจบบท มีข้อจำกัดที่ต้องพูดให้ชัด บันไดนี้วัดงานอย่างเดียว คือการอ่านค่าให้ตรง

ถ้าเป้าหมายของภาพเปลี่ยนไป ลำดับก็อาจเปลี่ยนตาม — จะหาค่าผิดปกติในข้อมูลหมื่นแถว สีบน heatmap ชนะขาดทั้งที่อยู่ขั้นล่างสุด จะดูว่ารูปร่างการกระจายเป็นยังไง ตำแหน่งชนะแต่ด้วยเหตุผลคนละข้อกับที่บันไดบอก

อันดับนี้ไม่ใช่ความเห็น มันคือผลการวัด — แต่มันวัดงานเดียว คือการอ่านค่าให้ตรง

นี่คือเหตุผลที่เล่มนี้ยืนยันจะสอนกลไกแทนที่จะให้กฎ ถ้าคุณจำแค่ว่า "ห้ามใช้วงกลม" คุณจะใช้ไม่เป็นในวันที่งานเปลี่ยน แต่ถ้าคุณรู้ว่ามุมแพ้เพราะไม่มีเส้นอ้างอิง คุณจะรู้เองว่าวันไหนมันไม่สำคัญ

บทถัดไปจะลงไปอีกชั้น — ทำไมสายตาถึงถอดค่าได้ไม่แม่นตั้งแต่แรก

อ่านแบบเต็มเล่ม