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

ฟันเนลพล็อตFunnel Plot

ตรวจว่าหลักฐานที่เห็นถูกคัดมาหรือไม่

5
เฉพาะทางควรรู้ก่อน · เข้าใจ forest plot และแนวคิดอคติจากการตีพิมพ์
ลองเล่น

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

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

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

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

ใช้ที่ไหนบ้าง — ตรวจอคติจากการตีพิมพ์ในการสังเคราะห์งานวิจัย หรือตรวจว่าผลการทดลองภายในองค์กรถูกรายงานครบหรือไม่

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

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

ตัวอย่างคลาสสิก · Funnel plot กับปัญหาอคติจากการตีพิมพ์

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

Wikipedia · Funnel plot

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

งานวิจัยที่ได้ผลชัดเจนมีโอกาสถูกตีพิมพ์มากกว่างานที่ได้ผลไม่ชัด ซึ่งแปลว่าหลักฐานที่เรามองเห็นอาจถูกคัดมาแล้ว

ผลที่ตามมาคือค่าสรุปจาก forest plot อาจสูงเกินจริงอย่างเป็นระบบ ทั้งที่การคำนวณถูกต้องทุกขั้นตอน

Funnel plot ตรวจเรื่องนี้ด้วยตรรกะง่าย ๆ คืองานที่มีตัวอย่างน้อยย่อมได้ผลกระจัดกระจายกว่างานที่มีตัวอย่างมาก ดังนั้นถ้าไม่มีอคติ จุดควรกระจายเป็นกรวยที่สมมาตร กว้างด้านล่างและแคบด้านบน

ถ้ามุมล่างด้านหนึ่งของกรวยว่างผิดปกติ ก็ชวนให้สงสัยว่างานเล็กที่ได้ผลไปทางนั้นมีอยู่แต่ไม่ได้ถูกตีพิมพ์

ข้อจำกัดที่ต้องพูดให้ชัดคือความไม่สมมาตรมีสาเหตุอื่นได้อีกหลายอย่าง เช่น งานเล็กมักทำในกลุ่มที่ตอบสนองดีกว่า หรือคุณภาพงานต่างกันอย่างเป็นระบบ

และเมื่อมีการศึกษาน้อยกว่าราวสิบชิ้น การดูรูปทรงด้วยตาก็แทบไม่มีความหมายเลย เพราะความบังเอิญอธิบายรูปทรงที่เห็นได้ทั้งหมด

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

รูปทรงของข้อมูลตารางแบบยาว (หนึ่งแถวหนึ่งสังเกต)
จำนวนมิติที่เข้ารหัสได้3 มิติ
จำนวนแถวที่เหมาะ15–100 การศึกษาขั้นต่ำ 10 แถว
เส้นฐานศูนย์ไม่เกี่ยวข้องทั้งสองแกนสื่อผลและความแม่น ไม่ใช่ปริมาณ

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

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
studyชื่อการศึกษาหมวดหมู่text10–200 การศึกษาใช้ใน tooltip
estimateขนาดของผลตัวเลขต่อเนื่องxต่อเนื่องแกนนอน
nขนาดตัวอย่างจำนวนนับyบวกเท่านั้น★ แกนตั้ง โดยค่ามากอยู่ด้านบน

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

  1. แปลงผลให้อยู่ในหน่วยเดียวกัน
  2. คำนวณความแม่นหรือความคลาดเคลื่อนมาตรฐานของแต่ละงาน
  3. ★ บันทึกจำนวนการศึกษาไว้ เพราะน้อยเกินแล้วอ่านไม่ได้

ค่าที่หายไป — งานที่ไม่รายงานขนาดตัวอย่างต้องตัดออกและระบุจำนวน

สเกลของแกน — แกนตั้งควรให้งานที่แม่นกว่าอยู่ด้านบน และถ้าผลเป็นอัตราส่วนควรใช้แกนนอนเป็นลอการิทึม

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

น้อยกว่า 10 การศึกษา รูปทรงที่เห็นอธิบายได้ด้วยความบังเอิญทั้งหมด

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

