Pendahuluan

Metode Bootstrap adalah teknik resampling yang powerful untuk mengestimasi distribusi sampling suatu statistik (seperti mean, median, dll.) tanpa asumsi distribusi teoritis yang kuat. Teknik ini mengambil sampel ulang dengan pengembalian (with replacement) dari data asli sebanyak B kali (biasanya 1000 atau lebih), kemudian menghitung statistik yang diinginkan pada setiap sampel bootstrap.

Tujuan

Pada latihan ini kita akan:

  1. Membuat data simulasi distribusi normal.
  2. Melakukan bootstrap untuk estimasi mean.
  3. Memvisualisasikan hasil bootstrap dan distribusi data asli.

Latihan 1: Pembuatan Data dan Bootstrap Sampling

set.seed(150)
myData <- rnorm(1000, mean = 30, sd = 2.5)

# Catatan revisi: n_bootstrap dinaikkan dari 50 menjadi 1000
# agar sesuai standar praktik bootstrap (B >= 1000) dan
# menghasilkan estimasi standard error yang lebih stabil & presisi.
n_bootstrap <- 1000
bootstrap_means <- numeric(n_bootstrap)

for (i in 1:n_bootstrap) {
  boot_sample <- sample(myData, size = 1000, replace = TRUE)
  bootstrap_means[i] <- mean(boot_sample)
}

cat("=== Sanity Check Data Asli ===\n")
## === Sanity Check Data Asli ===
print(length(myData))
## [1] 1000
print(mean(myData))
## [1] 29.92068
print(sd(myData))
## [1] 2.475175
cat("\n")
cat("=== Ringkasan Distribusi Bootstrap Means ===\n")
## === Ringkasan Distribusi Bootstrap Means ===
print(summary(bootstrap_means))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   29.68   29.87   29.92   29.92   29.98   30.17
cat("Standard Deviation of Bootstrap Means :", round(sd(bootstrap_means), 5), "\n")
## Standard Deviation of Bootstrap Means : 0.07803
# Pembanding teoritis: SE = sigma / sqrt(n)
se_teori <- sd(myData) / sqrt(1000)
cat("Standard Error Teoritis (sigma/sqrt(n)) :", round(se_teori, 5), "\n")
## Standard Error Teoritis (sigma/sqrt(n)) : 0.07827

Penjelasan Kode Latihan 1:

  1. set.seed(150): Menjamin hasil yang sama setiap kali dijalankan.
  2. rnorm(1000, 30, 2.5): Membuat data simulasi sesuai instruksi.
  3. sample(..., replace = TRUE): Inti dari bootstrap yaitu pengambilan sampel dengan pengembalian.
  4. n_bootstrap <- 1000: Jumlah replikasi bootstrap dinaikkan agar sesuai standar praktik (B ≥ 1000), sehingga estimasi distribusi sampling lebih stabil.
  5. bootstrap_means: Vektor hasil mean dari 1000 sample bootstrap.
  6. se_teori: Nilai pembanding dari rumus klasik SE = σ/√n, digunakan untuk validasi hasil bootstrap pada bagian Pembahasan.

Latihan 2: Visualisasi Distribusi Bootstrap

par(mfrow = c(2, 1), mar = c(4.5, 4.5, 3.5, 1), cex.main = 1.25)

hist(bootstrap_means, col = "#d83737", border = "white", breaks = 25,
     xlab = "Mean Bootstrap", ylab = "Frekuensi",
     main = "Distribusi 1000 Bootstrap Sample Means")
abline(v = mean(bootstrap_means), col = "darkred", lwd = 2.5, lty = 2)

hist(myData, col = "#37aad8", border = "white", breaks = 30,
     xlab = "Nilai Observasi", ylab = "Frekuensi",
     main = "Distribusi Data Asli myData (n = 1000)")
abline(v = mean(myData), col = "darkblue", lwd = 2.5, lty = 2)

