Membuktikan kausalitas, bukan sekadar korelasi: merancang eksperimen A/B yang valid, menghitung ukuran sampel, menguji signifikansi, dan mengukur uplift — dilengkapi praktik analisis hasil A/B test lengkap

Setelah di episode 15 kita meramal masa depan, pada episode ini kita membahas cara mengubah masa depan lewat eksperimen. A/B testing adalah metode paling andal untuk membuktikan kausalitas: apakah perubahan pada produk benar-benar menyebabkan peningkatan metrik, atau hanya kebetulan?
Mengapa ini keterampilan inti data scientist? Karena korelasi (episode 6) tidak pernah cukup. "Pengguna yang lihat banner X belanja lebih banyak" bisa jadi karena pengguna yang sudah loyal memang melihat banner itu — bukan karena banner-nya bekerja. Satu-satunya cara menyimpulkan dengan jujur adalah eksperimen acak. Dari optimasi halaman checkout sampai harga produk, keputusan bisnis terpenting seharusnya didasarkan pada uji yang dirancang dengan benar.
A/B test yang baik memenuhi beberapa prinsip dasar:
Sebelum eksperimen, hitung berapa sampel yang dibutuhkan — ini menghindari eksperimen yang berjalan berbulan-bulan tanpa hasil:
import math
def min_sample_size(alpha=0.05, power=0.8, effect=0.01, base_rate=0.10):
z_alpha = 1.96 # untuk alpha 0.05 (dua arah)
z_beta = 0.84 # untuk power 0.80
p = (base_rate + base_rate + effect) / 2
q = 1 - p
n = (z_alpha + z_beta) ** 2 * 2 * p * q / effect ** 2
return math.ceil(n)
print("sampel per grup:", min_sample_size())Pertanyaan yang harus dijawab sebelum running: berapa ukuran efek terkecil yang ingin dideteksi (effect size)? berapa power? berapa baseline rate? — jawabannya menentukan durasi dan biaya eksperimen.
Studi kasus: tim produk mengganti warna tombol checkout dan ingin tahu apakah conversion rate naik. Data: 10.000 pengguna per grup.
import numpy as np
import pandas as pd
from scipy import stats
np.random.seed(21)
n = 10000
control = np.random.binomial(1, 0.100, n) # baseline 10%
treatment = np.random.binomial(1, 0.115, n) # treatment 11.5%
c_rate = control.mean()
t_rate = treatment.mean()
print(f"kontrol : {c_rate:.3%}")
print(f"treatment: {t_rate:.3%}")
print(f"uplift : {(t_rate - c_rate):.3%}")
z_stat, p_value = stats.proportions_ztest(
[treatment.sum(), control.sum()],
[n, n],
)
print(f"z = {z_stat:.3f}, p-value = {p_value:.4f}")Keputusan mengikuti alur: p-value < 0.05 → tolak H0 (ada perbedaan signifikan); lalu tanyakan apakah besarnya berarti bagi bisnis? Uplift 1.5 poin persentase di contoh adalah efek signifikan secara statistik — tetapi jika biaya implementasi besar, keputusan tetap bisa "tidak".
Warning
Signifikan ≠ penting. Efek signifikan secara statistik bisa terlalu kecil untuk layak secara bisnis. Dan sebaliknya: eksperimen yang hasilnya tidak signifikan bukan berarti treatment tidak bekerja — bisa jadi sampelnya kurang. Selalu laporkan efek + confidence interval, bukan hanya p-value.
from statsmodels.stats.proportion import confint_proportions_2indep
ci = confint_proportions_2indep(
treatment.sum(), n, control.sum(), n, compare="diff", alpha=0.05
)
print(f"uplift CI 95%: [{ci[0]:.3%}, {ci[1]:.3%}]")Jika interval tidak mengandung 0, perbedaan signifikan. Interval juga menunjukkan rentang efek yang masuk akal — bahasa yang lebih kaya daripada satu angka p-value.
Tidak semua pertanyaan kausal bisa dijawab A/B test — kadang eksperimen acak tidak etis atau mustahil. Metode observasional yang dipakai praktisi:
| Metode | Kapan Dipakai | Intuisi |
|---|---|---|
| Regression discontinuity | Threshold kebijakan (misal cutoff umur) | Bandingkan tepat di kedua sisi garis batas |
| Difference-in-differences | Perubahan kebijakan di satu grup | Bandingkan selisih perubahan antar grup |
| Propensity score matching | Tidak bisa randomisasi | Cocokkan unit serupa di kedua grup |
| Instrumental variable | Ada variabel yang hanya memengaruhi treatment | Memanfaatkan "keacakan alami" |
Prinsip bersama: semua mencari variasi quasi-eksperimental untuk meniru kondisi acak. Mendalaminya butuh eksperimen tambahan; untuk sekarang, ingat aturannya — korelasi bukan bukti, dan klaim kausal harus menyebut metode & asumsinya.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Peeking berulang ("cek tiap hari") | False positive meningkat | Tetapkan durasi & stopping rule |
| Multiple metrics tanpa koreksi | Peluang salah meningkat | Satu metrik primer + koreksi |
| Mengabaikan ukuran sampel | Eksperimen tanpa daya | Hitung n sebelum mulai |
| Menyebarkan hasil sebagian | Segmen bias | Analisis segmentasi dengan hati-hati |
| Menghentikan dini saat "bagus" | Keputusan prematur | Patuhi aturan yang ditetapkan awal |
Inti yang harus dibawa pulang:
Di episode 17 selanjutnya kita akan membahas communication & storytelling — menyampaikan insight ke stakeholder non-teknis, yang mengubah temuan menjadi keputusan. Sampai jumpa di episode 17!