study,estimate,low,high,n
การทดลองที่ 1,3.37,0.57,6.17,630
การทดลองที่ 2,9.91,4.94,14.88,647

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

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

  • ความสมมาตรของการกระจายซึ่งบ่งบอกความครบถ้วนของหลักฐาน
  • มุมของกรวยที่ว่างผิดปกติ
  • งานเล็กที่ให้ผลใหญ่ผิดปกติ

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

  • ★ ยืนยันว่ามีอคติจากการตีพิมพ์จริง เพราะความไม่สมมาตรมีสาเหตุอื่นได้อีกหลายอย่าง
  • จำนวนงานที่หายไป
  • ค่าที่ถูกต้องถ้าไม่มีอคติ

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

  1. ดูว่าจุดกระจายสมมาตรรอบเส้นกลางหรือไม่
  2. มองหามุมล่างที่ว่างผิดปกติ
  3. ตรวจจำนวนการศึกษาก่อนว่ามากพอจะอ่านรูปทรงได้ไหม

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

  • หลักฐานที่เห็นน่าจะครบหรือถูกคัดมา
  • มีงานเล็กที่ได้ผลตรงข้ามหายไปไหม
  • งานไหนอยู่นอกกรวยซึ่งน่าสงสัย

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

  • ใช้กับการศึกษาน้อยกว่าสิบชิ้น
  • สรุปว่ามีอคติทันทีที่เห็นความไม่สมมาตร
  • ไม่วาดเส้นกรวยอ้างอิง

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

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

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

  1. ★ วาดเส้นกรวยที่ระดับนัยสำคัญเป็นกรอบอ้างอิง
  2. ระบุจำนวนการศึกษาไว้ให้ชัด
  3. เขียนเตือนว่าความไม่สมมาตรไม่ใช่หลักฐานเด็ดขาด

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

การกระจายของผลจาก <จำนวน> การศึกษาเทียบกับขนาดตัวอย่าง

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

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

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

ข้อมูลตัวอย่าง · 7 แถว · seed 419● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
สมมาตร = น่าจะครบ
ขนาดตัวอย่าง (n)0.002.004.006.008.0010.012.0ขนาดของผลที่รายงานการทดลองที่ 1 · n=630การทดลองที่ 2 · n=647การทดลองที่ 3 · n=668การทดลองที่ 4 · n=245การทดลองที่ 5 · n=242การทดลองที่ 6 · n=769การทดลองที่ 7 · n=502

รูปกรวยที่ไม่สมมาตรเป็นเพียงสัญญาณ ไม่ใช่หลักฐานของการตีพิมพ์แบบลำเอียง

ค่ากลาง6.86
อยู่นอกกรวย 95%6 จาก 7
ช่วง n242–769
ดูข้อมูลเป็นตาราง (7 แถว)
funnel plot 7 การศึกษา
การศึกษาผลn
การทดลองที่ 13.37630
การทดลองที่ 29.91647
การทดลองที่ 311.4668
การทดลองที่ 411.3245
การทดลองที่ 51.91242
การทดลองที่ 61.52769
การทดลองที่ 78.60502

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

  • สังเกตอะไร: จุดควรกระจายกว้างด้านล่างที่ตัวอย่างน้อยและแคบด้านบนที่ตัวอย่างมาก — มุมล่างที่ว่างคือสัญญาณให้สงสัย

ข้อควรระวัง

  1. ★ สรุปว่ามีอคติจากการตีพิมพ์ทันทีที่เห็นความไม่สมมาตร ทั้งที่สาเหตุอื่นก็ทำให้เบี้ยวได้
  2. ใช้กับการศึกษาน้อยกว่าสิบชิ้นซึ่งอ่านรูปทรงไม่ได้เลย
  3. ไม่วาดเส้นกรวยอ้างอิง ทำให้ไม่มีเกณฑ์ตัดสินความสมมาตร
  4. ใช้แกนเชิงเส้นกับผลที่เป็นอัตราส่วน

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

  • มีการศึกษาน้อยกว่า 10 ชิ้นใช้แทน: forest-plot อย่างเดียวพร้อมหมายเหตุ
  • ต้องการสรุปผลรวมใช้แทน: forest-plot
  • ข้อมูลไม่ใช่การสังเคราะห์งานวิจัยใช้แทน: scatter-plot ธรรมดา

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

เทคนิคถัดไป · กราฟขนาดของผล