01ภาพรวมของกราฟนี้
Tableplot เรียงข้อมูลตามตัวแปรหนึ่งแล้วยุบเป็นกลุ่มละเท่า ๆ กัน จากนั้นแสดงค่าสรุปของทุกคอลัมน์เรียงข้างกัน ทำให้ดูข้อมูลหลายล้านแถวได้ในภาพเดียวและเห็นว่าคอลัมน์อื่นเปลี่ยนอย่างไรตามคอลัมน์ที่ใช้เรียง แลกกับการที่ค่าผิดปกติรายแถวหายไปหมด
เปรียบเทียบให้เห็นภาพ
เหมือนดูภาพตัดขวางของชั้นหินที่เรียงตามความลึก ซึ่งเห็นว่าองค์ประกอบเปลี่ยนไปอย่างไรตามระดับ
ใช้ที่ไหนบ้าง — สำรวจข้อมูลขนาดใหญ่ก่อนวิเคราะห์ลึก ตรวจคุณภาพข้อมูล หรือดูว่าตัวแปรอื่นเปลี่ยนไปอย่างไรตามตัวแปรเป้าหมาย
สร้างอย่างไร
- ขั้นที่ 1★ เลือกคอลัมน์ที่ใช้เรียงซึ่งเป็นการตัดสินใจที่สำคัญที่สุด
- ขั้นที่ 2เรียงข้อมูลแล้วแบ่งเป็นกลุ่มละเท่า ๆ กันประมาณร้อยกลุ่ม
- ขั้นที่ 3คำนวณค่าสรุปของทุกคอลัมน์ในแต่ละกลุ่ม
- ขั้นที่ 4วาดแต่ละคอลัมน์เป็นแถบเรียงข้างกันโดยใช้ลำดับแถวเดียวกัน
ตัวอย่างคลาสสิก · Tableplot ในการสำรวจข้อมูลสำมะโนขนาดใหญ่
Tennekes และ de Jonge จากสำนักงานสถิติเนเธอร์แลนด์พัฒนา tableplot ขึ้นเพื่อตรวจคุณภาพข้อมูลสำมะโนที่มีหลายล้านแถว โดยพบว่าภาพนี้เผยปัญหาค่าที่หายไปแบบมีรูปแบบ ซึ่งการสุ่มตัวอย่างมาตรวจมักมองข้าม
02อธิบายภาษาคนเข้าใจง่าย ๆ
เมื่อข้อมูลมีหลายแสนหรือหลายล้านแถว การดูตารางดิบเป็นไปไม่ได้ และการสุ่มตัวอย่างมาดูก็เสี่ยงพลาดรูปแบบที่สำคัญ
Tableplot แก้ด้วยการยุบแถวแทนที่จะสุ่ม โดยเรียงข้อมูลตามคอลัมน์หนึ่ง แล้วแบ่งเป็นกลุ่มละเท่า ๆ กันประมาณร้อยกลุ่ม จากนั้นสรุปค่าของทุกคอลัมน์ในแต่ละกลุ่ม
สิ่งที่ได้คือภาพที่ทุกคอลัมน์ใช้ลำดับแถวเดียวกัน ทำให้เห็นทันทีว่าเมื่อคอลัมน์ที่ใช้เรียงเพิ่มขึ้น คอลัมน์อื่นเปลี่ยนไปอย่างไรบ้าง
จุดแข็งที่ชัดเจนคือมันใช้ข้อมูลทุกแถวจริง ๆ ไม่ใช่ตัวอย่าง จึงไม่มีความเสี่ยงว่าจะพลาดอะไรเพราะการสุ่ม และยังเผยรูปแบบของค่าที่หายไปได้ดีมากเพราะช่องว่างจะเห็นเป็นแถบชัดเจน
ราคาที่จ่ายข้อแรกคือค่าผิดปกติรายแถวหายไปหมด เพราะทุกอย่างถูกยุบเป็นค่าสรุปของกลุ่มแล้ว ถ้าเป้าหมายคือหาค่าผิดปกติ ภาพนี้ตอบไม่ได้เลย
ข้อที่สองคือคอลัมน์ที่เลือกใช้เรียงเปลี่ยนภาพทั้งหมด ความสัมพันธ์ที่เห็นเป็นความสัมพันธ์กับคอลัมน์นั้นเท่านั้น และการเปลี่ยนคอลัมน์ที่ใช้เรียงก็เท่ากับเปลี่ยนคำถามที่ถาม
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
itemไม่บังคับ | ตัวระบุแถว | หมวดหมู่ | text | 100–10,000,000 แถว | ไม่ได้แสดงในภาพ |
groupไม่บังคับ | กลุ่ม | หมวดหมู่ | color | 2–8 กลุ่ม | แสดงเป็นสัดส่วนในแต่ละแถบ |
ราคา | คอลัมน์ที่ใช้เรียง | ตัวเลขต่อเนื่อง | order | ต่อเนื่อง | ★ การเลือกคอลัมน์นี้เปลี่ยนภาพทั้งหมด |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ★ เลือกและบันทึกคอลัมน์ที่ใช้เรียง
- ตัดสินใจว่าจะใช้ค่าเฉลี่ยหรือมัธยฐานเป็นค่าสรุป
- จัดการหน่วยของแต่ละคอลัมน์ให้แสดงผลได้
ค่าที่หายไป — ★ จุดแข็งของภาพนี้คือค่าที่หายไปจะเห็นเป็นแถบชัดเจน จึงต้องแสดงให้เห็นไม่ใช่ซ่อน
สเกลของแกน — แต่ละคอลัมน์ใช้สเกลของตัวเองได้เพราะหน่วยต่างกัน แต่ต้องเขียนช่วงค่ากำกับทุกคอลัมน์
กราฟจะเริ่มพังเมื่อไร
น้อยกว่า 200 แถว การยุบเป็นกลุ่มไม่ช่วยอะไรและตารางธรรมดาอ่านง่ายกว่า
หน้าตาไฟล์ที่ต้องเตรียม
item,group,ราคา,ความเร็ว,ความจุ,น้ำหนัก,คะแนนรีวิว
รุ่น A,รุ่นประหยัด,167,48.5,17.6,30.9,3.17
รุ่น B,รุ่นมาตรฐาน,301,55.7,30.4,20,4.09
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ความสัมพันธ์ระหว่างคอลัมน์ที่ใช้เรียงกับคอลัมน์อื่น
- รูปแบบของค่าที่หายไป
- จุดหักที่คอลัมน์อื่นเปลี่ยนพฤติกรรมกะทันหัน
- คอลัมน์ที่ไม่สัมพันธ์กับคอลัมน์ที่ใช้เรียงเลย
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ ค่าผิดปกติรายแถว เพราะถูกยุบเป็นค่าสรุปของกลุ่มไปหมดแล้ว
- ความสัมพันธ์ระหว่างคอลัมน์อื่นที่ไม่ใช่คอลัมน์ที่ใช้เรียง
- การกระจายภายในแต่ละกลุ่ม
อ่านตามลำดับนี้
- ดูคอลัมน์ซ้ายสุดก่อนซึ่งคือคอลัมน์ที่ใช้เรียง
- กวาดสายตาลงทีละคอลัมน์เพื่อดูว่าเปลี่ยนไปพร้อมกันไหม
- มองหาแถบที่แสดงค่าที่หายไป
คำถามที่ตอบได้
- เมื่อตัวแปรนี้เพิ่มขึ้น ตัวแปรอื่นเปลี่ยนอย่างไร
- ค่าที่หายไปกระจุกอยู่ช่วงไหน
- มีจุดหักในความสัมพันธ์ไหม
สัญญาณว่ามีอะไรผิด
- ไม่ระบุคอลัมน์ที่ใช้เรียง
- ซ่อนค่าที่หายไป
- ไม่เขียนช่วงค่ากำกับแต่ละคอลัมน์
- ใช้กับข้อมูลน้อยเกินไป
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ เขียนที่หัวภาพว่าเรียงตามคอลัมน์อะไรและใช้กี่กลุ่ม
- เขียนช่วงค่ากำกับทุกคอลัมน์
- ทำเครื่องหมายแถบที่เป็นค่าที่หายไปให้ชัด
รูปแบบชื่อกราฟที่ควรใช้
ข้อมูล <จำนวน> แถว เรียงตาม <คอลัมน์> และยุบเป็น <จำนวน> กลุ่ม
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ tableplot-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด tableplot-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("tableplot-sample.csv")
df["ราคา"] = pd.to_numeric(df["ราคา"], errors="coerce")
df["ความเร็ว"] = pd.to_numeric(df["ความเร็ว"], errors="coerce")
df["ความจุ"] = pd.to_numeric(df["ความจุ"], errors="coerce")
df["น้ำหนัก"] = pd.to_numeric(df["น้ำหนัก"], errors="coerce")
df["คะแนนรีวิว"] = pd.to_numeric(df["คะแนนรีวิว"], errors="coerce")
NOTE = "sortcol" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
dims = ["ราคา", "ความเร็ว", "ความจุ", "น้ำหนัก"]
SORT_BY, BINS = "ราคา", 10 # ★ คอลัมน์ที่เรียงเปลี่ยนภาพทั้งหมด
d = df.sort_values(SORT_BY, ascending=False).reset_index(drop=True)
d["bin"] = (d.index * BINS // len(d))
agg = d.groupby("bin")[dims].mean()
fig, axes = plt.subplots(1, len(dims), figsize=(11, 5), sharey=True,
constrained_layout=True)
for ax_, dim in zip(axes, dims):
ax_.barh(agg.index, agg[dim], color=C1, height=0.86)
ax_.set_title(f"{dim}\n{agg[dim].min():.0f}–{agg[dim].max():.0f}", fontsize=9)
ax_.invert_yaxis(); ax_.set_xticks([])
axes[0].set_ylabel(f"กลุ่ม (เรียงตาม {SORT_BY})")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("tableplot.png", dpi=160)
print("เขียน tableplot.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (10 แถว)
| กลุ่ม | ราคา | ความเร็ว | ความจุ | น้ำหนัก |
|---|---|---|---|---|
| 0–10% | 426 | 73.5 | 42.5 | 17.6 |
| 10–20% | 395 | 76.8 | 43.9 | 17.7 |
| 20–30% | 306 | 58.7 | 34.7 | 22.7 |
| 30–40% | 302 | 52.5 | 27.3 | 23.0 |
| 40–50% | 191 | 40.5 | 20.2 | 29.8 |
| 50–60% | 170 | 43.8 | 18.7 | 29.2 |
| 60–70% | — | — | — | — |
| 70–80% | — | — | — | — |
| 80–90% | — | — | — | — |
| 90–100% | — | — | — | — |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: ลองจินตนาการว่าเปลี่ยนไปเรียงด้วยคอลัมน์อื่น ภาพทั้งภาพจะเปลี่ยนไปเลย เพราะคำถามที่ถามก็เปลี่ยนไปด้วย
ข้อควรระวัง
- ★ ไม่ระบุคอลัมน์ที่ใช้เรียง ทั้งที่มันกำหนดคำถามที่ภาพนี้ตอบทั้งหมด
- ใช้หาค่าผิดปกติ ทั้งที่ค่าผิดปกติถูกยุบหายไปหมดแล้ว
- ซ่อนค่าที่หายไป ซึ่งเป็นการทิ้งจุดแข็งที่สุดของภาพนี้
- ไม่เขียนช่วงค่ากำกับแต่ละคอลัมน์ ทำให้แถบยาวเท่ากันดูเหมือนค่าเท่ากัน
เมื่อไหร่ไม่ควรใช้กราฟนี้
- มีข้อมูลน้อยกว่า 200 แถว→ใช้แทน: scatter-matrix หรือตารางธรรมดา
- ต้องหาค่าผิดปกติรายแถว→ใช้แทน: scatter-plot หรือ box-plot
- สนใจความสัมพันธ์ระหว่างทุกคู่ตัวแปร→ใช้แทน: correlation-heatmap