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

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

ทดสอบว่าตัวแปรเชิงกลุ่มสองตัวเป็นอิสระต่อกันหรือไม่ โดยใช้ chi2_contingency กับตารางความถี่ไขว้

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

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

การทดสอบความสัมพันธ์ระหว่างตัวแปรเชิงหมวดหมู่

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

การสร้างตารางความถี่ร่วมด้วย Pandas

ตารางความถี่ร่วม (เรียกอีกอย่างว่าตารางไขว้) แสดงจำนวนข้อมูลสังเกตสำหรับทุกคู่ผสมของตัวแปรเชิงหมวดหมู่สองตัว pd.crosstab(df['var1'], df['var2'])สร้างตารางนี้โดยตรงจาก DataFrame แต่ละช่องประกอบด้วยจำนวนข้อมูลสังเกตที่หมวดหมู่ของแถวและหมวดหมู่ของคอลัมน์ปรากฏร่วมกัน ตารางนี้เป็นข้อมูลนำเข้าสำหรับ scipy.stats.chi2_contingency()

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'subscription': np.random.choice(['free', 'basic', 'pro'], 300),
    'churned': np.random.choice(['yes', 'no'], 300, p=[0.3, 0.7])
})

# Build contingency table
ct = pd.crosstab(df['subscription'], df['churned'])
print(ct)
print()
print('Row totals:', ct.sum(axis=1).to_dict())

การเรียกใช้ chi2_contingency()

scipy.stats.chi2_contingency(observed)รับตารางความถี่ร่วมที่สังเกตได้ (ในรูปอาร์เรย์ของ NumPy หรือ Pandas DataFrame) และคืนค่ามาสี่ค่า ได้แก่ ค่าสถิติไคสแควร์ ค่า p องศาเสรี และตารางความถี่ที่คาดหมาย สมมติฐานว่างคือ H₀: the two variables are independent หาก p ≤ 0.05 เราจะปฏิเสธความเป็นอิสระและสรุปได้ว่ามีความสัมพันธ์ที่มีนัยสำคัญทางสถิติ

import pandas as pd
import numpy as np
from scipy import stats

np.random.seed(0)
df = pd.DataFrame({
    'tier': np.random.choice(['free', 'basic', 'pro'], 300),
    'churned': np.random.choice(['yes', 'no'], 300, p=[0.3, 0.7])
})

ct = pd.crosstab(df['tier'], df['churned'])
chi2, p, dof, expected = stats.chi2_contingency(ct)

print(f'Chi-squared: {chi2:.3f}')
print(f'p-value: {p:.4f}')
print(f'Degrees of freedom: {dof}')
print('Association significant?', 'Yes' if p < 0.05 else 'No')

ทำความเข้าใจความถี่ที่คาดหมาย

ความถี่ที่คาดหมายแสดงให้เห็นว่าจำนวนในแต่ละช่องจะเป็นอย่างไร หากตัวแปรสองตัวเป็นอิสระต่อกันอย่างสมบูรณ์ สำหรับแต่ละช่อง expected = (row_total × column_total) / grand_total ค่าสถิติไคสแควร์วัดผลรวมของความแตกต่างยกกำลังสองระหว่างจำนวนที่สังเกตได้กับจำนวนที่คาดหมาย แล้วทำให้เป็นมาตรฐานด้วยจำนวนที่คาดหมาย ค่าไคสแควร์ขนาดใหญ่หมายถึงจำนวนที่สังเกตได้เบี่ยงเบนจากความเป็นอิสระอย่างมาก ส่วนค่าไคสแควร์ขนาดเล็กหมายถึงข้อมูลสอดคล้องกับความเป็นอิสระ

import pandas as pd
import numpy as np
from scipy import stats

observed = pd.DataFrame({
    'converted': [50, 30],
    'not_converted': [150, 170]
}, index=['variant', 'control'])

