← ทำไมตาถึงอ่านกราฟนี้ได้เร็วกว่า
LEVEL 1 · พื้นฐานที่ใช้ทุกวัน
ทำไมตาถึงไม่แม่น — กฎของเวเบอร์
บันไดในบทที่แล้วบอกว่า ใครแม่นกว่าใคร แต่ยังไม่ได้บอกว่า ทำไมถึงไม่แม่นตั้งแต่แรก บทนี้ลงไปอีกชั้นเดียว แล้วคุณจะได้กลไกที่อธิบายทั้งบันได ทั้งเรื่องแกน และทั้งเรื่องที่จะเจอในบทที่ 9 พร้อมกัน
6.1 การทดลองที่ทำได้ในสามวินาที
ดูภาพนี้ แล้วตอบว่าคู่ไหนบอกความต่างได้ชัดกว่า
คำตอบชัดจนไม่ต้องคิด แต่สิ่งที่ควรสะดุดคือ ความต่างของทั้งสองคู่เท่ากันเป๊ะที่ 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 อำนาจที่คนทำกราฟถืออยู่โดยไม่รู้ตัว
ถ้าตาหารด้วยค่าฐานเสมอ แล้วใครเป็นคนเลือกค่าฐาน
ข้อมูลคือ 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 ในสคริปต์เป็นเกณฑ์อนุรักษ์นิยมที่ตั้งไว้ให้ลองเล่น ไม่ใช่ค่าคงที่ของธรรมชาติ ค่าจริงขึ้นกับช่องทาง ขนาดภาพ ระยะมอง และตัวคนดู สิ่งที่ไม่เปลี่ยนคือรูปแบบ — เป็นอัตราส่วน ไม่ใช่ผลต่าง