Bootstrap: Bilgisayar Çağının İstatistik Devrimi
Bootstrap yeniden örnekleme, gözlemlenen verilerinizden tekrar tekrar yeniden örnekleyerek herhangi bir istatistiğin örnekleme dağılımını tahmin eden güçlü bir istatistiksel tekniktir. 1979’da Bradley Efron tarafından tanıtılan bu yöntem, matematiksel formüllere veya dağılım varsayımlarına dayanmadan karmaşık istatistiklerin analizini mümkün kılarak istatistiksel çıkarımda devrim yapmıştır.
Bootstrap’un arkasındaki temel kavrayış zarif bir şekilde basittir: örnekleminiz popülasyonun en iyi tahmininizdir. Örnekleminizden (yerine koyarak) yeniden örnekleme yaparak, popülasyondan tekrar tekrar örneklem alabilseydiniz ne olacağını simüle edersiniz. Bu yaklaşım özellikle standart sapma için değerlidir; çünkü geleneksel güven aralığı formülleri normallik varsayar—pratikte sıklıkla başarısız olan bir varsayım.
Bootstrap, herhangi bir istatistikle (medyan, korelasyon, regresyon katsayıları, sinir ağı ağırlıkları) çalıştığı ve verilerinizin altta yatan dağılımı hakkında varsayım yapmadığı için modern veri biliminde vazgeçilmez hale gelmiştir.
Standart Sapma İçin Neden Bootstrap?
Standart sapma için geleneksel güven aralıkları, verilerinizin normal dağılımdan geldiğini varsayar. Bu varsayım başarısız olduğunda (ki bu yaygındır), bu aralıklar tamamen yanlış olabilir. Bootstrap, dağılımdan bağımsız bir alternatif sunar.
Geleneksel Yöntemler Başarısız Olduğunda
Standart sapma için bootstrap’un temel avantajları:
- Dağılım varsayımı yok: Normal, çarpık veya kalın kuyruklu verilerle eşit derecede iyi çalışır
- Küçük örneklem performansı: n < 30 ile genellikle parametrik yöntemlerden daha doğru
- Karmaşık istatistikleri ele alır: Aynı yaklaşım kırpılmış SS, MAD veya özel değişkenlik ölçüleri için çalışır
- Görsel kavrayış: Bootstrap dağılımı size sadece son sayıları değil, ne olduğunu gösterir
Bootstrap Prosedürü
Bootstrap algoritması oldukça basittir. n gözlemlik orijinal örnekleminizden:
Bootstrap Örneklemi Çekin
İstatistiği Hesaplayın
Birçok Kez Tekrarlayın
Dağılımı Analiz Edin
Neden Yerine Koyarak?
Kaç bootstrap örneklemi? B = 1.000 kaba tahminler ve hipotez testleri için genellikle yeterlidir. Güven aralıkları için B = 10.000 kararlı yüzdelikler sağlar. Yayın kalitesinde BCa aralıkları için B = 15.000+ önerilir.
Bootstrap Güven Aralığı Yöntemleri
Bootstrap örneklemlerinden güven aralıkları oluşturmak için birkaç yöntem mevcuttur, her birinin artıları ve eksileri vardır:
1. Yüzdelik Yöntemi (En Basit)
En sezgisel yaklaşım: bootstrap dağılımının yüzdeliklerini doğrudan alın.
Yüzdelik GA
10.000 bootstrap örneklemi için bu, 250. ve 9.750. sıralı değerlerdir. Basit ancak bootstrap dağılımı çarpık olduğunda yanlı olabilir.
2. Temel (Pivotal) Bootstrap
Örneklem istatistiği ile bootstrap istatistikleri arasındaki ilişkiyi kullanır:
Temel Bootstrap GA
Burada θ̂ orijinal örneklem SS’sidir. Bu, yüzdelik aralığını örneklem tahmini etrafında “yansıtır”.
3. BCa (Yanlılık Düzeltmeli ve Hızlandırılmış)
Doğruluk için altın standart. BCa, bootstrap dağılımındaki hem yanlılığı hem de hızlanmayı (standart hatanın parametre değeriyle nasıl değiştiğini) düzeltir. Hesaplaması daha karmaşık ancak ikinci derece doğru aralıklar sağlar.
| Yöntem | Artılar | Eksiler |
|---|---|---|
| Yüzdelik | Basit, sezgisel | Çarpık verilerle yanlı olabilir |
| Temel | Simetrik aralıklar | Negatif değerler üretebilir |
| BCa | En doğru, dönüşüme saygılı | Hesaplama açısından yoğun |
Çözümlü Örnek: Normal Olmayan Veri
15 tepki süresi ölçümünü (ms cinsinden) düşünün: 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Bu veri sağa çarpıktır (bazı çok yavaş tepkiler).
Örneklem SS’sini Hesaplayın
Bootstrap Örneklemleri Üretin
Bootstrap SS’lerini Hesaplayın
Yüzdelikleri Bulun
%95 GA’yı Oluşturun
Bootstrap GA asimetriktir (yüksek tarafta daha geniş), verinin sağa çarpık doğasını yansıtır. Ki-kare GA bu asimetriyi yakalayamaz.
Python Uygulaması
Birden fazla GA yöntemiyle eksiksiz bootstrap uygulaması:
import numpy as np
from scipy import stats
def bootstrap_sd_ci(data, n_bootstrap=10000, ci=0.95, method='percentile'):
"""
Bootstrap confidence interval for standard deviation.
Parameters:
-----------
data : array-like - Original sample
n_bootstrap : int - Number of bootstrap samples
ci : float - Confidence level (e.g., 0.95)
method : str - 'percentile', 'basic', or 'bca'
Returns:
--------
tuple : (lower_bound, upper_bound, bootstrap_sds)
"""
data = np.array(data)
n = len(data)
original_sd = np.std(data, ddof=1)
# Generate bootstrap samples and calculate SDs
bootstrap_sds = np.array([
np.std(np.random.choice(data, size=n, replace=True), ddof=1)
for _ in range(n_bootstrap)
])
alpha = 1 - ci
if method == 'percentile':
lower = np.percentile(bootstrap_sds, 100 * alpha/2)
upper = np.percentile(bootstrap_sds, 100 * (1 - alpha/2))
elif method == 'basic':
lower = 2*original_sd - np.percentile(bootstrap_sds, 100*(1-alpha/2))
upper = 2*original_sd - np.percentile(bootstrap_sds, 100*alpha/2)
elif method == 'bca':
# Bias correction
prop_less = np.mean(bootstrap_sds < original_sd)
z0 = stats.norm.ppf(prop_less)
# Acceleration (jackknife estimate)
jackknife_sds = np.array([
np.std(np.delete(data, i), ddof=1) for i in range(n)
])
jack_mean = jackknife_sds.mean()
a = np.sum((jack_mean - jackknife_sds)**3) / \
(6 * np.sum((jack_mean - jackknife_sds)**2)**1.5)
# Adjusted percentiles
z_alpha = stats.norm.ppf([alpha/2, 1-alpha/2])
adj_percentiles = stats.norm.cdf(
z0 + (z0 + z_alpha) / (1 - a*(z0 + z_alpha))
) * 100
lower = np.percentile(bootstrap_sds, adj_percentiles[0])
upper = np.percentile(bootstrap_sds, adj_percentiles[1])
return lower, upper, bootstrap_sds
# Example usage
response_times = [245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312]
for method in ['percentile', 'basic', 'bca']:
lower, upper, _ = bootstrap_sd_ci(response_times, method=method)
print(f"{method.upper():12s} 95% CI: [{lower:.1f}, {upper:.1f}]")