Test de Permutación en Test A/B: valor p sin fórmula
El test de permutación baraja las etiquetas y arma la distribución nula con sus propios datos. Cuándo salva un test A/B y cuándo no cambia nada.

📚 Este artículo es parte de la guía Significancia Estadística en Tests A/B: La Guía.
El test de permutación calcula el valor p barajando las etiquetas de control y variación miles de veces encima de sus propios datos, en lugar de asumir que la diferencia entre medias sigue una normal. No es más preciso siempre: en un reparto 50/50 con métrica bien comportada, devuelve prácticamente el mismo número que el test z. Salva el resultado exactamente donde la aproximación normal se rompe, y la simulación de este artículo muestra el tamaño del estrago: en una rampa de 1 por ciento con ingreso por usuario, el test z rechazó 16,44 por ciento de los tests A/A a un alfa nominal de 5 por ciento, mientras que el test de permutación quedó en 4,78 por ciento. Esta guía muestra cómo funciona la cuenta, dónde importa, cómo correrla y qué no arregla. Forma parte de nuestra guía completa de test A/B y completa lo que ya dijimos sobre significancia estadística.
La idea del test de permutación, en una frase
Usted tiene 800 visitantes en el control con 24 conversiones y 800 en la variación con 36. La pregunta del test es: si la etiqueta “control” o “variación” no hiciera ninguna diferencia, ¿con qué frecuencia un sorteo aleatorio de esos 1.600 visitantes en dos grupos de 800 produciría una diferencia tan grande como la que usted vio?
El test z responde eso con una fórmula que aproxima esa distribución por una normal. El test de permutación responde la misma pregunta literalmente: hace el sorteo, muchas veces, y cuenta.
La justificación formal es la misma que sostiene el experimento. Guo, Lee y Toulis registran que el enfoque se remonta a Fisher, en 1935, y que procedimientos de ese tipo son válidos en muestra finita para distribuciones de datos arbitrarias, porque explotan la variación conocida en la asignación de los tratamientos, y no una suposición sobre la población. Quien sorteó el tráfico fue usted; el test apenas repite ese sorteo.
Dónde se rompe la fórmula cerrada
La respuesta honesta es: menos veces de lo que el folclore sugiere. Un test A/B típico, con reparto 50/50 y centenas de miles de usuarios, no necesita permutación. Nosotros lo medimos.
El experimento simulado: ingreso por usuario, 4 por ciento de los usuarios compran, la compra sigue una lognormal, y el total de 20.000 usuarios se divide en proporciones distintas entre control y variación. La métrica es violentamente asimétrica (el coeficiente de asimetría de la muestra combinada queda alrededor de 15, y la regla práctica de Kohavi y coautores pediría cerca de 81.000 observaciones por brazo solo para que la media sea aproximadamente normal). Corrimos miles de tests A/A, es decir, tests en los que los dos brazos vienen exactamente de la misma distribución y cualquier resultado significante es falso positivo.
| reparto control/variación | usuarios en el control | usuarios en la variación | test z: cola “variación peor” | test z: cola “variación mejor” | test z: total | permutación: total | réplicas |
|---|---|---|---|---|---|---|---|
| 50/50 | 10.000 | 10.000 | 2,40% | 2,45% | 4,85% | 5,00% | 4.000 |
| 80/20 | 16.000 | 4.000 | 3,45% | 1,27% | 4,72% | 4,13% | 4.000 |
| 90/10 | 18.000 | 2.000 | 5,43% | 0,75% | 6,18% | 5,12% | 6.000 |
| 99/1 | 19.800 | 200 | 16,35% | 0,09% | 16,44% | 4,78% | 8.000 |
El nominal es 5 por ciento en el total y 2,5 por ciento en cada cola. Lea la tabla de arriba abajo:
En el reparto 50/50, el test z está en lo cierto. 4,85 por ciento contra un objetivo de 5 por ciento, con las dos colas equilibradas, incluso con asimetría de 15 y una muestra siete veces menor de lo que la regla práctica pediría. Eso no es suerte: Kohavi y coautores hacen exactamente esa salvedad en el artículo en que publican la regla. Con reparto de tamaños iguales, la distribución de la diferencia queda aproximadamente simétrica, y es perfectamente simétrica con asimetría cero bajo la hipótesis nula, así que la regla deja de dar un límite inferior útil. La asimetría de la métrica se cancela entre los dos brazos.
Conforme el reparto se desequilibra, las colas se desequilibran junto. En 90/10 el total todavía parece casi aceptable (6,18 por ciento), pero esconde una cola de 5,43 por ciento contra 0,75 por ciento. Es decir: el test se equivoca casi siempre hacia el mismo lado, declarando que el brazo pequeño está peor.
En 99/1 el resultado es indefendible. Uno de cada seis tests A/A produce un resultado significante, y 16,35 de los 16,44 puntos vienen de la cola “el brazo de 1 por ciento está peor”. El test de permutación, en los mismos datos, quedó en 4,78 por ciento, dentro del error Monte Carlo de la simulación (con 8.000 réplicas, el error estándar alrededor de 5 por ciento es 0,24 punto porcentual).
La conclusión práctica es específica y no es “abandone el test z”. Es: en una rampa de exposición, que es justamente cuando usted corre 1 por ciento o 5 por ciento del tráfico en una variación nueva, la lectura por aproximación normal de una métrica de ingreso es el peor escenario posible, y se equivoca sistemáticamente contra la variación. Es el mismo cuidado que ya pedimos al hablar de SRM y reparto desigual de tráfico, solo que aquí el problema no es el sorteo, es la lectura.
El ejemplo trabajado: un test de bajo tráfico
El segundo lugar donde la fórmula cerrada se equivoca es el más común de todos: los conteos pequeños. Considere un test de bajo volumen, 800 visitantes por variación, 24 conversiones en el control (3,000 por ciento) y 36 en la variación (4,500 por ciento), una ganancia relativa aparente de 50 por ciento.
Test z bilateral de dos proporciones. "Sin significancia" casi siempre significa que falta muestra, no que las versiones sean iguales.
Pegando esos números en la calculadora de arriba, el test z devuelve z de 1,5791, valor p de 0,11432 e intervalo del 95 por ciento de la diferencia de menos 0,3604 a más 3,3604 puntos porcentuales. Sin significancia.
Corriendo el test de permutación en los mismos datos, con 100.000 barajados, 14.667 de ellos produjeron una diferencia absoluta tan grande como la observada. El valor p sale en 0,14668.
Aquí la cuenta tiene una verificación fuerte disponible: en el caso binario con las marginales fijas, el test de permutación converge al test exacto de Fisher, que es calculable analíticamente por la distribución hipergeométrica. El valor exacto es 0,147193. Nuestra aproximación Monte Carlo quedó a 0,00051 de él, y el error estándar Monte Carlo esperado con 100.000 barajados es 0,00112. La permutación acertó el objetivo dentro de medio error estándar.
| método | valor p | cómo se obtuvo |
|---|---|---|
| test z (aproximación normal) | 0,11432 | fórmula cerrada, la misma de la calculadora de arriba |
| chi cuadrado con corrección de Yates | 0,14776 | fórmula cerrada con corrección de continuidad |
| permutación Monte Carlo, 100.000 sorteos | 0,14668 | barajado de las etiquetas |
| test exacto de Fisher | 0,14719 | hipergeométrica, sin simulación |
La lectura: la aproximación normal devuelve un valor p 22 por ciento menor que el exacto, y es siempre en esa dirección con conteos de ese tamaño. En un test que ya no es significante, eso es irrelevante. En un test que quedó en 0,048 por la fórmula y 0,061 por el exacto, eso es la diferencia entre publicar una variación y no publicarla. Note también que la corrección de Yates, que es fórmula cerrada y corre en una línea, llegó a 0,14776, prácticamente en el exacto: en una tabla 2 por 2 es un sustituto barato y muy bueno de la permutación. Eso es especialmente relevante para quien hace CRO en un sitio de bajo tráfico, donde decenas de conversiones es el escenario normal y no la excepción.
Cómo correrlo, en 15 líneas
El algoritmo cabe en una función. Este es el código que generó los números de arriba, y no depende de ninguna biblioteca:
function permutationP(control, variacion, B, rand) {
const balde = control.concat(variacion);
const n = balde.length, nA = control.length;
const media = (a) => a.reduce((s, x) => s + x, 0) / a.length;
const observado = Math.abs(media(variacion) - media(control));
let extremos = 0;
for (let k = 0; k < B; k++) {
for (let i = n - 1; i > 0; i--) { // baraja el balde
const j = Math.floor(rand() * (i + 1));
[balde[i], balde[j]] = [balde[j], balde[i]];
}
let somaA = 0; for (let i = 0; i < nA; i++) somaA += balde[i];
let somaB = 0; for (let i = nA; i < n; i++) somaB += balde[i];
const dif = Math.abs(somaB / (n - nA) - somaA / nA);
if (dif >= observado - 1e-12) extremos++;
}
return (extremos + 1) / (B + 1); // Phipson y Smyth, 2010
}
Tres detalles que separan la implementación correcta de la equivocada:
El más 1 en el numerador y en el denominador no es una maña, es la cuenta correcta. Phipson y Smyth mostraron que la versión ingenua, dividir el conteo por B, subestima el valor p en cerca de 1 sobre B y aumenta la tasa de error tipo I del test. El argumento de los autores es que la permutación no estima la probabilidad de cola de una distribución continua: ella genera una distribución nula discreta exacta, y el estadístico observado es él mismo uno de los resultados posibles. Sumar 1 a los dos lados también elimina el absurdo de reportar un valor p exactamente cero.
El estadístico tiene que ser recalculado en cada sorteo, incluido el denominador. Si usted fija la varianza estimada en los datos originales y solo baraja las medias, pierde la propiedad que hace funcionar el método.
Use mayor o igual, no mayor. La comparación con el estadístico observado necesita incluir los empates, si no el test queda anticonservador en métricas discretas.
Cuántos barajados
La permutación Monte Carlo tiene un error propio, y es fácil de dimensionar: el número de sorteos extremos es una binomial, así que el error estándar de un valor p estimado en p es la raíz de p por (1 menos p) sobre B.
| barajados (B) | error estándar en p cerca de 0,05 | media anchura del IC 95% | menor valor p posible |
|---|---|---|---|
| 999 | 0,00690 | 0,01351 | 0,001000 |
| 9.999 | 0,00218 | 0,00427 | 0,000100 |
| 99.999 | 0,00069 | 0,00135 | 0,000010 |
| 999.999 | 0,00022 | 0,00043 | 0,000001 |
Con mil barajados, un valor p estimado en 0,05 viene con un intervalo que va de 0,036 a 0,064: usted no sabe de qué lado del umbral está. Diez mil ya resuelven la decisión binaria de significancia. Cien mil valen cuando usted va a publicar el número, y solo hacen diferencia real cuando el valor p es pequeño. Y note la última columna: el menor valor p que usted consigue reportar es 1 sobre (B más 1), así que “p menor que 0,001” exige como mínimo 999 barajados, por definición, independientemente de cuán convincentes sean los datos.
Lo que la permutación no arregla
Esta es la parte que los textos entusiasmados suelen saltarse. El test de permutación corrige una cosa: la aproximación de la distribución nula. No corrige nada de lo que viene antes de ella.
En concreto:
- Exige permutabilidad bajo la nula. Si el sorteo se rompió, y usted tiene reparto desigual de tráfico (SRM), las observaciones no son intercambiables entre las etiquetas y el test devuelve un valor p correctamente calculado sobre un experimento equivocado.
- No protege contra la dependencia. Si la unidad de análisis es el pageview pero el sorteo es por usuario, barajar pageviews individualmente destruye la estructura de dependencia y produce un valor p optimista, exactamente como lo produciría la fórmula i.i.d. El barajado tiene que ocurrir en la misma unidad en que ocurrió el sorteo, tema que tratamos en unidad de aleatorización.
- No entrega intervalo de confianza. La permutación responde una pregunta de test. Para la incertidumbre alrededor del efecto, el instrumento es el bootstrap, que remuestrea con reposición dentro de cada grupo en vez de barajar entre grupos.
- No arregla el peeking. Correr permutación cada hora y parar cuando dé por debajo de 0,05 infla el error tipo I igual que correr test z cada hora, por el motivo que describimos en el problema del peeking.
- No arregla la asimetría en sí. La regla práctica de Kohavi, Deng, Longbotham y Xu dice que el mínimo de observaciones independientes para que la media sea aproximadamente normal es 355 veces el cuadrado del coeficiente de asimetría, y vale la pena aplicarla cuando el módulo de la asimetría pasa de 1. En las métricas de Bing que los autores publican, ingreso por usuario tiene asimetría de 17,9 y pide 114 mil observaciones; ingreso por usuario con techo tiene 5,2 y pide 9,7 mil; sesiones por usuario tiene 3,6 y pide 4,70 mil. La permutación no reduce ese número, apenas deja de necesitarlo para calcular el valor p. La cuenta de tamaño de muestra sigue igual, y aplicar un techo en la métrica sigue siendo la intervención que más aumenta la sensibilidad.
Checklist de aplicación
- Reparto 50/50 y métrica binaria con centenas de conversiones por brazo: use la fórmula. La permutación no va a cambiar la tercera casa decimal.
- Menos de unas 100 conversiones por brazo: verifique el valor p con Fisher exacto o chi cuadrado con Yates antes de decidir. Son fórmulas cerradas y la diferencia ya es material.
- Métrica continua o de conteo con reparto desigual (rampa de 1, 5 o 10 por ciento): permutación, sin discusión. Es donde el test z más se equivoca, y se equivoca siempre contra el brazo pequeño.
- Estadístico sin fórmula cerrada (diferencia de medianas, diferencia de cuantiles, razón de razones): permutación para el valor p, bootstrap para el intervalo.
- Baraje en la unidad del sorteo. Si sorteó usuario, permute usuarios enteros, con todos sus eventos juntos.
- Fije la semilla del generador y publique B. Un valor p Monte Carlo sin el número de barajados es un número sin precisión declarada.
- Use (b más 1) sobre (B más 1). Siempre.
Haga esto automático en Donnu
El motivo por el cual casi nadie corre un test de permutación no es teórico, es operacional: exige guardar las observaciones al nivel de la unidad de sorteo, y no solo los totales agregados. Quien solo tiene “visitantes y conversiones” en una planilla no consigue permutar nada, porque la información individual ya fue tirada en la agregación.
Donnu guarda el evento al nivel del usuario asignado, así que la distribución nula empírica es calculable sobre cualquier métrica del experimento, no solo sobre la tasa de conversión. En la práctica eso significa poder leer una rampa de 1 por ciento sin el sesgo de 16 por ciento de falso positivo que la tabla de este artículo muestra, y poder probar una diferencia de mediana sin inventar una fórmula para ella. Si está empezando ahora, empiece por lo más barato: corra la calculadora de significancia y, si el conteo es bajo, verifique con Yates antes de decidir.
Referencias
- Guo, W., Lee, J. y Toulis, P. ML-assisted Randomization Tests for Detecting Treatment Effects in A/B Experiments. arXiv 2501.07722, enero de 2025. Fuente del encuadre de que la inferencia por aleatorización se remonta a Fisher (1935), de que los procedimientos del tipo test de aleatorización de Fisher son válidos en muestra finita para distribuciones arbitrarias por explotar la variación conocida en la asignación de los tratamientos, y de que esos tests son normalmente implementados como tests de permutación en experimentación online. arxiv.org.
- Phipson, B. y Smyth, G. K. Permutation P-values Should Never Be Zero: Calculating Exact P-values When Permutations Are Randomly Drawn. Statistical Applications in Genetics and Molecular Biology, volumen 9, número 1, artículo 39, 2010. Fuente de la demostración de que el valor p ingenuo está subestimado en cerca de 1 sobre el número de permutaciones y de que sustituir el valor p exacto por un estimador no sesgado aumenta la tasa de error tipo I; del argumento de que la permutación debe verse como generadora de una distribución nula discreta exacta, y no como estimación de una probabilidad de cola; y del registro histórico de que la enumeración completa es de Fisher (1935), el sorteo de un subconjunto de permutaciones es de Dwass (1957) y el test Monte Carlo es de Barnard (1963). arxiv.org.
- Kohavi, R., Deng, A., Longbotham, R. y Xu, Y. Seven Rules of Thumb for Web Site Experimenters. KDD 2014. Fuente de la regla práctica de 355 veces el cuadrado del coeficiente de asimetría como mínimo de observaciones independientes para que la media tenga distribución aproximadamente normal, con la recomendación de usarla cuando el módulo de la asimetría pasa de 1; de la tabla de métricas de Bing (ingreso por usuario con asimetría 17,9 y 114 mil observaciones, ingreso por usuario con techo con 5,2 y 9,7 mil, sesiones por usuario con 3,6 y 4,70 mil, tiempo hasta el éxito con 2,1 y 1,55 mil); de la observación de que aplicar un techo en ingreso por usuario derrumbó la asimetría de 18 a 5,3 y permitió detectar un cambio 30 por ciento menor con la misma muestra; y de la salvedad de que con reparto de tamaños iguales la distribución de la diferencia queda aproximadamente simétrica y la regla deja de dar un límite inferior útil. exp-platform.com.
- Deng, A., Knoblich, U. y Lu, J. Applying the Delta Method in Metric Analytics: A Practical Guide with Novel Ideas. KDD 2018. Fuente del contexto de por qué las plataformas de experimentación a escala buscan estimadores analíticos de varianza en vez de remuestreo, y de por qué el costo computacional del bootstrap es el obstáculo práctico a su adopción en producción. arxiv.org.
Lee también: Significancia estadística en test A/B · Outliers y capping · Unidad de aleatorización · CRO para sitios de bajo tráfico · SRM y reparto desigual · Calculadora de significancia · Leia em português
Preguntas frecuentes
- ¿Qué es un test de permutación en un test A/B?
- Es una manera de calcular el valor p sin usar fórmula cerrada. Usted junta las observaciones de los dos grupos en un único balde, sortea repetidas veces cuáles quedarían en el control y cuáles en la variación, recalcula la diferencia en cada sorteo y ve en qué fracción de los sorteos la diferencia barajada fue tan grande como la que observó de verdad. Esa fracción es el valor p. La idea es de Fisher, en 1935, y es la misma aleatorización que usted ya usó para montar el experimento.
- ¿Cuándo el test de permutación cambia el resultado de un test A/B?
- Cuando la aproximación normal del test z está mal. Eso ocurre en dos situaciones típicas: conteos pequeños (decenas de conversiones, no miles) y reparto de tráfico muy desigual en una métrica asimétrica, como una rampa de 1 por ciento en ingreso por usuario. En la simulación de este artículo, con reparto 99/1, el test z rechazó 16,44 por ciento de los tests A/A a un alfa nominal de 5 por ciento, y el test de permutación rechazó 4,78 por ciento.
- ¿Cuántas permutaciones son necesarias?
- Depende de la precisión que usted quiera cerca de su umbral de decisión. Con 10.000 permutaciones, el error estándar de un valor p cerca de 0,05 es 0,0022, es decir, el intervalo del 95 por ciento alrededor de la estimación tiene media anchura de 0,0043. Con 1.000 permutaciones esa media anchura sube a 0,0135, demasiado ancha para decidir encima de 0,05. Para publicar un valor p por debajo de 0,001 usted necesita al menos 999 permutaciones, porque el menor valor posible es 1 dividido por (B más 1).
- ¿Por qué sumar 1 en el numerador y en el denominador del valor p?
- Porque el estadístico observado es él mismo una de las permutaciones posibles. Phipson y Smyth mostraron que la cuenta ingenua, dividir el conteo por el número de permutaciones, subestima el valor p en cerca de 1 sobre el número de permutaciones y aumenta el error tipo I del test. La forma correcta es sumar 1 a los dos: (b más 1) dividido por (B más 1). Eso también impide el resultado absurdo de un valor p exactamente cero.
- ¿El test de permutación resuelve el sesgo de muestreo o el SRM?
- No. Arregla la aproximación de la distribución nula, y solo eso. Si el sorteo se rompió, si uno de los grupos perdió eventos por falla de rastreo o si existe interferencia entre las variaciones, los datos ya están contaminados antes de la cuenta, y barajar etiquetas contaminadas devuelve un valor p correctamente calculado sobre un experimento equivocado. La hipótesis que el test de permutación exige es la de permutabilidad bajo la nula, y cae junto con el sorteo.
- ¿Cuál es la diferencia entre permutación y bootstrap?
- La permutación baraja etiquetas sin reposición y responde una pregunta de test: cuál es la probabilidad de ver una diferencia de ese tamaño si la etiqueta no importara. El bootstrap remuestrea con reposición dentro de cada grupo y responde una pregunta de estimación: cuál es la incertidumbre alrededor del efecto medido. En la práctica usted usa los dos, permutación para el valor p y bootstrap para el intervalo de confianza, porque la permutación sola no entrega intervalo.