Bootstrap: Revolusi Statistik Era Komputer
Resampling bootstrap adalah teknik statistik yang kuat untuk mengestimasi distribusi pengambilan sampel dari statistik apa pun dengan berulang kali melakukan resampling dari data yang diamati. Diperkenalkan oleh Bradley Efron pada tahun 1979, teknik ini merevolusi inferensi statistik dengan memungkinkan analisis statistik kompleks tanpa bergantung pada rumus matematis atau asumsi distribusi.
Wawasan kunci di balik bootstrap sangat elegan sederhana: sampel Anda adalah estimasi terbaik Anda tentang populasi. Dengan melakukan resampling dari sampel Anda (dengan pengembalian), Anda mensimulasikan apa yang akan terjadi jika Anda bisa berulang kali mengambil sampel dari populasi. Pendekatan ini sangat berharga untuk simpangan baku, di mana rumus interval kepercayaan tradisional mengasumsikan normalitas—asumsi yang sering gagal dalam praktik.
Bootstrap telah menjadi penting dalam ilmu data modern karena bekerja dengan statistik apa pun (median, korelasi, koefisien regresi, bobot jaringan saraf) dan tidak membuat asumsi tentang distribusi data yang mendasari.
Mengapa Bootstrap untuk Simpangan Baku?
Interval kepercayaan tradisional untuk simpangan baku mengasumsikan data Anda berasal dari distribusi normal. Ketika asumsi ini gagal (yang umum terjadi), interval ini bisa sangat tidak akurat. Bootstrap menyediakan alternatif bebas distribusi.
Ketika Metode Tradisional Gagal
Keunggulan utama bootstrap untuk simpangan baku:
- Tanpa asumsi distribusi: Bekerja sama baiknya dengan data normal, menceng, atau berekor tebal
- Kinerja sampel kecil: Sering lebih akurat dari metode parametrik dengan n < 30
- Menangani statistik kompleks: Pendekatan yang sama bekerja untuk SD terpotong, MAD, atau ukuran variabilitas kustom
- Wawasan visual: Distribusi bootstrap menunjukkan apa yang terjadi, bukan hanya angka akhir
Prosedur Bootstrap
Algoritma bootstrap sangat mudah. Dari sampel asli Anda dengan n pengamatan:
Ambil Sampel Bootstrap
Hitung Statistik
Ulangi Berkali-kali
Analisis Distribusi
Mengapa Dengan Pengembalian?
Berapa banyak sampel bootstrap? B = 1.000 sering cukup untuk estimasi kasar dan pengujian hipotesis. Untuk interval kepercayaan, B = 10.000 memberikan persentil yang stabil. Untuk interval BCa berkualitas publikasi, B = 15.000+ direkomendasikan.
Metode Interval Kepercayaan Bootstrap
Beberapa metode ada untuk membangun interval kepercayaan dari sampel bootstrap, masing-masing dengan tradeoff:
1. Metode Persentil (Paling Sederhana)
Pendekatan paling intuitif: ambil persentil distribusi bootstrap secara langsung.
CI Persentil
Untuk 10.000 sampel bootstrap, ini adalah nilai terurut ke-250 dan ke-9.750. Sederhana tetapi bisa bias ketika distribusi bootstrap menceng.
2. Bootstrap Dasar (Pivotal)
Menggunakan hubungan antara statistik sampel dan statistik bootstrap:
CI Bootstrap Dasar
Di mana θ̂ adalah SD sampel asli. Ini “memantulkan” interval persentil di sekitar estimasi sampel.
3. BCa (Bias-Corrected and Accelerated)
Standar emas untuk akurasi. BCa menyesuaikan untuk bias dalam distribusi bootstrap dan akselerasi (bagaimana galat baku berubah dengan nilai parameter). Lebih kompleks untuk dihitung tetapi memberikan interval akurat orde kedua.
| Metode | Kelebihan | Kekurangan |
|---|---|---|
| Persentil | Sederhana, intuitif | Bisa bias dengan data menceng |
| Dasar | Interval simetris | Dapat menghasilkan nilai negatif |
| BCa | Paling akurat, menghormati transformasi | Intensif secara komputasi |
Contoh Perhitungan: Data Non-Normal
Pertimbangkan 15 pengukuran waktu respons (dalam ms): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Data ini menceng kanan (beberapa respons sangat lambat).
Hitung SD Sampel
Hasilkan Sampel Bootstrap
Hitung SD Bootstrap
Cari Persentil
Bentuk CI 95%
CI bootstrap asimetris (lebih lebar di sisi tinggi), mencerminkan sifat data yang menceng kanan. CI chi-kuadrat tidak menangkap asimetri ini.
Implementasi Python
Implementasi bootstrap lengkap dengan beberapa metode CI:
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}]")