01ภาพรวมของกราฟนี้
Bar chart ธรรมดาแสดงค่าประมาณเพียงค่าเดียวราวกับว่ามันแน่นอน ทั้งที่ค่าเฉลี่ยจากตัวอย่างย่อมมีความคลาดเคลื่อน การเติมขาความไม่แน่นอนทำให้ผู้อ่านเห็นว่าช่วงของสองกลุ่มทับกันหรือไม่ ซึ่งเปลี่ยนข้อสรุปได้ทั้งหมด
เปรียบเทียบให้เห็นภาพ
เหมือนบอกว่าจะถึงที่หมายใน 30 นาที กับบอกว่าจะถึงใน 25 ถึง 40 นาที อย่างหลังทำให้เราวางแผนได้ต่างออกไป
ใช้ที่ไหนบ้าง — ผลการทดลอง A/B ค่าเฉลี่ยจากแบบสำรวจ ผลวัดซ้ำในห้องแล็บ หรือการเทียบค่าเฉลี่ยของกลุ่มตัวอย่าง
สร้างอย่างไร
- ขั้นที่ 1คำนวณค่าประมาณและช่วงความไม่แน่นอน
- ขั้นที่ 2ระบุว่าขาที่วาดคืออะไร
- ขั้นที่ 3วาดแท่งและขาบนภาพเดียว
- ขั้นที่ 4ดูว่าช่วงของกลุ่มที่เทียบกันทับกันไหม
ตัวอย่างคลาสสิก · กราฟแท่งที่ซ่อนการกระจายไว้ จนเกิดขบวนการ “ban the bar chart”
วารสารชีววิทยาหลายฉบับพบว่ากราฟแท่งพร้อมขาที่ใช้ในงานวิจัยซ่อนข้อมูลสำคัญไว้มาก ข้อมูลที่กระจายคนละแบบสามารถให้แท่งและขาหน้าตาเหมือนกันได้ จึงมีการรณรงค์ให้แสดงจุดข้อมูลดิบควบคู่ไปด้วยเสมอ
02อธิบายภาษาคนเข้าใจง่าย ๆ
ค่าเฉลี่ยที่คำนวณจากกลุ่มตัวอย่างไม่ใช่ความจริงแท้ ถ้าเก็บข้อมูลอีกรอบก็จะได้ตัวเลขที่ต่างออกไปเล็กน้อย กราฟแท่งธรรมดาไม่ได้บอกเรื่องนี้เลย
ขาที่เติมขึ้นมาบอกว่าค่าจริงน่าจะอยู่ในช่วงไหน ยิ่งขาสั้นแปลว่ายิ่งมั่นใจ ซึ่งมักมาจากการที่มีข้อมูลเยอะหรือข้อมูลกระจายน้อย
สิ่งที่ต้องดูคือ ถ้าช่วงของสองกลุ่มทับกันมาก เราสรุปไม่ได้ว่ากลุ่มหนึ่งมากกว่าอีกกลุ่ม แม้ปลายแท่งจะสูงกว่าก็ตาม นี่คือประโยชน์หลักของกราฟนี้
ปัญหาใหญ่ที่สุดคือคนไม่บอกว่าขาคืออะไร ส่วนเบี่ยงเบนมาตรฐาน ค่าคลาดเคลื่อนมาตรฐาน และช่วงความเชื่อมั่น 95% ให้ขาที่ยาวไม่เท่ากันเลย ถ้าไม่เขียนบอก ผู้อ่านตีความไม่ได้
ข้อควรระวังอีกข้อคือ การที่ช่วงไม่ทับกันไม่ได้แปลว่ามีนัยสำคัญเสมอไป และการทับกันเล็กน้อยก็ไม่ได้แปลว่าไม่มีนัยสำคัญ กราฟนี้เป็นสัญญาณ ไม่ใช่การทดสอบทางสถิติ
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
study | กลุ่มที่เทียบ | หมวดหมู่ | x | 2–8 กลุ่ม | กลุ่มที่นำมาเทียบกันในการทดลองเดียวกัน |
estimate | ค่าประมาณ | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | มักเป็นค่าเฉลี่ยของกลุ่ม |
low | ขอบล่างของช่วง | ช่วงค่า | y | ต่อเนื่อง | ต้องระบุว่าเป็นช่วงแบบไหน |
high | ขอบบนของช่วง | ช่วงค่า | y | ต่อเนื่อง | คู่กับ low |
nไม่บังคับ | ขนาดตัวอย่าง | จำนวนนับ | text | จำนวนเต็ม | ควรเขียนกำกับ เพราะอธิบายว่าทำไมขาสั้นหรือยาว |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- คำนวณช่วงด้วยวิธีที่เหมาะกับข้อมูลและบันทึกวิธีไว้
- ตรวจว่าขนาดตัวอย่างพอที่ช่วงจะมีความหมาย
- ระบุชนิดของช่วงในคำอธิบายภาพ
ค่าที่หายไป — กลุ่มที่คำนวณช่วงไม่ได้เพราะข้อมูลน้อยเกินไป ให้แสดงแท่งพร้อมหมายเหตุ ห้ามวาดโดยไม่มีขาเฉย ๆ เพราะจะดูเหมือนแม่นที่สุด
สเกลของแกน — linear เริ่มที่ศูนย์ตามกฎของกราฟแท่ง
กราฟจะเริ่มพังเมื่อไร
เกิน 10 กลุ่ม ขาจะชนกันจนอ่านไม่ออก — ใช้ forest-plot แนวนอนแทน
หน้าตาไฟล์ที่ต้องเตรียม
study,estimate,low,high,n
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- กลุ่มไหนมีค่าประมาณสูงสุด
- ช่วงของกลุ่มไหนกว้างซึ่งแปลว่ามั่นใจน้อย
- คู่ที่ช่วงทับกันจนสรุปความต่างไม่ได้
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่ได้ทดสอบสมมติฐานให้ — การที่ช่วงไม่ทับกันไม่เท่ากับมีนัยสำคัญทางสถิติ
- ไม่บอกว่าความต่างนั้นสำคัญในทางปฏิบัติหรือไม่
อ่านตามลำดับนี้
- ดูปลายแท่งเพื่อหาค่าประมาณ
- ดูความยาวของขาเพื่อประเมินความมั่นใจ
- ดูว่าช่วงของคู่ที่สนใจทับกันหรือไม่
คำถามที่ตอบได้
- ความต่างที่เห็นน่าเชื่อถือแค่ไหน
- กลุ่มไหนที่เรามั่นใจในค่าที่สุด
- ต้องเก็บข้อมูลเพิ่มกับกลุ่มไหน
สัญญาณว่ามีอะไรผิด
- ไม่บอกว่าขาคืออะไร
- ขาสั้นผิดปกติทั้งที่ตัวอย่างน้อย ซึ่งมักแปลว่าใช้สูตรผิด
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- เขียนตัวใหญ่ว่าขาคือช่วงแบบไหน
- ใส่ขนาดตัวอย่าง n ของแต่ละกลุ่ม
- ถ้าช่วงทับกันมาก ให้เขียนตรง ๆ ว่ายังสรุปไม่ได้
รูปแบบชื่อกราฟที่ควรใช้
<กลุ่ม> สูงกว่า <กลุ่ม> แต่ช่วงความไม่แน่นอนยังทับกัน จึงยังสรุปไม่ได้
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ bar-with-error-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด bar-with-error-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("bar-with-error-sample.csv")
df["estimate"] = pd.to_numeric(df["estimate"], errors="coerce")
df["low"] = pd.to_numeric(df["low"], errors="coerce")
df["high"] = pd.to_numeric(df["high"], errors="coerce")
df["n"] = pd.to_numeric(df["n"], errors="coerce")
NOTE = "overlap" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
err = [df["estimate"] - df["low"], df["high"] - df["estimate"]] # ขาสองข้างไม่จำเป็นต้องเท่ากัน
ax.bar(df["study"], df["estimate"], yerr=err, capsize=6, color=C1, ecolor=INK, error_kw={"linewidth": 1.8})
ax.set_ylim(0, None)
ax.set_ylabel("ค่าประมาณ")
ax.set_title("ขาคือช่วงความเชื่อมั่น 95%", loc="left") # ต้องบอกเสมอว่าขาคืออะไร
plt.setp(ax.get_xticklabels(), rotation=25, ha="right")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("bar-with-error.png", dpi=160)
print("เขียน bar-with-error.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (6 แถว)
| กลุ่ม | ค่าประมาณ | ขอบล่าง | ขอบบน | n |
|---|---|---|---|---|
| การทดลองที่ 1 | -2.70 | -8.37 | 2.97 | 100 |
| การทดลองที่ 2 | 4.98 | 1.73 | 8.23 | 386 |
| การทดลองที่ 3 | 12.8 | 8.99 | 16.5 | 136 |
| การทดลองที่ 4 | 10.3 | 5.43 | 15.2 | 181 |
| การทดลองที่ 5 | 10.5 | 6.37 | 14.6 | 647 |
| การทดลองที่ 6 | 10.0 | 5.49 | 14.5 | 303 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: หาคู่ที่ปลายแท่งต่างกันเล็กน้อยแล้วดูขาของทั้งคู่ จะเห็นว่าความต่างที่ตาเห็นอาจอธิบายได้ด้วยความคลาดเคลื่อนล้วน ๆ
ข้อควรระวัง
- ไม่ระบุว่าขาคืออะไร ทำให้ผู้อ่านตีความความมั่นใจผิดได้หลายเท่า
- สรุปว่าต่างกันอย่างมีนัยสำคัญเพียงเพราะช่วงไม่ทับกัน ซึ่งไม่ใช่การทดสอบทางสถิติ
- ใช้กราฟแท่งกับข้อมูลที่ควรแสดงการกระจายทั้งหมด ซึ่ง box plot หรือ strip plot เหมาะกว่า
- ไม่ใส่ขนาดตัวอย่าง ทำให้ไม่รู้ว่าทำไมบางขาจึงยาว
เมื่อไหร่ไม่ควรใช้กราฟนี้
- มีข้อมูลดิบทุกจุดและจำนวนไม่มาก→ใช้แทน: strip-plot หรือ beeswarm-plot ที่โชว์ทุกจุดจริง
- เทียบผลการศึกษาหลายชิ้น→ใช้แทน: forest-plot
- ต้องการเห็นรูปร่างการกระจาย→ใช้แทน: box-plot หรือ violin-plot