Σ
SDCalc
LanjutanLanjutan·15 min

Metode Bootstrap untuk Simpangan Baku

Kuasai resampling bootstrap untuk estimasi simpangan baku. Pelajari metode persentil, BCa, dan bootstrap parametrik dengan implementasi Python dan contoh perhitungan.

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

CI berbasis chi-kuadrat untuk simpangan baku mengasumsikan normalitas. Dengan data yang menceng (pendapatan, waktu reaksi, data kelangsungan hidup), ini dapat menghasilkan interval yang meleset dari parameter sebenarnya 20-30% dari waktu, bukan 5% yang diharapkan.

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:

1

Ambil Sampel Bootstrap

Pilih secara acak n pengamatan dengan pengembalian dari data asli Anda. Beberapa nilai akan muncul berkali-kali, yang lain tidak sama sekali.
2

Hitung Statistik

Hitung simpangan baku dari sampel bootstrap ini. Ini adalah satu replikasi bootstrap.
3

Ulangi Berkali-kali

Ulangi langkah 1-2 ribuan kali (biasanya B = 10.000). Setiap pengulangan menghasilkan satu SD bootstrap.
4

Analisis Distribusi

Koleksi B SD bootstrap mendekati distribusi pengambilan sampel. Gunakan untuk CI dan pengujian hipotesis.

Mengapa Dengan Pengembalian?

Pengambilan sampel dengan pengembalian sangat penting. Ini menciptakan sampel yang bervariasi dalam komposisi, meniru variabilitas yang akan Anda lihat di berbagai sampel dari populasi. Tanpa pengembalian, setiap sampel akan identik dengan yang asli.

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

95% CI = [θ*₂.₅, θ*₉₇.₅]

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

95% CI = [2θ̂ - θ*₉₇.₅, 2θ̂ - θ*₂.₅]

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.

MetodeKelebihanKekurangan
PersentilSederhana, intuitifBisa bias dengan data menceng
DasarInterval simetrisDapat menghasilkan nilai negatif
BCaPaling akurat, menghormati transformasiIntensif 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).

1

Hitung SD Sampel

Sampel asli: n=15, SD = 109,8 ms
2

Hasilkan Sampel Bootstrap

Ambil 10.000 sampel berukuran 15 dengan pengembalian. Setiap sampel memiliki komposisi berbeda.
3

Hitung SD Bootstrap

Hitung SD untuk setiap sampel bootstrap, mendapatkan 10.000 nilai berkisar dari ~60 hingga ~180
4

Cari Persentil

Persentil ke-2,5: 72,3 ms, Persentil ke-97,5: 156,8 ms
5

Bentuk CI 95%

CI 95%: [72,3; 156,8] ms. Bandingkan dengan CI chi-kuadrat: [79,4; 175,2] yang mengasumsikan normalitas.

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:

python
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}]")