Skip to content
Tayakorn

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

LEVEL 1 · พื้นฐานที่ใช้ทุกวัน

ทำไมตาถึงไม่แม่น — กฎของเวเบอร์

บันไดในบทที่แล้วบอกว่า ใครแม่นกว่าใคร แต่ยังไม่ได้บอกว่า ทำไมถึงไม่แม่นตั้งแต่แรก บทนี้ลงไปอีกชั้นเดียว แล้วคุณจะได้กลไกที่อธิบายทั้งบันได ทั้งเรื่องแกน และทั้งเรื่องที่จะเจอในบทที่ 9 พร้อมกัน

6.1 การทดลองที่ทำได้ในสามวินาที

ดูภาพนี้ แล้วตอบว่าคู่ไหนบอกความต่างได้ชัดกว่า

10 กับ 15ต่างกัน 5 หน่วย = 33.33% ของแท่งที่สูงกว่า1015ห่างกันบนจอ 40 pxตาแยกออกสบาย1000 กับ 1005ต่างกัน 5 หน่วย = 0.50% ของแท่งที่สูงกว่า10001005ห่างกันบนจอ 0.6 pxตาแยกไม่ออกเลย
FIG 6.1 ความต่าง 5 หน่วยเท่ากันทั้งสองคู่ แต่คู่ซ้ายห่างกัน 40 px ส่วนคู่ขวาห่างกัน 0.6 px · ตาไม่ได้ถามว่าต่างกันเท่าไหร่ มันถามว่าต่างกันกี่ส่วนของของเดิม · นี่คือเหตุผลที่ตัวเลขใหญ่ ๆ บนกราฟเดียวกันมักดูเท่ากันไปหมด

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

6.2 ตาหารก่อนเสมอ

สิ่งที่เกิดขึ้นข้างบนมีชื่อ และถูกอธิบายไว้ตั้งแต่ศตวรรษที่ 19

