Pandas & NumPy Academy · บทเรียน

การวิเคราะห์สองตัวแปรและสหสัมพันธ์

สำรวจความสัมพันธ์ระหว่างคู่คอลัมน์ด้วยกราฟกระจาย กราฟกล่อง และฮีตแมปสหสัมพันธ์

บทเรียน 3 จาก 413 ขั้นตอน

การวิเคราะห์สองตัวแปรและสหสัมพันธ์ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

จากตัวแปรเดียวสู่สองตัวแปร

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

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Relationship types present in the dataset
print('Numeric columns:', df.select_dtypes('number').columns.tolist())
print('Categorical columns:', df.select_dtypes('object').columns.tolist())
print('Boolean columns:', df.select_dtypes('bool').columns.tolist())

ตัวเลขเทียบกับตัวเลข: กราฟกระจาย

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

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

sns.scatterplot(data=df, x='age', y='fare', alpha=0.4)
plt.title('Age vs. Fare — Is There a Linear Relationship?')
plt.xlabel('Age')
plt.ylabel('Fare ($)')
plt.show()

ค่าสัมประสิทธิ์สหสัมพันธ์เพียร์สัน

Pearson r ใช้ระบุความแรงและทิศทางของความสัมพันธ์เชิงเส้นระหว่างตัวแปรตัวเลขสองตัว คำนวณได้ด้วย df[['col1', 'col2']].corr() หรือ scipy.stats.pearsonr(x, y) ซึ่งจะคืนค่า p-value สำหรับการทดสอบนัยสำคัญทางสถิติด้วย ควรพิจารณา r ควบคู่กับกราฟกระจายเสมอ เพราะค่า r สูงอาจเกิดจากค่าผิดปกติเพียงไม่กี่ค่า และค่า r เดียวกันอาจอธิบายรูปร่างการกระจายที่แตกต่างกันมากได้ (Anscombe's Quartet เป็นตัวอย่างที่แสดงเรื่องนี้ได้อย่างชัดเจน)

import pandas as pd
import seaborn as sns
from scipy import stats

df = sns.load_dataset('titanic').dropna(subset=['age', 'fare'])

# Pearson correlation
r, p = stats.pearsonr(df['age'], df['fare'])
print(f'Pearson r = {r:.3f}, p-value = {p:.4f}')

# Spearman for robustness check
rho, p_sp = stats.spearmanr(df['age'], df['fare'])
print(f'Spearman rho = {rho:.3f}, p-value = {p_sp:.4f}')

ประเภทหมวดหมู่เทียบกับตัวเลข: กราฟกล่องและกราฟไวโอลิน

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

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.boxplot(data=df, x='class', y='fare',
            order=['First', 'Second', 'Third'], ax=axes[0])
axes[0].set_title('Fare by Passenger Class')

sns.violinplot(data=df, x='survived', y='age',
               inner='quartile', ax=axes[1])
axes[1].set_title('Age Distribution by Survival')

plt.tight_layout()
plt.show()

สถิติ GroupBy สำหรับประเภทหมวดหมู่เทียบกับตัวเลข

เสริมการเปรียบเทียบเชิงภาพด้วยสถิติกลุ่มในรูปตัวเลขโดยใช้ groupby คำนวณ mean, median และ count สำหรับแต่ละหมวดหมู่เพื่อวัดความแตกต่างที่เห็นในกราฟ ให้สังเกตหมวดหมู่ที่ mean และ median แตกต่างกันมาก (แสดงว่ามีค่าผิดปกติภายในกลุ่ม) และตรวจสอบว่าขนาดของกลุ่มสมดุลกันหรือไม่ เพราะกลุ่มที่มีขนาดเล็กมาก (<5 รายการ) ทำให้การเปรียบเทียบไม่น่าเชื่อถือ

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

stats = df.groupby('class')['fare'].agg(['mean', 'median', 'std', 'count'])
stats.columns = ['Mean Fare', 'Median Fare', 'Std Fare', 'Count']
print(stats.round(2))

print('\nSurvival rate by class:')
print(df.groupby('class')['survived'].mean().round(3))

ประเภทหมวดหมู่เทียบกับประเภทหมวดหมู่: ตารางไขว้

สำหรับตัวแปรประเภทหมวดหมู่สองตัว ให้ใช้ pd.crosstab(df['var1'], df['var2']) เพื่อสร้างตารางความถี่ที่แสดงจำนวนข้อมูลในแต่ละการจับคู่หมวดหมู่ ปรับเป็นสัดส่วนตามแถวหรือคอลัมน์ด้วย normalize='index' หรือ normalize='columns' เพื่อให้ได้สัดส่วนแทนจำนวน การดำเนินการนี้เป็นพื้นฐานสำหรับศึกษาว่าตัวแปรประเภทหมวดหมู่สองตัว เป็นอิสระต่อกัน หรือ มีความสัมพันธ์กัน

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Frequency table
counts = pd.crosstab(df['class'], df['survived'])
counts.columns = ['Died', 'Survived']
print('Counts:')
print(counts)

# Row-normalised proportions (survival rate per class)
props = pd.crosstab(df['class'], df['survived'], normalize='index')
props.columns = ['Died', 'Survived']
print('\nSurvival Rate per Class:')
print(props.round(3))

การแสดงตารางไขว้เป็นฮีตแมป

เปลี่ยนตารางไขว้เป็น ฮีตแมป เพื่อเปรียบเทียบความถี่ของแต่ละช่องได้ทันที วิธีนี้ดูไล่ตรวจได้ง่ายกว่าตารางที่พิมพ์ออกมาเมื่อมีการจับคู่หมวดหมู่จำนวนมาก ใส่ค่าลงในแต่ละช่องด้วย annot=True และเลือกชุดสีแบบต่อเนื่อง (เช่น 'YlOrRd') เนื่องจากค่าทั้งหมดไม่ติดลบ ฮีตแมปของสัดส่วนที่ปรับตามแถวจะแสดง การกระจายแบบมีเงื่อนไขของหมวดหมู่หนึ่งเมื่อกำหนดอีกหมวดหมู่หนึ่งได้อย่างมีประสิทธิภาพ

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')
props = pd.crosstab(df['class'], df['sex'], normalize='index')

sns.heatmap(props, annot=True, fmt='.2f', cmap='YlOrRd')
plt.title('Gender Mix by Passenger Class (Row %)')
plt.xlabel('Sex')
plt.ylabel('Class')
plt.show()

การทดสอบไคสแควร์เพื่อความเป็นอิสระ

การทดสอบไคสแควร์เพื่อความเป็นอิสระใช้ตรวจสอบว่าตัวแปรประเภทหมวดหมู่สองตัวเป็นอิสระทางสถิติหรือไม่ scipy.stats.chi2_contingency(crosstab) จะคืนค่าสถิติไคสแควร์ p-value องศาอิสระ และความถี่ที่คาดหมาย หาก p-value มีค่าน้อย (โดยทั่วไป < 0.05) หมายความว่าตัวแปรทั้งสองมีความสัมพันธ์กันอย่างมีนัยสำคัญทางสถิติ กล่าวคือ การกระจายของตัวแปรหนึ่งเปลี่ยนแปลงอย่างเป็นระบบตามอีกตัวแปรหนึ่ง

import pandas as pd
import seaborn as sns
from scipy.stats import chi2_contingency

df = sns.load_dataset('titanic')

# Test if passenger class and survival are independent
crosstab = pd.crosstab(df['class'], df['survived'])
chi2, p, dof, expected = chi2_contingency(crosstab)

print(f'Chi-squared: {chi2:.2f}')
print(f'P-value: {p:.6f}')
print(f'Degrees of freedom: {dof}')
print(f'\nConclusion: {"Significant association" if p < 0.05 else "No significant association"}')

เมทริกซ์สหสัมพันธ์เต็มรูปแบบสำหรับคอลัมน์ตัวเลข

แทนที่จะตรวจสอบทีละคู่ ให้คำนวณ เมทริกซ์สหสัมพันธ์เต็มรูปแบบสำหรับคอลัมน์ตัวเลขทั้งหมด แล้วแสดงเป็นฮีตแมป วิธีนี้ช่วยให้เห็นได้ในพริบตาว่าคู่ตัวแปรใดมีสหสัมพันธ์สูง สหสัมพันธ์สูงระหว่าง คุณลักษณะอิสระ (ภาวะพหุสหสัมพันธ์) อาจทำให้เกิดปัญหาในแบบจำลองการถดถอย การทราบเรื่องนี้ตั้งแต่เนิ่น ๆ ช่วยให้คุณลบหรือรวมคุณลักษณะที่ซ้ำซ้อนก่อนสร้างแบบจำลองได้

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

df = sns.load_dataset('titanic')
corr = df.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))

sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
            cmap='coolwarm', vmin=-1, vmax=1,
            linewidths=0.5, square=True)
plt.title('Correlation Matrix — Titanic Numeric Columns')
plt.tight_layout()
plt.show()

ปฏิสัมพันธ์ระหว่างกลุ่มย่อย

บางครั้งความสัมพันธ์ระหว่างตัวแปรสองตัวอาจแตกต่างกันอย่างมากในแต่ละกลุ่มย่อย ซึ่งเป็นปรากฏการณ์ที่เรียกว่า Simpson's Paradox ตัวอย่างเช่น ความสัมพันธ์ระหว่างอายุและค่าโดยสารอาจเป็นบวกสำหรับผู้โดยสารชั้นหนึ่ง แต่เป็นลบสำหรับผู้โดยสารชั้นสาม ควรแบ่งการวิเคราะห์แบบสองตัวแปรตามตัวแปรเชิงหมวดหมู่ที่สำคัญเสมอ (โดยใช้ hue ใน Seaborn หรือการรวมกลุ่มด้วย groupby แยกกัน) เพื่อตรวจสอบว่าความสัมพันธ์นั้นสอดคล้องกันหรือกลับทิศทางไปในแต่ละกลุ่มย่อย

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

# Scatter coloured by passenger class
sns.scatterplot(
    data=df.dropna(subset=['age', 'fare']),
    x='age',
    y='fare',
    hue='class',
    alpha=0.5,
    palette='deep'
)
plt.title('Age vs Fare — Does Class Change the Relationship?')
plt.legend(title='Class')
plt.yscale('log')  # log scale due to fare skewness
plt.show()