chi2, p, dof, expected = stats.chi2_contingency(observed)
print('Observed:')
print(observed)
print()
print('Expected (under independence):')
print(pd.DataFrame(expected,
                   index=observed.index,
                   columns=observed.columns).round(1))

องศาเสรีในการทดสอบไคสแควร์

สำหรับตารางความถี่ร่วมที่มี r แถวและ c คอลัมน์ องศาเสรีคือ df = (r-1) × (c-1) ตารางขนาด 2×2 มี df=1 ส่วนตารางขนาด 3×4 มี df=6 ค่าวิกฤตของไคสแควร์จะเพิ่มขึ้นตามองศาเสรี: สำหรับ df=1 ที่ α=0.05 ค่าวิกฤตมีค่าประมาณ 3.84 และสำหรับ df=6 ที่ α=0.05 ค่าวิกฤตมีค่าประมาณ 12.6 ฟังก์ชัน chi2_contingencyจัดการเรื่องนี้โดยอัตโนมัติ แต่การทราบสูตรจะช่วยให้คุณเข้าใจว่าเหตุใดไคสแควร์จากตารางขนาดใหญ่จึงต้องมีค่าสถิติสูงกว่าจึงจะมีนัยสำคัญ

from scipy import stats

# Critical values of chi-squared for alpha=0.05
for df in [1, 2, 3, 4, 6, 9]:
    critical = stats.chi2.ppf(0.95, df=df)
    print(f'df={df}: critical value = {critical:.3f}')

สมมติฐานเรื่องความถี่ที่คาดหมายขั้นต่ำ

การทดสอบไคสแควร์จะน่าเชื่อถือก็ต่อเมื่อความถี่ที่คาดหมายทั้งหมดมีค่าอย่างน้อย 5 (บางแหล่งระบุว่าอย่างน้อย 1 และมีจำนวนที่ต่ำกว่า 5 ไม่เกิน 20%) จำนวนที่คาดหมายขนาดเล็กทำให้การประมาณด้วยไคสแควร์ไม่แม่นยำ เมื่อสมมติฐานนี้ไม่เป็นจริง ให้ใช้การทดสอบแบบแม่นตรงของฟิชเชอร์ (scipy.stats.fisher_exact()) สำหรับตาราง 2×2 หรือรวมหมวดหมู่ที่พบได้น้อยเข้าด้วยกันเพื่อเพิ่มจำนวนที่คาดหมาย ควรตรวจสอบเมทริกซ์ความถี่ที่คาดหมายซึ่งคืนค่าจาก chi2_contingency เสมอ

import numpy as np
from scipy import stats

# Table with small expected counts
observed = np.array([[2, 3], [100, 95]])
chi2, p, dof, expected = stats.chi2_contingency(observed)

print('Expected frequencies:')
print(expected)
print('Min expected:', expected.min())

if expected.min() < 5:
    print('Warning: Expected frequency < 5. Use Fisher\'s exact test.')
    odds_ratio, p_fisher = stats.fisher_exact(observed)
    print(f'Fisher\'s exact p: {p_fisher:.4f}')

การทดสอบแบบแม่นตรงของฟิชเชอร์สำหรับตัวอย่างขนาดเล็ก

scipy.stats.fisher_exact(table)คำนวณความน่าจะเป็นที่แน่นอนของการสังเกตตาราง 2×2 ที่กำหนด (หรือค่าที่สุดโต่งกว่านั้น) ภายใต้สมมติฐานว่างเรื่องความเป็นอิสระ โดยไม่ใช้การประมาณใด ๆ การทดสอบนี้ใช้ได้เสมอไม่ว่าขนาดตัวอย่างหรือจำนวนในแต่ละช่องจะเป็นเท่าใด เพราะค่า p เป็นค่าที่แน่นอน ไม่ใช่ค่าประมาณ ข้อแลกเปลี่ยนคือด้านการคำนวณ: ฟังก์ชันจะไล่ตรวจสอบตารางที่เป็นไปได้ทั้งหมด จึงทำงานช้าเมื่อยอดรวมมีขนาดใหญ่ สำหรับตาราง 2×2 ที่มีจำนวนในช่องใด ๆ ต่ำกว่า 5 ควรเลือกการทดสอบแบบแม่นตรงของฟิชเชอร์แทนการทดสอบไคสแควร์เสมอ