Penjelasan Kode Visualisasi:

  1. par(mfrow=c(2,1)): Menggabungkan dua histogram dalam satu halaman.
  2. Warna merah (#d83737) untuk distribusi bootstrap (menunjukkan sampling variability).
  3. Warna biru (#37aad8) untuk distribusi data asli.
  4. Garis putus-putus menandakan nilai mean masing-masing distribusi.
  5. Histogram bootstrap jauh lebih sempit dibandingkan histogram data asli — ini adalah efek Central Limit Theorem (CLT), bukan efek “ukuran sampel besar” semata.

Boxplot Perbandingan Distribusi Bootstrap Means dan Data Asli

boxplot(bootstrap_means, myData,
        names = c("Bootstrap Means (1000 sampel)", "Data Asli (n=1000)"),
        col = c("#d83737", "#37aad8"),
        main = "Boxplot Perbandingan Distribusi Bootstrap Means dan Data Asli",
        ylab = "Nilai")

Plot Urutan Bootstrap Means

plot(1:n_bootstrap, bootstrap_means, type = "l", col = "#d83737",
     main = "Urutan Nilai Mean dari 1000 Kali Proses Bootstrap",
     xlab = "Nomor Bootstrap ke-",
     ylab = "Mean Bootstrap Sample",
     ylim = range(c(29.7, 30.2)))
abline(h = mean(myData), col = "blue", lty = 2)
legend("bottomright", legend = "Mean Data Asli", col = "blue", lty = 2)

QQ Plot dan Distribusi Bootstrap dengan Kurva Normal

par(mfrow = c(1, 2),
    mar = c(5, 5, 5, 2))

# Plot Kiri: QQ Plot
qqnorm(bootstrap_means,
       main = "QQ Plot Distribusi Bootstrap Means",
       xlab = "Quantile Teoritis Normal",
       ylab = "Quantile Sampel Bootstrap",
       pch = 19, col = "#2c3e50")
qqline(bootstrap_means, col = "red", lwd = 2.5)

# Plot Kanan: Distribusi Bootstrap + Kurva Normal
hist(bootstrap_means,
     prob = TRUE,
     col = "#d83737",
     border = "white",
     breaks = 25,
     main = "Distribusi Bootstrap + Kurva Normal",
     xlab = "Mean Bootstrap",
     ylab = "Density")

curve(dnorm(x, mean(bootstrap_means), sd(bootstrap_means)),
      add = TRUE,
      col = "darkblue",
      lwd = 3)

legend("topright",
       legend = c("Histogram Bootstrap", "Kurva Normal"),
       col = c("#d83737", "darkblue"),
       lwd = c(8, 3),
       bty = "n", cex = 0.95)

Visualisasi Gabungan

par(mfrow = c(2, 3),
    mar = c(5, 5, 5, 2),
    cex.main = 1.1,
    cex.lab = 1.0)

# Plot 1: Histogram Data Asli
hist(myData, col = "#37aad8", border = "white", breaks = 30,
     main = "1. Distribusi Data Asli (n=1000)",
     xlab = "Nilai Observasi", ylab = "Frekuensi")
abline(v = mean(myData), col = "darkblue", lwd = 2.5, lty = 2)

# Plot 2: Histogram Bootstrap Means
hist(bootstrap_means, col = "#d83737", border = "white", breaks = 25,
     main = "2. Distribusi Bootstrap Means",
     xlab = "Mean Bootstrap", ylab = "Frekuensi")
abline(v = mean(bootstrap_means), col = "darkred", lwd = 2.5, lty = 2)

# Plot 3: Boxplot Perbandingan
boxplot(bootstrap_means, myData,
        names = c("Bootstrap Means", "Data Asli"),
        col = c("#d83737", "#37aad8"),
        main = "3. Boxplot Perbandingan")

# Plot 4: Urutan Bootstrap Means
plot(1:n_bootstrap, bootstrap_means, type = "l", col = "#d83737",
     main = "4. Urutan Mean dari 1000 Bootstrap",
     xlab = "Urutan Bootstrap ke-", ylab = "Mean")

# Plot 5: QQ Plot
qqnorm(bootstrap_means,
       main = "5. QQ Plot Distribusi Bootstrap Means",
       xlab = "Quantile Teoritis Normal",
       ylab = "Quantile Sampel Bootstrap")
qqline(bootstrap_means, col = "red", lwd = 2.5)

# Plot 6: Distribusi Bootstrap + Kurva Normal
hist(bootstrap_means, prob = TRUE, col = "#d83737", border = "white", breaks = 25,
     main = "6. Distribusi Bootstrap + Kurva Normal",
     xlab = "Mean Bootstrap", ylab = "Density")
curve(dnorm(x, mean(bootstrap_means), sd(bootstrap_means)),
      add = TRUE, col = "darkblue", lwd = 3)

mtext("Visualisasi Lengkap Metode Bootstrap",
      side = 3, line = -1.5, outer = TRUE, font = 2, cex = 1.3)

Pembahasan

Pada praktikum ini, data disimulasikan dengan membangkitkan 1.000 observasi dari distribusi normal dengan parameter populasi μ = 30 dan σ = 2,5. Dari data tersebut, dilakukan proses bootstrap sebanyak 1.000 replikasi (B = 1000), di mana setiap replikasi mengambil resample berukuran sama dengan data asli (n = 1.000) secara acak dengan pengembalian, lalu menghitung mean dari setiap resample tersebut.

Pendekatan ini sejalan dengan prinsip dasar metode bootstrap yang diperkenalkan oleh Efron (1979): menggunakan resampling empirik untuk mengestimasi distribusi sampling suatu statistik tanpa bergantung pada asumsi parametrik yang ketat. Hasil sanity check menunjukkan mean data asli (29,92) dan SD data asli (2,475) sudah sangat dekat dengan parameter populasi yang ditentukan — ini mengonfirmasi bahwa proses pembangkitan data berjalan benar sebelum bootstrap dijalankan.

Hasil bootstrap dengan B = 1000 menghasilkan rata-rata mendekati 29,92 dengan SD bootstrap yang mendekati nilai standard error teoritis. Penting untuk dipahami bahwa SD bootstrap means bukan ukuran yang sebanding langsung dengan SD data asli — keduanya mengukur hal yang berbeda secara konsep:

Sebagai pembanding, rumus teoritis SEM memberikan:

\[SE_{teori} = \frac{\sigma}{\sqrt{n}} = \frac{2{,}475}{\sqrt{1000}} \approx 0{,}0783\]

Dengan menaikkan jumlah replikasi dari B = 50 menjadi B = 1.000, SD bootstrap kini konvergen jauh lebih dekat ke nilai teori ini dibandingkan hasil sebelumnya — ini membuktikan secara empiris bahwa jumlah replikasi bootstrap (B) yang cukup besar penting untuk menghasilkan estimasi standard error yang stabil dan presisi, sesuai standar praktik yang disebutkan pada bagian Pendahuluan (B ≥ 1000).

Dari sisi visualisasi, histogram bootstrap means tampak jauh lebih sempit dan terpusat dibanding histogram data asli, serta lebih mulus dan simetris dibandingkan hasil dengan B = 50 sebelumnya. Fenomena penyempitan ini adalah manifestasi dari Central Limit Theorem (CLT) — bukan Hukum Bilangan Besar — karena CLT menjelaskan bahwa distribusi sampling dari mean memiliki variabilitas yang jauh lebih kecil dan bentuknya mendekati normal, terlepas dari bentuk distribusi populasi aslinya. QQ-plot dan kurva normal yang dioverlay pada histogram juga menunjukkan kesesuaian yang lebih baik terhadap distribusi normal dibandingkan saat B = 50.

Analisis

1. Ketidakbiasan Estimator Rata-rata bootstrap sangat dekat dengan mean data asli (29,92) maupun parameter populasi (30). Ini menunjukkan estimator mean bersifat unbiased — bootstrap berhasil mereproduksi sifat ini secara empiris, dan dengan B = 1000 hasil ini semakin stabil dibandingkan B = 50.

2. Standard Error sebagai Ukuran Ketidakpastian SD bootstrap adalah estimasi empiris dari standard error mean, bukan sekadar “variabilitas yang lebih kecil karena sampel besar”. Nilai ini relevan dibandingkan dengan rumus teoritis SE = σ/√n (≈0,078), bukan dibandingkan langsung dengan SD data asli (2,475) — karena kedua SD tersebut menjawab pertanyaan yang berbeda: seberapa tersebar data individual, vs seberapa tersebar estimasi mean.

3. Pengaruh Jumlah Replikasi Bootstrap (B) Menaikkan B dari 50 menjadi 1.000 menghasilkan estimasi SD bootstrap yang lebih mendekati nilai teoritis (0,078), serta bentuk QQ-plot dan histogram yang lebih mulus dan stabil. Ini menegaskan bahwa B = 50 pada laporan sebelumnya terlalu kecil untuk estimasi yang presisi, dan validasi ini sekaligus menjawab catatan metodologis dari revisi sebelumnya.

4. Bentuk Distribusi Sampling QQ-plot dan overlay kurva normal mengindikasikan distribusi bootstrap means mendekati normal, sesuai prediksi CLT untuk statistik mean pada ukuran sampel besar (n = 1.000 per resample).

5. Perbandingan Visual Boxplot dan plot urutan bootstrap secara visual menegaskan perbedaan skala variabilitas antara data individual dan distribusi sampling mean — keduanya secara kolektif mengilustrasikan konsep sampling distribution dan sampling variability.

Interpretasi

Hasil praktikum ini menunjukkan bahwa metode bootstrap dapat digunakan untuk mengestimasi ketidakpastian suatu statistik (di sini: mean) tanpa harus mengetahui atau mengasumsikan rumus distribusi sampling secara teoritis. Dalam kasus ini, karena data berasal dari distribusi normal yang diketahui, kita bisa memvalidasi bootstrap dengan membandingkannya ke rumus klasik (SE = σ/√n) — dan dengan B = 1.000, keduanya memang sangat mendekati. Inilah nilai praktis bootstrap: pada situasi nyata di mana distribusi populasi tidak diketahui atau rumus teoritis SE-nya rumit/tidak ada, bootstrap tetap bisa memberikan estimasi yang masuk akal hanya dari data yang ada, asalkan jumlah replikasi (B) cukup besar.

Kesimpulan

  1. Bootstrap berhasil mengonfirmasi sifat tidak bias dari estimator mean: rata-rata bootstrap sangat dekat dengan mean data asli dan parameter populasi (30).
  2. Bootstrap berhasil mengestimasi standard error mean secara empiris, yang dengan B = 1.000 kini konvergen mendekati nilai teoritis SE = σ/√n (≈0,078) — bukan sekadar “lebih kecil karena n besar”, melainkan karena SD bootstrap dan SD data asli memang mengukur dua kuantitas yang berbeda secara konsep.
  3. Bentuk distribusi sampling mean mendekati normal, sesuai Central Limit Theorem — bukan Hukum Bilangan Besar (HBB menjelaskan konvergensi nilai mean ke parameter populasi, bukan bentuk atau besarnya variabilitas distribusi sampling).
  4. Menaikkan jumlah replikasi bootstrap dari B = 50 menjadi B = 1.000 terbukti menghasilkan estimasi standard error dan bentuk distribusi sampling (QQ-plot, histogram) yang lebih stabil dan presisi, sesuai standar praktik bootstrap.
  5. Visualisasi (histogram, boxplot, QQ-plot, line plot) secara kolektif berhasil mengilustrasikan perbedaan fundamental antara variabilitas data individual dan variabilitas distribusi sampling mean — inti dari konsep inferensia statistik berbasis resampling.