A/B Test Anlamlılık Hesaplayıcısı
A/B test sonucunuzun istatistiksel olarak anlamlı olup olmadığını kontrol edin. Ziyaretçileri ve dönüşümleri girin, p-değeri, z-skoru, güven aralığı ve göreceli kaldırmayı alın.
A/B Test Anlamlılık Hesaplayıcısı
Her varyant için ziyaretçileri ve dönüşümleri girin, farkın gerçek mi yoksa sadece gürültü mü olduğunu kontrol edin.
Sonuçlar
İstatistiksel Olarak Anlamlı
Farkın seçilen güven seviyesinde şansa bağlı olması olası değildir.
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.
Belgeler
A/B testi bir dakikada
Bir düğmeyi, bir başlığı veya bir ödeme akışını değiştirdiniz. Sürüm A eski, sürüm B yenidir. B daha iyi görünüyor — ziyaretçilerin %15'i dönüştürülürken A için %10. Ancak bu boşluk sadece şans olabilir mi, tıpkı bir parayı on kez atarken yedi yazı gelme ihtimali gibi?
Bu hesaplayıcı tam olarak bunu yanıtlar. Her sürümü kaç kişinin gördüğünü ve kaçının dönüştüğünü girersiniz ve ölçtüğünüz farkın gerçek mi yoksa rastgele gürültü mü olma olasılığını söyler. Bu olasılık yeterince yüksekse, bir kazanan var. Değilse, testi çalıştırmaya devam edersiniz.
İzlenecek bir sayı p-değeridir: iki sürüm aslında aynı olsaydı bu kadar büyük bir boşluk görme şansı. Küçük bir p-değeri (örneğin 0,05'in altında) "bu nadiren şans eseri olur, bu nedenle fark muhtemelen gerçektir" anlamına gelir.
Nasıl kullanılır
- Ziyaretçiler — her sürümü kaç benzersiz kişi görüş.
- Dönüşümler — bunlardan kaçı önem verdiğiniz şeyi yaptı (satın aldı, kaydoldu, tıkladı).
- Güven seviyesi — bir kazanan çağırmadan önce ne kadar emin olmak istiyorsunuz. %95 endüstri standardıdır.
- Hipotez — iki yönlü "B, A'dan farklı mı?" sorusunu sorar (daha güvenli, varsayılan); tek yönlü sadece "B, A'dan daha iyi mi?" sorusunu sorar (daha hassas, ancak testi çalıştırmadan önce yönü belirlemelisiniz).
Sonuç canlı güncellenir ve girişler sayfa URL'sinde depolanır, bu nedenle bir sonucu yer işareti koyabilir veya paylaşabilirsiniz. Sıfırla formu temizler; Örnek verileri yükle çalışılmış bir örneği doldurur.
Çalışılmış bir örnek
| Ziyaretçiler | Dönüşümler | Oran | |
|---|---|---|---|
| A (kontrol) | 1.000 | 100 | %10,0 |
| B (varyasyon) | 1.000 | 150 | %15,0 |
Bu %5 puan mutlak artış ve %50 göreceli artıştır. Hesaplayıcı yaklaşık 0,0007 p-değeri döndürür — 0,05'in altında — bu nedenle %95 güvenle sonuç istatistiksel olarak anlamlıdır. Kabaca, iki sürüm tamamen aynı olsaydı, bin testten birinde bu kadar büyük bir boşluk göreceksiniz.
Matematik (iki-oran z-testi)
Arka planda bu standart iki-oran z-testi, tanıtıcı istatistiklerde öğretilen ve ana A/B araçları tarafından kullanılan aynı testtir.
-
Her grubun dönüşüm oranı:
burada dönüşümler ve ziyaretçilerdir.
-
Birleştirilmiş oran, her iki grubun bir gerçek orandan paylaştığı varsayıldığında (sıfır hipotezi için):
-
Farkın standart hatası:
-
Z-skoru — iki oran kaç standart hata kadar uzak:
-
P-değeri standart normal dağılımdan gelir. İki yönlü: . Tek yönlü: .
-
Anlamlı şu durumlarda , burada (%95'te 0,05).
Hesaplayıcı ayrıca, birleştirilmemiş standart hata ile hesaplanan fark için bir güven aralığı da rapor eder: gerçek boşluk için makul aralık. Bu aralık 0'ı hariç tutarsa, sonuç anlamlıdır.
%95 güven seviyesinde, ±1.96'nın ötesindeki bir z (gölgeli kuyruklar, alanın %5'i) anlamlı sayılır.
Sonucu dürüstçe okuyun
- İstatistiksel anlamlılık, iş anlamı değildir. %0,1 kaldırma istatistiksel olarak gerçek olabilir ancak sevk etmeye değer olmayabilir.
- Erken gözetlemeyin ve durmayın. P-değerini her gün kontrol etmek ve 0,05'in altına düştüğü anda durma, yanlış-pozitif oranınızı şişirir. Örnek boyutunu önceden belirleyin ve testin bitmesine izin verin.
- Örnek boyutu hakkındaki kuralı izleyin. Normal yaklaşım, her grup en az ~10 dönüşüme ve ~10 dönüşüm olmayan sahip olduğunda güvenilirdir. Küçük sayılarla, sonucu yalnızca yönlü olarak ele alın.
- Güven ≠ B'nin daha iyi olma olasılığı. %95 güven seviyesi prosedürün uzun vadede zamanın en fazla %5'inde yanlış olduğu anlamına gelir — bu sıklıkçı bir ifadedir, "B kazanma ihtimali %95" değildir.
- Bir test, bir metrik. Aynı anda birçok metrik veya varyant test etme, tesadüfi ihtimalini çoğaltır; düzeltmek (örn. Bonferroni) veya testi belirleyen tek metriği ön kayıt edin.
Kendiniz hesaplayın
Her snippet yukarıdaki çalışılmış örnek için iki yönlü p-değerini hesaplar.
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 = kontrol ziyaretçileri, dönüşümler ; A2,B2 = varyasyon ziyaretçileri, dönüşümler
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
3SSS
Ne kadar örnek boyuta ihtiyacım var? Anlamlı bir kaldırmanın tespit edilebileceği kadar. Bir taban olarak, varyant başına en az birkaç yüz dönüşümü hedefleyin; temel oranınız ve tespit edilmeye değer en küçük kaldırma ile özel bir örnek boyutu hesaplayıcı kullanın.
İki yönlü mi yoksa tek yönlü mi? Sadece iyileştirmeyle ilgilenmek için sağlam, önceden kararlı bir nedeniniz yoksa iki yönlü kullanın. Tek yönlü, hassasiyetinizi iki katına çıkarır ancak B'nin daha kötü olmasına tepki vermeyi yasaklar.
Hesaplayıcı neden bir güven aralığı gösteriyor? Sadece evet/hayır kararı değil, gerçek farkın makul aralığını gösterir. 0'ı aşan geniş bir aralık "henüz yeterli veri yok" anlamına gelir.
Bu Bayesci mi? Hayır — en yaygın olarak öğretilen ve kullanılan yöntem olan sıklıkçı z-testi. Bayesci A/B araçları p-değeri yerine "B, A'yı geçme olasılığı" rapor eder; her ikisi de geçerlidir, biraz farklı soruları yanıtlarlar.