Bağımsızlık için Ki-Kare Testi
Bir çapraz tablo frekans tablosundaki chi2_contingency işlevini kullanarak iki kategorik değişkenin bağımsız olup olmadığını test edin.
Bağımsızlık için Ki-Kare Testi, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
Kategorik İlişkileri Test Etme
Bağımsızlık için ki-kare testi, iki kategorik değişkenin istatistiksel olarak bağımsız olup olmadığını veya aralarında bir ilişki bulunup bulunmadığını test eder. Örneğin: “Müşteri kaybı abonelik düzeyinden bağımsız mı?” ya da “Ürün tercihi yaş grubundan bağımsız mı?” Sayısal ortalamaları karşılaştıran t-testlerinin aksine ki-kare testleri, değişkenler bağımsız olsaydı bekleyeceğimiz frekanslarla bir çapraz tabloda bulunan gözlemlenen frekansları karşılaştırır.
Pandas ile Çapraz Tablo Oluşturma
Çapraz tablo (çapraz sınıflandırma tablosu olarak da adlandırılır), iki kategorik değişkenin her kombinasyonu için gözlem sayısını gösterir. pd.crosstab(df['var1'], df['var2']) bu tabloyu doğrudan bir DataFrame'den oluşturur. Her hücre, satır kategorisi ile sütun kategorisinin birlikte görüldüğü gözlem sayısını içerir. Bu tablo, scipy.stats.chi2_contingency() işlevine girdi olarak verilir.
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() Çalıştırma
scipy.stats.chi2_contingency(observed), gözlemlenen çapraz tabloyu (NumPy dizisi veya Pandas DataFrame olarak) alır ve dört değer döndürür: ki-kare istatistiği, p-değeri, serbestlik derecesi ve beklenen frekans tablosu. Sıfır hipotezi H₀: the two variables are independent şeklindedir. p ≤ 0.05 ise bağımsızlık hipotezini reddeder ve istatistiksel olarak anlamlı bir ilişki bulunduğu sonucuna varırız.
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')Beklenen Frekansları Anlama
Beklenen frekanslar, iki değişken tamamen bağımsız olsaydı hücrelerdeki sayıların nasıl görüneceğini gösterir. Her hücre için expected = (row_total × column_total) / grand_total hesaplanır. Ki-kare istatistiği, gözlemlenen ve beklenen sayılar arasındaki karesel farkların, beklenen sayılara göre normalize edilmiş toplamını ölçer. Büyük ki-kare değeri, gözlemlenen sayıların bağımsızlıktan güçlü biçimde saptığını; küçük ki-kare değeri ise verilerin bağımsızlıkla tutarlı olduğunu gösterir.
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))Ki-Kare Testinde Serbestlik Dereceleri
r satır ve c sütun içeren bir çapraz tablo için serbestlik derecesi df = (r-1) × (c-1) şeklindedir. 2×2 tablonun df=1, 3×4 tablonun ise df=6 serbestlik derecesi vardır. Ki-karenin kritik değeri serbestlik derecesi arttıkça yükselir: α=0.05 düzeyinde df=1 için kritik değer ≈ 3.84; df=6 için kritik değer ≈ 12.6'dır. chi2_contingency işlevi bunu otomatik olarak ele alır; ancak formülü bilmek, daha büyük tablolardan elde edilen ki-kare değerlerinin anlamlı olabilmesi için neden daha büyük istatistikler gerektiğini anlamanıza yardımcı olur.
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}')Minimum Beklenen Frekans Varsayımı
Ki-kare testi yalnızca tüm beklenen frekanslar en az 5 olduğunda güvenilirdir (bazı kaynaklar, 5'in altında kalanların oranı %20'yi geçmemek koşuluyla en az 1 olması gerektiğini belirtir). Küçük beklenen sayılar, ki-kare yaklaşımını hatalı hale getirir. Bu varsayım ihlal edildiğinde, 2×2 tablolar için Fisher kesin testini (scipy.stats.fisher_exact()) kullanın veya beklenen sayıları artırmak için nadir kategorileri birleştirin. chi2_contingency tarafından döndürülen beklenen frekans matrisini her zaman inceleyin.
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}')Küçük Örneklemler için Fisher Kesin Testi
scipy.stats.fisher_exact(table), bağımsızlık sıfır hipotezi altında verilen 2×2 tabloyu (veya bundan daha uç bir tabloyu) gözlemleme olasılığını herhangi bir yaklaşık hesaplama kullanmadan kesin olarak hesaplar. Örneklem büyüklüğünden veya hücre sayılarından bağımsız olarak her zaman geçerlidir; p-değeri yaklaşık değil, kesindir. Bunun bedeli hesaplama maliyetidir: tüm olası tabloları tek tek değerlendirir ve toplamların büyük olduğu durumlarda yavaşlar. Herhangi bir hücre sayısının 5'in altında olduğu 2×2 tablolarda, ki-kare testi yerine her zaman Fisher kesin testini tercih edin.
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')İlişki Gücünü Ölçme: Cramér's V
T-testleri için Cohen's d'de olduğu gibi, ki-kare istatistiği tek başına ilişkinin gücünü ölçmez — örneklem büyüklüğünden etkilenerek şişer. Cramér's V, ki-kareyi 0–1 aralığına normalize eder: 0 ilişki olmadığını, 1 ise kusursuz ilişkiyi gösterir. V = sqrt(chi2 / (n × min(r-1, c-1))). Genel ölçütler şöyledir: < 0.1 zayıf, 0.1–0.3 orta, > 0.3 güçlüdür. Eksiksiz bir değerlendirme için Cramér's V değerini her zaman p-değeriyle birlikte raporlayın.
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')Ki-Kare Uyum İyiliği Testi
Ki-karenin farklı bir kullanım alanı da uyum iyiliği testidir: gözlemlenen frekansların varsayılan bir dağılımla uyuşup uyuşmadığını test eder. Örneğin, “Zar atışları düzgün dağılmış mı?” veya “Web sitesi trafiğimiz beklenen haftanın günleri düzenini izliyor mu?” soruları bu testle incelenebilir. Beklenen frekansların f_exp olduğu scipy.stats.chisquare(f_obs, f_exp) işlevini kullanın. Sıfır hipotezi, verilerin belirtilen dağılımı izlediğidir.
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')normalise ile pd.crosstab Kullanımı
Ki-kare sonuçlarını raporlarken, okuyucuların göreli ilişkiyi görebilmesi için ham sayılar yerine oranları göstermek yararlıdır. pd.crosstab(var1, var2, normalize='index'), satır oranını gösterir (her satır kategorisinin ne kadarının her sütuna düştüğünü belirtir). normalize='columns' ise sütun oranlarını gösterir. Testi çalıştırmadan önce bu oranları görsel olarak karşılaştırmak, ilişkinin yönünü tahmin etmenize ve sonucu bağlam içinde yorumlamanıza yardımcı olur.
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 Testinde Ki-Kare Testi
Ki-kare testi, A/B testi dönüşüm oranları için standart testtir. Satırları = (kontrol, varyant), sütunları = (dönüştü, dönüşmedi) olacak şekilde 2×2 bir çapraz tablo oluşturun. Ki-kare testi, dönüşüm oranının gruplar arasında anlamlı biçimde farklı olup olmadığını gösterir. Büyük örneklemlerde bu, iki oranlı z-testine denktir. Küçük örneklemlerde (beklenen sayılardan herhangi biri < 5 ise) bunun yerine Fisher kesin testini kullanın.
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')Hızlı Kontrol
Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: pd.crosstab() + chi2_contingency(), gözlemlenen ve beklenen frekanslara dayanarak iki kategorik değişkenin bağımsız olup olmadığını test eder; Fisher kesin testi, beklenen sayılar 5'in altına düştüğünde güvenli alternatiftir; Cramér's V ise örneklem büyüklüğünden bağımsız olarak ilişki gücünü ölçer. Sırada, üç veya daha fazla grup arasındaki ortalamaları ANOVA ve sonrasında uygulanan testlerle karşılaştıracağız.
Yapay zeka eğitmeniyle Python öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Bağımsızlık için Ki-Kare Testi” dersi ücretsiz mi?
Evet — “Bağımsızlık için Ki-Kare Testi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
“Bağımsızlık için Ki-Kare Testi” dersinde ne öğreneceğim?
Bir çapraz tablo frekans tablosundaki chi2_contingency işlevini kullanarak iki kategorik değişkenin bağımsız olup olmadığını test edin. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Bağımsızlık için Ki-Kare Testi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Betimsel İstatistikler ve Normallik Testi
- Ortalamaları Karşılaştırmak için t Testleri
- Bağımsızlık için Ki-Kare Testi
- ANOVA ve Sonraki Testler