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

กราฟควอนไทล์เทียบควอนไทล์Q-Q Plot

ข้อมูลเบี่ยงจากการแจกแจงอ้างอิงตรงไหน

5
เฉพาะทางควรรู้ก่อน · เข้าใจควอนไทล์และการแจกแจงปกติ
ลองเล่น

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

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

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

เหมือนวางไม้บรรทัดสองอันเทียบกันทีละขีด ถ้าขีดตรงกันหมดแปลว่าไม้บรรทัดเหมือนกัน ถ้าปลายเบี่ยงแปลว่าต่างกันเฉพาะที่ปลาย

ใช้ที่ไหนบ้าง — ตรวจสมมติฐานความเป็นปกติก่อนใช้การทดสอบทางสถิติ ตรวจส่วนที่เหลือของโมเดล หรือเทียบการกระจายของสองกลุ่มโดยตรง

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

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

ตัวอย่างคลาสสิก · Normal probability plot ในการควบคุมคุณภาพอุตสาหกรรม

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

NIST/SEMATECH e-Handbook · Normal probability plot

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

วิธีทางสถิติหลายอย่างตั้งอยู่บนสมมติฐานว่าข้อมูลมีการแจกแจงแบบปกติ การดูฮิสโทแกรมแล้วบอกว่า "ดูเหมือนระฆัง" เป็นการตัดสินด้วยสายตาที่หยาบมาก

Q-Q plot ทำให้การเทียบแม่นขึ้นด้วยกลอุบายง่าย ๆ คือเปลี่ยนคำถามจาก "รูปร่างเหมือนกันไหม" เป็น "จุดเรียงเป็นเส้นตรงไหม" ซึ่งสายตามนุษย์ตัดสินได้ดีกว่ามาก

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

สิ่งที่มีค่าที่สุดคือรูปแบบของการเบี่ยง ถ้าปลายทั้งสองข้างโค้งขึ้น แปลว่าข้อมูลมีหางหนักกว่าทฤษฎี ถ้าโค้งเป็นรูปตัวซี แปลว่าข้อมูลเบ้ ซึ่งบอกได้ละเอียดกว่าคำตอบว่าปกติหรือไม่ปกติ

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

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

รูปทรงของข้อมูลข้อมูลดิบรายแถว (ยังไม่สรุป)
จำนวนมิติที่เข้ารหัสได้2 มิติ
จำนวนแถวที่เหมาะ50–5,000 แถวขั้นต่ำ 30 แถว
เส้นฐานศูนย์ไม่เกี่ยวข้องอ่านจากการเรียงตัวของจุดเทียบเส้นอ้างอิง ไม่ใช่ระยะจากศูนย์

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

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
valueค่าที่ต้องการตรวจตัวเลขต่อเนื่องyต่อเนื่องข้อมูลดิบ ควรมีอย่างน้อย 30 จุด

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

  1. เลือกการแจกแจงอ้างอิงและระบุไว้
  2. เรียงข้อมูล
  3. ตัดค่าว่างออก

ค่าที่หายไป — ตัดค่าว่างและรายงานจำนวน เพราะตำแหน่งควอนไทล์คำนวณจากจำนวนที่เหลือ

สเกลของแกน — ทั้งสองแกนเป็นสเกลของการแจกแจงที่เทียบกัน ไม่ควรแปลงสเกลเพิ่ม

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

ต่ำกว่า 30 จุด การเบี่ยงที่เห็นอาจเป็นแค่ความบังเอิญ

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

value

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

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

  • จุดเรียงเป็นเส้นตรงหรือโค้ง
  • การเบี่ยงที่ปลายซึ่งบอกเรื่องหาง
  • ความโค้งรูปตัวซีซึ่งบอกความเบ้

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

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

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

  1. ดูว่าจุดตรงกลางอยู่บนเส้นอ้างอิงไหม
  2. ดูปลายทั้งสองข้างว่าเบี่ยงขึ้นหรือลง
  3. ดูรูปแบบของการโค้งโดยรวม

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

  • ข้อมูลใกล้เคียงการแจกแจงปกติไหม
  • ข้อมูลเบี่ยงตรงไหน ที่กลางหรือที่หาง

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

  • ไม่ระบุว่าใช้การแจกแจงอ้างอิงแบบไหน
  • ใช้กับข้อมูลน้อยแล้วสรุปว่าไม่ปกติ

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

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

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

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

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

ข้อมูลใกล้เคียงการแจกแจงปกติที่ช่วงกลาง แต่มีหาง<หนัก/เบา>กว่าที่ <ปลาย>

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

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

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

