Menghitung Ukuran Sampel A/B Test Sebelum Eksperimen Dijalankan
TL;DR
Ukuran sampel A/B test adalah jumlah pengunjung minimum per varian yang kamu butuhin biar hasil test bisa dipercaya, dan angkanya dihitung sebelum test jalan. Empat input yang menentukan: conversion rate awal (baseline), minimum detectable effect, alpha, dan power. Buat baseline 4% dengan target kenaikan relatif 20%, kamu butuh sekitar 10.300 pengunjung per grup pada alpha 5% dan power 80%.
Ukuran sampel A/B test adalah jumlah pengunjung minimum per grup yang kamu butuhin biar hasil test-nya bisa dipercaya. Angka ini dihitung sebelum test jalan, bukan setelah datanya ngumpul.
Ada empat input yang wajib kamu tentuin duluan: conversion rate sekarang, seberapa kecil perubahan yang mau kamu deteksi, batas false positive yang kamu terima, dan power.
Di bawah ada rumusnya, kode Python yang bisa langsung kamu jalanin, tabel referensi cepat, plus hitungan buat toko online yang trafiknya pas-pasan.
Apa itu ukuran sampel A/B test?
Ukuran sampel A/B test adalah jumlah minimum peserta per varian supaya kamu punya peluang yang layak buat nangkep perbedaan nyata antara versi A dan versi B. Kalau sampelnya kurang, perbedaan asli gampang kelewat. Kalau kelebihan, kamu buang trafik dan waktu buat hal yang jawabannya udah jelas.
Angkanya nggak universal. Toko yang conversion rate-nya 10% butuh sampel jauh lebih kecil dari toko yang conversion rate-nya 2%, walaupun target kenaikannya sama-sama 20%.
Kalau kamu masih baru di topik ini, mampir dulu ke definisi A/B testing dan conversion rate biar istilahnya nyambung.
Kenapa ukuran sampel harus dihitung sebelum test jalan?
Soalnya kalau kamu nggak punya target angka, kamu nggak punya alasan buat berhenti. Test bakal kamu tutup pas hasilnya kebetulan enak dilihat, dan itu bikin false positive naik jauh di atas 5%. Target sampel yang ditetapin di awal jadi rem yang nahan godaan itu.
Ada satu lagi manfaatnya yang lebih praktis. Kadang hasil hitungannya bilang kamu butuh 40.000 pengunjung per grup, padahal trafik bulanan kamu 9.000. Mendingan tau itu sekarang daripada tiga minggu kemudian.
Input apa aja yang dibutuhin buat ngitung?
Empat angka. Tiga di antaranya kamu tentuin sendiri, satu diambil dari data historis.
| Input | Artinya | Nilai umum |
|---|---|---|
| Baseline (p1) | Conversion rate versi lama, dari data 30 hari terakhir | Diambil dari data kamu |
| MDE | Minimum detectable effect, perubahan terkecil yang masih layak kamu deteksi | 10% sampai 30% relatif |
| Alpha | Peluang bilang ada efek padahal nggak ada | 0,05 |
| Power | Peluang nangkep efek yang beneran ada | 0,8 |
MDE yang paling sering bikin orang bingung. Isinya bukan tebakan seberapa besar efek yang bakal terjadi. Isinya keputusan bisnis: kenaikan sekecil apa yang bikin kamu mau ganti halaman checkout beneran?
Kalau biaya ganti desainnya kecil, kenaikan 5% aja udah worth. Kalau ganti desain berarti rework tiga minggu, jangan repot ngukur di bawah 20%.
Gimana rumus ukuran sampel A/B test?
Buat metrik berbentuk proporsi kayak conversion rate, rumus yang paling umum dipakai kayak gini:
n per grup = (z_alpha + z_beta)^2 * (p1*(1-p1) + p2*(1-p2)) / (p2 - p1)^2
z_alpha = 1,96 (alpha 5%, dua arah)
z_beta = 0,84 (power 80%)
p1 = conversion rate versi lama
p2 = conversion rate target versi baru
Cara pakainya:
- Ambil baseline dari data 30 hari terakhir. Misal 4%, jadi p1 = 0,04.
- Tentuin MDE. Misal kenaikan relatif 20%, jadi p2 = 0,04 x 1,2 = 0,048.
- Hitung selisihnya. 0,048 dikurang 0,04 = 0,008.
- Masukin ke rumus. Hasilnya 10.314 orang per grup.
- Kali dua buat total dua varian. Jadi 20.628 pengunjung.
Angka 10.314 itu buat satu varian aja. Kesalahan klasik: orang ngira itu total, terus test-nya berhenti di separuh jalan.
Gimana cara hitung ukuran sampel pakai Python?
Kalau kamu nggak mau ngitung manual, dua library ini udah cukup. Versi paling ringkas pakai statsmodels:
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize
p1 = 0.04 # baseline conversion rate
p2 = 0.048 # target setelah naik 20% relatif
effect = proportion_effectsize(p2, p1)
n = NormalIndPower().solve_power(
effect_size=effect,
alpha=0.05,
power=0.8,
ratio=1,
alternative="two-sided",
)
print(round(n)) # 10297
Versi manual pakai scipy, kalau kamu pengin lihat rumusnya kebuka:
from scipy.stats import norm
p1, p2 = 0.04, 0.048
alpha, power = 0.05, 0.8
z_alpha = norm.ppf(1 - alpha / 2)
z_beta = norm.ppf(power)
n = (z_alpha + z_beta) ** 2 * (p1 * (1 - p1) + p2 * (1 - p2)) / (p2 - p1) ** 2
print(round(n)) # 10314
Dua-duanya keluar di kisaran 10.300. Bedanya 17 orang, gara-gara statsmodels pakai transformasi arcsine buat ngitung effect size sementara versi manual pakai varians mentah. Buat keputusan operasional, selisih segitu nggak ngaruh.
Detail argumen solve_power ada di dokumentasi statsmodels.
Berapa lama test-nya harus jalan?
Bagi total sampel dengan trafik harian yang masuk ke halaman yang diuji. Kalau kamu butuh 20.628 pengunjung dan halaman checkout kamu dikunjungi 1.500 orang per hari, test-nya jalan 14 hari.
Dua aturan tambahan yang aku selalu pakai:
- Minimum 7 hari, biar kena semua hari dalam seminggu. Perilaku belanja Sabtu beda jauh sama Selasa.
- Hindari periode aneh. Harbolnas, minggu Lebaran, atau flash sale bikin baseline kamu nggak mewakili hari normal.
Kalau hitungannya keluar 6 minggu, itu sinyal buat mundur sebentar. Naikin MDE, atau ganti dulu ke perubahan yang efeknya lebih besar.
Contoh kasus: toko_berkah nguji halaman checkout baru
Dataset toko_berkah punya 47.900 sesi checkout selama 90 hari. Dari situ, 1.962 sesi berakhir jadi pesanan, jadi conversion rate-nya 4,1%. Rata-rata nilai pesanan Rp 187.000.
Tim mau nyoba checkout satu halaman buat gantiin alur tiga langkah. Perkiraan kerjaannya dua minggu developer, jadi kenaikan kecil nggak cukup buat bayar ongkosnya.
Hitungannya:
| Parameter | Nilai | Alasan |
|---|---|---|
| Baseline | 4,1% | 1.962 dari 47.900 sesi |
| MDE relatif | 20% | Di bawah itu, ongkos development-nya nggak balik |
| Target p2 | 4,92% | 4,1% x 1,2 |
| Alpha | 0,05 | Standar |
| Power | 0,8 | Standar |
| Sampel per grup | 10.048 | Hasil rumus |
| Total sampel | 20.096 | Dua varian |
| Trafik harian | 532 sesi | 47.900 dibagi 90 hari |
| Durasi | 38 hari | 20.096 dibagi 532 |
Angka 38 hari itu yang bikin diskusinya jadi menarik. Buat toko dengan trafik 532 sesi checkout per hari, satu test doang makan lebih dari sebulan. Artinya toko_berkah cuma bisa jalanin sekitar 9 eksperimen setahun kalau semuanya diuji serius satu per satu.
Konsekuensinya jelas: antrean ide harus diprioritasin ketat. Perubahan yang efeknya diperkirain di bawah 20% mendingan langsung diputusin lewat riset kualitatif atau diluncurin aja tanpa test.
Tabel referensi cepat: sampel per grup
Semua angka di bawah pakai alpha 0,05 dua arah dan power 80%. Kalikan dua buat dapetin total dua varian.
| Baseline | MDE 10% relatif | MDE 20% relatif | MDE 30% relatif |
|---|---|---|---|
| 2% | 80.680 | 21.106 | 9.795 |
| 4% | 39.473 | 10.314 | 4.780 |
| 10% | 14.748 | 3.838 | 1.771 |
Pola yang kelihatan dari tabel ini: MDE punya pengaruh jauh lebih besar dari baseline. Turun dari MDE 30% ke 10% bikin kebutuhan sampel naik hampir 8 kali lipat.
Jadi kalau kamu lagi mentok sama durasi test, angka pertama yang harus kamu tinjau ulang itu MDE, bukan yang lain.
Kesalahan umum waktu ngitung ukuran sampel
Nganggap hasil rumus itu total peserta
Hasil rumus itu per grup. Kalau kamu punya tiga varian, kalikan tiga, bukan tetap satu angka.
Ngambil baseline dari periode promo
Conversion rate waktu flash sale bisa dua kali lipat hari normal. Baseline yang kelewat tinggi bikin estimasi sampel kamu kekecilan, dan test-nya jadi kurang tenaga sejak hari pertama.
Ngitung sampel per sesi tapi ngukur per user
Satu orang bisa buka checkout tiga kali dalam seminggu. Unit yang kamu hitung di rumus harus sama persis sama unit yang kamu pakai waktu ngerandomin dan waktu ngukur. Campur aduk di sini bikin p-value kamu nggak valid.
Nambah varian tanpa nambah sampel
Nguji empat versi sekaligus dengan trafik yang sama kayak dua versi berarti tiap grup cuma dapet separuh. Ditambah lagi, makin banyak perbandingan yang kamu lakuin, makin gede peluang salah satunya kelihatan signifikan gara-gara kebetulan.
Berhenti pas lagi menang
Ini yang paling sering. Hari ke-5 treatment unggul, p-value nembus 0,05, test langsung ditutup. Padahal target sampelnya baru kepenuhan sepertiga. Kalau kamu belum kenal jebakan ini, baca dulu soal cara baca p-value yang bener dan dasar uji hipotesis.
FAQ
Trafik toko aku kecil, apa masih bisa jalanin A/B test?
Bisa, tapi kamu harus turunin ambisinya. Dengan 300 pengunjung checkout per hari, deteksi kenaikan relatif 5% butuh berbulan-bulan. Yang realistis: uji perubahan besar yang efeknya diharapkan 20% ke atas, kayak ganti alur checkout atau ganti posisi tombol bayar. Perubahan warna tombol efeknya kecil banget dan hampir mustahil kebukti di trafik segitu.
Apa bedanya MDE absolut dan MDE relatif?
MDE absolut ditulis dalam selisih poin persen. Dari 4% ke 4,8% itu selisih absolut 0,8 poin persen. MDE relatif ditulis dalam persentase dari baseline. Dari 4% ke 4,8% itu kenaikan relatif 20%. Rumus ukuran sampel pakai selisih absolut, jadi konversi dulu angka relatif kamu sebelum masuk rumus.
Boleh nggak nambah sampel di tengah jalan kalau hasilnya belum signifikan?
Kalau kamu ngintip hasil terus mutusin nambah sampel gara-gara p-value belum lolos, tingkat false positive kamu naik di atas 5%. Ini masuk kategori peeking. Tentuin target sampel di awal, terus tunggu sampai target itu kepenuhan. Kalau memang butuh berhenti lebih awal, pakai metode sequential testing yang emang dirancang buat itu.
Power 80% itu artinya apa?
Power 80% berarti kalau perbedaan sebesar MDE kamu memang beneran ada, test kamu punya peluang 80% buat nangkepnya sebagai hasil signifikan. Sisanya 20% risiko kelewat. Naikin power ke 90% bikin hasil lebih jarang kelewat, tapi kebutuhan sampelnya naik sekitar sepertiga. Buat eksperimen produk sehari-hari, 80% masih jadi standar yang wajar.
Metrik rata-rata belanja hitungnya sama kayak conversion rate?
Beda. Conversion rate itu proporsi, jadi variansnya bisa dihitung langsung dari angka baseline. Rata-rata belanja itu angka kontinu, jadi kamu butuh standar deviasi dari data historis kamu sendiri. Rumusnya jadi n per grup = 2 kali kuadrat jumlah z, dikali kuadrat standar deviasi, dibagi kuadrat selisih rata-rata yang mau dideteksi.
Mulai dari mana
Tiga langkah yang bisa kamu kerjain hari ini:
- Tarik conversion rate 30 hari terakhir dari halaman yang mau kamu uji. Itu baseline kamu.
- Putusin kenaikan terkecil yang bikin kamu mau ganti halamannya beneran. Itu MDE kamu.
- Jalanin salah satu kode Python di atas, terus bagi hasilnya dengan trafik harian. Kalau durasinya lewat 6 minggu, naikin MDE dan hitung ulang.
Habis sampelnya kekumpul, langkah berikutnya ngitung lift dan cek signifikansi. Query siap pakainya udah aku tulis di panduan analisis A/B test pakai SQL. Buat nyocokin istilah metrik yang dipakai tim kamu, cek juga glosarium metric.
Coba hitung ulang satu eksperimen yang pernah kamu jalanin. Banyak yang kaget pas tau test-nya dulu berhenti di 30% target sampel.
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.