💡 กฎของเวเบอร์ (Weber's law) — ความต่างที่น้อยที่สุดที่คนจะสังเกตเห็นได้ แปรตามขนาดของสิ่งที่กำลังดู ไม่ใช่ค่าคงที่ · เขียนเป็นสมการคือ ΔI / I = k โดย ΔI คือความต่างที่พอจะสังเกตออก I คือขนาดตั้งต้น และ k คือค่าคงที่ของช่องทางนั้น · แปลเป็นภาษาคนคือ ตาวัดเป็นอัตราส่วน ไม่ได้วัดเป็นผลต่าง

พอรู้ข้อนี้ ผลในภาพก็คำนวณล่วงหน้าได้ ไม่ต้องทดลอง — 5 หน่วยจาก 15 คือ 33% ส่วน 5 หน่วยจาก 1005 คือ 0.5% ตาได้รับตัวเลขสองตัวนี้ ไม่ได้รับเลข 5 ทั้งคู่

ตาไม่เคยถามว่า "ต่างกันเท่าไหร่" มันถามว่า "ต่างกันกี่ส่วนของของเดิม"

6.3 สามเรื่องที่กฎข้อเดียวนี้อธิบายได้ทันที

นี่คือสิ่งที่ทำให้กฎนี้คุ้มค่าที่จะจำ มันไม่ได้อธิบายแค่ภาพเดียว

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

สอง — ทำไมสเกล log ถึงไม่ใช่แค่ลูกเล่นคณิตศาสตร์ สเกล log ทำให้อัตราส่วนที่เท่ากันกินระยะบนแกนเท่ากัน ซึ่งบังเอิญตรงกับวิธีที่ตาอ่านพอดี มันจึงไม่ใช่การบิดข้อมูล แต่เป็นการจับสเกลของภาพให้ตรงกับสเกลของผู้อ่าน

สาม — ทำไมแท่งที่เริ่มจากฐานเดียวกันถึงสำคัญ เพราะฐานคือค่าที่ตาเอาไปหาร เปลี่ยนฐาน เปลี่ยนตัวหาร เปลี่ยนคำตอบ — ซึ่งพาเราไปหัวข้อถัดไป

6.4 อำนาจที่คนทำกราฟถืออยู่โดยไม่รู้ตัว

ถ้าตาหารด้วยค่าฐานเสมอ แล้วใครเป็นคนเลือกค่าฐาน

แกนเริ่มนับที่ 0ตาเห็นต่างกัน 1.96%100102ห่างกันบนจอ 2.35 pxซื่อสัตย์ แต่คนอ่านไม่เห็นความต่างแกนเริ่มนับที่ 98ตาเห็นต่างกัน 50.00%100102ห่างกันบนจอ 60 pxเห็นชัด แต่ขยายความต่างไป 25 เท่า
FIG 6.2 ข้อมูลคือ 102 กับ 100 ทั้งสองแผง ไม่ขยับสักหน่วย · เปลี่ยนแค่ตำแหน่งที่แกนเริ่มนับ แล้วความต่างที่ตาเห็นกระโดดจาก 1.96% เป็น 50.00% · กฎของเวเบอร์บอกว่าตาหารด้วยค่าฐานเสมอ และคนทำกราฟคือคนเลือกค่าฐานนั้น — อำนาจข้อนี้จะกลับมาอีกทีในบทที่ 9

ข้อมูลคือ 102 กับ 100 ทั้งสองแผง ไม่ขยับแม้แต่หน่วยเดียว แต่พอเลื่อนจุดที่แกนเริ่มนับจาก 0 ไปเป็น 98 ความต่างที่ตาได้รับกระโดดจาก 1.96% เป็น 50.00%

ขยายขึ้น 25 เท่า โดยไม่แตะข้อมูลเลยสักตัว

⚠️ ตรงนี้ต้องระวัง เล่มนี้ยังไม่ได้บอกว่าตัดฐานแกนคือการโกหก บางครั้งมันคือสิ่งที่ถูกต้อง เช่นเวลาดูอุณหภูมิร่างกายที่ 36.5 กับ 38.5 องศา การเริ่มแกนที่ 0 คือการซ่อนเรื่องสำคัญ เส้นแบ่งระหว่าง "จำเป็น" กับ "หลอกตา" อยู่ที่บทที่ 9 ตอนนี้ขอแค่ให้เห็นว่า อำนาจนี้มีอยู่จริง และมันอยู่ในมือคุณทุกครั้งที่ทำกราฟ

6.5 ตรวจชุดข้อมูลของคุณเอง

สคริปต์นี้ (weber.py) รวมทั้งสามเรื่องในบท และท้ายสุดพิมพ์ความสูงแท่งที่ใช้วาด FIG 6.1 กับ 6.2 ให้ตรวจได้ว่าภาพตรงกับเลข · ให้ลองเปลี่ยนค่า K แล้วดูว่าคำตัดสินขยับยังไง

"""กฎของเวเบอร์ — ตาอ่าน 'กี่เท่า' ไม่ใช่ 'ต่างกันเท่าไหร่'"""

K = 0.05  # ความต่างต้องเป็นอย่างน้อย 5% ของค่าฐาน ถึงจะหวังให้ตาแยกออก

def detectable(a, b, k=K):
    """ต่างกันพอให้ตาแยกออกไหม — เทียบเป็นสัดส่วนของค่าที่ใหญ่กว่า"""
    return abs(a - b) / max(a, b) >= k

print("=== ความต่างเท่ากันเป๊ะ 5 หน่วย ที่ระดับค่าต่างกัน ===")
for base in (10, 50, 100, 500, 1000):
    a, b = base, base + 5
    ratio = 5 / b
    print(f"  {a:>5} กับ {b:>5} -> ต่างกัน {ratio * 100:5.2f}% "
          f"-> {'แยกออก' if detectable(a, b) else 'แยกไม่ออก'}")

print("\n=== อัตราส่วนเท่ากัน ที่ระดับค่าต่างกัน ===")
for base in (10, 100, 1000):
    b = base * 1.10
    print(f"  {base:>5} กับ {b:>7.1f} -> ต่างกัน 10.00% "
          f"-> {'แยกออก' if detectable(base, b) else 'แยกไม่ออก'}")
print("  ระดับค่าเปลี่ยนไป 100 เท่า แต่ผลเหมือนกันหมด นั่นคือสิ่งที่กฎนี้พูด")

print("\n=== ตัดฐานแกนออก แล้วอัตราส่วนที่ตาเห็นเปลี่ยนไปแค่ไหน ===")
A, B = 102, 100
for floor in (0, 90, 98, 99):
    ha, hb = A - floor, B - floor
    ratio = (ha - hb) / ha
    print(f"  แกนเริ่มที่ {floor:>3} -> แท่งสูง {ha:>4} กับ {hb:>4} "
          f"-> ตาเห็นต่างกัน {ratio * 100:6.2f}% "
          f"-> {'แยกออก' if ratio >= K else 'แยกไม่ออก'}")
print(f"  ข้อมูลไม่ขยับเลย {A} กับ {B} ต่างกัน 2 หน่วยตลอด")
print("  สิ่งที่ขยับคือค่าฐานที่ตาเอาไปหาร ซึ่งคนทำกราฟเป็นคนเลือก")

# --- ความสูงแท่งที่ใช้วาดสองภาพในบทนี้ เผื่ออยากตรวจว่าภาพตรงกับเลข ---
H = 120.0
print("\n=== ความสูงแท่งของ FIG 6.1 ===")
for pair in ((10, 15), (1000, 1005)):
    hi = max(pair)
    hs = [round(v / hi * H, 2) for v in pair]
    print(f"  {pair} -> สูง {hs} px -> ห่างกัน {round(hs[1] - hs[0], 2)} px")

print("\n=== ความสูงแท่งของ FIG 6.2 ===")
for floor in (0, 98):
    ha, hb = A - floor, B - floor
    low = round(hb / ha * H, 2)
    print(f"  ฐานแกน {floor:>3} -> สูง {low} กับ {H} px -> ห่างกัน {round(H - low, 2)} px")

ผลรันจริง

=== ความต่างเท่ากันเป๊ะ 5 หน่วย ที่ระดับค่าต่างกัน ===
     10 กับ    15 -> ต่างกัน 33.33% -> แยกออก
     50 กับ    55 -> ต่างกัน  9.09% -> แยกออก
    100 กับ   105 -> ต่างกัน  4.76% -> แยกไม่ออก
    500 กับ   505 -> ต่างกัน  0.99% -> แยกไม่ออก
   1000 กับ  1005 -> ต่างกัน  0.50% -> แยกไม่ออก

=== อัตราส่วนเท่ากัน ที่ระดับค่าต่างกัน ===
     10 กับ    11.0 -> ต่างกัน 10.00% -> แยกออก
    100 กับ   110.0 -> ต่างกัน 10.00% -> แยกออก
   1000 กับ  1100.0 -> ต่างกัน 10.00% -> แยกออก
  ระดับค่าเปลี่ยนไป 100 เท่า แต่ผลเหมือนกันหมด นั่นคือสิ่งที่กฎนี้พูด

=== ตัดฐานแกนออก แล้วอัตราส่วนที่ตาเห็นเปลี่ยนไปแค่ไหน ===
  แกนเริ่มที่   0 -> แท่งสูง  102 กับ  100 -> ตาเห็นต่างกัน   1.96% -> แยกไม่ออก
  แกนเริ่มที่  90 -> แท่งสูง   12 กับ   10 -> ตาเห็นต่างกัน  16.67% -> แยกออก
  แกนเริ่มที่  98 -> แท่งสูง    4 กับ    2 -> ตาเห็นต่างกัน  50.00% -> แยกออก
  แกนเริ่มที่  99 -> แท่งสูง    3 กับ    1 -> ตาเห็นต่างกัน  66.67% -> แยกออก
  ข้อมูลไม่ขยับเลย 102 กับ 100 ต่างกัน 2 หน่วยตลอด
  สิ่งที่ขยับคือค่าฐานที่ตาเอาไปหาร ซึ่งคนทำกราฟเป็นคนเลือก

=== ความสูงแท่งของ FIG 6.1 ===
  (10, 15) -> สูง [80.0, 120.0] px -> ห่างกัน 40.0 px
  (1000, 1005) -> สูง [119.4, 120.0] px -> ห่างกัน 0.6 px

=== ความสูงแท่งของ FIG 6.2 ===
  ฐานแกน   0 -> สูง 117.65 กับ 120.0 px -> ห่างกัน 2.35 px
  ฐานแกน  98 -> สูง 60.0 กับ 120.0 px -> ห่างกัน 60.0 px

ค่า K = 0.05 ในสคริปต์เป็นเกณฑ์อนุรักษ์นิยมที่ตั้งไว้ให้ลองเล่น ไม่ใช่ค่าคงที่ของธรรมชาติ ค่าจริงขึ้นกับช่องทาง ขนาดภาพ ระยะมอง และตัวคนดู สิ่งที่ไม่เปลี่ยนคือรูปแบบ — เป็นอัตราส่วน ไม่ใช่ผลต่าง

Read the full book