Pengujian Chi-Kuadrat untuk Independensi
Uji apakah dua variabel kategorikal saling independen menggunakan chi2_contingency pada tabel frekuensi tabulasi silang.
Pengujian Chi-Kuadrat untuk Independensi adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Menguji Hubungan Kategorikal
uji khi-kuadrat untuk independensi menguji apakah dua variabel kategorikal secara statistik independen atau memiliki hubungan. Contohnya: "Apakah pelanggan berhenti berlangganan secara independen dari tingkat langganan?" atau "Apakah preferensi produk independen dari kelompok usia?" Berbeda dari uji-t yang membandingkan mean numerik, uji khi-kuadrat membandingkan frekuensi yang diamati dalam tabel kontingensi dengan frekuensi yang diharapkan jika variabel-variabel tersebut independen.
Membuat Tabel Kontingensi dengan Pandas
tabel kontingensi (juga disebut tabulasi silang) menunjukkan jumlah pengamatan untuk setiap kombinasi dua variabel kategorikal. pd.crosstab(df['var1'], df['var2']) membuat tabel ini langsung dari DataFrame. Setiap sel berisi jumlah pengamatan ketika kategori baris dan kategori kolom muncul bersamaan. Tabel ini menjadi input untuk 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())Menjalankan chi2_contingency()
scipy.stats.chi2_contingency(observed) menerima tabel kontingensi yang diamati (sebagai array NumPy atau DataFrame Pandas) dan mengembalikan empat nilai: statistik khi-kuadrat, nilai-p, derajat kebebasan, dan tabel frekuensi yang diharapkan. Hipotesis nolnya adalah H₀: the two variables are independent. Jika p ≤ 0.05, kita menolak independensi dan menyimpulkan bahwa terdapat hubungan yang signifikan secara statistik.
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')Memahami Frekuensi yang Diharapkan
Frekuensi yang diharapkan menunjukkan seperti apa jumlah sel jika kedua variabel benar-benar independen. Untuk setiap sel, expected = (row_total × column_total) / grand_total. Statistik khi-kuadrat mengukur jumlah kuadrat perbedaan antara jumlah yang diamati dan yang diharapkan, yang dinormalisasi dengan jumlah yang diharapkan. Nilai khi-kuadrat yang besar berarti jumlah yang diamati sangat menyimpang dari independensi; nilai yang kecil berarti data konsisten dengan independensi.
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))Derajat Kebebasan dalam Khi-Kuadrat
Untuk tabel kontingensi dengan r baris dan c kolom, derajat kebebasan adalah df = (r-1) × (c-1). Tabel 2×2 memiliki df=1; tabel 3×4 memiliki df=6. Nilai kritis khi-kuadrat meningkat seiring derajat kebebasan: untuk df=1 pada α=0.05, nilai kritis ≈ 3.84; untuk df=6 pada α=0.05, nilai kritis ≈ 12.6. Fungsi chi2_contingency menanganinya secara otomatis, tetapi mengetahui rumusnya membantu Anda memahami alasan khi-kuadrat dari tabel yang lebih besar memerlukan statistik yang lebih besar agar signifikan.
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}')Asumsi Frekuensi Minimum yang Diharapkan
Uji khi-kuadrat hanya dapat diandalkan ketika semua frekuensi yang diharapkan setidaknya 5 (beberapa sumber menyebutkan setidaknya 1 dengan tidak lebih dari 20% di bawah 5). Jumlah yang diharapkan yang kecil membuat pendekatan khi-kuadrat tidak akurat. Jika asumsi ini dilanggar, gunakan uji eksak Fisher (scipy.stats.fisher_exact()) untuk tabel 2×2, atau gabungkan kategori yang jarang muncul untuk meningkatkan jumlah yang diharapkan. Selalu periksa matriks frekuensi yang diharapkan yang dikembalikan oleh 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}')Uji Eksak Fisher untuk Sampel Kecil
scipy.stats.fisher_exact(table) menghitung probabilitas eksak untuk mengamati tabel 2×2 yang diberikan (atau tabel yang lebih ekstrem) berdasarkan hipotesis nol independensi, tanpa pendekatan apa pun. Uji ini selalu valid terlepas dari ukuran sampel atau jumlah sel — nilai-p bersifat eksak, bukan perkiraan. Kekurangannya adalah biaya komputasi: uji ini mencacah semua tabel yang mungkin, sehingga lambat untuk jumlah total yang besar. Untuk tabel 2×2 dengan jumlah sel apa pun yang kurang dari 5, selalu pilih uji eksak Fisher daripada khi-kuadrat.
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')Mengukur Kekuatan Hubungan: Cramér's V
Seperti Cohen's d pada uji-t, statistik khi-kuadrat saja tidak mengukur kekuatan hubungan — nilainya meningkat akibat ukuran sampel. Cramér's V menormalisasi khi-kuadrat ke skala 0–1: 0 berarti tidak ada hubungan, 1 berarti hubungan sempurna. V = sqrt(chi2 / (n × min(r-1, c-1))). Panduan: < 0.1 lemah, 0.1–0.3 sedang, dan > 0.3 kuat. Selalu laporkan Cramér's V bersama nilai-p untuk mendapatkan gambaran yang lengkap.
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')Uji Kecocokan Distribusi Khi-Kuadrat
Penerapan lain dari khi-kuadrat adalah uji kecocokan distribusi: uji ini memeriksa apakah frekuensi yang diamati sesuai dengan distribusi yang dihipotesiskan. Contohnya, "Apakah hasil lemparan dadu terdistribusi secara seragam?" atau "Apakah lalu lintas situs web kita mengikuti pola hari dalam seminggu yang diharapkan?" Gunakan scipy.stats.chisquare(f_obs, f_exp) dengan f_exp sebagai frekuensi yang diharapkan. Hipotesis nolnya adalah bahwa data mengikuti distribusi yang ditentukan.
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')Menggunakan pd.crosstab dengan normalise
Saat melaporkan hasil khi-kuadrat, akan lebih membantu jika Anda menampilkan proporsi daripada jumlah mentah agar pembaca dapat melihat hubungan relatifnya. pd.crosstab(var1, var2, normalize='index') menampilkan proporsi baris (bagian dari setiap kategori baris yang masuk ke setiap kolom). normalize='columns' menampilkan proporsi kolom. Membandingkan proporsi ini secara visual sebelum menjalankan uji membantu Anda memperkirakan arah hubungan dan menafsirkan hasilnya dalam konteks.
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))Uji Khi-Kuadrat dalam Pengujian A/B
Uji khi-kuadrat adalah uji standar untuk tingkat konversi dalam pengujian A/B. Buat tabel kontingensi 2×2 dengan baris = (kontrol, varian) dan kolom = (dikonversi, tidak dikonversi). Uji khi-kuadrat memberi tahu apakah tingkat konversi berbeda secara signifikan antara kelompok. Untuk sampel besar, uji ini setara dengan uji-z dua proporsi. Untuk sampel kecil (jumlah yang diharapkan apa pun < 5), gunakan uji eksak Fisher.
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')Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari: pd.crosstab() + chi2_contingency() menguji apakah dua variabel kategorikal independen berdasarkan frekuensi yang diamati dibandingkan dengan yang diharapkan, uji eksak Fisher adalah alternatif yang aman ketika jumlah yang diharapkan kurang dari 5, dan Cramér's V mengukur kekuatan hubungan secara independen dari ukuran sampel. Selanjutnya, kita membandingkan mean di tiga kelompok atau lebih dengan ANOVA dan uji pascahoc.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengujian Chi-Kuadrat untuk Independensi” gratis?
Ya — teks lengkap “Pengujian Chi-Kuadrat untuk Independensi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengujian Chi-Kuadrat untuk Independensi”?
Uji apakah dua variabel kategorikal saling independen menggunakan chi2_contingency pada tabel frekuensi tabulasi silang. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pengujian Chi-Kuadrat untuk Independensi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Statistik Deskriptif dan Pengujian Normalitas
- Pengujian-t untuk Membandingkan Rata-Rata
- Pengujian Chi-Kuadrat untuk Independensi
- ANOVA dan Pengujian Pasca-Hoc