การวิเคราะห์สองตัวแปรและสหสัมพันธ์
สำรวจความสัมพันธ์ระหว่างคู่คอลัมน์ด้วยกราฟกระจาย กราฟกล่อง และฮีตแมปสหสัมพันธ์
การวิเคราะห์สองตัวแปรและสหสัมพันธ์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รายการตรวจสอบการสำรวจชุดข้อมูล
- การวิเคราะห์ตัวแปรเดียว
- การวิเคราะห์สองตัวแปรและสหสัมพันธ์
- การสรุปข้อค้นพบในรายงาน