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.
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.
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.
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%.
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:
Angka 10.314 itu buat satu varian aja. Kesalahan klasik: orang ngira itu total, terus test-nya berhenti di separuh jalan.
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.
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:
Kalau hitungannya keluar 6 minggu, itu sinyal buat mundur sebentar. Naikin MDE, atau ganti dulu ke perubahan yang efeknya lebih besar.
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.
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.
Hasil rumus itu per grup. Kalau kamu punya tiga varian, kalikan tiga, bukan tetap satu angka.
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.
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.
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.
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.
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.
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.
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% 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.
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.
Tiga langkah yang bisa kamu kerjain hari ini:
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.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.