Örnekleme teorisi, sınırlı verilerden evrene genelleme yapmanın matematiksel temelini oluşturur. Veri biliminde, küçük örneklemlerden büyük veri setleri hakkında çıkarımlar yaparken kritik öneme sahiptir.
İstatistiğin en önemli teoremlerinden biri. Örneklem büyüklüğü arttıkça, örneklem ortalamalarının dağılımı normal dağılıma yaklaşır.
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
population = np.random.uniform(0, 10, 10000)
pop_mean = np.mean(population)
pop_std = np.std(population)
print(f"Evren ortalaması: {pop_mean:.2f}")
print(f"Evren standart sapması: {pop_std:.2f}")
sample_sizes = [5, 10, 30, 100]
sample_means = {}
for n in sample_sizes:
means = []
for i in range(1000):
sample = np.random.choice(population, n)
means.append(np.mean(sample))
sample_means[n] = means
mean_of_means = np.mean(means)
std_of_means = np.std(means)
theoretical_std = pop_std / np.sqrt(n)
print(f"\nn = {n}:")
print(f" Ortalama: {mean_of_means:.2f} (beklenen: {pop_mean:.2f})")
print(f" Std sapma: {std_of_means:.3f} (teorik: {theoretical_std:.3f})")
Evren ortalaması: 5.00
Evren standart sapması: 2.89
n = 5:
Ortalama: 4.99 (beklenen: 5.00)
Std sapma: 1.292 (teorik: 1.293)
n = 30:
Ortalama: 5.00 (beklenen: 5.00)
Std sapma: 0.527 (teorik: 0.528)
E[θ̂] = θ koşulunu sağlayan tahmin edici. Örneklem ortalaması yansız, ama örneklem varyansı (n ile bölen) yanlı!
Dikkat: Örneklem varyansında n-1 ile bölerek (Bessel düzeltmesi) yansız tahmin elde ederiz. Bu, küçük örneklemlerde özellikle önemlidir.
Evren parametresinin belirli bir olasılıkla içinde bulunduğu aralık. %95 güven aralığı en yaygın kullanılan.
Örnek: 100 müşterinin ortalama harcaması 250 TL, standart sapma 50 TL. Evren ortalaması için %95 güven aralığı nedir?
Çözüm:
n = 100, x̄ = 250, σ = 50, Z₀.₀₂₅ = 1.96
SE = 50/√100 = 5
CI = 250 ± 1.96 × 5 = 250 ± 9.8 = [240.2, 259.8]
Yorum: Evren ortalaması %95 olasılıkla 240.2-259.8 TL arasındadır.
# Python ile Güven Aralığı Hesaplama
import numpy as np
from scipy import stats
# Veri
sample_mean = 250
sample_std = 50
n = 100
confidence_level = 0.95
# Standart hata
standard_error = sample_std / np.sqrt(n)
print(f"Standart hata: {standard_error}")
# Kritik değer (t-dağılımı, çünkü σ bilinmiyor)
alpha = 1 - confidence_level
df = n - 1
| 0.0 - 0.3 |
Zayıf |
Neredeyse hiç ilişki yok |
| 0.3 - 0.7 |
Orta |
Belirgin ilişki var |
| 0.7 - 0.9 |
Güçlü |
Kuvvetli ilişki |
| 0.9 - 1.0 |
Çok Güçlü |
Neredeyse mükemmel ilişki |
# Python ile Korelasyon Analizi
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# Örnek veri seti oluştur
np.random.seed(42)
n = 100
# Farklı korelasyon örnekleri
x1 = np.random.normal(0, 1, n)
y1 = 2 * x1 + np.random.normal(0, 0.5, n) # Güçlü pozitif
x2 = np.random.normal(0, 1, n)
y2 = -1.5 * x2 + np.random.normal(0, 1, n) # Orta negatif
x3 = np.random.normal(0, 1, n)
y3 = x3**2 + np.random.normal(0, 0.5, n) # Nonlinear (Pearson düşük gösterir)
x4 = np.random.normal(0, 1, n)
y4 = np.random.normal(0, 1, n) # Bağımsız
# DataFrame oluştur
df = pd.DataFrame({
'X1': x1, 'Y1': y1,
'X2': x2, 'Y2': y2,
'X3': x3, 'Y3': y3,
'X4': x4, 'Y4': y4
})
# Korelasyon hesaplamaları
correlations = [
('X1-Y1 (Güçlü Pozitif)', stats.pearsonr(x1, y1)),
('X2-Y2 (Orta Negatif)', stats.pearsonr(x2, y2)),
('X3-Y3 (Nonlinear)', stats.pearsonr(x3, y3)),
('X4-Y4 (Bağımsız)', stats.pearsonr(x4, y4))
]
print("Pearson Korelasyon Sonuçları:")
print("-" * 45)
for name, (r, p_val) in correlations:
significance = "***" if p_val < 0.001 else "**" if p_val < 0.01 else "*" if p_val < 0.05 else "ns"
print(f"{name:<20}: r = {r:6.3f}, p = {p_val:.6f} {significance}")
# Korelasyon matrisi
correlation_matrix = df.corr()
print(f"\nKorelasyon Matrisi:")
print(correlation_matrix.round(3))
Pearson Korelasyon Sonuçları:
---------------------------------------------
X1-Y1 (Güçlü Pozitif) : r = 0.970, p = 0.000000 ***
X2-Y2 (Orta Negatif) : r = -0.848, p = 0.000000 ***
X3-Y3 (Nonlinear) : r = 0.058, p = 0.572079 ns
X4-Y4 (Bağımsız) : r = -0.075, p = 0.459508 ns
Sıralama temelli korelasyon. Nonlinear monotonic ilişkileri yakalar. Outlier'lara daha robust.
Küçük örneklemlerde daha stable. Concordant ve discordant çiftleri karşılaştırır.
# Farklı korelasyon türleri karşılaştırması
from scipy.stats import pearsonr, spearmanr, kendalltau
# Nonlinear veri için karşılaştırma
x = np.random.uniform(0, 4, 50)
y = x**2 + np.random.normal(0, 2, 50) # Quadratic ilişki
# Farklı korelasyon türleri
pearson_r, pearson_p = pearsonr(x, y)
spearman_r, spearman_p = spearmanr(x, y)
kendall_r, kendall_p = kendalltau(x, y)
print("Nonlinear İlişki için Korelasyon Karşılaştırması:")
print(f"Pearson r: {pearson_r:.3f} (p = {pearson_p:.6f})")
print(f"Spearman ρ: {spearman_r:.3f} (p = {spearman_p:.6f})")
print(f"Kendall τ: {kendall_r:.3f} (p = {kendall_p:.6f})")
# Outlier etkisi
x_clean = np.random.normal(0, 1, 48)
y_clean = 2 * x_clean + np.random.normal(0, 0.5, 48)
# Outlier ekle
x_outlier = np.append(x_clean, [10, -10])
y_outlier = np.append(y_clean, [-5, 15])
print(f"\nOutlier Etkisi:")
print(f"Clean data Pearson: {pearsonr(x_clean, y_clean)[0]:.3f}")
print(f"With outliers Pearson: {pearsonr(x_outlier, y_outlier)[0]:.3f}")
print(f"Clean data Spearman: {spearmanr(x_clean, y_clean)[0]:.3f}")
print(f"With outliers Spearman: {spearmanr(x_outlier, y_outlier)[0]:.3f}")
Nonlinear İlişki için Korelasyon Karşılaştırması:
Pearson r: 0.634 (p = 0.000001)
Spearman ρ: 0.919 (p = 0.000000)
Kendall τ: 0.767 (p = 0.000000)
Outlier Etkisi:
Clean data Pearson: 0.970
With outliers Pearson: 0.189
Clean data Spearman: 0.969
With outliers Spearman: 0.863
Korelasyon ≠ Nedensellik! Yüksek korelasyon nedensel ilişki anlamına gelmez. Üçüncü bir değişken (confounding variable) her iki değişkeni de etkileyebilir.
ML'de Korelasyon Kullanımı:
• Feature Selection: Yüksek korelasyonlu features'ları tespit
• Multicollinearity: VIF (Variance Inflation Factor) hesaplama
• EDA: Veri keşfi ve pattern recognition
• Ensemble Methods: Model diversity için düşük korelasyonlu modeller
Varyans Analizi (ANOVA)
ANOVA (Analysis of Variance), üç veya daha fazla grubun ortalamalarını karşılaştırmak için kullanılan istatistiksel yöntemdir. A/B/C testleri, feature importance analizi ve categorical variable'ların etkisini ölçmede kritik rol oynar.
Bir kategorik bağımsız değişkenin sürekli bağımlı değişken üzerindeki etkisini test eder.
1. Independence: Gözlemler bağımsız
2. Normality: Her grup normal dağılım
3. Homogeneity: Varyanslar eşit (Levene test)
# One-Way ANOVA Örneği: Marketing Channel Effectiveness
import numpy as np
import pandas as pd
from scipy import stats
from scipy.stats import f_oneway, levene, shapiro
import matplotlib.pyplot as plt
# Sentetik veri: 4 farklı marketing channel'ın conversion rate'leri
np.random.seed(42)
# Email: Ortalama conversion rate %8
email = np.random.normal(0.08, 0.02, 50)
# Social Media: Ortalama conversion rate %12
social = np.random.normal(0.12, 0.025, 45)
# Paid Ads: Ortalama conversion rate %15
paid_ads = np.random.normal(0.15, 0.03, 40)
# Organic: Ortalama conversion rate %6
organic = np.random.normal(0.06, 0.015, 55)
# DataFrame oluştur
data = []
for channel, rates in [('Email', email), ('Social', social),
('Paid_Ads', paid_ads), ('Organic', organic)]:
for rate in rates:
data.append({'Channel': channel, 'Conversion_Rate': rate})
df = pd.DataFrame(data)
print("Kanal Bazında İstatistikler:")
summary_stats = df.groupby('Channel')['Conversion_Rate'].agg([
'count', 'mean', 'std', 'min', 'max'
]).round(4)
print(summary_stats)
# ANOVA varsayımlarını kontrol et
print(f"\n=== ANOVA Varsayım Kontrolleri ===")
# 1. Normallik testi (her grup için)
channels = df['Channel'].unique()
for channel in channels:
channel_data = df[df['Channel'] == channel]['Conversion_Rate']
stat, p_val = shapiro(channel_data)
normal = "Normal" if p_val > 0.05 else "Normal Değil"
print(f"{channel} Normallik: W = {stat:.3f}, p = {p_val:.6f} ({normal})")
# 2. Varyans homojenliği (Levene testi)
groups = [df[df['Channel'] == channel]['Conversion_Rate'] for channel in channels]
levene_stat, levene_p = levene(*groups)
homogeneous = "Homojen" if levene_p > 0.05 else "Heterojen"
print(f"\nVaryans Homojenliği: W = {levene_stat:.3f}, p = {levene_p:.6f} ({homogeneous})")
# One-Way ANOVA
f_statistic, p_value = f_oneway(*groups)
print(f"\n=== One-Way ANOVA Sonuçları ===")
print(f"F-istatistiği: {f_statistic:.3f}")
print(f"p-value: {p_value:.2e}")
if p_value < 0.05:
print("Sonuç: En az bir grup ortalaması diğerlerinden farklıdır (p < 0.05)")
else:
print("Sonuç: Tüm grup ortalamaları eşittir (p ≥ 0.05)")
# Effect Size (Eta-squared)
# η² = SSB / SST
grand_mean = df['Conversion_Rate'].mean()
ssb = sum([len(group) * (group.mean() - grand_mean)**2 for group in groups])
sst = sum([(x - grand_mean)**2 for x in df['Conversion_Rate']])
eta_squared = ssb / sst
print(f"Effect Size (η²): {eta_squared:.3f}")
if eta_squared < 0.01:
effect_size = "Küçük"
elif eta_squared < 0.06:
effect_size = "Orta"
elif eta_squared < 0.14:
effect_size = "Büyük"
else:
effect_size = "Çok Büyük"
print(f"Effect Size Yorumu: {effect_size} etki")
ANOVA Varsayım Kontrolleri:
Email Normallik: W = 0.982, p = 0.670194 (Normal)
Social Normallik: W = 0.975, p = 0.423516 (Normal)
Paid_Ads Normallik: W = 0.971, p = 0.371829 (Normal)
Organic Normallik: W = 0.988, p = 0.853376 (Normal)
Varyans Homojenliği: W = 2.341, p = 0.073527 (Homojen)
One-Way ANOVA Sonuçları:
F-istatistiği: 157.891
p-value: 1.25e-52
Sonuç: En az bir grup ortalaması diğerlerinden farklıdır (p < 0.05)
Effect Size (η²): 0.715
Effect Size Yorumu: Çok Büyük etki
ANOVA anlamlı çıktığında, hangi grupların farklı olduğunu bulmak için kullanılır.
# Post-Hoc Analysis: Tukey HSD
from scipy.stats import tukey_hsd
from itertools import combinations
# Tukey HSD testi
groups_data = [df[df['Channel'] == channel]['Conversion_Rate'].values
for channel in channels]
tukey_result = tukey_hsd(*groups_data)
print("=== Post-Hoc Analysis: Tukey HSD ===")
print("Grup karşılaştırmaları:")
# Manuel pairwise karşılaştırma
for i, j in combinations(range(len(channels)), 2):
group1_data = df[df['Channel'] == channels[i]]['Conversion_Rate']
group2_data = df[df['Channel'] == channels[j]]['Conversion_Rate']
t_stat, p_val = stats.ttest_ind(group1_data, group2_data)
# Bonferroni correction
n_comparisons = 6 # C(4,2) = 6 karşılaştırma
bonferroni_p = p_val * n_comparisons
bonferroni_p = min(bonferroni_p, 1.0) # p-value 1'i geçemez
mean_diff = group1_data.mean() - group2_data.mean()
significance = "***" if bonferroni_p < 0.001 else "**" if bonferroni_p < 0.01 else "*" if bonferroni_p < 0.05 else "ns"
print(f"{channels[i]} vs {channels[j]}:")
print(f" Mean difference: {mean_diff:7.4f}")
print(f" p-value (Bonferroni): {bonferroni_p:.6f} {significance}")
# Effect size for each comparison (Cohen's d)
print(f"\nCohen's d for each comparison:")
for i, j in combinations(range(len(channels)), 2):
group1_data = df[df['Channel'] == channels[i]]['Conversion_Rate']
group2_data = df[df['Channel'] == channels[j]]['Conversion_Rate']
# Pooled standard deviation
n1, n2 = len(group1_data), len(group2_data)
s1, s2 = group1_data.std(ddof=1), group2_data.std(ddof=1)
pooled_std = np.sqrt(((n1-1)*s1**2 + (n2-1)*s2**2) / (n1+n2-2))
cohens_d = (group1_data.mean() - group2_data.mean()) / pooled_std
print(f"{channels[i]} vs {channels[j]}: d = {cohens_d:6.3f}")
Post-Hoc Analysis: Tukey HSD
Grup karşılaştırmaları:
Email vs Organic:
Mean difference: 0.0195
p-value (Bonferroni): 0.000000 ***
Email vs Paid_Ads:
Mean difference: -0.0726
p-value (Bonferroni): 0.000000 ***
Social vs Paid_Ads:
Mean difference: -0.0331
p-value (Bonferroni): 0.000000 ***
İki kategorik bağımsız değişkenin etkilerini ve etkileşimlerini test eder.
ANOVA vs t-test:
- 2 grup: t-test ve ANOVA aynı sonucu verir (F = t²)
- 3+ grup: Multiple t-testler Type I error'ı artırır, ANOVA kullan
- Bonferroni düzeltmesi: α' = α/k (k: karşılaştırma sayısı)
ML'de ANOVA Kullanımı:
• Feature Selection: Categorical features'ların target'a etkisi
• A/B/C Testing: Multiple variant karşılaştırması
• Hyperparameter Tuning: Different algorithms karşılaştırması
• Market Segmentation: Segment performance analizi
Ki-Kare (χ²) Testleri
Ki-kare testleri, kategorik veriler arasındaki ilişkileri analiz etmek için kullanılır. Özellikle feature selection, independence testing ve goodness-of-fit analizlerinde kritik öneme sahiptir.
İki kategorik değişkenin birbirinden bağımsız olup olmadığını test eder. Contingency table (çapraz tablo) kullanır.
# Ki-Kare Bağımsızlık Testi Örneği
import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency, chi2
from scipy.stats.contingency import association
# Örnek: Marketing Channel vs Conversion
# Sentetik veri oluştur
np.random.seed(42)
channels = ['Email', 'Social', 'Paid', 'Organic']
conversions = ['Converted', 'Not_Converted']
# Contingency table (çapraz tablo)
observed = np.array([
[45, 155], # Email: 45 conversion, 155 no conversion
[65, 135], # Social: 65 conversion, 135 no conversion
[85, 115], # Paid: 85 conversion, 115 no conversion
[25, 175] # Organic: 25 conversion, 175 no conversion
])
print("Contingency Table (Çapraz Tablo):")
df_contingency = pd.DataFrame(observed,
index=['Email', 'Social', 'Paid', 'Organic'],
columns=['Converted', 'Not_Converted'])
print(df_contingency)
# Ki-kare testi
chi2_stat, p_value, dof, expected = chi2_contingency(observed)
print(f"\n=== Ki-Kare Bağımsızlık Testi ===")
print(f"χ² istatistiği: {chi2_stat:.3f}")
print(f"p-value: {p_value:.6f}")
print(f"Serbestlik derecesi: {dof}")
# Kritik değer
alpha = 0.05
critical_value = chi2.ppf(1 - alpha, dof)
print(f"Kritik değer (α=0.05): {critical_value:.3f}")
# Karar
if p_value < alpha:
print("Sonuç: Değişkenler bağımsız DEĞİLdir (p < 0.05)")
print("Marketing channel ile conversion arasında anlamlı ilişki vardır.")
else:
print("Sonuç: Değişkenler bağımsızdır (p ≥ 0.05)")
# Effect size (Cramér's V)
n = observed.sum()
cramers_v = np.sqrt(chi2_stat / (n * (min(observed.shape) - 1)))
print(f"Cramér's V (effect size): {cramers_v:.3f}")
# Beklenen değerler
print(f"\nBeklenen Değerler:")
df_expected = pd.DataFrame(expected.round(1),
index=['Email', 'Social', 'Paid', 'Organic'],
columns=['Converted', 'Not_Converted'])
print(df_expected)
χ² istatistiği: 32.645
p-value: 0.000000
Serbestlik derecesi: 3
Kritik değer (α=0.05): 7.815
Sonuç: Değişkenler bağımsız DEĞİLdir (p < 0.05)
Marketing channel ile conversion arasında anlamlı ilişki vardır.
Cramér's V (effect size): 0.226
Gözlenen dağılımın teorik bir dağılıma uyup uymadığını test eder.
# Goodness-of-Fit Test Örneği
from scipy.stats import chisquare
# Örnek: Zar atma deneyi - her yüzün eşit gelme olasılığı
observed_dice = [18, 22, 16, 25, 20, 19] # 6 yüz için gözlenen frekanslar
expected_dice = [20, 20, 20, 20, 20, 20] # Her yüz için beklenen (eşit dağılım)
chi2_gof, p_gof = chisquare(observed_dice, expected_dice)
print("=== Goodness-of-Fit Testi (Zar Örneği) ===")
print(f"Gözlenen: {observed_dice}")
print(f"Beklenen: {expected_dice}")
print(f"χ² istatistiği: {chi2_gof:.3f}")
print(f"p-value: {p_gof:.6f}")
if p_gof < 0.05:
print("Sonuç: Zar ADALET DEĞİL (p < 0.05)")
else:
print("Sonuç: Zar adil görünüyor (p ≥ 0.05)")
Ki-Kare Varsayımları:
• Beklenen frekanslar ≥ 5 (en az %80'i için)
• Gözlemler bağımsız olmalı
• Kategorik veriler olmalı
• Rastgele örnekleme yapılmalı
Bayesian İstatistik Temelleri
Bayesian istatistik, belirsizliği olasılık dağılımları ile ifade eder ve önsel bilgiyi veriye entegre eder. Modern ML algoritmalarının (Bayesian Networks, MCMC, Variational Inference) teorik temelini oluşturur.
Frequentist: Parametreler sabit, veri rastgele
Bayesian: Parametreler rastgele (dağılım), veri gözlenen
Prior ve posterior'un aynı dağılım ailesinden olması. Analitik çözüm imkanı sağlar.
# Bayesian A/B Testing Örneği
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Beta-Binomial Conjugacy örneği
# A/B test: Conversion rate karşılaştırması
class BayesianABTest:
def __init__(self, alpha_prior=1, beta_prior=1):
self.alpha_prior = alpha_prior
self.beta_prior = beta_prior
def update_posterior(self, conversions, trials):
"""Beta posterior güncelleme"""
alpha_posterior = self.alpha_prior + conversions
beta_posterior = self.beta_prior + trials - conversions
return alpha_posterior, beta_posterior
def probability_A_beats_B(self, alpha_A, beta_A, alpha_B, beta_B, samples=10000):
"""A'nın B'den iyi olma olasılığı (Monte Carlo)"""
# Posterior'lardan örneklem al
samples_A = np.random.beta(alpha_A, beta_A, samples)
samples_B = np.random.beta(alpha_B, beta_B, samples)
return np.mean(samples_A > samples_B)
# Örnek veri
np.random.seed(42)
bayesian_test = BayesianABTest(alpha_prior=1, beta_prior=1) # Uniform prior
# A grubu: 120 trial, 18 conversion
# B grubu: 100 trial, 20 conversion
conversions_A, trials_A = 18, 120
conversions_B, trials_B = 20, 100
# Posterior'ları güncelle
alpha_A, beta_A = bayesian_test.update_posterior(conversions_A, trials_A)
alpha_B, beta_B = bayesian_test.update_posterior(conversions_B, trials_B)
print("=== Bayesian A/B Test Sonuçları ===")
print(f"A grubu: {conversions_A}/{trials_A} = {conversions_A/trials_A:.3f}")
print(f"B grubu: {conversions_B}/{trials_B} = {conversions_B/trials_B:.3f}")
# Posterior istatistikleri
mean_A = alpha_A / (alpha_A + beta_A)
mean_B = alpha_B / (alpha_B + beta_B)
var_A = (alpha_A * beta_A) / ((alpha_A + beta_A)**2 * (alpha_A + beta_A + 1))
var_B = (alpha_B * beta_B) / ((alpha_B + beta_B)**2 * (alpha_B + beta_B + 1))
print(f"\nPosterior A: Beta({alpha_A}, {beta_A})")
print(f" Mean: {mean_A:.4f}, Std: {np.sqrt(var_A):.4f}")
print(f"Posterior B: Beta({alpha_B}, {beta_B})")
print(f" Mean: {mean_B:.4f}, Std: {np.sqrt(var_B):.4f}")
# B'nin A'dan iyi olma olasılığı
prob_B_wins = bayesian_test.probability_A_beats_B(alpha_B, beta_B, alpha_A, beta_A)
print(f"\nP(B > A) = {prob_B_wins:.3f}")
print(f"P(A > B) = {1 - prob_B_wins:.3f}")
# Credible intervals (Bayesian confidence intervals)
ci_A = stats.beta.interval(0.95, alpha_A, beta_A)
ci_B = stats.beta.interval(0.95, alpha_B, beta_B)
print(f"\n95% Credible Intervals:")
print(f"A: [{ci_A[0]:.4f}, {ci_A[1]:.4f}]")
print(f"B: [{ci_B[0]:.4f}, {ci_B[1]:.4f}]")
A grubu: 18/120 = 0.150
B grubu: 20/100 = 0.200
Posterior A: Beta(19, 103)
Mean: 0.1557, Std: 0.0329
Posterior B: Beta(21, 81)
Mean: 0.2059, Std: 0.0400
P(B > A) = 0.891
P(A > B) = 0.109
95% Credible Intervals:
A: [0.0972, 0.2256]
B: [0.1341, 0.2874]
Bayesian Avantajları:
• Prior bilgi kullanımı
• Uncertainty quantification
• Sequential learning (data geldiğinde güncelleme)
• Interpretable probability statements
• Small sample performance
Hipotez Testleri
Hipotez testleri, veri temelli karar vermenin bilimsel yöntemidir. A/B testleri, model performans karşılaştırmaları ve machine learning pipeline'larında kritik öneme sahiptir.
H₀: Null Hipotez
Status quo, fark yok
H₁: Alternatif Hipotez
İspatlanmak istenen
Tip I Hata (α): H₀ doğruyken reddetme (False Positive)
Tip II Hata (β): H₀ yanlışken kabul etme (False Negative)
Power (1-β): Gerçek etkiyi tespit etme gücü
| Gerçek Durum |
H₀ Kabul |
H₀ Red |
| H₀ Doğru |
Doğru Karar (1-α) |
Tip I Hata (α) |
| H₁ Doğru |
Tip II Hata (β) |
Doğru Karar (1-β) |
Örneklem ortalamasının belli bir değere eşit olup olmadığını test eder.
Örnek: Bir üretim hattında günlük ortalama 1000 ürün üretilir. Son 20 günde ortalama 1050, standart sapma 80. Bu artış anlamlı mı? (α = 0.05)
Hipotezler:
H₀: μ = 1000 (artış yok)
H₁: μ > 1000 (artış var, tek yönlü test)
Test İstatistiği:
t = (1050 - 1000) / (80/√20) = 50 / 17.89 = 2.80
Kritik Değer: t₀.₀₅,₁₉ = 1.729
Karar: 2.80 > 1.729, H₀ red. Artış anlamlı!
# Python ile t-Testi
import numpy as np
from scipy import stats
# Veri
sample_mean = 1050
population_mean = 1000
sample_std = 80
n = 20
alpha = 0.05
# t-istatistiği hesaplama
t_statistic = (sample_mean - population_mean) / (sample_std / np.sqrt(n))
print(f"t-istatistiği: {t_statistic:.3f}")
# Serbestlik derecesi
df = n - 1
print(f"Serbestlik derecesi: {df}")
# p-value hesaplama (tek yönlü test)
p_value = 1 - stats.t.cdf(t_statistic, df)
print(f"p-value: {p_value:.6f}")
# Kritik değer
critical_value = stats.t.ppf(1 - alpha, df)
print(f"Kritik değer: {critical_value:.3f}")
# Karar
if t_statistic > critical_value:
print("H₀ reddedilir. Artış anlamlıdır.")
else:
print("H₀ kabul edilir. Artış anlamlı değildir.")
print(f"Alpha: {alpha}, p-value: {p_value:.6f}")
if p_value < alpha:
print("p < α: H₀ reddedilir")
else:
print("p ≥ α: H₀ kabul edilir")
t-istatistiği: 2.795
Serbestlik derecesi: 19
p-value: 0.006099
Kritik değer: 1.729
H₀ reddedilir. Artış anlamlıdır.
Alpha: 0.05, p-value: 0.006099
p < α: H₀ reddedilir
İki grubun ortalamalarının eşit olup olmadığını test eder. A/B testlerde en yaygın kullanılan.
# A/B Test Örneği
import numpy as np
from scipy import stats
# A/B Test Verileri
np.random.seed(42)
control_group = np.random.normal(100, 15, 200) # Kontrol grubu
treatment_group = np.random.normal(105, 15, 180) # Treatment grubu
# Temel istatistikler
control_mean = np.mean(control_group)
treatment_mean = np.mean(treatment_group)
control_std = np.std(control_group, ddof=1)
treatment_std = np.std(treatment_group, ddof=1)
print(f"Kontrol grubu: μ = {control_mean:.2f}, σ = {control_std:.2f}, n = {len(control_group)}")
print(f"Treatment grubu: μ = {treatment_mean:.2f}, σ = {treatment_std:.2f}, n = {len(treatment_group)}")
# İki örneklem t-testi
t_stat, p_val = stats.ttest_ind(control_group, treatment_group, equal_var=False)
print(f"\nt-istatistiği: {t_stat:.3f}")
print(f"p-value: {p_val:.6f}")
# Etki büyüklüğü (Cohen's d)
pooled_std = np.sqrt(((len(control_group)-1)*control_std**2 +
(len(treatment_group)-1)*treatment_std**2) /
(len(control_group) + len(treatment_group) - 2))
cohens_d = (treatment_mean - control_mean) / pooled_std
print(f"Cohen's d: {cohens_d:.3f}")
# Güven aralığı
diff_mean = treatment_mean - control_mean
se_diff = np.sqrt(control_std**2/len(control_group) + treatment_std**2/len(treatment_group))
df_welch = ((control_std**2/len(control_group) + treatment_std**2/len(treatment_group))**2) / \
((control_std**2/len(control_group))**2/(len(control_group)-1) +
(treatment_std**2/len(treatment_group))**2/(len(treatment_group)-1))
t_critical = stats.t.ppf(0.975, df_welch)
ci_lower = diff_mean - t_critical * se_diff
ci_upper = diff_mean + t_critical * se_diff
print(f"Ortalama fark: {diff_mean:.2f}")
print(f"95% Güven aralığı: [{ci_lower:.2f}, {ci_upper:.2f}]")
Kontrol grubu: μ = 99.73, σ = 14.76, n = 200
Treatment grubu: μ = 105.12, σ = 14.89, n = 180
t-istatistiği: -3.536
p-value: 0.000444
Cohen's d: -0.364
Ortalama fark: 5.39
95% Güven aralığı: [2.39, 8.39]
Effect Size Yorumlama (Cohen's d):
- |d| < 0.2: Küçük etki
- 0.2 ≤ |d| < 0.5: Orta etki
- 0.5 ≤ |d| < 0.8: Büyük etki
- |d| ≥ 0.8: Çok büyük etki
p-Hacking Uyarısı: Çoklu karşılaştırma sorunu! Birçok test yapıldığında Tip I hata riski artar. Bonferroni düzeltmesi kullanın: α' = α/k (k: test sayısı)
A/B Test İpuçları:
• Önceden sample size hesaplayın (power analysis)
• Test süresini önceden belirleyin (peeking yapmayın)
• Segmentation yaparken multiple testing correction uygulayın
• Practical significance vs statistical significance ayrımı yapın
Regresyon Analizi
Regresyon analizi, değişkenler arasındaki ilişkiyi modelleyen ve tahmin yapan temel istatistiksel yöntemdir. Machine learning'in supervised learning algoritmalarının teorik temelidir.
Bir bağımsız değişken (X) ile bağımlı değişken (Y) arasındaki doğrusal ilişkiyi modeller.
Residual kareler toplamını minimize eden parametreleri bulur.
# Python ile Basit Doğrusal Regresyon
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
# Örnek veri: Reklam harcaması vs Satış
np.random.seed(42)
advertising = np.random.uniform(10, 100, 50)
noise = np.random.normal(0, 10, 50)
sales = 20 + 0.8 * advertising + noise
# DataFrame oluştur
df = pd.DataFrame({'Advertising': advertising, 'Sales': sales})
# Manuel hesaplama
x_mean = np.mean(advertising)
y_mean = np.mean(sales)
numerator = np.sum((advertising - x_mean) * (sales - y_mean))
denominator = np.sum((advertising - x_mean) ** 2)
beta1 = numerator / denominator
beta0 = y_mean - beta1 * x_mean
print(f"Manuel hesaplama:")
print(f"β₀ (intercept): {beta0:.3f}")
print(f"β₁ (slope): {beta1:.3f}")
# Sklearn ile
model = LinearRegression()
X = advertising.reshape(-1, 1)
y = sales
model.fit(X, y)
predictions = model.predict(X)
print(f"\nSklearn ile:")
print(f"β₀ (intercept): {model.intercept_:.3f}")
print(f"β₁ (slope): {model.coef_[0]:.3f}")
# Model değerlendirme
r2 = r2_score(y, predictions)
mse = mean_squared_error(y, predictions)
rmse = np.sqrt(mse)
print(f"\nModel Performansı:")
print(f"R²: {r2:.3f}")
print(f"MSE: {mse:.3f}")
print(f"RMSE: {rmse:.3f}")
# Pearson korelasyon
correlation, p_value = stats.pearsonr(advertising, sales)
print(f"Korelasyon: {correlation:.3f} (p = {p_value:.6f})")
Manuel hesaplama:
β₀ (intercept): 19.996
β₁ (slope): 0.801
Sklearn ile:
β₀ (intercept): 19.996
β₁ (slope): 0.801
Model Performansı:
R²: 0.891
MSE: 108.647
RMSE: 10.424
Korelasyon: 0.944 (p = 0.000000)
Bağımsız değişkenlerin bağımlı değişkendeki varyansın ne kadarını açıkladığını gösterir.
Birden fazla bağımsız değişkenle tahmin yapma. Gerçek dünya problemlerinde daha yaygın.
# Çoklu Regresyon Örneği
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score, mean_absolute_error
import seaborn as sns
# Sentetik veri: Ev fiyat tahmini
np.random.seed(42)
n_samples = 500
# Features
size = np.random.normal(150, 50, n_samples) # m²
bedrooms = np.random.poisson(3, n_samples) # oda sayısı
age = np.random.exponential(15, n_samples) # yaş
location_score = np.random.uniform(1, 10, n_samples) # lokasyon skoru
# Target (price) - gerçekçi ilişki
noise = np.random.normal(0, 20000, n_samples)
price = (2000 * size +
10000 * bedrooms +
-500 * age +
15000 * location_score +
100000 + noise)
# DataFrame oluştur
df = pd.DataFrame({
'size': size,
'bedrooms': bedrooms,
'age': age,
'location_score': location_score,
'price': price
})
print("Veri Seti Özeti:")
print(df.describe())
# Korelasyon matrisi
correlation_matrix = df.corr()
print(f"\nPrice ile korelasyonlar:")
print(correlation_matrix['price'].sort_values(ascending=False))
# Train-test split
X = df[['size', 'bedrooms', 'age', 'location_score']]
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Model eğitimi
model = LinearRegression()
model.fit(X_train, y_train)
# Tahminler
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
# Model değerlendirme
print(f"\nModel Katsayıları:")
print(f"Intercept: {model.intercept_:.0f}")
for i, feature in enumerate(X.columns):
print(f"{feature}: {model.coef_[i]:.2f}")
print(f"\nModel Performansı:")
print(f"Train R²: {r2_score(y_train, y_pred_train):.3f}")
print(f"Test R²: {r2_score(y_test, y_pred_test):.3f}")
print(f"Test MAE: {mean_absolute_error(y_test, y_pred_test):.0f} TL")
Model Katsayıları:
Intercept: 99482
size: 2000.84
bedrooms: 9963.31
age: -500.45
location_score: 15021.67
Model Performansı:
Train R²: 0.998
Test R²: 0.998
Test MAE: 14562 TL
Regresyon Varsayımları:
• Linearity: X ve Y arasında doğrusal ilişki
• Independence: Gözlemler bağımsız
• Homoscedasticity: Hata varyansı sabit
• Normality: Hatalar normal dağılım
• No multicollinearity: Bağımsız değişkenler birbirleriyle yüksek korelasyonlu değil
Regresyon İyileştirme Teknikleri:
• Regularization: Ridge (L2), Lasso (L1), Elastic Net
• Feature Engineering: Polynomial features, interactions
• Cross-validation: Model stability için
• Residual Analysis: Varsayım kontrolü
Korelasyon Analizi
Korelasyon analizi, iki veya daha fazla değişken arasındaki doğrusal ilişkinin gücünü ve yönünü ölçer. Feature selection, exploratory data analysis ve multicollinearity tespitinde kritik rol oynar.
En yaygın kullanılan korelasyon ölçüsü. Doğrusal ilişkinin gücünü ölçer. -1 ile +1 arasında değer alır.
| |r| Değeri |
İlişki Gücü |
Yorumlama |
| 0.00 - 0.19 |
Çok Zayıf |
Pratikte ilişki yok |
| 0.20 - 0.39 |
Zayıf |
Gözle görülür ama zayıf ilişki |
| 0.40 - 0.59 |
Orta |
Dikkate değer ilişki |
| 0.60 - 0.79 |
Güçlü |
Güçlü ilişki |
| 0.80 - 1.00 |
Çok Güçlü |
Mükemmel veya neredeyse mükemmel ilişki |
Non-parametrik korelasyon ölçüleri. Sıralı veriler veya non-linear ilişkiler için kullanılır.
# Python ile Güven Aralığı Hesaplama
import numpy as np
from scipy import stats
# Veri
sample_mean = 250
sample_std = 50
n = 100
confidence_level = 0.95
# Standart hata
standard_error = sample_std / np.sqrt(n)
print(f"Standart hata: {standard_error}")
# Kritik değer (t-dağılımı, çünkü σ bilinmiyor)
alpha = 1 - confidence_level
df = n - 1
t_critical = stats.t.ppf(1 - alpha/2, df)
print(f"t kritik değeri: {t_critical:.3f}")
# Güven aralığı
margin_of_error = t_critical * standard_error
ci_lower = sample_mean - margin_of_error
ci_upper = sample_mean + margin_of_error
print(f"Hata payı: ±{margin_of_error:.2f}")
print(f"%{confidence_level*100} Güven aralığı: [{ci_lower:.2f}, {ci_upper:.2f}]")
# Bootstrapping ile alternatif yaklaşım
np.random.seed(42)
original_sample = np.random.normal(sample_mean, sample_std, n)
bootstrap_means = []
for i in range(1000):
bootstrap_sample = np.random.choice(original_sample, size=n, replace=True)
bootstrap_means.append(np.mean(bootstrap_sample))
# Bootstrap güven aralığı
ci_bootstrap = np.percentile(bootstrap_means, [2.5, 97.5])
print(f"Bootstrap %95 güven aralığı: [{ci_bootstrap[0]:.2f}, {ci_bootstrap[1]:.2f}]")
Standart hata: 5.0
t kritik değeri: 1.984
Hata payı: ±9.92
%95 Güven aralığı: [240.08, 259.92]
Bootstrap %95 güven aralığı: [240.15, 259.85]
Bootstrapping: Yeniden örnekleme tekniği. Parametrik varsayımlar olmadan güven aralığı hesaplar. Özellikle karmaşık istatistikler için yararlı.