Calculadora de Significancia de Pruebas A/B
Verifica si el resultado de tu prueba A/B es estadísticamente significativo. Ingresa visitantes y conversiones para obtener el valor p, puntuación z, intervalo de confianza e incremento relativo.
Calculadora de Significancia de Pruebas A/B
Ingresa visitantes y conversiones para cada variante para verificar si la diferencia es real o solo ruido.
Resultados
Estadísticamente Significativo
Es poco probable que la diferencia se deba al azar en tu nivel de confianza elegido.
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.
Documentación
Pruebas A/B en un minuto
Cambiaste un botón, un titular o un flujo de pago. La versión A es la antigua, la versión B es la nueva. B se ve mejor — se convirtió el 15% de visitantes versus 10% para A. Pero, ¿esa brecha podría ser solo suerte, de la misma manera que lanzar una moneda diez veces puede dar siete caras?
Esta calculadora responde exactamente eso. Ingresas cuántas personas vieron cada versión y cuántas se convirtieron, y te dice la probabilidad de que la diferencia que mediste sea real en lugar de ruido aleatorio. Si esa probabilidad es lo suficientemente alta, tienes un ganador. Si no, mantienes la prueba en ejecución.
El único número a observar es el valor p: la oportunidad de ver una brecha al menos tan grande si las dos versiones fueran idénticas. Un valor p pequeño (digamos, por debajo de 0.05) significa "esto rara vez sucedería por suerte, así que la diferencia probablemente es real."
Cómo usarlo
- Visitantes — cuántas personas únicas vieron cada versión.
- Conversiones — cuántas de ellas hicieron lo que te importa (compraron, se registraron, hicieron clic).
- Nivel de confianza — qué tan seguro quieres estar antes de llamar ganador. 95% es el estándar de la industria.
- Hipótesis — bilateral pregunta "¿es B diferente de A?" (más seguro, el predeterminado); unilateral pregunta solo "¿es B mejor que A?" (más sensible, pero debes decidir la dirección antes de ejecutar la prueba).
El resultado se actualiza en vivo y las entradas se almacenan en la URL de la página, por lo que puedes marcar como favorito o compartir un resultado. Restablecer borra el formulario; Cargar datos de ejemplo rellena un ejemplo trabajado.
Un ejemplo trabajado
| Visitantes | Conversiones | Tasa | |
|---|---|---|---|
| A (control) | 1,000 | 100 | 10.0% |
| B (variación) | 1,000 | 150 | 15.0% |
Eso es un incremento absoluto de 5 puntos porcentuales y un incremento relativo de +50%. La calculadora devuelve un valor p de aproximadamente 0.0007 — por debajo de 0.05 — así que con confianza del 95% el resultado es estadísticamente significativo. Aproximadamente, si las dos versiones fueran verdaderamente idénticas, verías una brecha esta grande menos de una vez en mil pruebas.
Las matemáticas (prueba z de dos proporciones)
Bajo el capó esto es la estándar prueba z de dos proporciones, la misma prueba enseñada en estadística introductoria y usada por herramientas A/B convencionales.
-
Tasa de conversión de cada grupo:
donde son conversiones y son visitantes.
-
Tasa agrupada, asumiendo (para la hipótesis nula) que ambos grupos comparten una tasa verdadera:
-
Error estándar de la diferencia:
-
La puntuación z — cuántos errores estándar aparte están las dos tasas:
-
El valor p viene de la distribución normal estándar . Bilateral: . Unilateral: .
-
Significativo cuando , donde (así 0.05 a 95%).
La calculadora también reporta un intervalo de confianza para la diferencia, calculado con el error estándar no agrupado : el rango plausible para la brecha verdadera. Si ese intervalo excluye 0, el resultado es significativo.
Con confianza del 95%, una z más allá de ±1.96 (las colas sombreadas, 5% del área) cuenta como significativo.
Leer el resultado honestamente
- La significancia estadística no es significancia de negocio. Un incremento del 0.1% puede ser realmente estadístico pero no valer la pena implementar.
- No hagas peeking y detengas temprano. Revisar el valor p cada día y detener el momento en que cae por debajo de 0.05 infla tu tasa de falsos positivos. Decide el tamaño de la muestra por adelantado y deja terminar la prueba.
- Observa la regla general del tamaño de la muestra. La aproximación normal es confiable cuando cada grupo tiene al menos ~10 conversiones y ~10 no conversiones. Con números pequeños, trata el resultado como solo direccional.
- Confianza ≠ probabilidad de que B sea mejor. Un nivel de confianza del 95% significa el procedimiento está equivocado como máximo 5% del tiempo a largo plazo — es una declaración frecuentista, no "95% de oportunidad de que B gane."
- Una prueba, una métrica. Probar muchas métricas o variantes a la vez multiplica la oportunidad de un golpe de suerte; corrige por ello (ej. Bonferroni) o preregistra la métrica única que decide la prueba.
Calcula usted mismo
Cada fragmento calcula el valor p bilateral para el ejemplo trabajado anterior.
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
3Preguntas Frecuentes
¿Qué tamaño de muestra necesito? Lo suficiente para que un incremento significativo sea detectable. Como mínimo, apunta a al menos algunos cientos de conversiones por variante; usa una calculadora de tamaño de muestra dedicada con tu tasa de base y el incremento más pequeño que vale la pena detectar.
¿Bilateral o unilateral? Usa bilateral a menos que tengas una razón firme y precomprometida para solo preocuparte por la mejora. Unilateral duplica tu sensibilidad pero prohíbe reaccionar a B siendo peor.
¿Por qué la calculadora muestra un intervalo de confianza? Muestra el rango plausible de la diferencia verdadera, no solo un veredicto sí/no. Un intervalo amplio que se aproxima a 0 significa "datos insuficientes todavía."
¿Es esto Bayesiano? No — es una prueba z frecuentista, el método más ampliamente enseñado y utilizado. Las herramientas A/B Bayesianas reportan "probabilidad de que B supere A" en lugar de un valor p; ambas son válidas, responden preguntas ligeramente diferentes.