Kalkulačka štatistickej významnosti A/B testov
Skontrolujte, či je váš výsledok A/B testu štatisticky významný. Zadajte návštevníkov a konverzie, aby ste dostali p-hodnotu, z-skóre, interval spoľahlivosti a relatívne zvýšenie.
Kalkulačka štatistickej významnosti A/B testov
Zadajte návštevníkov a konverzie pre každý variant a skontrolujte, či je rozdiel skutočný alebo len šum.
Výsledky
Štatisticky významné
Rozdiel je nepravdepodobný kvôli náhode pri zvolenej úrovni spoľahlivosti.
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.
Dokumentácia
A/B testovanie za jednu minútu
Zmenili ste tlačidlo, nadpis alebo tok platby. Verzia A je tá stará, verzia B je tá nová. B vyzerá lepšie – konvertovala 15% návštevníkov oproti 10% pre A. Ale mohla by tá prehra byť len šťastím, rovnako ako keď je možné pri desiatich hodoch mincou získať sedem lícov?
Táto kalkulačka odpovie presne na to. Zadáte, koľko ľudí videlo každú verziu a koľko z nich konvertovalo, a ona vám povie pravdepodobnosť, že rozdiel, ktorý ste nameráli, je skutočný a nie len náhodný šum. Ak je táto pravdepodobnosť dostatočne vysoká, máte víťaza. Ak nie, pokračujete v teste.
Číslo, na ktoré treba dávať pozor, je p-hodnota: šanca vidieť rozdiel aspoň takto veľký ak by boli obe verzie vlastne identické. Malá p-hodnota (napríklad pod 0,05) znamená "toto by sa vzácne stalo šťastím, takže rozdiel je pravdepodobne skutočný."
Ako to používať
- Návštevníci – koľko jedinečných ľudí bolo priradených ku každej verzii.
- Konverzie – koľko z nich urobilo vec, na ktorej vám záleží (kúpilo, podpísalo sa, kliklo).
- Úroveň spoľahlivosti – ako si chcete byť istí predtým, ako deklarujete víťaza. 95% je priemyselný štandard.
- Hypotéza – dvojstranný pýta „je B iný ako A?" (bezpečnejší, predvolený); jednostranný pýta iba „je B lepší ako A?" (citlivejší, ale musíte sa rozhodnúť smerom predtým, ako spustíte test).
Výsledok sa aktualizuje živý a vstupy sú uložené v URL stránky, takže môžete výsledok zabudovať alebo zdieľať. Obnoviť vymaže formulár; Načítať vzorové údaje vyplní spracovaný príklad.
Spracovaný príklad
| Návštevníci | Konverzie | Frekvencia | |
|---|---|---|---|
| A (kontrola) | 1 000 | 100 | 10,0% |
| B (variácia) | 1 000 | 150 | 15,0% |
To je zvýšenie o 5 percentných bodov absolútne a +50% relatívne zvýšenie. Kalkulačka vráti p-hodnotu približne 0,0007 – pod 0,05 – takže pri 95% spoľahlivosti je výsledok štatisticky významný. Zhruba povedané, ak by boli obe verzie naozaj identické, videli by ste rozdiel takej veľkosti menej ako raz za tisíc testov.
Matematika (test dvoch proporcií z)
Pod kapotou je to štandardný test dvoch proporcií z, rovnaký test vyučovaný v úvodných kurzoch štatistiky a používaný bežnými nástrojmi A/B.
-
Frekvencia konverzie každej skupiny:
kde je konverzie a je návštevníci.
-
Zjednotená frekvencia, za predpokladu (pre nulovú hypotézu), že obe skupiny zdieľajú jednu skutočnú frekvenciu:
-
Štandardná chyba rozdielu:
-
Z-skóre – koľko štandardných chýb od seba sú dve frekvencie:
-
P-hodnota pochádza zo štandardného normálneho rozdelenia . Dvojstranný: . Jednostranný: .
-
Významný keď , kde (takže 0,05 pri 95%).
Kalkulačka tiež hlási interval spoľahlivosti pre rozdiel, vypočítaný s nezjednotenú štandardnú chybou : rozumný rozsah pre skutočnú medzeru. Ak ten interval vylučuje 0, výsledok je významný.
Pri 95% spoľahlivosti, z bez ±1,96 (tieňované chvosty, 5% plochy) sa počíta ako významný.
Čítanie výsledku čestne
- Štatistická významnosť nie je obchodná významnosť. Zvýšenie o 0,1% môže byť štatisticky skutočné, ale nemusí stáť za to ho zaviesť.
- Nepozerajte a nezastavujte sa skoro. Kontrola p-hodnoty každý deň a zastavenie v momente, keď klesne pod 0,05, zvyšuje vašu mieru falošne pozitívnych. Rozhodnite sa na veľkosť vzorky vopred a nechajte test skončiť.
- Sledujte pravidlo palca pre veľkosť vzorky. Normálna aproximácia je spoľahlivá, keď má každá skupiny aspoň ~10 konverzií a ~10 nekonverzií. S malými číslami konečný výsledok považujte za orientačný iba.
- Spoľahlivosť ≠ pravdepodobnosť B je lepší. Úroveň spoľahlivosti 95% znamená postup je chybný maximálne 5% času v dlhodobom horizonte – je to frekventistické tvrdenie, nie "95% šanca na výhru B."
- Jeden test, jedna metrika. Testovanie mnohých metrík alebo variantov naraz zvyšuje šancu na náhodu; korigovať to (napr. Bonferroni) alebo predregistrujte jednu metriku, ktorá rozhoduje test.
Vypočítajte si to sami
Každý útržok počíta dvoustranný p-hodnotu pre spracovaný príklad vyššie.
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
3Časté otázky
Akú veľkosť vzorky potrebujem? Dosť, aby zmysluplné zvýšenie bolo detekovateľné. Ako minimálny cieľ, snažte sa aspoň pár stoviek konverzií na variant; použite špecializovanú kalkulačku veľkosti vzorky s vaším základnom a najmenším zvýšením, ktoré stojí za to zistiť.
Dvojstranný alebo jednostranný? Použite dvojstranný, pokiaľ nemáte pevný, vopred záväzný dôvod starostlivosti iba o zlepšenie. Jednostranný zdvojnásobuje vašu citlivosť, ale zakazuje reagovať na to, že B je horšie.
Prečo kalkulačka ukazuje interval spoľahlivosti? Ukazuje rozumný rozsah skutočného rozdielu, nie len áno/nie verdikt. Širší interval, ktorý prekročí 0, znamená "ešte nie je dosť údajov."
Je toto bayesovské? Nie – je to frekventistický z-test, najčastejšie vyučovaná a používaná metóda. Bayesovské nástroje A/B hlášajú "pravdepodobnosť B bije A" namiesto p-hodnoty; obidve sú platné, len odpovedajú trochu iným otázkam.