เทคนิคที่ 012 · PYTHON / JAVASCRIPT

กราฟแท่งพร้อมช่วงความไม่แน่นอนBar Chart with Error Bars

บอกด้วยว่าความต่างที่เห็นเชื่อได้แค่ไหน

3
ผสานหลายแนวคิดควรรู้ก่อน · เข้าใจว่าค่าเฉลี่ยจากตัวอย่างมีความคลาดเคลื่อน
ลองเล่น

01ภาพรวมของกราฟนี้

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

เปรียบเทียบให้เห็นภาพ

เหมือนบอกว่าจะถึงที่หมายใน 30 นาที กับบอกว่าจะถึงใน 25 ถึง 40 นาที อย่างหลังทำให้เราวางแผนได้ต่างออกไป

ใช้ที่ไหนบ้าง — ผลการทดลอง A/B ค่าเฉลี่ยจากแบบสำรวจ ผลวัดซ้ำในห้องแล็บ หรือการเทียบค่าเฉลี่ยของกลุ่มตัวอย่าง

สร้างอย่างไร

  1. ขั้นที่ 1คำนวณค่าประมาณและช่วงความไม่แน่นอน
  2. ขั้นที่ 2ระบุว่าขาที่วาดคืออะไร
  3. ขั้นที่ 3วาดแท่งและขาบนภาพเดียว
  4. ขั้นที่ 4ดูว่าช่วงของกลุ่มที่เทียบกันทับกันไหม

ตัวอย่างคลาสสิก · กราฟแท่งที่ซ่อนการกระจายไว้ จนเกิดขบวนการ “ban the bar chart”

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

PLOS Biology · Beyond bar and line graphs

02อธิบายภาษาคนเข้าใจง่าย ๆ

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

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

สิ่งที่ต้องดูคือ ถ้าช่วงของสองกลุ่มทับกันมาก เราสรุปไม่ได้ว่ากลุ่มหนึ่งมากกว่าอีกกลุ่ม แม้ปลายแท่งจะสูงกว่าก็ตาม นี่คือประโยชน์หลักของกราฟนี้

ปัญหาใหญ่ที่สุดคือคนไม่บอกว่าขาคืออะไร ส่วนเบี่ยงเบนมาตรฐาน ค่าคลาดเคลื่อนมาตรฐาน และช่วงความเชื่อมั่น 95% ให้ขาที่ยาวไม่เท่ากันเลย ถ้าไม่เขียนบอก ผู้อ่านตีความไม่ได้

ข้อควรระวังอีกข้อคือ การที่ช่วงไม่ทับกันไม่ได้แปลว่ามีนัยสำคัญเสมอไป และการทับกันเล็กน้อยก็ไม่ได้แปลว่าไม่มีนัยสำคัญ กราฟนี้เป็นสัญญาณ ไม่ใช่การทดสอบทางสถิติ

03ข้อมูลที่ต้องใช้

รูปทรงของข้อมูลตารางแบบยาว (หนึ่งแถวหนึ่งสังเกต)
จำนวนมิติที่เข้ารหัสได้3 มิติ
จำนวนแถวที่เหมาะ2–6 กลุ่มขั้นต่ำ 2 แถว
เส้นฐานศูนย์ต้องเริ่มที่ศูนย์ยังเป็นกราฟแท่ง ความยาวจึงต้องแปรตามค่า

คอลัมน์ที่ต้องเตรียม

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
studyกลุ่มที่เทียบหมวดหมู่x2–8 กลุ่มกลุ่มที่นำมาเทียบกันในการทดลองเดียวกัน
estimateค่าประมาณตัวเลขต่อเนื่องyต่อเนื่องมักเป็นค่าเฉลี่ยของกลุ่ม
lowขอบล่างของช่วงช่วงค่าyต่อเนื่องต้องระบุว่าเป็นช่วงแบบไหน
highขอบบนของช่วงช่วงค่าyต่อเนื่องคู่กับ low
n
ไม่บังคับ
ขนาดตัวอย่างจำนวนนับtextจำนวนเต็มควรเขียนกำกับ เพราะอธิบายว่าทำไมขาสั้นหรือยาว

ต้องเตรียมข้อมูลอย่างไรก่อนวาด

  1. คำนวณช่วงด้วยวิธีที่เหมาะกับข้อมูลและบันทึกวิธีไว้
  2. ตรวจว่าขนาดตัวอย่างพอที่ช่วงจะมีความหมาย
  3. ระบุชนิดของช่วงในคำอธิบายภาพ

ค่าที่หายไป — กลุ่มที่คำนวณช่วงไม่ได้เพราะข้อมูลน้อยเกินไป ให้แสดงแท่งพร้อมหมายเหตุ ห้ามวาดโดยไม่มีขาเฉย ๆ เพราะจะดูเหมือนแม่นที่สุด

สเกลของแกน — linear เริ่มที่ศูนย์ตามกฎของกราฟแท่ง

กราฟจะเริ่มพังเมื่อไร

เกิน 10 กลุ่ม ขาจะชนกันจนอ่านไม่ออก — ใช้ forest-plot แนวนอนแทน

หน้าตาไฟล์ที่ต้องเตรียม

