01ภาพรวมของกราฟนี้
Funnel plot พล็อตผลของแต่ละการศึกษาเทียบกับความแม่น ถ้าไม่มีอคติ จุดควรกระจายเป็นรูปกรวยสมมตร ความไม่สมมาตรเป็นสัญญาณว่าอาจมีงานที่ไม่ได้ตีพิมพ์ แต่ไม่ใช่หลักฐานเด็ดขาดเพราะสาเหตุอื่นก็ทำให้เบี้ยวได้
เปรียบเทียบให้เห็นภาพ
เหมือนตรวจว่ากล่องรีวิวสินค้ามีแต่รีวิวห้าดาว ซึ่งชวนสงสัยว่ารีวิวแย่ถูกลบไปหรือเปล่า
ใช้ที่ไหนบ้าง — ตรวจอคติจากการตีพิมพ์ในการสังเคราะห์งานวิจัย หรือตรวจว่าผลการทดลองภายในองค์กรถูกรายงานครบหรือไม่
สร้างอย่างไร
- ขั้นที่ 1พล็อตขนาดผลบนแกนนอนและความแม่นบนแกนตั้ง
- ขั้นที่ 2วาดเส้นกรวยที่ระดับนัยสำคัญเพื่อเป็นกรอบอ้างอิง
- ขั้นที่ 3ดูว่าจุดกระจายสมมาตรรอบค่ากลางหรือไม่
- ขั้นที่ 4พิจารณาสาเหตุอื่นก่อนสรุปว่าเป็นอคติ
ตัวอย่างคลาสสิก · Funnel plot กับปัญหาอคติจากการตีพิมพ์
การทบทวนวรรณกรรมหลายชิ้นพบว่า funnel plot ของงานวิจัยด้านการรักษาบางเรื่องเบี้ยวอย่างชัดเจน ซึ่งนำไปสู่การผลักดันให้จดทะเบียนการทดลองก่อนเริ่มทุกครั้ง เพื่อให้รู้ว่ามีงานใดทำแล้วไม่ได้ตีพิมพ์บ้าง เป็นตัวอย่างที่ภาพข้อมูลเปลี่ยนกฎของทั้งวงการ
02อธิบายภาษาคนเข้าใจง่าย ๆ
งานวิจัยที่ได้ผลชัดเจนมีโอกาสถูกตีพิมพ์มากกว่างานที่ได้ผลไม่ชัด ซึ่งแปลว่าหลักฐานที่เรามองเห็นอาจถูกคัดมาแล้ว
ผลที่ตามมาคือค่าสรุปจาก forest plot อาจสูงเกินจริงอย่างเป็นระบบ ทั้งที่การคำนวณถูกต้องทุกขั้นตอน
Funnel plot ตรวจเรื่องนี้ด้วยตรรกะง่าย ๆ คืองานที่มีตัวอย่างน้อยย่อมได้ผลกระจัดกระจายกว่างานที่มีตัวอย่างมาก ดังนั้นถ้าไม่มีอคติ จุดควรกระจายเป็นกรวยที่สมมาตร กว้างด้านล่างและแคบด้านบน
ถ้ามุมล่างด้านหนึ่งของกรวยว่างผิดปกติ ก็ชวนให้สงสัยว่างานเล็กที่ได้ผลไปทางนั้นมีอยู่แต่ไม่ได้ถูกตีพิมพ์
ข้อจำกัดที่ต้องพูดให้ชัดคือความไม่สมมาตรมีสาเหตุอื่นได้อีกหลายอย่าง เช่น งานเล็กมักทำในกลุ่มที่ตอบสนองดีกว่า หรือคุณภาพงานต่างกันอย่างเป็นระบบ
และเมื่อมีการศึกษาน้อยกว่าราวสิบชิ้น การดูรูปทรงด้วยตาก็แทบไม่มีความหมายเลย เพราะความบังเอิญอธิบายรูปทรงที่เห็นได้ทั้งหมด
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
study | ชื่อการศึกษา | หมวดหมู่ | text | 10–200 การศึกษา | ใช้ใน tooltip |
estimate | ขนาดของผล | ตัวเลขต่อเนื่อง | x | ต่อเนื่อง | แกนนอน |
n | ขนาดตัวอย่าง | จำนวนนับ | y | บวกเท่านั้น | ★ แกนตั้ง โดยค่ามากอยู่ด้านบน |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- แปลงผลให้อยู่ในหน่วยเดียวกัน
- คำนวณความแม่นหรือความคลาดเคลื่อนมาตรฐานของแต่ละงาน
- ★ บันทึกจำนวนการศึกษาไว้ เพราะน้อยเกินแล้วอ่านไม่ได้
ค่าที่หายไป — งานที่ไม่รายงานขนาดตัวอย่างต้องตัดออกและระบุจำนวน
สเกลของแกน — แกนตั้งควรให้งานที่แม่นกว่าอยู่ด้านบน และถ้าผลเป็นอัตราส่วนควรใช้แกนนอนเป็นลอการิทึม
กราฟจะเริ่มพังเมื่อไร
น้อยกว่า 10 การศึกษา รูปทรงที่เห็นอธิบายได้ด้วยความบังเอิญทั้งหมด
หน้าตาไฟล์ที่ต้องเตรียม
study,estimate,low,high,n
การทดลองที่ 1,3.37,0.57,6.17,630
การทดลองที่ 2,9.91,4.94,14.88,647
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ความสมมาตรของการกระจายซึ่งบ่งบอกความครบถ้วนของหลักฐาน
- มุมของกรวยที่ว่างผิดปกติ
- งานเล็กที่ให้ผลใหญ่ผิดปกติ
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ ยืนยันว่ามีอคติจากการตีพิมพ์จริง เพราะความไม่สมมาตรมีสาเหตุอื่นได้อีกหลายอย่าง
- จำนวนงานที่หายไป
- ค่าที่ถูกต้องถ้าไม่มีอคติ
อ่านตามลำดับนี้
- ดูว่าจุดกระจายสมมาตรรอบเส้นกลางหรือไม่
- มองหามุมล่างที่ว่างผิดปกติ
- ตรวจจำนวนการศึกษาก่อนว่ามากพอจะอ่านรูปทรงได้ไหม
คำถามที่ตอบได้
- หลักฐานที่เห็นน่าจะครบหรือถูกคัดมา
- มีงานเล็กที่ได้ผลตรงข้ามหายไปไหม
- งานไหนอยู่นอกกรวยซึ่งน่าสงสัย
สัญญาณว่ามีอะไรผิด
- ใช้กับการศึกษาน้อยกว่าสิบชิ้น
- สรุปว่ามีอคติทันทีที่เห็นความไม่สมมาตร
- ไม่วาดเส้นกรวยอ้างอิง
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ วาดเส้นกรวยที่ระดับนัยสำคัญเป็นกรอบอ้างอิง
- ระบุจำนวนการศึกษาไว้ให้ชัด
- เขียนเตือนว่าความไม่สมมาตรไม่ใช่หลักฐานเด็ดขาด
รูปแบบชื่อกราฟที่ควรใช้
การกระจายของผลจาก <จำนวน> การศึกษาเทียบกับขนาดตัวอย่าง
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ funnel-plot-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด funnel-plot-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("funnel-plot-sample.csv")
df["estimate"] = pd.to_numeric(df["estimate"], errors="coerce")
df["n"] = pd.to_numeric(df["n"], errors="coerce")
NOTE = "symmetry" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
center = df["estimate"].mean()
ns = np.linspace(df["n"].min(), df["n"].max(), 120)
se = 30 / np.sqrt(ns) # ความคลาดเคลื่อนลดลงตาม sqrt(n)
for z, ls in [(1.96, "--"), (2.58, ":")]: # เส้นกรวยอ้างอิง
ax.plot(center - z * se, ns, color="#8c887e", linestyle=ls, linewidth=1)
ax.plot(center + z * se, ns, color="#8c887e", linestyle=ls, linewidth=1)
ax.axvline(center, color="#8c887e", linewidth=1)
ax.scatter(df["estimate"], df["n"], s=46, color=C1, zorder=3)
ax.set_xlabel("ขนาดของผลที่รายงาน"); ax.set_ylabel("ขนาดตัวอย่าง (n)")
ax.set_title(f"{len(df)} การศึกษา — น้อยกว่า 10 ชิ้นอ่านรูปทรงไม่ได้", loc="left", fontsize=9)
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("funnel-plot.png", dpi=160)
print("เขียน funnel-plot.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
รูปกรวยที่ไม่สมมาตรเป็นเพียงสัญญาณ ไม่ใช่หลักฐานของการตีพิมพ์แบบลำเอียง
ดูข้อมูลเป็นตาราง (7 แถว)
| การศึกษา | ผล | n |
|---|---|---|
| การทดลองที่ 1 | 3.37 | 630 |
| การทดลองที่ 2 | 9.91 | 647 |
| การทดลองที่ 3 | 11.4 | 668 |
| การทดลองที่ 4 | 11.3 | 245 |
| การทดลองที่ 5 | 1.91 | 242 |
| การทดลองที่ 6 | 1.52 | 769 |
| การทดลองที่ 7 | 8.60 | 502 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: จุดควรกระจายกว้างด้านล่างที่ตัวอย่างน้อยและแคบด้านบนที่ตัวอย่างมาก — มุมล่างที่ว่างคือสัญญาณให้สงสัย
ข้อควรระวัง
- ★ สรุปว่ามีอคติจากการตีพิมพ์ทันทีที่เห็นความไม่สมมาตร ทั้งที่สาเหตุอื่นก็ทำให้เบี้ยวได้
- ใช้กับการศึกษาน้อยกว่าสิบชิ้นซึ่งอ่านรูปทรงไม่ได้เลย
- ไม่วาดเส้นกรวยอ้างอิง ทำให้ไม่มีเกณฑ์ตัดสินความสมมาตร
- ใช้แกนเชิงเส้นกับผลที่เป็นอัตราส่วน
เมื่อไหร่ไม่ควรใช้กราฟนี้
- มีการศึกษาน้อยกว่า 10 ชิ้น→ใช้แทน: forest-plot อย่างเดียวพร้อมหมายเหตุ
- ต้องการสรุปผลรวม→ใช้แทน: forest-plot
- ข้อมูลไม่ใช่การสังเคราะห์งานวิจัย→ใช้แทน: scatter-plot ธรรมดา