Bootstrap: Mengukur Ketidakpastian Tanpa Rumus Statistik Rumit
TL;DR
Bootstrap adalah cara ngukur ketidakpastian sebuah angka dengan ngambil sampel ulang dari data yang kamu punya, ribuan kali, terus ngelihat sebaran hasilnya. Kelebihannya, kamu bisa bikin rentang kepercayaan buat statistik apapun termasuk median dan persentil, yang rumus bakunya susah atau nggak ada. Di Python cukup pakai numpy buat versi manual, atau scipy.stats.bootstrap buat versi siap pakai.
Bootstrap adalah cara ngukur ketidakpastian sebuah angka dengan ngambil sampel ulang dari data yang kamu punya, ribuan kali, terus ngelihat seberapa lebar sebaran hasilnya.
Nggak ada rumus yang perlu dihafal. Yang dibutuhin cuma data asli dan komputer yang mau ngulang kerjaan yang sama 10.000 kali.
Kelebihannya kelihatan waktu kamu butuh rentang kepercayaan buat median, persentil 90, atau rasio antar dua metrik. Ketiganya nggak punya rumus baku yang enak dipakai.
Apa itu bootstrap?
Bootstrap adalah metode resampling yang bikin banyak sampel tiruan dari satu set data, dengan cara ngambil baris secara acak dan boleh berulang, sebanyak jumlah baris aslinya. Tiap sampel tiruan dihitung statistiknya, terus sebaran dari ribuan hasil itu dipakai buat nentuin rentang kepercayaan.
Kata kuncinya "boleh berulang". Kalau data kamu 240 baris, tiap sampel tiruan juga 240 baris, tapi baris ke-17 bisa kepilih tiga kali sementara baris ke-92 nggak kepilih sama sekali.
Pengulangan itu yang bikin tiap sampel tiruan sedikit berbeda. Dan perbedaan antar sampel tiruan itulah yang nunjukin seberapa goyang angka kamu.
Kapan bootstrap lebih berguna dari rumus biasa?
Rumus rentang kepercayaan yang diajarin di kuliah biasanya cuma buat rata-rata, dan nganggep datanya nyebar normal. Data bisnis jarang begitu.
| Situasi | Rumus baku | Bootstrap |
|---|---|---|
| Rentang kepercayaan rata-rata, data normal | Gampang | Bisa, tapi berlebihan |
| Rentang kepercayaan median | Ribet | Gampang |
| Rentang kepercayaan persentil 90 | Nyaris nggak ada | Gampang |
| Rasio antar dua metrik | Butuh pendekatan khusus | Gampang |
| Data miring ekstrem | Hasilnya meleset | Ngikutin bentuk data |
| Sampel di bawah 30 | Perlu asumsi tambahan | Jalan, rentangnya jujur lebar |
Nilai pesanan toko online itu contoh klasik data miring. Kebanyakan pesanan di kisaran Rp 100 ribu sampai Rp 250 ribu, tapi ada satu dua pesanan Rp 1,7 juta yang narik rata-rata ke atas.
Gimana cara kerja bootstrap?
Lima langkah, dan langkah 2 sampai 4 diulang ribuan kali:
- Siapin data asli kamu, misalnya 240 nilai pesanan.
- Ambil 240 baris secara acak dari data itu, boleh ngambil baris yang sama lebih dari sekali.
- Hitung statistik yang kamu mau dari sampel tiruan itu, misalnya mediannya.
- Simpan hasilnya.
- Setelah 10.000 kali, urutin semua hasil. Ambil nilai di posisi 2,5% dan 97,5%. Dua angka itu batas bawah dan batas atas rentang kepercayaan 95% kamu.
Langkah kelima itu yang namanya metode persentil. Ada varian lain yang lebih canggih, tapi metode persentil udah cukup buat hampir semua kebutuhan sehari-hari.
Gimana cara bootstrap di Python?
Versi manual pakai numpy. Delapan baris, dan kamu bisa lihat semua yang terjadi:
import numpy as np
rng = np.random.default_rng(2025)
x = np.array(nilai_pesanan) # data asli, 240 angka
n = len(x)
B = 10000 # jumlah resample
# ambil indeks acak, boleh berulang, sekaligus 10.000 baris
idx = rng.integers(0, n, size=(B, n))
sampel = x[idx]
median_boot = np.median(sampel, axis=1)
lo, hi = np.percentile(median_boot, [2.5, 97.5])
print(f"median {np.median(x):,.0f}")
print(f"CI 95%: {lo:,.0f} sampai {hi:,.0f}")
Trik yang bikin kode ini cepat ada di baris rng.integers. Alih-alih ngulang perulangan 10.000 kali, semua indeks acak dibikin sekaligus jadi matriks. Buat 240 baris dan 10.000 resample, jalannya di bawah satu detik.
Mau ganti statistiknya? Tukar aja np.median jadi np.mean, atau pakai np.percentile(sampel, 90, axis=1) buat persentil 90.
Versi siap pakai dengan scipy
Kalau kamu nggak mau ngurus indeks sendiri, scipy punya fungsi khusus:
import numpy as np
from scipy.stats import bootstrap
x = np.array(nilai_pesanan)
hasil = bootstrap(
(x,), # data harus dibungkus tuple
np.median,
confidence_level=0.95,
n_resamples=10000,
method="percentile",
random_state=2025,
)
print(hasil.confidence_interval.low)
print(hasil.confidence_interval.high)
print(hasil.standard_error)
Tanda koma di (x,) itu wajib. Tanpa koma, Python nganggep itu tanda kurung biasa, bukan tuple, dan scipy bakal nolak.
Argumen method punya tiga pilihan: percentile, basic, dan BCa. Yang terakhir ngoreksi kemiringan dan bias, dan biasanya paling akurat buat data miring. Bedanya tipis buat sampel besar. Penjelasan lengkap tiap metode ada di dokumentasi scipy.stats.bootstrap.
Contoh kasus: nilai pesanan toko_berkah
Data yang aku pakai: 240 pesanan, nilainya miring ke kanan kayak data belanja pada umumnya.
- Rata-rata: Rp 206.433
- Median: Rp 151.500
- Simpangan baku: Rp 211.759
- Pesanan terbesar: Rp 1.694.000
Jarak antara rata-rata dan median hampir Rp 55 ribu. Itu tanda datanya miring, dan tanda bahwa rata-rata bukan angka terbaik buat ngegambarin pesanan biasa.
Hasil bootstrap 10.000 kali:
| Statistik | Nilai | Rentang kepercayaan 95% | Lebar rentang |
|---|---|---|---|
| Rata-rata | Rp 206.433 | Rp 181.265 sampai Rp 234.505 | Rp 53.240 |
| Median | Rp 151.500 | Rp 129.000 sampai Rp 174.500 | Rp 45.500 |
| Persentil 90 | Rp 402.000 | Rp 330.000 sampai Rp 487.500 | Rp 157.500 |
Tiga hal yang kelihatan dari tabel ini.
Pertama, rentang buat median lebih sempit dari rentang buat rata-rata. Di data miring, median memang lebih stabil karena nggak keseret pesanan Rp 1,7 juta tadi.
Kedua, rentang buat persentil 90 lebar banget, hampir Rp 158 ribu. Wajar, karena cuma sedikit data yang ada di daerah situ. Kalau kamu mau bikin janji pengiriman buat pesanan besar, ketidakpastian segitu perlu masuk hitungan.
Ketiga, rumus t biasa buat rata-rata ngasih rentang Rp 179.505 sampai Rp 233.361. Bootstrap ngasih Rp 181.265 sampai Rp 234.505, sedikit geser ke kanan. Pergeseran itu efek dari kemiringan data, yang nggak ketangkep rumus t.
Selisihnya kecil di sini karena sampelnya 240 baris. Di sampel 40 baris, selisihnya bisa jauh lebih besar.
Bootstrap buat bandingin dua grup
Ini yang paling kepakai kalau kamu lagi ngerjain eksperimen. Alih-alih ngelaporin p-value, kamu bisa langsung ngelaporin rentang selisihnya.
import numpy as np
rng = np.random.default_rng(7)
B = 10000
selisih = np.empty(B)
for i in range(B):
sa = a[rng.integers(0, len(a), len(a))]
sb = b[rng.integers(0, len(b), len(b))]
selisih[i] = sb.mean() - sa.mean()
lo, hi = np.percentile(selisih, [2.5, 97.5])
print(f"selisih rata-rata: {b.mean() - a.mean():,.0f}")
print(f"CI 95%: {lo:,.0f} sampai {hi:,.0f}")
Aku jalanin ini di dua grup pesanan, 240 baris di grup lama dan 236 di grup baru. Hasilnya:
- Rata-rata grup lama: Rp 168.004
- Rata-rata grup baru: Rp 194.127
- Selisih: Rp 26.123
- Rentang kepercayaan 95%: Rp 1.948 sampai Rp 51.560
Rentangnya nggak nyentuh nol, tapi batas bawahnya cuma Rp 1.948. Artinya data ini konsisten sama kenaikan yang gede banget, tapi juga konsisten sama kenaikan yang nyaris nol.
Kalimat itu jauh lebih jujur dari "signifikan secara statistik". Kalau kamu cuma ngelaporin p-value, orang di ruang rapat bakal nangkep kesimpulan yang jauh lebih pasti dari yang datanya sanggup dukung.
Kalau kamu masih sering ngandelin p-value doang, catatan soal p-value ini layak dibaca sekali lagi.
Kapan bootstrap nggak bisa dipakai?
Bootstrap bukan alat serbaguna. Ada empat situasi yang bikin hasilnya nyesatin:
- Statistik yang bergantung nilai ekstrem. Nilai maksimum atau minimum nggak cocok, karena resample nggak pernah ngasih angka di luar data asli.
- Data deret waktu. Ngambil baris acak ngerusak urutan hari. Buat kasus ini ada block bootstrap yang ngambil potongan periode, bukan baris satuan.
- Data berkelompok. Kalau satu pelanggan punya 30 pesanan, resample per baris nganggep 30 pesanan itu saling bebas. Ambil ulang per pelanggan, bukan per pesanan.
- Sampel yang terlalu kecil dan nggak mewakili. Bootstrap cuma bisa ngukur ketidakpastian, bukan ngebenerin sampel yang bias sejak awal.
Poin terakhir yang paling sering disalahpahami. Ngulang resample 100.000 kali nggak bikin data 15 baris jadi lebih mewakili populasi.
Kesalahan umum waktu pakai bootstrap
Resample tanpa pengembalian
Kalau kamu ngambil acak tanpa boleh berulang sebanyak jumlah baris asli, kamu cuma dapet data yang sama diacak urutannya. Semua hasil bootstrap-nya bakal identik. Pastiin kamu pakai pengambilan yang boleh berulang.
Bikin sampel tiruan yang ukurannya beda dari data asli
Ambil 100 baris dari data 240 baris bikin rentangnya kelewat lebar. Ukuran sampel tiruan harus sama persis sama data aslinya.
Resample cuma 200 kali
Batas rentangnya bakal goyang tiap kali kamu jalanin ulang. Pakai 10.000 buat rentang kepercayaan.
Lupa ngunci random seed
Tanpa seed, hasil kamu beda tiap kali dijalanin dan orang lain nggak bisa ngecek kerjaan kamu. Isi default_rng(2025) atau random_state dengan angka apapun yang kamu catat.
Nyimpulin seolah-olah pasti dari rentang yang lebar
Rentang Rp 1.948 sampai Rp 51.560 itu informasi soal seberapa banyak yang kamu belum tau. Laporin dua ujungnya, jangan cuma titik tengahnya.
FAQ
Berapa kali resample yang cukup buat bootstrap?
Buat rentang kepercayaan, 10.000 kali udah jadi patokan yang aman. Di bawah 1.000, batas rentangnya masih goyang tiap kali kamu jalanin ulang. Di atas 10.000, hasilnya nyaris nggak berubah lagi tapi waktu komputasinya nambah terus. Kalau kamu cuma butuh standar error, 1.000 kali biasanya udah cukup stabil.
Bootstrap bisa dipakai buat data yang cuma 20 baris?
Bisa dijalanin, tapi hati-hati bacanya. Bootstrap ngambil ulang dari data yang ada, jadi kalau data aslinya nggak mewakili populasi, hasil bootstrap-nya ikut meleset. Dengan 20 baris, rentangnya bakal lebar banget dan itu jujur. Yang berbahaya kalau kamu ngeliat rentang sempit dari 20 baris, berarti ada yang salah di kodenya.
Apa bedanya bootstrap sama simulasi Monte Carlo?
Monte Carlo bikin data baru dari sebaran yang kamu tentuin sendiri, misalnya normal dengan rata-rata dan simpangan tertentu. Bootstrap nggak nebak sebaran apapun, dia ngambil ulang dari data asli kamu. Makanya bootstrap cocok waktu kamu nggak yakin data kamu ngikutin sebaran apa.
Kapan bootstrap kasih hasil yang menyesatkan?
Waktu statistik yang kamu ukur bergantung banget sama nilai ekstrem, misalnya nilai maksimum atau minimum. Bootstrap nggak pernah ngeluarin angka yang lebih besar dari maksimum data asli, jadi rentangnya bakal kelewat sempit. Juga hati-hati kalau datanya punya urutan waktu atau ada pengelompokan, karena resample acak biasa ngerusak struktur itu.
Bootstrap bisa gantiin uji hipotesis?
Bisa buat banyak kasus, dan hasilnya sering lebih gampang dijelasin. Alih-alih ngelaporin p-value, kamu bisa bilang selisih rata-ratanya ada di rentang Rp 1.948 sampai Rp 51.560 dengan keyakinan 95%. Rentang yang nggak nyentuh nol punya arti yang sama dengan hasil signifikan, tapi sekalian nunjukin seberapa besar efeknya.
Langkah berikutnya
Ambil satu angka yang sering kamu laporin ke atasan, misalnya median nilai pesanan bulan lalu. Jalanin kode delapan baris di atas, terus tambahin rentangnya di slide berikutnya.
Perubahan kecil itu biasanya ngubah nada diskusinya. Angka tunggal ngundang perdebatan menang kalah, rentang ngundang pertanyaan soal seberapa yakin kita.
Buat dasar teorinya, mampir ke uji hipotesis. Kalau angka yang kamu ukur sering keseret nilai ekstrem, cek juga glosarium outlier sebelum mutusin pakai rata-rata atau median.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.
Pandas read_csv: Baca File CSV di Python untuk Analis
pandas read_csv baca file CSV jadi DataFrame siap olah cuma satu baris kode. Ini cara pakai plus parameter penting kayak sep, encoding, dan usecols dengan contoh data toko.