0Pricing
Pandas & NumPy Academy · Ders

ANOVA ve Sonraki Testler

Tek yönlü ANOVA ile üç veya daha fazla grup arasındaki ortalamaları karşılaştırın ve hangi çiftlerin farklı olduğunu belirlemek için Tukey HSD uygulayın.

ANOVA ve Sonraki Testler, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 4. 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.

Neden Birden Çok T-Testi Kullanılmamalı?

Üç veya daha fazla grubun ortalamalarını karşılaştırırken birden çok t-testi çalıştırmak, 1. tür hata oranını (yanlış pozitif oranını) artırır. A ve B, A ve C, B ve C gruplarını ayrı ayrı α=0.05 düzeyinde test etmek, genel yanlış pozitif olasılığını %5 yerine yaklaşık %14'e çıkarır. Varyans Analizi (ANOVA), tüm grupları tek bir testte eşzamanlı olarak inceleyerek bu sorunu çözer ve yanlış pozitif oranını tam olarak α düzeyinde tutar. Tek bir ANOVA, “Herhangi bir grup farklı mı?” şeklindeki genel soru için tüm ikili t-testlerinin yerini alır.

Tek Yönlü ANOVA: Genel Bakış

Tek yönlü ANOVA, üç veya daha fazla grubun ortalamalarının anlamlı biçimde farklı olup olmadığını test eder. Toplam varyansı gruplar arası varyansa (grup üyeliğiyle açıklanan) ve grup içi varyansa (rastgele gürültü) ayırır. F-istatistiği bunların oranıdır: F = (gruplar arası varyans) / (grup içi varyans). Büyük bir F değeri, grup farklarının gürültüye kıyasla büyük olduğunu ve küçük bir p-değeri elde edileceğini gösterir. Sıfır hipotezi H₀: tüm grup ortalamaları eşittir şeklindedir.

import numpy as np
from scipy import stats

np.random.seed(0)
# Three product variants with different conversion rates
group_a = np.random.normal(10.0, 2.0, 50)  # baseline
group_b = np.random.normal(11.5, 2.0, 50)  # slightly better
group_c = np.random.normal(13.0, 2.0, 50)  # clearly better

f_stat, p = stats.f_oneway(group_a, group_b, group_c)
print(f'F-statistic: {f_stat:.3f}')
print(f'p-value: {p:.6f}')
print('At least one group differs?', 'Yes' if p < 0.05 else 'No')

Pandas DataFrames ile ANOVA

Uygulamada verileriniz, bir sütununda grup etiketinin, başka bir sütununda ise ölçümün bulunduğu uzun biçimli bir DataFrame içinde yer alır. Her grubu bir Series olarak çıkarın ve stats.f_oneway() işlevine aktarın. Alternatif olarak, geniş biçimli bir DataFrame'iniz varsa (her grup için bir sütun), her sütunu doğrudan aktarın. İşlev, istenen sayıda konumsal bağımsız değişken kabul eder; bu da 4, 5 veya daha fazla gruba kolayca genişletilebilmesini sağlar.

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

np.random.seed(1)
df = pd.DataFrame({
    'group': ['A']*40 + ['B']*40 + ['C']*40 + ['D']*40,
    'score': np.concatenate([
        np.random.normal(70, 10, 40),
        np.random.normal(75, 10, 40),
        np.random.normal(80, 10, 40),
        np.random.normal(72, 10, 40)
    ])
})

groups = [group['score'].values
          for _, group in df.groupby('group')]

f, p = stats.f_oneway(*groups)
print(f'F={f:.3f}, p={p:.4f}')
print(df.groupby('group')['score'].mean().round(2))

ANOVA Varsayımları

Tek yönlü ANOVA şu varsayımlara dayanır: (1) Bağımsızlık — gözlemler birbirinden bağımsızdır; (2) Normallik — artıklar her grup içinde yaklaşık olarak normal dağılır (CLT sayesinde büyük örneklemlerde dayanıklıdır); (3) Varyansların eşitliği — gruplar arasındaki varyanslar eşittir. Varyans varsayımını Levene testi (stats.levene(*groups)) ile test edin. Varyanslar eşit değilse pingouin kütüphanesinde bulunan veya statsmodels ile hesaplanabilen Welch ANOVA kullanın.

