01ภาพรวมของกราฟนี้
Scatter plot matrix วาดแผนภาพกระจายของทุกคู่ตัวแปรเรียงเป็นตาราง จุดแข็งเหนือ correlation matrix คือมันไม่ได้ย่อความสัมพันธ์เหลือตัวเลขเดียว จึงเห็นความสัมพันธ์แบบโค้ง กลุ่มก้อน และค่าผิดปกติที่ค่าสหสัมพันธ์มองไม่เห็น
เปรียบเทียบให้เห็นภาพ
เหมือนอัลบั้มรูปที่มีรูปคู่ของทุกคนในกลุ่ม แทนที่จะมีแค่ตารางบอกว่าใครสนิทกับใครกี่คะแนน
ใช้ที่ไหนบ้าง — สำรวจชุดข้อมูลใหม่ที่มี 4-6 ตัวแปร ตรวจสมมติฐานก่อนสร้างโมเดล หรือหากลุ่มย่อยในข้อมูลหลายมิติ
สร้างอย่างไร
- ขั้นที่ 1เลือกตัวแปรไม่เกิน 6 ตัว
- ขั้นที่ 2วาดแผนภาพกระจายของทุกคู่
- ขั้นที่ 3ใส่สถิติสรุปในครึ่งหนึ่งของตาราง
- ขั้นที่ 4ใส่การกระจายของแต่ละตัวแปรบนเส้นทแยงมุม
ตัวอย่างคลาสสิก · Pairs plot ของชุดข้อมูลดอกไอริส
ชุดข้อมูลไอริสของ Fisher มีสี่ตัวแปรและสามสายพันธุ์ การวาด pairs plot เผยทันทีว่าบางคู่ตัวแปรแยกสายพันธุ์ได้เกือบสมบูรณ์ ขณะที่บางคู่แยกไม่ออกเลย ซึ่งเป็นข้อมูลที่ตารางสหสัมพันธ์ไม่มีทางบอกได้
02อธิบายภาษาคนเข้าใจง่าย ๆ
ตารางสหสัมพันธ์บอกได้เร็วว่าคู่ไหนแรง แต่มันย่อทุกอย่างเหลือตัวเลขเดียว ซึ่งทิ้งข้อมูลสำคัญไปมาก โดยเฉพาะรูปร่างของความสัมพันธ์
Scatter plot matrix แก้ด้วยการวาดแผนภาพกระจายของทุกคู่จริง ๆ แล้ววางเป็นตาราง ตำแหน่งแถวและคอลัมน์บอกว่าช่องนั้นเป็นคู่ของตัวแปรไหน
สิ่งที่เห็นเพิ่มขึ้นมาคือความสัมพันธ์แบบโค้งที่ค่าสหสัมพันธ์ให้เป็นศูนย์ กลุ่มก้อนที่แยกกัน และค่าผิดปกติที่ดึงค่าสหสัมพันธ์ทั้งค่า
นิยมใช้พื้นที่ให้คุ้มด้วยการใส่สองอย่างในตารางเดียว คือครึ่งล่างเป็นแผนภาพกระจาย ครึ่งบนเป็นตัวเลขสหสัมพันธ์ และเส้นทแยงมุมเป็นการกระจายของตัวแปรนั้นเอง
ข้อจำกัดคือจำนวนตัวแปร ถ้ามี 6 ตัวก็ได้ 36 ช่อง ซึ่งแต่ละช่องเล็กแล้ว เกินกว่านั้นช่องจะเล็กจนอ่านอะไรไม่ได้ ในทางปฏิบัติจึงใช้กับ 3-6 ตัวแปร
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
ราคา | ตัวแปรตัวเลขตัวที่ 1 | ตัวเลขต่อเนื่อง | x | ต่อเนื่อง | ทุกคอลัมน์ตัวเลขจะถูกจับคู่กันทั้งหมด |
ความเร็ว | ตัวแปรตัวเลขตัวที่ 2 | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ควรมี 3–6 คอลัมน์ตัวเลข |
groupไม่บังคับ | กลุ่ม | หมวดหมู่ | color | <= 3 กลุ่ม | จุดของทุกกลุ่มปนกันในทุกช่อง จึงจำกัด 3 สี |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- เลือกตัวแปรที่จะเทียบไม่เกิน 6 ตัว
- ปรับสเกลถ้าหน่วยต่างกันมาก
- ตัดสินใจว่าจะใส่อะไรในครึ่งบนและเส้นทแยงมุม
ค่าที่หายไป — แถวที่ขาดค่าใดค่าหนึ่งจะหายไปเฉพาะในช่องที่เกี่ยวข้อง ต้องระบุจำนวนที่ใช้จริงในแต่ละช่อง
สเกลของแกน — แต่ละตัวแปรใช้สเกลของตัวเอง และสเกลของตัวแปรเดียวกันต้องเหมือนกันทุกช่องในแถวและคอลัมน์นั้น
กราฟจะเริ่มพังเมื่อไร
เกิน 7 ตัวแปร ช่องจะเล็กจนจุดกลายเป็นก้อน — เลือกตัวแปรที่สำคัญก่อน หรือใช้ correlation-matrix คัดกรอง
หน้าตาไฟล์ที่ต้องเตรียม
item,group,ราคา,ความเร็ว,ความจุ,น้ำหนัก,คะแนนรีวิว
รุ่น A,รุ่นประหยัด,167,48.5,17.6,30.9,3.17
รุ่น B,รุ่นมาตรฐาน,301,55.7,30.4,20,4.09
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- รูปร่างของความสัมพันธ์ในทุกคู่
- คู่ที่สัมพันธ์กันแบบโค้งซึ่งค่าสหสัมพันธ์มองไม่เห็น
- กลุ่มก้อนที่ปรากฏในบางคู่แต่ไม่ปรากฏในคู่อื่น
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่รองรับตัวแปรจำนวนมาก
- ช่องเล็กทำให้เห็นรายละเอียดได้จำกัด
อ่านตามลำดับนี้
- กวาดตาหาช่องที่จุดเรียงเป็นรูปแบบชัดเจน
- ดูเส้นทแยงมุมเพื่อรู้การกระจายของแต่ละตัวแปร
- ตรวจว่าค่าผิดปกติจุดเดียวกันโผล่ในหลายช่องไหม
คำถามที่ตอบได้
- คู่ไหนสัมพันธ์กันและสัมพันธ์แบบไหน
- มีตัวแปรไหนที่แยกกลุ่มได้ชัด
- ค่าผิดปกติจุดเดียวกันปรากฏในหลายคู่ไหม
สัญญาณว่ามีอะไรผิด
- ช่องเล็กจนจุดกลายเป็นก้อนทึบ
- สเกลของตัวแปรเดียวกันไม่ตรงกันระหว่างช่อง
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ทำเครื่องหมายช่องที่น่าสนใจที่สุดด้วยกรอบ
- ใส่ค่าสหสัมพันธ์ในครึ่งบนของตาราง
- เขียนชื่อตัวแปรให้อ่านง่ายที่ขอบ
รูปแบบชื่อกราฟที่ควรใช้
<ตัวแปร> กับ <ตัวแปร> สัมพันธ์กันแบบ <รูปร่าง> ซึ่งค่าสหสัมพันธ์เพียงอย่างเดียวมองไม่เห็น
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ scatter-matrix-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด scatter-matrix-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("scatter-matrix-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 = "shapes" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
fig.clf()
cols = ["ราคา", "ความเร็ว", "ความจุ", "คะแนนรีวิว"] # เลือกไม่เกิน 6 ตัว
g = sns.pairplot(df[cols + ["group"]], hue="group", diag_kind="kde",
palette=[C1, C2, C3], plot_kws={"s": 18, "alpha": 0.6})
g.figure.savefig("scatter-matrix.png", dpi=160)
print("เขียน scatter-matrix.png แล้ว")
raise SystemExit # seaborn สร้าง figure ของตัวเอง จึงไม่ใช้ fig เดิม
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("scatter-matrix.png", dpi=160)
print("เขียน scatter-matrix.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (6 แถว)
| คู่ตัวแปร | r |
|---|---|
| ราคา × ความเร็ว | 0.956 |
| ราคา × ความจุ | 0.936 |
| ราคา × น้ำหนัก | -0.908 |
| ความเร็ว × ความจุ | 0.931 |
| ความเร็ว × น้ำหนัก | -0.885 |
| ความจุ × น้ำหนัก | -0.892 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: เทียบช่องที่มีค่าสหสัมพันธ์เท่ากันในครึ่งบน กับรูปร่างของจุดในครึ่งล่าง จะเห็นว่าค่าเท่ากันไม่ได้แปลว่ารูปร่างเหมือนกัน
ข้อควรระวัง
- ใส่ตัวแปรมากเกินไปจนแต่ละช่องเล็กจนอ่านไม่ได้
- ใช้สีเกิน 3 กลุ่ม ทำให้จุดที่ปนกันในทุกช่องแยกไม่ออก
- ใช้สเกลของตัวแปรเดียวกันไม่ตรงกันระหว่างช่อง
- ดูแต่ครึ่งบนที่เป็นตัวเลข โดยไม่ดูครึ่งล่างที่เป็นรูปร่างจริง
เมื่อไหร่ไม่ควรใช้กราฟนี้
- มีตัวแปรมากกว่า 7 ตัว→ใช้แทน: correlation-matrix คัดกรองก่อนแล้วค่อยดูคู่ที่น่าสนใจ
- ต้องการดูคู่เดียว→ใช้แทน: scatter-plot ที่ใหญ่และอ่านง่ายกว่า
- ข้อมูลใหญ่มากจนจุดทับกัน→ใช้แทน: hexbin-plot ของคู่ที่สนใจ