Kalkulator A/B test statistične značilnosti
Preverite, ali je rezultat vašega A/B testa statistično značilen. Vnesite obiskovalce in konverzije, da dobite p-vrednost, z-rezultat, interval zaupanja in relativno dvigo.
Kalkulator A/B test statistične značilnosti
Vnesite obiskovalce in konverzije za vsako različico, da preverite, ali je razlika resnična ali le šum.
Rezultati
Statistično značilno
Razlika je pri vašem izbiranem nivoju zaupanja malo verjetna, da je naključna.
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 v eni minuti
Spremenili ste gumb, naslov ali tok za plačilo. Različica A je stara, različica B je nova. B izgleda bolje — konvertirala je 15 % obiskovalcev proti 10 % za A. Vendar bi ta razlika lahko bila le sreča, enako kot lahko metanje kovanca desetkrat da sedem repov?
Ta kalkulator odgovori točno na to. Vnesete, koliko ljudi je videlo vsako različico in koliko jih je konvertiralo, in vam pove verjetnost, da je razlika, ki ste jo izmerili, resnična namesto naključnega šuma. Če je ta verjetnost dovolj visoka, imate zmagovalca. Če ne, nadaljujete s testom.
Edino število, ki ga morate spremljati, je p-vrednost: verjetnost, da vidite razliko vsaj tako veliko če bi bili pravzaprav obe različici enaki. Majhna p-vrednost (npr. pod 0,05) pomeni »to bi se redko zgodilo po sreči, zato je razlika verjetno resnična«.
Kako ga uporabljati
- Obiskovalci — koliko edinstvenega ljudi je videlo vsako različico.
- Konverzije — koliko jih je naredilo stvar, ki te zanima (kupilo, se prijavilo, kliknilo).
- Nivo zaupanja — kako prepričan se želiš biti, preden deklariraš zmagovalca. 95 % je industrijski standard.
- Hipoteza — dvostransko sprašuje »je B drugačna od A?« (varnejše, privzeto); enostransko sprašuje samo »je B boljša od A?« (bolj občutljivo, vendar se moraš odločiti za smer pred izvedbo testa).
Rezultat se posodablja v živo in vhodi se shranjujejo v URL strani, zato lahko rezultat označite z zaznamkom ali ga delite. Ponastavka počisti obrazec; Naloži vzorčne podatke izpolni primer.
Delujoči primer
| Obiskovalci | Konverzije | Stopnja | |
|---|---|---|---|
| A (nadzor) | 1.000 | 100 | 10,0 % |
| B (različica) | 1.000 | 150 | 15,0 % |
To je dvotočkovna absolutna dviga in +50 % relativna dviga. Kalkulator vrne p-vrednost približno 0,0007 — pod 0,05 — zato je rezultat pri 95-odstotni zaupanju statistično značilen. Grobo rečeno, če bi bili obe različici resnično enaki, bi videli tako veliko razliko manj kot enkrat v tisoč testih.
Matematika (dvoproporcijski z-test)
Prikrito je to standardni dvoproporcijski z-test, isti test, ki se poučuje v uvodnih statistikah in ga uporabljajo mainstream A/B orodja.
-
Konverzijsko stopnjo vsake skupine:
kjer je konverzije in obiskovalci.
-
Kombinirana stopnja, ob predpostavki (za ničelno hipotezo), da obe skupini delita eno resnično stopnjo:
-
Standardna napaka razlike:
-
Z-rezultat — koliko standardnih napak narazen sta obe stopnji:
-
P-vrednost prihaja iz standardne normalne porazdelitve . Dvostransko: . Enostransko: .
-
Značilna ko je , kjer je (torej 0,05 pri 95 %).
Kalkulator tudi poroča interval zaupanja za razliko, izračunan s nezdruženo standardno napako : smiselni razpon za pravo vrzel. Če ta interval izključuje 0, je rezultat značilen.
Pri 95-odstotni zaupanju se z preko ±1,96 (senčeni repi, 5 % površine) šteje za značilen.
Iskreno preberite rezultat
- Statistična značilnost ni poslovna značilnost. Dviga 0,1 % je lahko statistično realna, vendar ne vredno pošiljanja.
- Ne vohunite in se ne ustavljajte zgodaj. Preverjanje p-vrednosti vsak dan in ustavljanje v trenutku, ko pade pod 0,05, nadufla vašo stopnjo lažno pozitivnih. Vnaprej odločite velikost vzorca in pustite, da se test zaključi.
- Upoštevajte pravilo palca za velikost vzorca. Normalna aproximacija je zanesljiva, ko ima vsaka skupina najmanj ~10 konverzij in ~10 ne-konverzij. S tiny številkami obravnavajte rezultat samo kot smer.
- Zaupanje ≠ verjetnost, da je B boljša. Nivo zaupanja 95 % pomeni, da je postopek v dolgoročnem teku napačen največ 5 % časa — to je frekventistična izjava, ne »95 % verjetnost, da B zmaguje«.
- En test, ena metrika. Testiranje številnih metrik ali različic hkrati pomnoži možnost naključja; popravite to (npr. Bonferroni) ali vnaprej registrirajte posamezno metriko, ki odloči test.
Izračunaj sam
Vsak fragment izračuna dvostransko p-vrednost za delujoči primer zgoraj.
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
3Pogosta vprašanja
Kolikšna velikost vzorca potrebujem? Dovolj, da bi bila smiselna dviga zaznana. Kot nižja meja ciljajte vsaj nekaj sto konverzij na varianto; uporabite dedicirani kalkulator za velikost vzorca z vašo bazično stopnjo in najmanjšo dvigo vredne zaznave.
Dvostransko ali enostransko? Uporabite dvostransko, razen če imate trdno, vnaprej zavezano razlogo, da vas zanima samo izboljšanje. Enostransko podvoji vašo občutljivost, vendar prepoveduje reagiranje na B, ki je slabši.
Zakaj kalkulator prikazuje interval zaupanja? Prikazuje smiselni razpon prave razlike, ne samo da/ne verdikt. Širok interval, ki prečka 0, pomeni »še ni dovolj podatkov«.
Je to Bayesovska? Ne — to je frekventistični z-test, najbolj poučena in uporabljena metoda. Bayesovska A/B orodja sporočajo »verjetnost B prekaša A« namesto p-vrednosti; obe sta veljavni, odgovarjata malo drugačna vprašanja.