Uji A/B adalah cara paling tegas menyimpulkan sebab akibat, yaitu membagi unit secara acak ke dua perlakuan dan membandingkan hasilnya. Topik ini menjalankan satu uji A/B lengkap pada data latihan 400 pengguna, menunjukkan bahwa selisih yang tampak menarik belum tentu nyata, serta memperkenalkan dua disiplin desainnya, yaitu ukuran sampel dan larangan mengintip hasil secara sekuensial. Setelah membacanya, satu eksperimen dirancang dengan keputusan yang ditetapkan sebelum data pertama datang.
Desain sebelum data pertama#
Desain eksperimen menetapkan empat keputusan sebelum data mengalir, yaitu metrik keberhasilan yang didefinisikan sebagaimana modul cara berpikir, unit acaknya, alokasi acak yang benar-benar acak, dan durasi berdasarkan ukuran sampel yang dihitung lebih dahulu. Empat keputusan ini adalah yang membedakan eksperimen dari analisis historis, sebab acak adalah satu-satunya cara menyebarkan faktor tak terukur secara adil antar kelompok.
Data latihan ini berbentuk satu baris per pengguna dengan kolom kelompok dan konversi, dan datanya diacak urutannya sejak pembangkitan sehingga tidak berpola. Skrip berikut meringkas kedua kelompok, lalu mengujinya dengan uji-z dua proporsi.
"""Uji A/B: perbandingan proporsi konversi dua kelompok."""
import pandas as pd
from statsmodels.stats.proportion import proportions_ztest
data = pd.read_csv("uji_ab.csv")
ringkas = data.groupby("kelompok")["konversi"].agg(["count", "sum"])
ringkas["persen"] = (ringkas["sum"] / ringkas["count"] * 100).round(1)
print(ringkas.to_string())
print()
b = data[data["kelompok"] == "B"]["konversi"]
a = data[data["kelompok"] == "A"]["konversi"]
z, p = proportions_ztest([int(b.sum()), int(a.sum())], [len(b), len(a)])
print(f"z = {z:.2f} | p-value = {p:.3f}") count sum persen
kelompok
A 200 24 12.0
B 200 35 17.5
z = 1.55 | p-value = 0.121Keluaran ini adalah pelajaran terpenting topik, yaitu selisih 5.5 persen poin yang tampak menarik belum cukup untuk disebut nyata pada ukuran sampel 200 per kelompok, karena p-value 0.121 berada di atas ambang 0.05. Keputusan yang sah adalah melanjutkan pengumpulan data sesuai rencana, bukan mengumumkan kemenangan desain B.
Power dan ukuran sampel#
Power adalah peluang pengujian menemukan efek yang benar-benar ada, dan umumnya dipatok sebesar 0.8 sebelum eksperimen. Ketiga besaran, yaitu ukuran sampel per kelompok, besarnya efek yang ingin dideteksi, dan tingkat signifikansi, terikat dalam satu hubungan, sehingga ukuran sampel dapat dihitung dari dua besaran lainnya.
Perhitungan kasarnya menjelaskan hasil di atas. Mendeteksi kenaikan dari 12 persen ke 17.5 persen pada tingkat 0.05 dengan power 0.8 membutuhkan sekitar 800 pengguna per kelompok, dan data latihan ini baru memuat 200, sehingga p-value 0.121 persis seperti yang diperkirakan. Semakin kecil efek yang hendak dideteksi, semakin besar sampel yang dibutuhkan, dan angka itu dihitung sebelum eksperimen dimulai, bukan dilihat kemudian.
Efek yang lebih kecil menuntut sampel yang lebih besar secara kuadratik, dan inilah sebabnya banyak eksperimen nyata memilih menguji perubahan yang diduga berdampak besar, atau menerima durasi yang panjang. Perhitungan resminya tersedia pada pustaka statsmodels melalui kelas power untuk dua proporsi, dan angkanya masuk dokumen desain eksperimen sebelum data pertama.
Jebakan mengintip sekuensial#
Jebakan yang paling sering menimpa uji A/B adalah memeriksa p-value setiap hari dan berhenti begitu angkanya turun di bawah 0.05. Setiap pemeriksaan adalah satu kesempatan menemukan p-value kecil secara kebetulan, dan pemeriksaan yang diulang puluhan kali memperbesar peluang hasil palsu jauh di atas 5 persen yang dijanjikan.
Penangkal desainnya ada tiga tingkat. Paling sederhana adalah memperbaiki durasi sejak awal dan menganalisis sekali setelah selesai, yang menjadi bawaan yang sehat. Tingkat kedua adalah mengurangi jumlah pemeriksaan menjadi beberapa titik yang ditetapkan sebelumnya beserta ambang yang disesuaikan. Tingkat ketiga adalah metode sekuensial formal yang menyesuaikan ambang pada setiap pemeriksaan, dan kajiannya berada di luar lingkup jalur ini.
Perilaku yang sama menyamar dalam bentuk lain, yaitu berhenti saat metrik turun atau menambah durasi hingga hasilnya cocok. Semuanya mengubah eksperimen menjadi pemilihan cerita, dan rencana analisis yang tertulis pada dokumen desain adalah satu-satunya penangkalnya.
Kesalahan umum#
Kesalahan pertama adalah mengumumkan kemenangan dari selisih yang belum diuji. Selisih 5.5 poin pada data latihan terlihat meyakinkan, dan p-value 0.121 menyatakannya belum cukup, sehingga metrik dan pengujian berjalan bersama sejak awal.
Kesalahan kedua adalah menghitung ukuran sampel setelah eksperimen berjalan lambat. Rencana yang berubah di tengah jalan membatalkan janji power, dan durasi yang diperpanjang untuk mengejar signifikansi adalah mengintip sekuensial dalam penyamaran.
Kesalahan ketiga adalah membagi pengguna dengan kebetulan yang tidak terkontrol, misalnya pengguna siang ke kelompok A. Perbedaan jam mengakses mencampur ke perlakuannya, sedangkan alokasi acak yang betul-betul acak menetralkannya.
Ringkasan#
- Uji A/B menetapkan metrik, unit acak, alokasi, dan durasi sebelum data pertama datang, dan acak adalah satu-satunya penjamin perbandingan yang adil.
- Selisih yang tampak menarik belum nyata tanpa pengujian, dan data latihan menghasilkan p-value 0.121 untuk selisih 5.5 poin pada 200 pengguna per kelompok.
- Power dipatok 0.8, dan ukuran sampelnya dihitung dari efek yang hendak dideteksi sebelum eksperimen dimulai.
- Mengintip hasil secara sekuensial memperbesar hasil palsu, dan durasi tetap beserta satu analisis akhir adalah bawaan yang sehat.
Referensi#
- statsmodels.stats.proportion.proportions_ztest — statsmodels documentation — rujukan resmi uji-z dua proporsi yang dipakai topik ini.
- statsmodels.stats.power — statsmodels documentation — rujukan resmi perhitungan power dan ukuran sampel.
- Trustworthy Online Controlled Experiments — Kohavi, Tang & Xu, Cambridge University Press — rujukan praktik eksperimen daring termasuk jebakan sekuensial.