Kalkulator statističke značajnosti A/B testa
Provjerite je li rezultat vašeg A/B testa statistički značajan. Unesite posjetitelje i konverzije kako biste dobili p-vrijednost, z-rezultat, interval pouzdanosti i relativni porast.
Kalkulator statističke značajnosti A/B testa
Unesite posjetitelje i konverzije za svaku varijantu kako biste provjerili je li razlika stvarna ili samo buka.
Rezultati
Statistički značajno
Razlika je malo vjerovatno da je zbog slučaja na vašoj odabranoj razini pouzdanosti.
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.
Dokumentacija
A/B testiranje u jednoj minuti
Promijenili ste gumb, naslov ili tok plaćanja. Verzija A je stara, verzija B je nova. B izgleda bolje — konvertirala je 15% posjetitelja nasuprot 10% za A. Ali bi taj razmak mogao biti samo sreća, kao što bacanje novčića deset puta može dati sedam glava?
Ovaj kalkulator odgovara upravo na to pitanje. Unosite koliko je ljudi vidjelo svaku verziju i koliko je konvertiralo, te vam pokazuje vjerojatnost da je razlika koju ste izmjerili stvarna umjesto slučajnog šuma. Ako je ta vjerojatnost dovoljno visoka, imate pobjednika. Ako nije, nastavite test.
Broj na koji trebate paziti je p-vrijednost: vjerojatnost da vidite razmak najmanje ovakav ako su dvije verzije zapravo identične. Mala p-vrijednost (recimo, ispod 0,05) znači "ovo bi se rijetko dogodilo slučajno, tako da je razlika vjerojatno stvarna."
Kako ga koristiti
- Posjetitelji — koliko jedinstvenih ljudi je vidjelo svaku verziju.
- Konverzije — koliko ih je učinilo ono što vas zanima (kupilo, prijavilo se, kliknulo).
- Razina pouzdanosti — koliko ste sigurni prije nego što proglasите pobjednika. 95% je industrijski standard.
- Hipoteza — dvostrana pita "je li B drugačit od A?" (sigurnije, zadana vrijednost); jednostrana pita samo "je li B bolje od A?" (osjetljivije, ali morate odlučiti smjer prije pokretanja testa).
Rezultat se ažurira u stvarnom vremenu i unosi se spremaju u URL stranice, tako da možete oblikovati ili podijeliti rezultat. Resetiraj briše obrazac; Učitaj primjer podataka popunjava radni primjer.
Radni primjer
| Posjetitelji | Konverzije | Stopa | |
|---|---|---|---|
| A (kontrola) | 1.000 | 100 | 10,0% |
| B (varijacija) | 1.000 | 150 | 15,0% |
To je porast od 5 postotnih poena apsolutan i +50% relativni porast. Kalkulator vraća p-vrijednost od oko 0,0007 — ispod 0,05 — tako da je rezultat na 95% pouzdanosti statistički značajan. Grubo, ako su dvije verzije bile zaista identične, vidjeli biste razmak ovakav manje od jednom u tisuću testova.
Matematika (test dva proporciona z)
Ispod haube ovo je standardni test dva proporciona z, isti test koji se podučava u uvodnoj statistici i koristi ga glavne A/B alate.
-
Stopa konverzije svake grupe:
gdje je konverzije i posjetitelji.
-
Stavljena stopa, pretpostavljajući (za nultu hipotezu) obje grupe dijele jednu stvarnu stopu:
-
Standardna greška razlike:
-
Z-rezultat — koliko standardnih grešaka razjedinjenih dvije stope:
-
P-vrijednost dolazi iz standardne normalne distribucije . Dvostrana: . Jednostrana: .
-
Značajna kada je , gdje je (dakle 0,05 na 95%).
Kalkulator također prikazuje interval pouzdanosti za razliku, izračunat s nestavljenom standardnom greškom : vjerojatni raspon za stvarnu jaz. Ako taj interval isključuje 0, rezultat je značajan.
Na 95% pouzdanosti, z izvan ±1,96 (osjenčane repove, 5% područja) računa se kao značajno.
Čitanje rezultata iskreno
- Statistička značajnost nije poslovna značajnost. Porast od 0,1% može biti statistički stvaran, ali ne vrijedi otpremanja.
- Ne pogledajte i ne staneteearly. Provjera p-vrijednosti svaki dan i zaustavljanje čim padne ispod 0,05 povećava vašu stopu lažno-pozitivnih. Odlučite veličinu uzorka unaprijed i pustite test da završi.
- Pazite na pravilo veličine uzorka. Normalna aproksimacija je pouzdana kada svaka grupa ima najmanje ~10 konverzija i ~10 ne-konverzija. S malim brojevima, rezultat tretirati samo kao smjerni.
- Pouzdanost ≠ vjerojatnost da je B bolje. Razina pouzdanosti od 95% znači da je postupak kriv maksimalno 5% vremena u dugom roku — to je izjava čestotnjaka, ne "95% šansi da B pobijedi."
- Jedan test, jedna metrika. Testiranje mnogih metrika ili varijanti odjednom množi šansu za fluke; ispraviti za to (npr. Bonferroni) ili preunaprijed registrirati jednu metriku koja odlučuje test.
Izračunajte ga sami
Svaki isječak izračunava p-vrijednost na dvije strane za radni primjer gore.
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
3FAQ
Koju veličinu uzorka trebam? Dovoljno da bi se detektirala smislena porast. Kao minimum, teži najmanje nekoliko stotina konverzija po varijanti; koristiti poseban kalkulator veličine uzorka sa vašom baznom stopom i najmanjom detektabilnom porastom.
Dvostrana ili jednostrana? Koristite dvostrana osim ako imate čvrst, unaprijed predan razlog da brinete samo o poboljšanju. Jednostrana dvostruko povećava vašu osjetljivost, ali zabranjuje reagiranje na to što B bude gore.
Zašto kalkulator prikazuje interval pouzdanosti? Pokazuje vjerojatni raspon stvarne razlike, ne samo da/ne verdikt. Široki interval koji prelazi 0 znači "nedovoljno podataka još."
Je li ovo Bayesovo? Ne — to je čestotnjakov z-test, najčešće podučavana i korištena metoda. Bayesovi A/B alati izvještavaju "vjerojatnost da B porazi A" umjesto p-vrijednosti; oboje su valjani, odgovaraju malo drugačitim pitanjima.