import numpy as np
from scipy import stats

np.random.seed(0)
g1 = np.random.normal(10, 2, 40)
g2 = np.random.normal(12, 2, 40)
g3 = np.random.normal(11, 8, 40)   # Much higher variance

# Test equal variances
stat_l, p_l = stats.levene(g1, g2, g3)
print(f'Levene\'s test: stat={stat_l:.3f}, p={p_l:.4f}')
if p_l < 0.05:
    print('Warning: Unequal variances! Standard ANOVA may be unreliable.')
    print('Consider Welch\'s ANOVA or Kruskal-Wallis.')

Kruskal-Wallis: Parametrik Olmayan ANOVA

ANOVA varsayımları ihlal edildiğinde (normal olmayan dağılımlar, küçük örneklemler, eşit olmayan varyanslar), Kruskal-Wallis testi parametrik olmayan alternatiftir. Verileri sıralara dönüştürüp sıralanmış toplamları karşılaştırarak grupların dağılımlarının farklı olup olmadığını test eder. scipy.stats.kruskal(*groups) kullanın. Sıfır hipotezi, tüm grupların aynı dağılıma sahip olduğudur (dağılımların şekli aynı olduğunda medyanların eşitliğini test etmeye denktir). Varsayımlar sağlandığında ANOVA'dan daha düşük güce sahip olsa da her zaman geçerlidir.

import numpy as np
from scipy import stats

np.random.seed(0)
# Non-normal data: customer satisfaction scores (1-10 scale)
g1 = np.random.choice(range(1, 11), 50, p=[0.05]*10)
g2 = np.random.choice(range(1, 11), 50, p=[0.02, 0.03, 0.05, 0.08, 0.12, 0.15, 0.20, 0.15, 0.12, 0.08])
g3 = np.random.choice(range(1, 11), 50, p=[0.15, 0.15, 0.15, 0.15, 0.10, 0.10, 0.08, 0.05, 0.04, 0.03])

stat, p = stats.kruskal(g1, g2, g3)
print(f'Kruskal-Wallis: H={stat:.3f}, p={p:.4f}')
print('Groups differ?', 'Yes' if p < 0.05 else 'No')

Sonrasında Uygulanan Testler: Neden Gereklidir?

Anlamlı bir ANOVA, en az bir grup ortalamasının farklı olduğunu gösterir; ancak hangi çiftlerin farklı olduğunu göstermez. İkili karşılaştırma testleri, çoklu karşılaştırmaları düzelterek tüm ikili karşılaştırmaları gerçekleştirir. En yaygın kullanılan yöntem, aile bazındaki hata oranını α düzeyinde tam olarak kontrol eden Tukey Dürüst Anlamlı Fark (Tukey HSD) testidir. Bu test statsmodels.stats.multicomp.pairwise_tukeyhsd() içinde kullanılabilir. İkili karşılaştırma testlerini yalnızca ANOVA anlamlı çıktıktan sonra çalıştırın; anlamlı olmayan sonuçlar üzerinde rastgele anlam aramayın.

import numpy as np
import pandas as pd
from scipy import stats
from statsmodels.stats.multicomp import pairwise_tukeyhsd

np.random.seed(0)
data = np.concatenate([
    np.random.normal(70, 10, 40),
    np.random.normal(80, 10, 40),
    np.random.normal(75, 10, 40)
])
groups = ['A']*40 + ['B']*40 + ['C']*40

# First confirm ANOVA is significant
f, p = stats.f_oneway(*[data[i*40:(i+1)*40] for i in range(3)])
print(f'ANOVA p={p:.4f}')
if p < 0.05:
    print('Post-hoc Tukey HSD:')
    print(pairwise_tukeyhsd(data, groups, alpha=0.05))

Tukey HSD Çıktısını Okuma