ข้อมูลตัวอย่าง · 200 แถว · seed 113● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
ปลายที่เบี่ยงบอกเรื่องหางของการกระจาย
0.005.0010.015.020.025.030.0ค่าที่สังเกตได้-3.00-2.00-1.000.001.002.003.00ควอนไทล์ตามทฤษฎี (normal)ทฤษฎี -2.81 · สังเกต 4.24ทฤษฎี -2.43 · สังเกต 4.36ทฤษฎี -2.24 · สังเกต 4.61ทฤษฎี -2.11 · สังเกต 4.72ทฤษฎี -2.00 · สังเกต 5.72ทฤษฎี -1.92 · สังเกต 5.73ทฤษฎี -1.85 · สังเกต 5.78ทฤษฎี -1.78 · สังเกต 5.79ทฤษฎี -1.72 · สังเกต 6.03ทฤษฎี -1.67 · สังเกต 6.05ทฤษฎี -1.62 · สังเกต 6.07ทฤษฎี -1.58 · สังเกต 6.12ทฤษฎี -1.53 · สังเกต 6.14ทฤษฎี -1.49 · สังเกต 6.27ทฤษฎี -1.46 · สังเกต 6.44ทฤษฎี -1.42 · สังเกต 6.45ทฤษฎี -1.39 · สังเกต 6.50ทฤษฎี -1.36 · สังเกต 6.56ทฤษฎี -1.33 · สังเกต 6.60ทฤษฎี -1.30 · สังเกต 6.70ทฤษฎี -1.27 · สังเกต 6.73ทฤษฎี -1.24 · สังเกต 6.81ทฤษฎี -1.21 · สังเกต 6.85ทฤษฎี -1.19 · สังเกต 7.13ทฤษฎี -1.16 · สังเกต 7.16ทฤษฎี -1.14 · สังเกต 7.24ทฤษฎี -1.11 · สังเกต 7.29ทฤษฎี -1.09 · สังเกต 7.36ทฤษฎี -1.07 · สังเกต 7.44ทฤษฎี -1.05 · สังเกต 7.57ทฤษฎี -1.03 · สังเกต 7.58ทฤษฎี -1.00 · สังเกต 7.60ทฤษฎี -0.98 · สังเกต 7.78ทฤษฎี -0.96 · สังเกต 7.83ทฤษฎี -0.94 · สังเกต 7.91ทฤษฎี -0.92 · สังเกต 7.93ทฤษฎี -0.91 · สังเกต 7.99ทฤษฎี -0.89 · สังเกต 8.03ทฤษฎี -0.87 · สังเกต 8.07ทฤษฎี -0.85 · สังเกต 8.09ทฤษฎี -0.83 · สังเกต 8.15ทฤษฎี -0.82 · สังเกต 8.18ทฤษฎี -0.80 · สังเกต 8.36ทฤษฎี -0.78 · สังเกต 8.46ทฤษฎี -0.76 · สังเกต 8.49ทฤษฎี -0.75 · สังเกต 8.53ทฤษฎี -0.73 · สังเกต 8.61ทฤษฎี -0.71 · สังเกต 8.62ทฤษฎี -0.70 · สังเกต 8.63ทฤษฎี -0.68 · สังเกต 8.64ทฤษฎี -0.67 · สังเกต 8.64ทฤษฎี -0.65 · สังเกต 8.64ทฤษฎี -0.64 · สังเกต 8.65ทฤษฎี -0.62 · สังเกต 8.69ทฤษฎี -0.61 · สังเกต 8.82ทฤษฎี -0.59 · สังเกต 8.83ทฤษฎี -0.58 · สังเกต 8.86ทฤษฎี -0.56 · สังเกต 8.88ทฤษฎี -0.55 · สังเกต 8.95ทฤษฎี -0.53 · สังเกต 8.97ทฤษฎี -0.52 · สังเกต 9.09ทฤษฎี -0.50 · สังเกต 9.15ทฤษฎี -0.49 · สังเกต 9.17ทฤษฎี -0.47 · สังเกต 9.21ทฤษฎี -0.46 · สังเกต 9.32ทฤษฎี -0.45 · สังเกต 9.35ทฤษฎี -0.43 · สังเกต 9.39ทฤษฎี -0.42 · สังเกต 9.42ทฤษฎี -0.41 · สังเกต 9.47ทฤษฎี -0.39 · สังเกต 9.50ทฤษฎี -0.38 · สังเกต 9.54ทฤษฎี -0.37 · สังเกต 9.54ทฤษฎี -0.35 · สังเกต 9.59ทฤษฎี -0.34 · สังเกต 9.65ทฤษฎี -0.33 · สังเกต 9.66ทฤษฎี -0.31 · สังเกต 9.67ทฤษฎี -0.30 · สังเกต 9.70ทฤษฎี -0.29 · สังเกต 9.82ทฤษฎี -0.27 · สังเกต 9.83ทฤษฎี -0.26 · สังเกต 9.88ทฤษฎี -0.25 · สังเกต 9.88ทฤษฎี -0.23 · สังเกต 9.92ทฤษฎี -0.22 · สังเกต 9.94ทฤษฎี -0.21 · สังเกต 10.02ทฤษฎี -0.20 · สังเกต 10.07ทฤษฎี -0.18 · สังเกต 10.08ทฤษฎี -0.17 · สังเกต 10.15ทฤษฎี -0.16 · สังเกต 10.22ทฤษฎี -0.14 · สังเกต 10.27ทฤษฎี -0.13 · สังเกต 10.33ทฤษฎี -0.12 · สังเกต 10.52ทฤษฎี -0.11 · สังเกต 10.77ทฤษฎี -0.09 · สังเกต 10.83ทฤษฎี -0.08 · สังเกต 10.93ทฤษฎี -0.07 · สังเกต 11.01ทฤษฎี -0.06 · สังเกต 11.16ทฤษฎี -0.04 · สังเกต 11.18ทฤษฎี -0.03 · สังเกต 11.29ทฤษฎี -0.02 · สังเกต 11.37ทฤษฎี -0.01 · สังเกต 11.41ทฤษฎี 0.01 · สังเกต 11.44ทฤษฎี 0.02 · สังเกต 11.45ทฤษฎี 0.03 · สังเกต 11.45ทฤษฎี 0.04 · สังเกต 11.45ทฤษฎี 0.06 · สังเกต 11.49ทฤษฎี 0.07 · สังเกต 11.53ทฤษฎี 0.08 · สังเกต 11.55ทฤษฎี 0.09 · สังเกต 11.55ทฤษฎี 0.11 · สังเกต 11.61ทฤษฎี 0.12 · สังเกต 11.65ทฤษฎี 0.13 · สังเกต 11.73ทฤษฎี 0.14 · สังเกต 11.78ทฤษฎี 0.16 · สังเกต 11.82ทฤษฎี 0.17 · สังเกต 11.90ทฤษฎี 0.18 · สังเกต 11.95ทฤษฎี 0.20 · สังเกต 12.10ทฤษฎี 0.21 · สังเกต 12.12ทฤษฎี 0.22 · สังเกต 12.16ทฤษฎี 0.23 · สังเกต 12.18ทฤษฎี 0.25 · สังเกต 12.18ทฤษฎี 0.26 · สังเกต 12.18ทฤษฎี 0.27 · สังเกต 12.21ทฤษฎี 0.29 · สังเกต 12.27ทฤษฎี 0.30 · สังเกต 12.32ทฤษฎี 0.31 · สังเกต 12.40ทฤษฎี 0.33 · สังเกต 12.42ทฤษฎี 0.34 · สังเกต 12.57ทฤษฎี 0.35 · สังเกต 12.75ทฤษฎี 0.37 · สังเกต 12.83ทฤษฎี 0.38 · สังเกต 12.87ทฤษฎี 0.39 · สังเกต 12.95ทฤษฎี 0.41 · สังเกต 12.97ทฤษฎี 0.42 · สังเกต 13.11ทฤษฎี 0.43 · สังเกต 13.12ทฤษฎี 0.45 · สังเกต 13.19ทฤษฎี 0.46 · สังเกต 13.22ทฤษฎี 0.47 · สังเกต 13.23ทฤษฎี 0.49 · สังเกต 13.23ทฤษฎี 0.50 · สังเกต 13.32ทฤษฎี 0.52 · สังเกต 13.32ทฤษฎี 0.53 · สังเกต 13.39ทฤษฎี 0.55 · สังเกต 13.47ทฤษฎี 0.56 · สังเกต 13.50ทฤษฎี 0.58 · สังเกต 13.60ทฤษฎี 0.59 · สังเกต 13.61ทฤษฎี 0.61 · สังเกต 13.64ทฤษฎี 0.62 · สังเกต 13.74ทฤษฎี 0.64 · สังเกต 13.75ทฤษฎี 0.65 · สังเกต 13.76ทฤษฎี 0.67 · สังเกต 13.80ทฤษฎี 0.68 · สังเกต 13.80ทฤษฎี 0.70 · สังเกต 13.87ทฤษฎี 0.71 · สังเกต 13.87ทฤษฎี 0.73 · สังเกต 14.05ทฤษฎี 0.75 · สังเกต 14.10ทฤษฎี 0.76 · สังเกต 14.46ทฤษฎี 0.78 · สังเกต 14.47ทฤษฎี 0.80 · สังเกต 14.53ทฤษฎี 0.82 · สังเกต 14.61ทฤษฎี 0.83 · สังเกต 14.74ทฤษฎี 0.85 · สังเกต 14.82ทฤษฎี 0.87 · สังเกต 14.90ทฤษฎี 0.89 · สังเกต 14.94ทฤษฎี 0.91 · สังเกต 15.00ทฤษฎี 0.92 · สังเกต 15.06ทฤษฎี 0.94 · สังเกต 15.13ทฤษฎี 0.96 · สังเกต 15.24ทฤษฎี 0.98 · สังเกต 15.26ทฤษฎี 1.00 · สังเกต 15.30ทฤษฎี 1.03 · สังเกต 15.52ทฤษฎี 1.05 · สังเกต 15.54ทฤษฎี 1.07 · สังเกต 15.90ทฤษฎี 1.09 · สังเกต 16.00ทฤษฎี 1.11 · สังเกต 16.07ทฤษฎี 1.14 · สังเกต 16.30ทฤษฎี 1.16 · สังเกต 16.31ทฤษฎี 1.19 · สังเกต 16.34ทฤษฎี 1.21 · สังเกต 16.44ทฤษฎี 1.24 · สังเกต 16.48ทฤษฎี 1.27 · สังเกต 16.50ทฤษฎี 1.30 · สังเกต 16.62ทฤษฎี 1.33 · สังเกต 17.08ทฤษฎี 1.36 · สังเกต 17.25ทฤษฎี 1.39 · สังเกต 17.31ทฤษฎี 1.42 · สังเกต 17.74ทฤษฎี 1.46 · สังเกต 17.92ทฤษฎี 1.49 · สังเกต 18.80ทฤษฎี 1.53 · สังเกต 18.86ทฤษฎี 1.58 · สังเกต 19.31ทฤษฎี 1.62 · สังเกต 19.51ทฤษฎี 1.67 · สังเกต 19.84ทฤษฎี 1.72 · สังเกต 20.74ทฤษฎี 1.78 · สังเกต 20.90ทฤษฎี 1.85 · สังเกต 21.22ทฤษฎี 1.92 · สังเกต 21.25ทฤษฎี 2.00 · สังเกต 22.16ทฤษฎี 2.11 · สังเกต 22.62ทฤษฎี 2.24 · สังเกต 24.23ทฤษฎี 2.43 · สังเกต 26.90ทฤษฎี 2.81 · สังเกต 27.37
ความเบ้0.93
จุดที่ห่างเส้นมากสุด5.05
จำนวนข้อมูล200
ดูข้อมูลเป็นตาราง (17 แถว)
Q-Q plot เทียบกับการแจกแจงปกติ 200 จุด
ควอนไทล์ทฤษฎีค่าสังเกต
-2.814.24
-1.536.14
-1.167.16
-0.917.99
-0.708.63
-0.529.09
-0.359.59
-0.2010.07
-0.0411.18
0.1111.61
0.2612.18
0.4213.11
0.5913.61
0.7814.47
1.0015.30
1.3016.62
1.7820.90

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

  • สังเกตอะไร: ข้อมูลชุดนี้เบ้ขวา สังเกตว่าปลายขวาโค้งขึ้นจากเส้นอ้างอิงชัดเจน ซึ่งเป็นลายเซ็นของการเบ้ที่ฮิสโทแกรมบอกได้ไม่ละเอียดเท่านี้

ข้อควรระวัง

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

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

  • ผู้อ่านไม่มีพื้นฐานสถิติใช้แทน: histogram พร้อมเส้นการแจกแจงอ้างอิงทับ
  • ต้องการค่าทดสอบทางสถิติใช้แทน: การทดสอบความเป็นปกติควบคู่กับกราฟนี้
  • ต้องการเทียบสองกลุ่มที่มีข้อมูลจริงทั้งคู่ใช้แทน: ecdf-plot ที่ซ้อนสองเส้น

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

เทคนิคถัดไป · กราฟขีดข้อมูล