01ภาพรวมของกราฟนี้
Q-Q plot เทียบควอนไทล์ของข้อมูลจริงกับควอนไทล์ของการแจกแจงอ้างอิง ถ้าข้อมูลมาจากการแจกแจงนั้นจริง จุดจะเรียงเป็นเส้นตรง ความโค้งหรือการเบี่ยงที่ปลายจึงบอกได้อย่างละเอียดว่าข้อมูลต่างจากทฤษฎีตรงไหน
เปรียบเทียบให้เห็นภาพ
เหมือนวางไม้บรรทัดสองอันเทียบกันทีละขีด ถ้าขีดตรงกันหมดแปลว่าไม้บรรทัดเหมือนกัน ถ้าปลายเบี่ยงแปลว่าต่างกันเฉพาะที่ปลาย
ใช้ที่ไหนบ้าง — ตรวจสมมติฐานความเป็นปกติก่อนใช้การทดสอบทางสถิติ ตรวจส่วนที่เหลือของโมเดล หรือเทียบการกระจายของสองกลุ่มโดยตรง
สร้างอย่างไร
- ขั้นที่ 1เรียงข้อมูลจากน้อยไปมาก
- ขั้นที่ 2คำนวณควอนไทล์ตามทฤษฎีของแต่ละตำแหน่ง
- ขั้นที่ 3วาดจุดคู่กัน
- ขั้นที่ 4ลากเส้นอ้างอิงเพื่อเทียบ
ตัวอย่างคลาสสิก · Normal probability plot ในการควบคุมคุณภาพอุตสาหกรรม
ก่อนมีคอมพิวเตอร์ วิศวกรใช้กระดาษกราฟพิเศษที่แกนถูกยืดตามการแจกแจงปกติไว้แล้ว การพล็อตข้อมูลลงบนกระดาษนั้นแล้วดูว่าเป็นเส้นตรงไหม เป็นวิธีตรวจความเป็นปกติที่ทำได้ในโรงงานโดยไม่ต้องคำนวณอะไรเลย
02อธิบายภาษาคนเข้าใจง่าย ๆ
วิธีทางสถิติหลายอย่างตั้งอยู่บนสมมติฐานว่าข้อมูลมีการแจกแจงแบบปกติ การดูฮิสโทแกรมแล้วบอกว่า "ดูเหมือนระฆัง" เป็นการตัดสินด้วยสายตาที่หยาบมาก
Q-Q plot ทำให้การเทียบแม่นขึ้นด้วยกลอุบายง่าย ๆ คือเปลี่ยนคำถามจาก "รูปร่างเหมือนกันไหม" เป็น "จุดเรียงเป็นเส้นตรงไหม" ซึ่งสายตามนุษย์ตัดสินได้ดีกว่ามาก
วิธีทำคือเรียงข้อมูลจริงจากน้อยไปมาก แล้วเทียบแต่ละตัวกับค่าที่ควรจะเป็นถ้าข้อมูลมาจากการแจกแจงอ้างอิง ถ้าตรงกันทุกตัว จุดก็จะเรียงบนเส้นทแยงมุมพอดี
สิ่งที่มีค่าที่สุดคือรูปแบบของการเบี่ยง ถ้าปลายทั้งสองข้างโค้งขึ้น แปลว่าข้อมูลมีหางหนักกว่าทฤษฎี ถ้าโค้งเป็นรูปตัวซี แปลว่าข้อมูลเบ้ ซึ่งบอกได้ละเอียดกว่าคำตอบว่าปกติหรือไม่ปกติ
ข้อควรระวังคือกับข้อมูลจำนวนมาก การเบี่ยงเล็กน้อยที่ไม่สำคัญในทางปฏิบัติก็จะเห็นชัด ส่วนกับข้อมูลน้อยจุดจะแกว่งจนดูเบี่ยงทั้งที่อาจไม่มีอะไร
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
value | ค่าที่ต้องการตรวจ | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ข้อมูลดิบ ควรมีอย่างน้อย 30 จุด |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- เลือกการแจกแจงอ้างอิงและระบุไว้
- เรียงข้อมูล
- ตัดค่าว่างออก
ค่าที่หายไป — ตัดค่าว่างและรายงานจำนวน เพราะตำแหน่งควอนไทล์คำนวณจากจำนวนที่เหลือ
สเกลของแกน — ทั้งสองแกนเป็นสเกลของการแจกแจงที่เทียบกัน ไม่ควรแปลงสเกลเพิ่ม
กราฟจะเริ่มพังเมื่อไร
ต่ำกว่า 30 จุด การเบี่ยงที่เห็นอาจเป็นแค่ความบังเอิญ
หน้าตาไฟล์ที่ต้องเตรียม
value
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- จุดเรียงเป็นเส้นตรงหรือโค้ง
- การเบี่ยงที่ปลายซึ่งบอกเรื่องหาง
- ความโค้งรูปตัวซีซึ่งบอกความเบ้
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่ให้ค่าทดสอบทางสถิติ เป็นการตรวจด้วยสายตา
- ไม่บอกว่าการเบี่ยงที่เห็นสำคัญพอที่จะเปลี่ยนวิธีวิเคราะห์หรือไม่
อ่านตามลำดับนี้
- ดูว่าจุดตรงกลางอยู่บนเส้นอ้างอิงไหม
- ดูปลายทั้งสองข้างว่าเบี่ยงขึ้นหรือลง
- ดูรูปแบบของการโค้งโดยรวม
คำถามที่ตอบได้
- ข้อมูลใกล้เคียงการแจกแจงปกติไหม
- ข้อมูลเบี่ยงตรงไหน ที่กลางหรือที่หาง
สัญญาณว่ามีอะไรผิด
- ไม่ระบุว่าใช้การแจกแจงอ้างอิงแบบไหน
- ใช้กับข้อมูลน้อยแล้วสรุปว่าไม่ปกติ
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ลากเส้นอ้างอิงและระบุว่าเป็นการแจกแจงอะไร
- เขียนจำนวนข้อมูล
- ทำเครื่องหมายจุดที่เบี่ยงมากที่สุด
รูปแบบชื่อกราฟที่ควรใช้
ข้อมูลใกล้เคียงการแจกแจงปกติที่ช่วงกลาง แต่มีหาง<หนัก/เบา>กว่าที่ <ปลาย>
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ qq-plot-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด qq-plot-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats # pip install scipy
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("qq-plot-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
NOTE = "tails" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
v = df["value"].dropna()
stats.probplot(v, dist="norm", plot=ax) # dist="norm" คือการแจกแจงอ้างอิงที่ต้องระบุ
ax.get_lines()[0].set(color=C1, markersize=4, alpha=0.7)
ax.get_lines()[1].set(color=INK, linestyle="--", linewidth=1.4)
ax.set_title(f"เทียบกับการแจกแจงปกติ · n = {len(v)}", loc="left")
ax.set_xlabel("ควอนไทล์ตามทฤษฎี"); ax.set_ylabel("ค่าที่สังเกตได้")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("qq-plot.png", dpi=160)
print("เขียน qq-plot.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (17 แถว)
| ควอนไทล์ทฤษฎี | ค่าสังเกต |
|---|---|
| -2.81 | 4.24 |
| -1.53 | 6.14 |
| -1.16 | 7.16 |
| -0.91 | 7.99 |
| -0.70 | 8.63 |
| -0.52 | 9.09 |
| -0.35 | 9.59 |
| -0.20 | 10.07 |
| -0.04 | 11.18 |
| 0.11 | 11.61 |
| 0.26 | 12.18 |
| 0.42 | 13.11 |
| 0.59 | 13.61 |
| 0.78 | 14.47 |
| 1.00 | 15.30 |
| 1.30 | 16.62 |
| 1.78 | 20.90 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: ข้อมูลชุดนี้เบ้ขวา สังเกตว่าปลายขวาโค้งขึ้นจากเส้นอ้างอิงชัดเจน ซึ่งเป็นลายเซ็นของการเบ้ที่ฮิสโทแกรมบอกได้ไม่ละเอียดเท่านี้
ข้อควรระวัง
- ไม่ระบุว่าใช้การแจกแจงอ้างอิงแบบไหน ทำให้ตีความการเบี่ยงไม่ได้
- ใช้กับข้อมูลน้อยแล้วสรุปว่าข้อมูลไม่ปกติจากการแกว่งที่ปลาย
- สรุปว่าข้อมูลไม่ปกติเพราะเห็นการเบี่ยงเล็กน้อยกับข้อมูลจำนวนมาก โดยไม่ถามว่าสำคัญในทางปฏิบัติไหม
- ใช้เป็นภาพสื่อสารกับผู้อ่านทั่วไปที่ไม่มีพื้นฐาน
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ผู้อ่านไม่มีพื้นฐานสถิติ→ใช้แทน: histogram พร้อมเส้นการแจกแจงอ้างอิงทับ
- ต้องการค่าทดสอบทางสถิติ→ใช้แทน: การทดสอบความเป็นปกติควบคู่กับกราฟนี้
- ต้องการเทียบสองกลุ่มที่มีข้อมูลจริงทั้งคู่→ใช้แทน: ecdf-plot ที่ซ้อนสองเส้น