Tukey HSD tablosunda her grup çifti için bir satır bulunur. Odaklanmanız gereken sütunlar şunlardır: meandiff (çift arasındaki ortalama farkı), lower ve upper (fark için %95 güven aralığının alt ve üst sınırları) ve reject (çift α düzeyinde anlamlı biçimde farklıysa True değerini alır). Sıfırı içermeyen bir GA, çiftin anlamlı biçimde farklı olduğunu gösterir. Güven aralıkları örtüşen gruplar birbirlerinden anlamlı biçimde farklı değildir.

import numpy as np
from statsmodels.stats.multicomp import pairwise_tukeyhsd

np.random.seed(42)
data = np.concatenate([
    np.random.normal(10, 2, 60),  # Group A
    np.random.normal(13, 2, 60),  # Group B (clearly higher)
    np.random.normal(10.5, 2, 60) # Group C (barely different from A)
])
groups = ['A']*60 + ['B']*60 + ['C']*60

result = pairwise_tukeyhsd(data, groups, alpha=0.05)
print(result)
# A-B: reject=True (B is higher)
# A-C: reject=False (barely different)
# B-C: reject=True (B is higher)

Bonferroni ve Benjamini-Hochberg Düzeltmeleri

Tukey HSD'ye alternatif olarak ikili t-testlerine Bonferroni düzeltmesi uygulayabilirsiniz: tüm t-testlerini çalıştırın, ardından eşiği k karşılaştırma sayısı olmak üzere α/k değerine ayarlayın. Bu yöntem ihtiyatlıdır; gerçek farkları gözden kaçırabilir. Benjamini-Hochberg Yanlış Keşif Oranı (FDR) düzeltmesi daha az ihtiyatlıdır: yanlış keşiflerin beklenen oranını kontrol eder ve biraz daha fazla yanlış pozitif karşılığında daha fazla doğru pozitife izin verir. statsmodels.stats.multitest.multipletests(p_values, method='fdr_bh') kullanın.

import numpy as np
from scipy import stats
from statsmodels.stats.multitest import multipletests

np.random.seed(0)
groups = [np.random.normal(10 + i*1.5, 2, 40) for i in range(4)]
names = ['A', 'B', 'C', 'D']

# All pairwise t-tests
p_values = []
pairs = []
for i in range(len(groups)):
    for j in range(i+1, len(groups)):
        _, p = stats.ttest_ind(groups[i], groups[j])
        p_values.append(p)
        pairs.append(f'{names[i]}-{names[j]}')

# Benjamini-Hochberg correction
reject, adj_p, _, _ = multipletests(p_values, method='fdr_bh')
for pair, p, ap, r in zip(pairs, p_values, adj_p, reject):
    print(f'{pair}: raw_p={p:.4f}, adj_p={ap:.4f}, significant={r}')

ANOVA için Etki Büyüklüğü: Eta-Kare

ANOVA için Cohen d'sine karşılık gelen ölçü eta-kare (η²) değeridir: toplam varyansın grup üyeliğiyle açıklanan oranı. η² = SS_between / SS_total. Değerler: < 0.01 küçük, 0.06 orta, > 0.14 büyük etkiyi gösterir. Kısmi eta-kare (η²_p) yayımlanmış araştırmalarda daha yaygındır: toplam varyans yerine yalnızca grup varyansı ile hata varyansının toplamına böler. Etkinin yalnızca istatistiksel olarak saptanabilir değil, pratik açıdan da anlamlı olup olmadığını göstermek için η² değerini her zaman ANOVA p-değeriyle birlikte hesaplayın.

import numpy as np
from scipy import stats

np.random.seed(0)
groups = [
    np.random.normal(10, 2, 50),
    np.random.normal(12, 2, 50),
    np.random.normal(14, 2, 50)
]

all_data = np.concatenate(groups)
grand_mean = all_data.mean()

ss_between = sum(len(g) * (g.mean() - grand_mean)**2 for g in groups)
ss_total = sum((x - grand_mean)**2 for g in groups for x in g)
eta_sq = ss_between / ss_total

f, p = stats.f_oneway(*groups)
print(f'F={f:.3f}, p={p:.4f}')
print(f'Eta-squared: {eta_sq:.4f} ({eta_sq:.1%} of variance explained)')

İki Yönlü ANOVA'ya Genel Bakış

