Kalkulator Signifikansi Uji A/B
Periksa apakah hasil uji A/B Anda signifikan secara statistik. Masukkan pengunjung dan konversi untuk mendapatkan p-value, skor-z, interval kepercayaan, dan kenaikan relatif.
Kalkulator Signifikansi Uji A/B
Masukkan pengunjung dan konversi untuk setiap varian untuk memeriksa apakah perbedaannya nyata atau hanya kebisingan.
Hasil
Signifikan Secara Statistik
Perbedaannya tidak mungkin karena kebetulan pada tingkat kepercayaan pilihan Anda.
Chance this gap is just luck โ lower is stronger.
How far apart the two rates are, in standard errors.
The likely range for the true difference.
Dokumentasi
Pengujian A/B dalam satu menit
Anda mengubah tombol, judul, atau alur checkout. Versi A adalah yang lama, versi B adalah yang baru. B terlihat lebih baik โ dikonversi 15% pengunjung versus 10% untuk A. Tetapi apakah selisih itu hanya keberuntungan, seperti melempar koin sepuluh kali bisa menghasilkan tujuh kepala?
Kalkulator ini menjawab tepatnya itu. Anda memasukkan berapa banyak orang melihat setiap versi dan berapa banyak yang dikonversi, dan ini memberi tahu Anda probabilitas bahwa perbedaan yang Anda ukur adalah nyata bukan kebisingan acak. Jika probabilitas itu cukup tinggi, Anda memiliki pemenang. Jika tidak, Anda tetap menjalankan tes.
Satu-satunya angka yang perlu diperhatikan adalah p-value: kemungkinan melihat selisih setidaknya sebesar ini jika kedua versi benar-benar identik. P-value kecil (katakanlah, di bawah 0,05) berarti "ini jarang terjadi karena keberuntungan, jadi perbedaannya mungkin nyata."
Cara menggunakannya
- Pengunjung โ berapa banyak orang unik yang ditampilkan ke setiap versi.
- Konversi โ berapa banyak dari mereka yang melakukan hal yang Anda pedulikan (membeli, mendaftar, mengklik).
- Tingkat kepercayaan โ seberapa yakin Anda ingin sebelum memanggil pemenang. 95% adalah standar industri.
- Hipotesis โ dua sisi menanyakan "apakah B berbeda dari A?" (lebih aman, standar); satu sisi hanya menanyakan "apakah B lebih baik dari A?" (lebih sensitif, tetapi Anda harus memutuskan arahnya sebelum menjalankan tes).
Hasilnya diperbarui secara langsung dan input disimpan di URL halaman, sehingga Anda dapat menandai atau membagikan hasil. Reset menghapus formulir; Muat data sampel mengisinya dengan contoh yang sudah dikerjakan.
Contoh yang sudah dikerjakan
| Pengunjung | Konversi | Tarif | |
|---|---|---|---|
| A (kontrol) | 1.000 | 100 | 10,0% |
| B (variasi) | 1.000 | 150 | 15,0% |
Itu adalah kenaikan absolut 5 poin persentase dan kenaikan relatif +50%. Kalkulator mengembalikan p-value sekitar 0,0007 โ di bawah 0,05 โ jadi dengan kepercayaan 95% hasilnya signifikan secara statistik. Kira-kira, jika kedua versi benar-benar identik, Anda akan melihat selisih sekecil ini kurang dari sekali dalam seribu tes.
Matematika (uji z dua proporsi)
Di bawah kap ini adalah uji z dua proporsi standar, tes yang sama yang diajarkan dalam statistik pengantar dan digunakan oleh alat A/B arus utama.
-
Tingkat konversi setiap kelompok:
di mana adalah konversi dan adalah pengunjung.
-
Tingkat gabungan, dengan asumsi (untuk hipotesis nol) kedua kelompok berbagi satu tingkat yang benar:
-
Kesalahan standar perbedaannya:
-
Skor z โ berapa banyak kesalahan standar terpisah dua tarif:
-
p-value berasal dari distribusi normal standar . Dua sisi: . Satu sisi: .
-
Signifikan ketika , di mana (jadi 0,05 pada 95%).
Kalkulator juga melaporkan interval kepercayaan untuk perbedaannya, dihitung dengan kesalahan standar tidak gabungan : jangkauan yang masuk akal untuk kesenjangan sejati. Jika interval itu mengecualikan 0, hasilnya signifikan.
Pada 95% kepercayaan, z di luar ยฑ1,96 (ekor yang diarsir, 5% dari area) dihitung sebagai signifikan.
Membaca hasilnya dengan jujur
- Signifikansi statistik bukanlah signifikansi bisnis. Kenaikan 0,1% bisa benar secara statistik namun tidak layak dikirim.
- Jangan mengintip dan berhenti lebih awal. Memeriksa p-value setiap hari dan menghentikan tes saat jatuh di bawah 0,05 meningkatkan tingkat positif palsu Anda. Tetapkan ukuran sampel di depan dan biarkan tes selesai.
- Tonton aturan praktis ukuran sampel. Perkiraan normal dapat diandalkan ketika setiap kelompok memiliki setidaknya ~10 konversi dan ~10 non-konversi. Dengan angka kecil, anggap hasilnya hanya direktif.
- Kepercayaan โ probabilitas B lebih baik. Tingkat kepercayaan 95% berarti prosedur salah paling banyak 5% dari waktu dalam jangka panjang โ itu adalah pernyataan frequentist, bukan "95% kesempatan B menang."
- Satu tes, satu metrik. Menguji banyak metrik atau varian sekaligus menggandakan kesempatan kebetulan; perbaiki (misalnya Bonferroni) atau daftarkan sebelumnya metrik tunggal yang memutuskan tes.
Hitungnya sendiri
Setiap cuplikan menghitung p-value dua sisi untuk contoh yang sudah dikerjakan di atas.
1=2*(1-NORM.S.DIST(
2 (B2/A2 - B1/A1) /
3 SQRT(((B1+B2)/(A1+A2))*(1-(B1+B2)/(A1+A2))*(1/A1+1/A2)),
4 TRUE))
5' A1,B1 = control visitors, conversions ; A2,B2 = variation visitors, conversions
61from math import sqrt, erf
2
3def ab_pvalue(n1, x1, n2, x2, two_sided=True):
4 p1, p2 = x1 / n1, x2 / n2
5 p = (x1 + x2) / (n1 + n2)
6 se = sqrt(p * (1 - p) * (1 / n1 + 1 / n2))
7 z = (p2 - p1) / se
8 phi = lambda v: 0.5 * (1 + erf(v / sqrt(2))) # standard normal CDF
9 return 2 * (1 - phi(abs(z))) if two_sided else 1 - phi(z)
10
11print(ab_pvalue(1000, 100, 1000, 150)) # ~0.00072
121// erf via Abramowitz & Stegun 7.1.26
2function erf(x) {
3 const s = x < 0 ? -1 : 1;
4 x = Math.abs(x);
5 const t = 1 / (1 + 0.3275911 * x);
6 const y = 1 - ((((1.061405429 * t - 1.453152027) * t + 1.421413741) * t
7 - 0.284496736) * t + 0.254829592) * t * Math.exp(-x * x);
8 return s * y;
9}
10const phi = z => 0.5 * (1 + erf(z / Math.SQRT2));
11
12function abPValue(n1, x1, n2, x2, twoSided = true) {
13 const p1 = x1 / n1, p2 = x2 / n2, p = (x1 + x2) / (n1 + n2);
14 const se = Math.sqrt(p * (1 - p) * (1 / n1 + 1 / n2));
15 const z = (p2 - p1) / se;
16 return twoSided ? 2 * (1 - phi(Math.abs(z))) : 1 - phi(z);
17}
18console.log(abPValue(1000, 100, 1000, 150)); // ~0.00072
191public static double abPValue(int n1, int x1, int n2, int x2) {
2 double p1 = (double) x1 / n1, p2 = (double) x2 / n2;
3 double p = (double) (x1 + x2) / (n1 + n2);
4 double se = Math.sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2));
5 double z = (p2 - p1) / se;
6 // Phi via the error function; erf approximated (A&S 7.1.26) separately.
7 double phi = 0.5 * (1 + erf(Math.abs(z) / Math.sqrt(2)));
8 return 2 * (1 - phi);
9}
101static double AbPValue(int n1, int x1, int n2, int x2) {
2 double p1 = (double)x1 / n1, p2 = (double)x2 / n2;
3 double p = (double)(x1 + x2) / (n1 + n2);
4 double se = Math.Sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2));
5 double z = (p2 - p1) / se;
6 double phi = 0.5 * (1 + Erf(Math.Abs(z) / Math.Sqrt(2)));
7 return 2 * (1 - phi);
8}
91#include <cmath>
2
3double ab_pvalue(int n1, int x1, int n2, int x2) {
4 double p1 = (double)x1 / n1, p2 = (double)x2 / n2;
5 double p = (double)(x1 + x2) / (n1 + n2);
6 double se = std::sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2));
7 double z = (p2 - p1) / se;
8 double phi = 0.5 * (1 + std::erf(std::fabs(z) / std::sqrt(2.0)));
9 return 2 * (1 - phi);
10}
111import "math"
2
3func abPValue(n1, x1, n2, x2 float64) float64 {
4 p1, p2 := x1/n1, x2/n2
5 p := (x1 + x2) / (n1 + n2)
6 se := math.Sqrt(p * (1 - p) * (1/n1 + 1/n2))
7 z := (p2 - p1) / se
8 phi := 0.5 * (1 + math.Erf(math.Abs(z)/math.Sqrt2))
9 return 2 * (1 - phi)
10}
111// erf from the `libm` crate; std has no erf.
2fn ab_pvalue(n1: f64, x1: f64, n2: f64, x2: f64) -> f64 {
3 let (p1, p2) = (x1 / n1, x2 / n2);
4 let p = (x1 + x2) / (n1 + n2);
5 let se = (p * (1.0 - p) * (1.0 / n1 + 1.0 / n2)).sqrt();
6 let z = (p2 - p1) / se;
7 let phi = 0.5 * (1.0 + libm::erf(z.abs() / 2f64.sqrt()));
8 2.0 * (1.0 - phi)
9}
101function ab_pvalue($n1, $x1, $n2, $x2) {
2 $p1 = $x1 / $n1; $p2 = $x2 / $n2;
3 $p = ($x1 + $x2) / ($n1 + $n2);
4 $se = sqrt($p * (1 - $p) * (1 / $n1 + 1 / $n2));
5 $z = ($p2 - $p1) / $se;
6 $phi = 0.5 * (1 + erf(abs($z) / sqrt(2)));
7 return 2 * (1 - $phi);
8}
91def ab_pvalue(n1, x1, n2, x2)
2 p1, p2 = x1.to_f / n1, x2.to_f / n2
3 p = (x1 + x2).to_f / (n1 + n2)
4 se = Math.sqrt(p * (1 - p) * (1.0 / n1 + 1.0 / n2))
5 z = (p2 - p1) / se
6 phi = 0.5 * (1 + Math.erf(z.abs / Math.sqrt(2)))
7 2 * (1 - phi)
8end
91# R has this built in: prop.test does the whole thing.
2prop.test(c(100, 150), c(1000, 1000), correct = FALSE)$p.value # ~0.00072
3Pertanyaan yang Sering Diajukan
Ukuran sampel apa yang saya butuhkan? Cukup sehingga kenaikan bermakna dapat dideteksi. Sebagai dasar, targetkan setidaknya beberapa ratus konversi per varian; gunakan kalkulator ukuran sampel khusus dengan tingkat dasar Anda dan kenaikan terkecil yang layak dideteksi.
Dua sisi atau satu sisi? Gunakan dua sisi kecuali Anda memiliki alasan yang kuat dan berkomitmen sebelumnya untuk hanya peduli dengan perbaikan. Satu sisi menggandakan sensitivitas Anda tetapi melarang bereaksi terhadap B yang lebih buruk.
Mengapa kalkulator menunjukkan interval kepercayaan? Ini menunjukkan jangkauan yang masuk akal dari perbedaan sejati, bukan hanya verdikat ya/tidak. Interval lebar yang melintasi 0 berarti "belum cukup data."
Apakah ini Bayesian? Tidak โ itu adalah uji z frequentist, metode yang paling banyak diajarkan dan digunakan. Alat A/B Bayesian melaporkan "probabilitas B mengalahkan A" bukan p-value; keduanya valid, mereka menjawab pertanyaan yang sedikit berbeda.