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

เมทริกซ์แผนภาพกระจายScatter Plot Matrix

เห็นรูปร่างของทุกคู่ ไม่ใช่แค่ตัวเลขสรุป

4
ขั้นสูงควรรู้ก่อน · อ่าน scatter plot เป็น
ลองเล่น

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

Scatter plot matrix วาดแผนภาพกระจายของทุกคู่ตัวแปรเรียงเป็นตาราง จุดแข็งเหนือ correlation matrix คือมันไม่ได้ย่อความสัมพันธ์เหลือตัวเลขเดียว จึงเห็นความสัมพันธ์แบบโค้ง กลุ่มก้อน และค่าผิดปกติที่ค่าสหสัมพันธ์มองไม่เห็น

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

เหมือนอัลบั้มรูปที่มีรูปคู่ของทุกคนในกลุ่ม แทนที่จะมีแค่ตารางบอกว่าใครสนิทกับใครกี่คะแนน

ใช้ที่ไหนบ้าง — สำรวจชุดข้อมูลใหม่ที่มี 4-6 ตัวแปร ตรวจสมมติฐานก่อนสร้างโมเดล หรือหากลุ่มย่อยในข้อมูลหลายมิติ

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

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

ตัวอย่างคลาสสิก · Pairs plot ของชุดข้อมูลดอกไอริส

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

Wikipedia · Iris flower data set

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

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

Scatter plot matrix แก้ด้วยการวาดแผนภาพกระจายของทุกคู่จริง ๆ แล้ววางเป็นตาราง ตำแหน่งแถวและคอลัมน์บอกว่าช่องนั้นเป็นคู่ของตัวแปรไหน

สิ่งที่เห็นเพิ่มขึ้นมาคือความสัมพันธ์แบบโค้งที่ค่าสหสัมพันธ์ให้เป็นศูนย์ กลุ่มก้อนที่แยกกัน และค่าผิดปกติที่ดึงค่าสหสัมพันธ์ทั้งค่า

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

ข้อจำกัดคือจำนวนตัวแปร ถ้ามี 6 ตัวก็ได้ 36 ช่อง ซึ่งแต่ละช่องเล็กแล้ว เกินกว่านั้นช่องจะเล็กจนอ่านอะไรไม่ได้ ในทางปฏิบัติจึงใช้กับ 3-6 ตัวแปร

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

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

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

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
ราคาตัวแปรตัวเลขตัวที่ 1ตัวเลขต่อเนื่องxต่อเนื่องทุกคอลัมน์ตัวเลขจะถูกจับคู่กันทั้งหมด
ความเร็วตัวแปรตัวเลขตัวที่ 2ตัวเลขต่อเนื่องyต่อเนื่องควรมี 3–6 คอลัมน์ตัวเลข
group
ไม่บังคับ
กลุ่มหมวดหมู่color<= 3 กลุ่มจุดของทุกกลุ่มปนกันในทุกช่อง จึงจำกัด 3 สี

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

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

ค่าที่หายไป — แถวที่ขาดค่าใดค่าหนึ่งจะหายไปเฉพาะในช่องที่เกี่ยวข้อง ต้องระบุจำนวนที่ใช้จริงในแต่ละช่อง

สเกลของแกน — แต่ละตัวแปรใช้สเกลของตัวเอง และสเกลของตัวแปรเดียวกันต้องเหมือนกันทุกช่องในแถวและคอลัมน์นั้น

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

เกิน 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อ่านแล้วเห็นอะไร

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

  • รูปร่างของความสัมพันธ์ในทุกคู่
  • คู่ที่สัมพันธ์กันแบบโค้งซึ่งค่าสหสัมพันธ์มองไม่เห็น
  • กลุ่มก้อนที่ปรากฏในบางคู่แต่ไม่ปรากฏในคู่อื่น

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

  • ไม่รองรับตัวแปรจำนวนมาก
  • ช่องเล็กทำให้เห็นรายละเอียดได้จำกัด

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

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

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

  • คู่ไหนสัมพันธ์กันและสัมพันธ์แบบไหน
  • มีตัวแปรไหนที่แยกกลุ่มได้ชัด
  • ค่าผิดปกติจุดเดียวกันปรากฏในหลายคู่ไหม

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

  • ช่องเล็กจนจุดกลายเป็นก้อนทึบ
  • สเกลของตัวแปรเดียวกันไม่ตรงกันระหว่างช่อง

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

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

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

  1. ทำเครื่องหมายช่องที่น่าสนใจที่สุดด้วยกรอบ
  2. ใส่ค่าสหสัมพันธ์ในครึ่งบนของตาราง
  3. เขียนชื่อตัวแปรให้อ่านง่ายที่ขอบ

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

<ตัวแปร> กับ <ตัวแปร> สัมพันธ์กันแบบ <รูปร่าง> ซึ่งค่าสหสัมพันธ์เพียงอย่างเดียวมองไม่เห็น

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

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

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

ข้อมูลตัวอย่าง · 60 แถว · seed 197● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
ครึ่งล่างเป็นจุด ครึ่งบนเป็นค่าสหสัมพันธ์
ราคาราคาราคา × ราคา · r = 1.000.96ราคา × ความเร็ว · r = 0.960.94ราคา × ความจุ · r = 0.94-0.91ราคา × น้ำหนัก · r = -0.91ความเร็วความเร็ว × ราคา · r = 0.96ความเร็วความเร็ว × ความเร็ว · r = 1.000.93ความเร็ว × ความจุ · r = 0.93-0.88ความเร็ว × น้ำหนัก · r = -0.88ความจุความจุ × ราคา · r = 0.94ความจุ × ความเร็ว · r = 0.93ความจุความจุ × ความจุ · r = 1.00-0.89ความจุ × น้ำหนัก · r = -0.89น้ำหนักน้ำหนัก × ราคา · r = -0.91น้ำหนัก × ความเร็ว · r = -0.88น้ำหนัก × ความจุ · r = -0.89น้ำหนักน้ำหนัก × น้ำหนัก · r = 1.00
จำนวนตัวแปร4
จำนวนคู่6
จำนวนแถว60
ดูข้อมูลเป็นตาราง (6 แถว)
scatter matrix 4 ตัวแปร
คู่ตัวแปรr
ราคา × ความเร็ว0.956
ราคา × ความจุ0.936
ราคา × น้ำหนัก-0.908
ความเร็ว × ความจุ0.931
ความเร็ว × น้ำหนัก-0.885
ความจุ × น้ำหนัก-0.892

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

  • สังเกตอะไร: เทียบช่องที่มีค่าสหสัมพันธ์เท่ากันในครึ่งบน กับรูปร่างของจุดในครึ่งล่าง จะเห็นว่าค่าเท่ากันไม่ได้แปลว่ารูปร่างเหมือนกัน

ข้อควรระวัง

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

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

  • มีตัวแปรมากกว่า 7 ตัวใช้แทน: correlation-matrix คัดกรองก่อนแล้วค่อยดูคู่ที่น่าสนใจ
  • ต้องการดูคู่เดียวใช้แทน: scatter-plot ที่ใหญ่และอ่านง่ายกว่า
  • ข้อมูลใหญ่มากจนจุดทับกันใช้แทน: hexbin-plot ของคู่ที่สนใจ

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

เทคนิคถัดไป · กราฟส่วนที่เหลือ