Kalkulačka statistické významnosti A/B testu
Zkontrolujte, zda je výsledek vašeho A/B testu statisticky významný. Zadejte návštěvníky a konverze, abyste získali p-value, z-skóre, interval spolehlivosti a relativní nárůst.
Kalkulačka statistické významnosti A/B testu
Zadejte návštěvníky a konverze pro každou variantu, abyste zkontrolovali, zda je rozdíl skutečný nebo jen šum.
Výsledky
Statisticky významné
Rozdíl je nepravděpodobný, že by byl způsoben náhodou ve vaší zvolené úrovni důvěry.
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.
Dokumentace
A/B testování v jedné minutě
Změnili jste tlačítko, nadpis nebo checkout flow. Verze A je stará, verze B je nová. B vypadá lépe — konvertovala 15% návštěvníků oproti 10% pro A. Ale mohl by být ten rozdíl jen náhoda, stejně jako když si házíte mincí desetkrát a padne vám sedmkrát panna?
Tato kalkulačka odpovídá přesně na to. Zadáte, kolik lidí vidělo každou verzi a kolik jich konvertovalo, a ona vám řekne, jaká je pravděpodobnost, že rozdíl, který jste naměřili, je skutečný a ne náhodný šum. Pokud je tato pravděpodobnost dostatečně vysoká, máte vítěze. Pokud ne, necháte test běžet dál.
Jediné číslo, na které se musíte soustředit, je p-value: šance na rozdíl alespoň takto velký, pokud by byly obě verze vlastně identické. Malá p-value (řekněme níže 0,05) znamená "to by se náhodou zřídka stalo, takže rozdíl je pravděpodobně skutečný."
Jak to používat
- Návštěvníci — kolik jedinečných lidí vidělo každou verzi.
- Konverze — kolik z nich udělalo věc, na které vám záleží (koupili, registrovali se, klikli).
- Úroveň důvěry — jak si chcete být jisti, než deklarujete vítěze. 95 % je průmyslový standard.
- Hypotéza — oboustranná se ptá "je B jiná než A?" (bezpečnější, výchozí); jednostranná se ptá jen "je B lepší než A?" (citlivější, ale musíte si směr určit před spuštěním testu).
Výsledek se aktualizuje v reálném čase a vstupy se ukládají v URL stránky, takže si můžete výsledek uložit do záložek nebo sdílet. Obnovit vymaže formulář; Načíst ukázková data vyplní odpracovaný příklad.
Odpracovaný příklad
| Návštěvníci | Konverze | Sazba | |
|---|---|---|---|
| A (kontrola) | 1 000 | 100 | 10,0% |
| B (varianta) | 1 000 | 150 | 15,0% |
To je nárůst o 5 procentních bodů v absolutní hodnotě a +50 % relativní nárůst. Kalkulačka vrátí p-value přibližně 0,0007 — pod 0,05 — takže s 95% důvěrou je výsledek statisticky významný. Zhruba řečeno, pokud by byly obě verze skutečně identické, viděli byste takto velký rozdíl méně než jednou z tisíce testů.
Matematika (z-test dvou proporcí)
Pod kapotou je to standardní z-test dvou proporcí, stejný test vyučovaný v úvodní statistice a používaný mainstreamovými A/B nástroji.
-
Míra konverze každé skupiny:
kde jsou konverze a jsou návštěvníci.
-
Sdružená sazba, za předpokladu (pro nulovou hypotézu), že obě skupiny sdílejí jednu skutečnou sazbu:
-
Standardní chyba rozdílu:
-
Z-skóre — kolik standardních chyb jsou obě sazby od sebe:
-
p-value pochází ze standardního normálního rozdělení . Oboustranné: . Jednostranné: .
-
Významné když , kde (takže 0,05 na 95 %).
Kalkulačka také hlásí interval spolehlivosti pro rozdíl, počítaný s nesdruženou standardní chybou : plausibilní rozsah pro skutečný rozdíl. Pokud tento interval vylučuje 0, výsledek je významný.
S 95% důvěrou se z mimo ±1,96 (stínované ocasy, 5 % plochy) počítá jako významné.
Čestné čtení výsledku
- Statistická významnost není obchodní významnost. Nárůst o 0,1 % může být statisticky skutečný, ale není stojí za to to nasadit.
- Nekoukejte a zastavte se brzy. Kontrola p-value každý den a zastavení se v okamžiku, kdy padne pod 0,05, zvyšuje váš falešně pozitivní poměr. Rozhodněte se o velikosti vzorku předem a nechte test skončit.
- Sledujte pravidlo aproximace velikosti vzorku. Normální aproximace je spolehlivá, když každá skupina má alespoň ~10 konverzí a ~10 nekonverzí. S malými čísly zacházejte s výsledkem jen orientačně.
- Důvěra ≠ pravděpodobnost, že B je lepší. Úroveň důvěry 95 % znamená, že procedura je chybná nejvýše 5 % času v dlouhodobém horizontu — je to frequentistické tvrzení, ne "95% šance, že B vyhraje."
- Jeden test, jedna metrika. Testování více metrik nebo variant najednou násobí šanci na náhodu; opravte ji (např. Bonferroni) nebo předem zaregistrujte jedinou metriku, která rozhodne o testu.
Vypočítejte si sami
Každý úryvek vypočítá oboustrannou p-value pro odpracovaný příklad výše.
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
Jakou velikost vzorku potřebuji? Dostatečné, aby byl zjistitelný smysluplný nárůst. Jako minimální cíl se snažte alespoň pár set konverzí na variantu; použijte vyhrazenou kalkulačku velikosti vzorku s vaší základní sazbou a nejmenším nárůstem za to stojícím.
Oboustranné nebo jednostranné? Používejte oboustranné, pokud nemáte pevný, předem dohodnutý důvod starat se jen o zlepšení. Jednostranné zdvojnásobuje vaši citlivost, ale zakazuje vám reagovat na B, které je horší.
Proč kalkulačka ukazuje interval spolehlivosti? Ukazuje plausibilní rozsah skutečného rozdílu, ne jen ano/ne rozhodnutí. Široký interval, který se pohybuje kolem 0, znamená "ještě není dost dat."
Je to Bayesovské? Ne — je to frequentistský z-test, nejvíce vyučovaná a používaná metoda. Bayesovské A/B nástroje hlásí "pravděpodobnost, že B překoná A" místo p-value; obě jsou platné, odpovídají jen mírně odlišné otázky.