Estadística

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.

Ilustración plana de dos cuencos verdes lado a lado con pequeñas piedras idénticas atravesando el aire en arco de uno al otro, sobre fondo verde menta

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.

Cómo el test de permutación arma la distribución nulaDiagrama en tres columnas. A la izquierda, dos cajas apiladas rotuladas control y variación, con la diferencia observada anotada al lado. Al centro, una flecha indica que las observaciones de los dos grupos son arrojadas a un balde único y las etiquetas son barajadas. A la derecha, tres cajas menores apiladas muestran tres sorteos distintos con diferencias barajadas, y debajo de ellas una línea dice que la fracción de sorteos con diferencia tan extrema como la observada es el valor p.La permutación rehace el sorteo que usted ya hizo, miles de vecescontrol: 24 de 800variación: 36 de 800diferencia observada1,5 punto porcentual1.600 observacionesen un solo baldeetiquetas barajadassorteo 1: diferencia 0,4 ppsorteo 2: diferencia 1,7 ppsorteo 3: diferencia 0,9 ppy así por 100.000 vecesvalor p = fracción de los sorteos cuya diferencia barajada fue tan grande como la observadaen este caso, 14.667 de 100.000 sorteos
El procedimiento entero. Ninguna distribución es asumida: la distribución nula se construye a partir de las observaciones que usted ya tiene.

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).

Falso positivo real en tests A/A por reparto de tráficoGráfico de barras agrupadas con cuatro grupos en el eje horizontal, uno para cada reparto de tráfico: 50 barra 50, 80 barra 20, 90 barra 10 y 99 barra 1. En cada grupo hay dos barras, la oscura para el test z y la clara para el test de permutación. Una línea discontinua horizontal marca el nivel nominal de 5 por ciento. Las barras del test z quedan en 4,85, 4,72, 6,18 y 16,44 por ciento, creciendo mucho en el último grupo. Las barras de la permutación quedan en 5,00, 4,13, 5,12 y 4,78 por ciento, todas próximas a la línea de 5 por ciento.Cuanto más desigual el reparto, más se aleja el test z del alfa que promete0%5%10%15%alfa nominal de 5%50/504,855,0080/204,724,1390/106,185,1299/116,444,78test ztest de permutación
Tasa real de falso positivo en tests A/A con ingreso por usuario fuertemente asimétrico, 20.000 usuarios por réplica. Cuanto más desigual el reparto, más se distancia el test z del nivel que promete.

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.

Calculadora de significancia estadística
Control (A)
Variación (B)
Control (A) · Tasa-
Variación (B) · Tasa-
Mejora relativa-
valor-p-
IC 95% de la diferencia-

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.

Qué cubre el test de permutación y qué queda fueraDiagrama de una franja horizontal dividida en cinco etapas de un test A/B, de izquierda a derecha: sorteo del tráfico, recolección y rastreo, definición de la métrica, cálculo de la distribución nula y decisión. Solo la cuarta etapa, cálculo de la distribución nula, está destacada en color sólido con la marca de que es lo que la permutación arregla. Las otras cuatro están en gris claro con la marca de que siguen siendo responsabilidad del diseño del experimento.La permutación actúa en una sola etapa del test1. sorteodel tráfico2. recolección yrastreo3. definiciónde la métrica4. distribuciónnula5. decisiónde negociola permutación arregla estaSRM, pérdida de rastreo, interferencia y métrica equivocada siguen intactosy ningún barajado los revela
El test de permutación cambia la fórmula de la distribución nula por la distribución empírica. Todo lo que ocurre antes de eso sigue siendo problema del diseño.

En concreto:

Checklist de aplicación

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Baraje en la unidad del sorteo. Si sorteó usuario, permute usuarios enteros, con todos sus eventos juntos.
  6. 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.
  7. 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

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.