import numpy as np
from scipy import stats

# Small clinical trial: treatment vs. outcome
observed = np.array([
    [3, 12],   # treated: 3 improved, 12 did not
    [1, 18]    # control: 1 improved, 18 did not
])

odds_ratio, p = stats.fisher_exact(observed, alternative='two-sided')
print(f'Odds ratio: {odds_ratio:.3f}')
print(f'p-value: {p:.4f}')
print('Association significant?', 'Yes' if p < 0.05 else 'No')

การวัดความเข้มของความสัมพันธ์: V ของ Cramér

เช่นเดียวกับ d ของโคเฮนสำหรับการทดสอบ t ค่าสถิติไคสแควร์เพียงอย่างเดียวไม่ได้วัดความเข้มของความสัมพันธ์ เพราะค่าจะเพิ่มขึ้นตามขนาดตัวอย่าง V ของ Cramérทำให้ค่าไคสแควร์อยู่ในมาตราส่วน 0–1 โดย 0 หมายถึงไม่มีความสัมพันธ์ และ 1 หมายถึงมีความสัมพันธ์อย่างสมบูรณ์ V = sqrt(chi2 / (n × min(r-1, c-1))) แนวทางทั่วไปคือ < 0.1 ถือว่าอ่อน, 0.1–0.3 ถือว่าปานกลาง และ > 0.3 ถือว่าเข้มแข็ง ควรรายงาน V ของ Cramér ควบคู่กับค่า p เสมอเพื่อให้เห็นภาพอย่างครบถ้วน

import pandas as pd
import numpy as np
from scipy import stats

np.random.seed(0)
df = pd.DataFrame({
    'tier': np.random.choice(['free', 'basic', 'pro'], 500),
    'churn': np.random.choice(['yes', 'no'], 500, p=[0.3, 0.7])
})
ct = pd.crosstab(df['tier'], df['churn'])

chi2, p, dof, _ = stats.chi2_contingency(ct)
n = ct.sum().sum()
min_dim = min(ct.shape[0]-1, ct.shape[1]-1)
cramers_v = np.sqrt(chi2 / (n * min_dim))

print(f'chi2={chi2:.3f}, p={p:.4f}')
print(f'Cramer\'s V: {cramers_v:.4f}')
print('Association strength:', 'strong' if cramers_v > 0.3 else 'moderate' if cramers_v > 0.1 else 'weak')

การทดสอบความสอดคล้องของไคสแควร์

การประยุกต์ใช้ไคสแควร์อีกรูปแบบหนึ่งคือการทดสอบความสอดคล้อง ซึ่งใช้ทดสอบว่าความถี่ที่สังเกตได้ตรงกับการแจกแจงที่ตั้งสมมติฐานไว้หรือไม่ ตัวอย่างเช่น “ผลการทอดลูกเต๋ามีการแจกแจงสม่ำเสมอหรือไม่” หรือ “ปริมาณการเข้าชมเว็บไซต์ของเราเป็นไปตามรูปแบบรายวันที่คาดหมายไว้หรือไม่” ให้ใช้ scipy.stats.chisquare(f_obs, f_exp) โดย f_exp คือความถี่ที่คาดหมาย สมมติฐานว่างคือข้อมูลเป็นไปตามการแจกแจงที่ระบุ

import numpy as np
from scipy import stats

# Observed: counts for each weekday over 70 weeks
observed = np.array([980, 1050, 1020, 1080, 1120, 850, 900])
# Expected: uniform distribution
expected = np.full(7, observed.sum() / 7)