İki yönlü ANOVA, tek yönlü ANOVA'yı aynı anda iki kategorik faktöre genişletir. Örneğin sınav puanlarının hem öğretim yöntemine hem de öğrencinin deneyim düzeyine göre farklı olup olmadığını aynı anda test eder. Ayrıca etkileşim etkisini de test eder: Öğretim yönteminin etkisi deneyim düzeyine bağlı mı? İki yönlü ANOVA, statsmodels içinde ols('score ~ C(method) + C(level) + C(method):C(level)', data=df).fit() ve anova_lm(model) kullanılarak uygulanır. Bu, daha ileri deneysel tasarım çalışmalarının temelini oluşturur.

import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

np.random.seed(0)
df = pd.DataFrame({
    'method': ['trad']*60 + ['active']*60,
    'level': ['beginner']*30 + ['advanced']*30 + ['beginner']*30 + ['advanced']*30,
    'score': (np.random.normal(70, 8, 30).tolist() +
              np.random.normal(80, 8, 30).tolist() +
              np.random.normal(75, 8, 30).tolist() +
              np.random.normal(88, 8, 30).tolist())
})

model = ols('score ~ C(method) + C(level) + C(method):C(level)', data=df).fit()
print(anova_lm(model, typ=2)[['F', 'PR(>F)']].round(4))

Tekrarlı Ölçümler ANOVA'sı

Tekrarlı ölçümler ANOVA'sı, aynı deneklerin birden çok kez ölçüldüğü durumlarda kullanılır; örneğin bir tedaviden 0, 30 ve 60 dakika sonra tepki süresini test etmek gibi. Eşleştirilmiş t-testinin çok gruplu genellemesidir. Bireysel farklılıkları hesaba kattığı için tek yönlü ANOVA'dan daha yüksek güce sahiptir. Python'da ikili karşılaştırma analizi için pingouin.rm_anova() veya pg.pairwise_tests() kullanın. Küresellik varsayımı ihlal edildiğinde (Mauchly testiyle test edilir), Greenhouse-Geisser düzeltmeli p-değerlerini kullanın.

import pandas as pd
import numpy as np

# Example structure for repeated measures (pingouin library)
np.random.seed(0)
subjects = list(range(20)) * 3   # 20 subjects, 3 time points
timepoints = ['T0']*20 + ['T1']*20 + ['T2']*20
scores = np.concatenate([
    np.random.normal(50, 10, 20),   # baseline
    np.random.normal(55, 10, 20),   # improved
    np.random.normal(60, 10, 20)    # further improved
])

df_rm = pd.DataFrame({'subject': subjects, 'time': timepoints, 'score': scores})
print(df_rm.groupby('time')['score'].mean().round(2))
# Use pingouin.rm_anova(data=df_rm, dv='score', within='time', subject='subject')

Hızlı Kontrol

Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: scipy.stats.f_oneway(), genel Tip I hata oranını kontrol ederken herhangi bir grubun ortalamasının farklı olup olmadığını test eder; ikili karşılaştırma testleri (Tukey HSD), anlamlı bir ANOVA sonrasında hangi belirli çiftlerin farklı olduğunu belirler; Kruskal-Wallis ise normallik veya eşit varyans varsayımları ihlal edildiğinde kullanılan parametrik olmayan alternatiftir. Sırada, tüm becerileri uçtan uca bir veri işlem hattında birleştireceğiniz bitirme projesi var.

Sıkça Sorulan Sorular

“ANOVA ve Sonraki Testler” dersi ücretsiz mi?

Evet — “ANOVA ve Sonraki Testler” 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.

“ANOVA ve Sonraki Testler” dersinde ne öğreneceğim?

Tek yönlü ANOVA ile üç veya daha fazla grup arasındaki ortalamaları karşılaştırın ve hangi çiftlerin farklı olduğunu belirlemek için Tukey HSD uygulayın. 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 4. dersidir.

“ANOVA ve Sonraki Testler” 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

  1. Betimsel İstatistikler ve Normallik Testi
  2. Ortalamaları Karşılaştırmak için t Testleri
  3. Bağımsızlık için Ki-Kare Testi
  4. ANOVA ve Sonraki Testler
← Pandas & NumPy Academy Sayfasına Dön