3-4 saatte tüm istatistiği tekrar etmek için kapsamlı rehber
| Ölçü | Formül | Ne Zaman? |
|---|---|---|
| Ortalama | x̄ = Σxᵢ / n | Simetrik dağılımlarda |
| Medyan | Sıralı verinin ortası | Çarpık dağılım, aykırı değer |
| Mod | En sık tekrar eden | Kategorik veri |
| Ölçü | Değer | Yorum |
|---|---|---|
| Çarpıklık | = 0 | Simetrik | >0 Sağa | <0 Sola |
| Basıklık | = 3 | Normal | >3 Sivri | <3 Basık |
Pythonimport numpy as np
from scipy import stats
veri = [23, 45, 12, 67, 34, 89, 56, 78, 90, 43]
print(f"Ortalama: {np.mean(veri):.2f}")
print(f"Medyan: {np.median(veri):.2f}")
print(f"Std Sapma: {np.std(veri, ddof=1):.2f}")
print(f"Çarpıklık: {stats.skew(veri):.4f}")
print(f"Basıklık: {stats.kurtosis(veri):.4f}")
Merkezi Limit Teoremi: n≥30 olduğunda örneklem ortalamaları normal dağılır.
n bağımsız deneme, her birinde başarı olasılığı p
Birim zamanda/alanda nadir olay sayma (λ = ortalama olay sayısı)
Pythonfrom scipy.stats import norm, binom, poisson
# Normal: P(Z < 1.96)
print(f"P(Z < 1.96) = {norm.cdf(1.96):.4f}")
# Binomial: 10 atışta 6 başarı (p=0.5)
print(f"P(X=6) = {binom.pmf(6, 10, 0.5):.4f}")
# Poisson: λ=3, P(X=5)
print(f"P(X=5) = {poisson.pmf(5, 3):.4f}")
Bir değerin ortalamadan kaç standart sapma uzakta olduğunu gösterir.
| z değeri | Tek Taraflı P | Çift Taraflı P |
|---|---|---|
| 1.645 | 0.050 | 0.100 |
| 1.960 | 0.025 | 0.050 |
| 2.576 | 0.005 | 0.010 |
Pythonfrom scipy.stats import norm
x, mu, sigma = 85, 70, 10
z = (x - mu) / sigma
print(f"z = {z:.2f}")
print(f"P(Z < {z}) = {norm.cdf(z):.4f}") # sol kuyruk
print(f"P(Z > {z}) = {1 - norm.cdf(z):.4f}") # sağ kuyruk
print(f"Çift taraflı = {2*(1 - norm.cdf(abs(z))):.4f}")
# Olasılıktan z bul
z_kritik = norm.ppf(0.975) # α=0.05 çift taraflı
print(f"Kritik z (α=0.05) = {z_kritik:.4f}")
| Güven Düzeyi | z* değeri |
|---|---|
| 90% | 1.645 |
| 95% | 1.960 |
| 99% | 2.576 |
Pythonimport numpy as np
from scipy import stats
veri = np.random.normal(100, 15, size=50)
se = stats.sem(veri)
ci = stats.t.interval(0.95, df=len(veri)-1, loc=np.mean(veri), scale=se)
print(f"Ortalama: {np.mean(veri):.2f}")
print(f"%95 GA: ({ci[0]:.2f}, {ci[1]:.2f})")
| H₀ Doğru | H₀ Yanlış | |
|---|---|---|
| H₀ Reddet | ❌ Tip I (α) | ✅ Doğru (Güç=1-β) |
| H₀ Reddetme | ✅ Doğru | ❌ Tip II (β) |
| Test Yönü | H₁ | Ne Zaman? |
|---|---|---|
| Çift taraflı | μ ≠ μ₀ | Farkın yönü önemsiz |
| Sağ taraflı | μ > μ₀ | Artış bekleniyor |
| Sol taraflı | μ < μ₀ | Azalış bekleniyor |
En güvenilir normallik testi (n < 5000).
H₀: Veri normal | H₁: Normal değil | p > 0.05 → Normal
Pythonfrom scipy.stats import shapiro, normaltest
import numpy as np
normal_veri = np.random.normal(50, 10, 100)
carpik_veri = np.random.exponential(5, 100)
stat, p = shapiro(normal_veri)
print(f"Shapiro → W={stat:.4f}, p={p:.4f}")
print("Normal ✅" if p > 0.05 else "Normal değil ❌")
# D'Agostino K²
stat2, p2 = normaltest(normal_veri)
print(f"D'Agostino → K²={stat2:.4f}, p={p2:.4f}")
Grupların varyanslarının eşit olup olmadığını test eder. T-testi ve ANOVA ön koşuludur.
H₀: σ₁² = σ₂² | p > 0.05 → Homojen
| Test | Avantaj | Dezavantaj |
|---|---|---|
| Levene | Normallik varsaymaz | Biraz daha az güçlü |
| Bartlett | Normal dağılımda güçlü | Normallik ihlallerine hassas |
Pythonfrom scipy.stats import levene
import numpy as np
grup_a = np.random.normal(50, 10, 50) # std=10
grup_c = np.random.normal(48, 25, 50) # std=25
stat, p = levene(grup_a, grup_c)
print(f"Levene W={stat:.4f}, p={p:.4f}")
print("Homojen ✅" if p > 0.05 else "Heterojen ❌")
equal_var=False (Welch), ANOVA yerine Kruskal-Wallis kullanın.Pythonfrom scipy.stats import ttest_1samp
notlar = [78, 82, 85, 90, 74, 88, 92, 79, 83, 87]
t, p = ttest_1samp(notlar, popmean=80)
print(f"t={t:.4f}, p={p:.4f} → {'Red' if p<0.05 else 'Reddedilemez'}")
Ön koşullar: ① Normallik ② Varyans homojenliği ③ Bağımsızlık
Pythonfrom scipy.stats import ttest_ind, levene, shapiro
import numpy as np
ilac = np.random.normal(120, 15, 30)
plasebo = np.random.normal(130, 15, 30)
# Ön koşullar
_, p_lev = levene(ilac, plasebo)
t, p = ttest_ind(ilac, plasebo, equal_var=(p_lev > 0.05))
print(f"t={t:.4f}, p={p:.4f}")
print("Fark VAR ✅" if p < 0.05 else "Fark YOK ❌")
Pythonfrom scipy.stats import ttest_rel
oncesi = [120, 135, 128, 140, 132, 145, 138, 130, 142, 136]
sonrasi = [115, 125, 122, 130, 128, 135, 130, 120, 132, 128]
t, p = ttest_rel(oncesi, sonrasi)
print(f"Ort. fark: {sum(a-b for a,b in zip(oncesi,sonrasi))/len(oncesi):.1f}")
print(f"t={t:.4f}, p={p:.4f} → {'Etkili ✅' if p<0.05 else 'Etkisiz ❌'}")
T-testinin büyük örneklem (n≥30) ve σ bilinen versiyonu.
Pythonimport numpy as np
from scipy.stats import norm
olcumler = np.random.normal(503, 10, 50)
z = (np.mean(olcumler) - 500) / (10 / np.sqrt(50))
p = 2 * (1 - norm.cdf(abs(z)))
print(f"z={z:.4f}, p={p:.4f}")
| Özellik | Z-Testi | T-Testi |
|---|---|---|
| σ biliniyor mu? | Evet | Hayır |
| Örneklem | n ≥ 30 | Herhangi |
| Dağılım | Normal (CLT) | t dağılımı |
3+ grubun ortalamasını karşılaştırır. H₀: μ₁ = μ₂ = ... = μₖ
Pythonfrom scipy.stats import f_oneway
import numpy as np
a = np.random.normal(75, 8, 30)
b = np.random.normal(80, 8, 30)
c = np.random.normal(78, 8, 30)
F, p = f_oneway(a, b, c)
print(f"F={F:.4f}, p={p:.4f}")
# Post-hoc: Tukey HSD
from statsmodels.stats.multicomp import pairwise_tukeyhsd
data = np.concatenate([a, b, c])
groups = ['A']*30 + ['B']*30 + ['C']*30
print(pairwise_tukeyhsd(data, groups, alpha=0.05))
İki kategorik değişken arasında ilişki var mı?
Pythonfrom scipy.stats import chi2_contingency, chisquare
import numpy as np
# Bağımsızlık
tablo = np.array([[50, 30], [20, 100]])
chi2, p, df, beklenen = chi2_contingency(tablo)
print(f"χ²={chi2:.4f}, p={p:.6f} → {'İlişki VAR' if p<0.05 else 'İlişki YOK'}")
# Uyum iyiliği (zar adil mi?)
gozlenen = [18, 22, 20, 25, 15]
chi2, p = chisquare(gozlenen, f_exp=[20]*5)
print(f"χ²={chi2:.4f}, p={p:.4f} → {'Hileli' if p<0.05 else 'Adil'}")
| |r| değeri | Yorum |
|---|---|
| 0.00 – 0.29 | Zayıf |
| 0.30 – 0.69 | Orta |
| 0.70 – 1.00 | Güçlü |
Pythonfrom scipy.stats import pearsonr, spearmanr
from sklearn.linear_model import LinearRegression
import numpy as np
x = np.random.uniform(1, 10, 50)
y = 50 + 4*x + np.random.normal(0, 5, 50)
r, p = pearsonr(x, y)
rho, p2 = spearmanr(x, y)
print(f"Pearson r={r:.4f}, Spearman ρ={rho:.4f}")
model = LinearRegression().fit(x.reshape(-1,1), y)
print(f"ŷ = {model.intercept_:.2f} + {model.coef_[0]:.2f}·x")
print(f"R² = {model.score(x.reshape(-1,1), y):.4f}")
| Parametrik | Non-Parametrik | Durum |
|---|---|---|
| Bağımsız t-testi | Mann-Whitney U | 2 bağımsız grup |
| Eşleştirilmiş t | Wilcoxon | 2 bağımlı grup |
| Tek yönlü ANOVA | Kruskal-Wallis | 3+ bağımsız grup |
Pythonfrom scipy.stats import mannwhitneyu, wilcoxon, kruskal
import numpy as np
g1 = np.random.exponential(5, 30)
g2 = np.random.exponential(8, 30)
U, p = mannwhitneyu(g1, g2, alternative='two-sided')
print(f"Mann-Whitney U={U:.0f}, p={p:.4f}")
oncesi = [85, 90, 78, 92, 88, 76, 95, 80, 83, 89]
sonrasi = [90, 95, 82, 96, 92, 82, 98, 86, 88, 93]
W, p2 = wilcoxon(oncesi, sonrasi)
print(f"Wilcoxon W={W:.0f}, p={p2:.4f}")
p-value "fark var mı?" sorusunu, etki büyüklüğü "fark ne kadar büyük?" sorusunu cevaplar.
| d | Yorum |
|---|---|
| 0.2 | Küçük |
| 0.5 | Orta |
| 0.8 | Büyük |
Pythonimport numpy as np
def cohens_d(g1, g2):
n1, n2 = len(g1), len(g2)
pooled = np.sqrt(((n1-1)*np.var(g1,ddof=1)+(n2-1)*np.var(g2,ddof=1))/(n1+n2-2))
return (np.mean(g1) - np.mean(g2)) / pooled
d = cohens_d(np.random.normal(120,15,30), np.random.normal(130,15,30))
print(f"Cohen's d = {d:.4f}")
Testten ÖNCE yapılır. 4 bileşen (3'ünü ver, 4.'yü hesapla):
Pythonfrom statsmodels.stats.power import TTestIndPower
analysis = TTestIndPower()
for d in [0.2, 0.5, 0.8]:
n = analysis.solve_power(effect_size=d, alpha=0.05, power=0.8)
print(f"d={d} → n={n:.0f} (grup başına)")
Pythonfrom statsmodels.stats.proportion import proportions_ztest, proportion_confint
from statsmodels.stats.proportion import proportion_effectsize
from statsmodels.stats.power import NormalIndPower
import numpy as np
# Kontrol: 120/1000, Test: 145/1000
z, p = proportions_ztest([120,145], [1000,1000], alternative='smaller')
print(f"z={z:.4f}, p={p:.4f}")
if p < 0.05:
lift = (145/1000 - 120/1000) / (120/1000) * 100
print(f"✅ Lift: +{lift:.1f}%")
# Gerekli örneklem
effect = proportion_effectsize(0.10, 0.12)
n = NormalIndPower().solve_power(effect, alpha=0.05, power=0.80)
print(f"MDE %10→%12 için n = {n:.0f} (grup başına)")
| Tuzak | Çözüm |
|---|---|
| Peeking (erken bakma) | Önceden n belirle, bekle |
| Multiple testing | Bonferroni: α_yeni = α / k |
| Simpson paradoksu | Segmentasyon yap |
| Novelty effect | Yeterli süre bekle |
Python# Hastalık testi: %99 doğruluk, %1 prevalans
p_hasta = 0.01
p_poz = 0.99 * 0.01 + 0.01 * 0.99
posterior = (0.99 * 0.01) / p_poz
print(f"P(Hasta | Pozitif) = {posterior:.2%}")
print("→ %99 doğruluklu test bile nadir hastalıkta yanıltıcı!")
| # | Adım | Araç |
|---|---|---|
| 1 | Veri tipini belirle | df.dtypes |
| 2 | Dağılımı gör | Histogram, QQ-plot |
| 3 | Normallik testi | shapiro() |
| 4 | Varyans homojenliği | levene() |
| 5 | Uygun testi uygula | Karar ağacı |
| 6 | Etki büyüklüğü | Cohen's d, η² |
| 7 | Sonucu yorumla | p + etki + GA |