การจัดทำเอกสารผลการวิเคราะห์แบบสองตัวแปร

หลังจากวิเคราะห์แบบสองตัวแปรเสร็จแล้ว ให้บันทึกข้อค้นพบสำคัญ ได้แก่ คู่คุณลักษณะที่มีความสัมพันธ์กัน (และมีความสัมพันธ์มากน้อยเพียงใด) ตัวแปรเชิงหมวดหมู่แสดงความแตกต่างระหว่างกลุ่มที่มีความหมายในผลลัพธ์เชิงตัวเลขหรือไม่ และพบปฏิสัมพันธ์หรือความขัดแย้งระหว่างกลุ่มย่อยหรือไม่ ข้อมูลเชิงลึกเหล่านี้ควรใช้ประกอบการตัดสินใจเลือกคุณลักษณะ — คู่คุณลักษณะที่มีความสัมพันธ์กันสูงอาจจำเป็นต้องตัดออกหนึ่งตัว และตัวแปรเชิงหมวดหมู่ที่ใช้ทำนายตัวแปรเป้าหมายได้ดีควรถูกทำเครื่องหมายเป็นตัวแปรนำเข้าที่มีความสำคัญสูงสำหรับการสร้างแบบจำลอง

ตรวจสอบความเข้าใจอย่างรวดเร็ว

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

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า แผนภาพกระจายและ Pearson r ใช้วิเคราะห์ความสัมพันธ์ระหว่างข้อมูลตัวเลขกับข้อมูลตัวเลข, แผนภาพกล่อง/ไวโอลินและ groupby ใช้เปรียบเทียบตัวแปรเชิงตัวเลขระหว่างหมวดหมู่ และ ตารางไขว้ร่วมกับการทดสอบไคสแควร์ ใช้วัดความสัมพันธ์ระหว่างตัวแปรเชิงหมวดหมู่ บทถัดไปจะครอบคลุมวิธีรวบรวมข้อค้นพบจาก EDA ให้เป็นรายงานสรุปที่มีโครงสร้าง

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การวิเคราะห์สองตัวแปรและสหสัมพันธ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การวิเคราะห์สองตัวแปรและสหสัมพันธ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์สองตัวแปรและสหสัมพันธ์”

สำรวจความสัมพันธ์ระหว่างคู่คอลัมน์ด้วยกราฟกระจาย กราฟกล่อง และฮีตแมปสหสัมพันธ์ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การวิเคราะห์สองตัวแปรและสหสัมพันธ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รายการตรวจสอบการสำรวจชุดข้อมูล
  2. การวิเคราะห์ตัวแปรเดียว
  3. การวิเคราะห์สองตัวแปรและสหสัมพันธ์
  4. การสรุปข้อค้นพบในรายงาน
← กลับไปที่ Pandas & NumPy Academy