study,estimate,low,high,n

04อ่านแล้วเห็นอะไร

สิ่งที่เห็นได้จากภาพ

  • กลุ่มไหนมีค่าประมาณสูงสุด
  • ช่วงของกลุ่มไหนกว้างซึ่งแปลว่ามั่นใจน้อย
  • คู่ที่ช่วงทับกันจนสรุปความต่างไม่ได้

สิ่งที่กราฟนี้ตอบไม่ได้

  • ไม่ได้ทดสอบสมมติฐานให้ — การที่ช่วงไม่ทับกันไม่เท่ากับมีนัยสำคัญทางสถิติ
  • ไม่บอกว่าความต่างนั้นสำคัญในทางปฏิบัติหรือไม่

อ่านตามลำดับนี้

  1. ดูปลายแท่งเพื่อหาค่าประมาณ
  2. ดูความยาวของขาเพื่อประเมินความมั่นใจ
  3. ดูว่าช่วงของคู่ที่สนใจทับกันหรือไม่

คำถามที่ตอบได้

  • ความต่างที่เห็นน่าเชื่อถือแค่ไหน
  • กลุ่มไหนที่เรามั่นใจในค่าที่สุด
  • ต้องเก็บข้อมูลเพิ่มกับกลุ่มไหน

สัญญาณว่ามีอะไรผิด

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

05เหมาะกับการนำเสนอแบบไหน

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

ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย

  1. เขียนตัวใหญ่ว่าขาคือช่วงแบบไหน
  2. ใส่ขนาดตัวอย่าง n ของแต่ละกลุ่ม
  3. ถ้าช่วงทับกันมาก ให้เขียนตรง ๆ ว่ายังสรุปไม่ได้

รูปแบบชื่อกราฟที่ควรใช้

<กลุ่ม> สูงกว่า <กลุ่ม> แต่ช่วงความไม่แน่นอนยังทับกัน จึงยังสรุปไม่ได้

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), "แถว")

ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*" · ทดสอบกับเวอร์ชัน 3.10

07ลองเล่นเพื่อเข้าใจ

ข้อมูลตัวอย่าง · 6 แถว · seed 31● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
เทียบช่วงของกลุ่มที่ปลายแท่งใกล้กัน
-10.0-5.000.005.0010.015.020.0การทดลองที่ 1การทดลองที่ 2การทดลองที่ 3การทดลองที่ 4การทดลองที่ 5การทดลองที่ 6การทดลองที่ 1 · -2.70 (ช่วง -8.37–2.97)การทดลองที่ 2 · 4.98 (ช่วง 1.73–8.23)การทดลองที่ 3 · 12.8 (ช่วง 8.99–16.5)การทดลองที่ 4 · 10.3 (ช่วง 5.43–15.2)การทดลองที่ 5 · 10.5 (ช่วง 6.37–14.6)การทดลองที่ 6 · 10.0 (ช่วง 5.49–14.5)
ช่วงที่กว้างที่สุด11.3
ทับซ้อนกับกลุ่มแรก1 กลุ่ม
จำนวนกลุ่ม6
ดูข้อมูลเป็นตาราง (6 แถว)
กราฟแท่งพร้อมช่วงความไม่แน่นอน 6 กลุ่ม
กลุ่มค่าประมาณขอบล่างขอบบนn
การทดลองที่ 1-2.70-8.372.97100
การทดลองที่ 24.981.738.23386
การทดลองที่ 312.88.9916.5136
การทดลองที่ 410.35.4315.2181
การทดลองที่ 510.56.3714.6647
การทดลองที่ 610.05.4914.5303

ลองแล้วจะเห็นอะไร

  • สังเกตอะไร: หาคู่ที่ปลายแท่งต่างกันเล็กน้อยแล้วดูขาของทั้งคู่ จะเห็นว่าความต่างที่ตาเห็นอาจอธิบายได้ด้วยความคลาดเคลื่อนล้วน ๆ

ข้อควรระวัง

  1. ไม่ระบุว่าขาคืออะไร ทำให้ผู้อ่านตีความความมั่นใจผิดได้หลายเท่า
  2. สรุปว่าต่างกันอย่างมีนัยสำคัญเพียงเพราะช่วงไม่ทับกัน ซึ่งไม่ใช่การทดสอบทางสถิติ
  3. ใช้กราฟแท่งกับข้อมูลที่ควรแสดงการกระจายทั้งหมด ซึ่ง box plot หรือ strip plot เหมาะกว่า
  4. ไม่ใส่ขนาดตัวอย่าง ทำให้ไม่รู้ว่าทำไมบางขาจึงยาว

เมื่อไหร่ไม่ควรใช้กราฟนี้

  • มีข้อมูลดิบทุกจุดและจำนวนไม่มากใช้แทน: strip-plot หรือ beeswarm-plot ที่โชว์ทุกจุดจริง
  • เทียบผลการศึกษาหลายชิ้นใช้แทน: forest-plot
  • ต้องการเห็นรูปร่างการกระจายใช้แทน: box-plot หรือ violin-plot

กราฟที่เกี่ยวข้อง

เทคนิคถัดไป · กราฟน้ำตก