chi2, p = stats.chisquare(f_obs=observed, f_exp=expected)
print('Observed:', observed)
print('Expected (uniform):', expected.round(0))
print(f'chi2={chi2:.3f}, p={p:.4f}')
print('Uniform?', 'Yes' if p > 0.05 else 'No - some days significantly busier')

การใช้ pd.crosstab กับการทำให้เป็นสัดส่วน

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

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'tier': np.random.choice(['free', 'basic', 'pro'], 300),
    'churned': np.random.choice(['yes', 'no'], 300, p=[0.3, 0.7])
})

# Row-proportions: churn rate within each tier
prop_table = pd.crosstab(df['tier'], df['churned'], normalize='index')
print('Churn rate by tier:')
print((prop_table * 100).round(1))

การทดสอบไคสแควร์ในการทดสอบ A/B

การทดสอบไคสแควร์เป็นการทดสอบมาตรฐานสำหรับอัตราการเปลี่ยนเป็นผลสำเร็จในการทดสอบ A/B สร้างตารางความถี่ร่วมขนาด 2×2 โดยให้แถว = (กลุ่มควบคุม, ตัวแปร) และคอลัมน์ = (เปลี่ยนเป็นผลสำเร็จ, ไม่เปลี่ยนเป็นผลสำเร็จ) การทดสอบไคสแควร์จะบอกว่าอัตราการเปลี่ยนเป็นผลสำเร็จแตกต่างกันอย่างมีนัยสำคัญระหว่างกลุ่มหรือไม่ การทดสอบนี้เทียบเท่ากับการทดสอบ z สำหรับสัดส่วนสองกลุ่มเมื่อมีตัวอย่างขนาดใหญ่ สำหรับตัวอย่างขนาดเล็ก (จำนวนที่คาดหมายใด ๆ < 5) ให้ใช้การทดสอบแบบแม่นตรงของฟิชเชอร์แทน

import numpy as np
from scipy import stats

# A/B test: control vs. variant, conversions vs. non-conversions
control_conv = 45
control_total = 500
variant_conv = 63
variant_total = 500

contingency = np.array([
    [control_conv, control_total - control_conv],
    [variant_conv, variant_total - variant_conv]
])

chi2, p, dof, expected = stats.chi2_contingency(contingency)
print(f'Control rate: {control_conv/control_total:.1%}')
print(f'Variant rate: {variant_conv/variant_total:.1%}')
print(f'p-value: {p:.4f}')
print('Variant significantly better?', 'Yes' if p < 0.05 else 'No')

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

ทดสอบความเข้าใจแนวคิดการวิเคราะห์ข้อมูลจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า pd.crosstab() + chi2_contingency()ใช้ทดสอบว่าตัวแปรเชิงหมวดหมู่สองตัวเป็นอิสระต่อกันหรือไม่ โดยอาศัยความถี่ที่สังเกตได้เทียบกับความถี่ที่คาดหมาย การทดสอบแบบแม่นตรงของฟิชเชอร์เป็นทางเลือกที่ปลอดภัยเมื่อจำนวนที่คาดหมายต่ำกว่า 5 และ V ของ Cramérใช้วัดความเข้มของความสัมพันธ์โดยไม่ขึ้นกับขนาดตัวอย่าง บทถัดไป เราจะเปรียบเทียบค่าเฉลี่ยระหว่างกลุ่มสามกลุ่มขึ้นไปด้วย ANOVA และการทดสอบภายหลัง

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

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

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

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

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

บทเรียน “การทดสอบไคสแควร์เพื่อความเป็นอิสระ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบไคสแควร์เพื่อความเป็นอิสระ”

ทดสอบว่าตัวแปรเชิงกลุ่มสองตัวเป็นอิสระต่อกันหรือไม่ โดยใช้ chi2_contingency กับตารางความถี่ไขว้ คุณปฏิบัติ 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. ANOVA และการทดสอบภายหลัง
← กลับไปที่ Pandas & NumPy Academy