Estadística

Efecto de Arrastre entre Tests A/B: el residuo anterior

El efecto de arrastre entre tests A/B contamina el siguiente experimento en los mismos buckets. Medimos 93% de falso positivo en un A/A y la corrección.

Ilustración plana de un rastro de huellas atravesando una superficie clara de arena, nítidas y profundas a la izquierda y cada vez más borrosas hasta casi desaparecer a la derecha

Cuando el segundo test reaprovecha los mismos buckets del primero, el residuo del primero entra en la lectura del segundo como si fuera efecto. En la simulación de este artículo, un test A/A corrido justo después de un experimento que dejó al grupo de tratamiento 0,60 punto porcentual abajo acusó resultado significativo en 93,30 por ciento de las réplicas, contra el 5 por ciento nominal. Con re-sorteo de los usuarios en cada experimento, la misma medición volvió a 4,47 por ciento. El problema no está en la estadística ni en el volumen de tráfico: está en quién fue sorteado hacia dónde, y cuándo. Esta guía muestra por qué el sistema de buckets crea el problema, mide cuánto tiempo sobrevive el residuo, prueba que la verificación de SRM no lo detecta, y describe la corrección. Forma parte de nuestra guía completa de test A/B y complementa test A/A para validar el montaje y efecto novedad.

El sistema de buckets y el precio de la comodidad

Las plataformas grandes no sortean al usuario directamente hacia el experimento. Sortean al usuario una vez hacia un bucket, y después asignan buckets a los experimentos. Kohavi, Deng, Frasca, Longbotham, Walker y Xu describen el diseño y su ventaja: es flexible y permite el reuso fácil de usuarios en experimentos posteriores. El mismo grupo describe, en el artículo sobre la plataforma de Bing a escala, el mecanismo de aislamiento que corre encima de eso: una línea numérica, equivalente a las capas de Google, garantiza que un usuario quede en un único experimento por línea, con la asignación hecha por un hash pseudoaleatorio de un identificador anónimo.

La comodidad es real. El costo también. Si el sorteo no se repite en cada experimento, quien estaba en el tratamiento ayer tiende a estar en el tratamiento de nuevo hoy, y carga consigo todo lo que el test anterior hizo con él: el hábito que creó, la frustración que causó, el registro que completó, el carrito que abandonó.

Por qué reusar el bucket hace que el residuo del test anterior se vuelva efecto del test nuevoDiagrama en dos franjas horizontales. En la franja de arriba, llamada test 1, una fila de buckets numerados está pintada en dos colores alternados: buckets claros en el control y buckets oscuros en el tratamiento, y los oscuros llevan una marca que indica que ese grupo fue afectado. En la franja de abajo, llamada test 2, aparecen dos escenarios. A la izquierda, reusando el mismo hash, los mismos buckets oscuros caen de nuevo en el mismo brazo y la marca viene con ellos, concentrada en un lado. A la derecha, con re-sorteo, los buckets marcados aparecen esparcidos en los dos brazos, y las marcas quedan distribuidas de forma equilibrada entre control y tratamiento.Test 1: la mitad de los buckets va al tratamiento y sale marcadaoscuro = pasó por el tratamiento y quedó marcadoTest 2, mismo hashcontrolvariacióntodas las marcas de un solo ladoel residuo se vuelve “efecto”Test 2, hash nuevocontrolvariaciónmarcas divididas entre los dos brazosel residuo se vuelve ruido comúnEl residuo no desaparece con el re-sorteo. Deja de concentrarse en uno de los brazos, que es lo que importa.
La corrección no hace que el efecto del test anterior desaparezca. Distribuye ese efecto por igual entre control y variación, que es donde deja de volverse sesgo.

El resultado clásico está en el artículo de Kohavi, Deng, Frasca, Longbotham, Walker y Xu: un experimento corrió y las métricas no relacionadas con el cambio se movieron en direcciones inesperadas, con significancia estadística alta. Al correrlo de nuevo en una muestra mayor, muchos de esos efectos simplemente desaparecieron. La explicación era el arrastre.

Cuánto tiempo sobrevive el residuo

Los autores reportan dos mediciones. En la primera, el experimento se corrió en tres etapas: 7 días de A/A en los buckets, 47 días de A/B encendido, y después más de tres semanas monitoreando los mismos buckets con el experimento ya apagado. El efecto de arrastre en el criterio principal, sesiones por usuario, era visible y parece morir alrededor de la tercera semana después del fin del experimento. En la segunda, un bug expuso a los usuarios del tratamiento a una experiencia muy mala: incluso después de tres meses, los buckets todavía no habían vuelto a los niveles anteriores al experimento.

Simulamos esa dinámica para poder medir el efecto sobre la decisión. El diseño: 1.000 buckets de 60 usuarios cada uno, 60.000 usuarios por lectura, tasa base de 5 por ciento, un test 1 que dejó al grupo de tratamiento 0,60 punto porcentual abajo, y un residuo que decae con vida media de 14 días. Después de eso, un test 2 se corre como A/A puro, es decir, sin ningún efecto real, y medimos cuántas veces acusa significancia. Son 3.000 réplicas por línea, con error estándar de Monte Carlo de 0,40 punto porcentual alrededor de 5 por ciento.

descanso entre los tests residuo ese día reusando el bucket: falso positivo lift medido promedio con re-sorteo: falso positivo
0 día -0,6000 pp 93,30% -0,6032 pp 4,47%
7 días -0,4243 pp 67,93% -0,4196 pp 4,87%
14 días -0,3000 pp 39,87% -0,2982 pp 4,90%
21 días -0,2121 pp 23,10% -0,2155 pp 5,13%
28 días -0,1500 pp 13,90% -0,1496 pp 6,00%
42 días -0,0750 pp 7,03% -0,0743 pp 4,97%
60 días -0,0308 pp 5,07% -0,0292 pp 4,47%
90 días -0,0070 pp 4,77% -0,0055 pp 5,43%

Dos lecturas salen de ahí.

La primera: el descanso funciona, pero es demasiado caro. Tres semanas de espera todavía dejaban el falso positivo en 23,10 por ciento, casi cinco veces el nominal. Solo con 60 días de bucket parado la lectura volvió a su lugar. Pocos equipos tienen capacidad de tráfico para darle dos meses de vacaciones a la mitad de la base entre un test y otro.

La segunda: re-sortear resuelve independientemente del descanso. La columna de la derecha queda entre 4,47 y 6,00 por ciento en todas las líneas, incluso con descanso cero. Es la diferencia entre esperar a que el problema pase y desarmar el problema.

Falso positivo de un test A/A según el tiempo de descanso entre experimentosGráfico de líneas con el tiempo de descanso en días en el eje horizontal, de cero a noventa, y la tasa de falso positivo de un test A/A en el eje vertical, de cero a cien por ciento. La línea oscura, que representa el reuso de los mismos buckets, comienza en 93,3 por ciento con descanso cero, cae a 67,9 por ciento en siete días, 39,9 en catorce, 23,1 en veintiuno, 13,9 en veintiocho, 7,0 en cuarenta y dos y solo toca el 5 por ciento nominal a los sesenta días. La línea clara, que representa el re-sorteo de los usuarios en cada experimento, queda prácticamente pegada a la línea del 5 por ciento en todos los puntos. Una línea punteada horizontal marca el nivel nominal de 5 por ciento.Falso positivo de un A/A después de un experimento que lastimó al tratamientonominal 5%93,3%67,9%39,9%23,1%13,9%7,0%014286090días de descanso entre los dos testsreusando el mismo hash de bucketre-sorteando en cada experimento
La línea clara es una recta en 5 por ciento. Ningún tiempo de espera compra lo que una semilla de hash nueva entrega gratis.

Un ejemplo trabajado, con la calculadora

Este es un único test A/A corrido inmediatamente después del experimento anterior, sin ningún descanso, sobre los mismos buckets:

Pegando esos números en la calculadora de significancia, el veredicto es:

Un valor p de 0,001404 en un test donde las dos variaciones son idénticas. Nada fue cambiado. Ningún código fue desplegado. La conclusión que sale de ese panel, si nadie sabe lo que pasó antes, es que la variación derrumbó la conversión en 11 por ciento.

Corra usted mismo los números en la calculadora de abajo:

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.

El SRM no detecta esto

La verificación de proporción de muestra es la defensa estándar contra un sorteo roto, y es una buena defensa: ver SRM y reparto desigual de tráfico. Simplemente no es la defensa para este problema.

Corriendo el test de chi cuadrado sobre el reparto del ejemplo de arriba:

verificación resultado
visitantes en A 30.000
visitantes en B 30.000
reparto esperado 50/50
estadístico de chi cuadrado 0,0000
valor p del SRM 1,0000
desvío detectado no

El sorteo está perfecto. El conteo está perfecto. El problema no es cuántos usuarios cayeron en cada brazo, es cuáles. Ningún verificador de proporción ve eso, porque la información que delata el arrastre no está en los conteos del test actual, está en el historial de quién estuvo dónde en el test anterior.

Esa es la misma clase de trampa de Demasiado bueno para ser verdad y la ley de Twyman: un resultado demasiado fuerte en métricas que ni siquiera deberían haberse movido es señal de problema de medición, no de descubrimiento.

Qué pasa con un test que sí tiene efecto de verdad

El caso del A/A es didáctico, pero el daño real aparece cuando existe un efecto genuino para medir y el arrastre lo distorsiona. Corrimos el mismo diseño con un efecto real de +4 por ciento relativo, es decir, +0,20 punto porcentual, 3.000 réplicas por línea:

descanso reusando: tasa de resultado significativo lift medido promedio re-sorteando: tasa significativa lift medido promedio
0 día 63,33% -0,4051 pp 19,07% +0,1931 pp
7 días 25,53% -0,2274 pp 21,33% +0,2027 pp
14 días 8,57% -0,0977 pp 19,00% +0,1950 pp
21 días 4,53% -0,0167 pp 20,53% +0,1981 pp
28 días 6,10% +0,0516 pp 20,83% +0,2015 pp
60 días 16,27% +0,1698 pp 19,23% +0,1946 pp

Lea la columna del lift medido con atención. El efecto real es de +0,20 punto porcentual. Con descanso cero y buckets reusados, el test mide -0,4051, es decir, signo cambiado. Y el 63,33 por ciento de resultados significativos no son victorias: son condenas. En casi dos tercios de las réplicas, una variación que de hecho mejora la conversión es declarada perdedora con significancia estadística.

Note también la línea de 21 días, donde la tasa de significancia cae a 4,53 por ciento. No es una buena noticia: es el punto en que el residuo negativo cancela casi exactamente el efecto positivo real, y el test concluye empate sobre una mejora que existe. El arrastre no empuja el resultado siempre hacia un lado, empuja hacia el lado del test anterior.

La columna del re-sorteo, en contraste, mide entre +0,1931 y +0,2027 punto porcentual en todos los intervalos, con el efecto real de +0,2000 en medio del rango.

La corrección: re-aleatorización localizada

La causa raíz, en la formulación de los autores de Bing, es directa: el sistema de buckets no re-sortea en cada experimento. Depende de una reasignación infrecuente de los buckets, y entre una reasignación y otra la asignación queda constante por un período relativamente largo.

Cambiar la función de hash resuelve, pero tiene un costo operativo pesado: el sistema de buckets acopla todos los experimentos de una misma línea, así que cambiar la función exige detener todos los experimentos de esa línea, lo que lastima capacidad y agilidad.

La alternativa que ellos describen es un sistema de buckets en dos niveles:

  1. El nivel de arriba define qué unidades entran en el experimento.
  2. La asignación de tratamiento ocurre en el nivel de abajo, con una semilla de hash distinta para cada experimento.

Eso garantiza un sorteo por experimento, de modo que la asignación de tratamiento queda independiente de cualquier evento histórico, incluido el arrastre de experimentos anteriores.

El costo declarado por ellos es uno solo, y es importante: no se puede usar un control compartido. Cada experimento necesita su propio control, para que cualquier residuo de un experimento anterior quede mezclado entre control y tratamiento en vez de concentrado en un lado.

A cambio viene un beneficio que compensa bien. Con re-aleatorización localizada, se puede correr un test A/A retrospectivo sin gastar tiempo de calendario: usted cambia la función de hash y reevalúa los últimos días antes del experimento como si fueran un A/A. Por la propiedad de independencia de la re-aleatorización localizada, comparar retrospectivamente a los usuarios que habrían sido asignados a control y tratamiento en cualquier período anterior al experimento es un A/A legítimo. Si ese A/A muestra efecto en las métricas principales, con valor p por debajo de 0,2 por ejemplo, por culpa de un reparto con mala suerte, se cambia la clave de hash y se intenta de nuevo, antes de gastar un día de tráfico.

Sistema de buckets en dos niveles con semilla de hash por experimentoDiagrama de flujo en tres columnas. En la columna de la izquierda, una caja llamada nivel 1 recibe a todos los usuarios y selecciona cuáles entran en el experimento, usando un hash estable que no cambia entre experimentos. Una flecha lleva a la columna del medio, una caja llamada nivel 2, donde la asignación de control o tratamiento ocurre usando una semilla de hash específica de ese experimento. Dos flechas salen de ella hacia la columna de la derecha, una hacia control y otra hacia tratamiento, y una anotación dice que como la semilla cambia en cada experimento, el residuo del experimento anterior cae por igual en los dos brazos. Abajo, una nota registra el costo: cada experimento necesita su propio control.La semilla de hash cambia por experimento, solo en el segundo nivelnivel 1: elegibilidadhash estable, define quiénentra en el experimentonivel 2: asignaciónsemilla de hash PROPIAde cada experimentocontrol de este experimentotratamientoComo la semilla cambia, el residuo del experimento anterior cae por igual en los dos brazos de este.Costo declarado por los autoresCada experimento necesita su propio control. No se puede compartir un control entre varios.Beneficio que compensaTest A/A retrospectivo sin gastar calendario: reevalúe los días anteriores con la nueva semilla.
El nivel 1 responde “quién participa”, el nivel 2 responde “en qué brazo”. Solo el segundo necesita cambiar de semilla en cada experimento.

Qué hacer si usted no controla la plataforma

No todo equipo puede reescribir el sistema de asignación de la herramienta que usa. Lo que queda, en orden de preferencia:

  1. Verifique si su herramienta ya re-sortea por experimento. Muchas herramientas modernas hacen el hash con una combinación de identificador del usuario e identificador del experimento, que es exactamente la re-aleatorización localizada. Si es el caso, el problema no existe para usted y vale confirmarlo por escrito, no por suposición.
  2. Corra un A/A retrospectivo antes de cada test. Tome los días anteriores, aplique el reparto que el test nuevo va a usar y verifique si las métricas principales empatan. Es el test que habría detectado el caso de 93,30 por ciento en el primer intento.
  3. Trate un valor p por debajo de 0,2 en el A/A como señal amarilla, no como aprobación. El criterio es de los propios autores de Bing y es deliberadamente laxo, porque el costo de una falsa alarma aquí es cambiar una clave de hash, y el costo de dejarlo pasar es un trimestre de decisión equivocada.
  4. Registre en el reporte qué experimento corrió antes en esos buckets. Sin ese registro, nadie logra siquiera levantar la hipótesis de arrastre cuando el resultado salga raro.
  5. Desconfíe de métricas que se movieron sin motivo. Si el cambio fue en el pie de página y la métrica de búsqueda se movió con significancia alta, la hipótesis principal no es un descubrimiento.
  6. El descanso es el último recurso, y usted necesita dimensionarlo. En nuestra simulación, 21 días todavía dejaban 23,10 por ciento de falso positivo. Si va a esperar, espere de verdad y mida con un A/A antes de volver a testear.

Hágalo automático con Donnu

El arrastre es un problema de arquitectura de sorteo, no de análisis. En Donnu la asignación de cada experimento sale de un hash que combina el identificador del usuario con el identificador de ese experimento, así que dos tests seguidos nunca heredan el mismo reparto: quien fue tratado ayer se esparce entre control y variación hoy. El panel también guarda qué experimentos corrieron antes sobre la misma población, para que la hipótesis de arrastre sea lo primero que alguien logre revisar cuando una métrica no relacionada se mueva. Si su herramienta actual sortea al usuario una vez y reaprovecha el reparto, ese es el ítem que necesita cambiar antes de que cualquier refinamiento estadístico valga algo.

Preguntas frecuentes

Las respuestas cortas están en la sección de preguntas frecuentes de esta página, generadas a partir del mismo material medido aquí.

Referencias

Lee también

Leia em português

Preguntas frecuentes

¿Qué es el efecto de arrastre entre tests A/B?
Es cuando los mismos usuarios que fueron afectados por el primer experimento son reaprovechados en el experimento siguiente, y el residuo del primero contamina la lectura del segundo. El término viene del sistema de buckets usado por las plataformas grandes: los usuarios son sorteados una vez en buckets, y son los buckets los que van siendo asignados de experimento en experimento. Como el sorteo no se repite en cada test, quien estuvo en el tratamiento ayer tiende a estar en el tratamiento de nuevo hoy, cargando consigo todo lo que el test anterior hizo con él.
¿Cuánto tiempo dura el efecto de arrastre?
Más de lo que sugiere la intuición. Kohavi y coautores registran dos casos en Bing: en uno de ellos, un experimento de 47 días dejó un residuo medible en los mismos buckets por cerca de tres semanas después de apagado; en el otro, un bug que expuso a los usuarios a una experiencia muy mala dejó los buckets sin volver a los niveles anteriores incluso después de tres meses. En la simulación de este artículo, con vida media de 14 días, la tasa de falso positivo de un test A/A solo volvió al nivel nominal de 5 por ciento después de 60 días de descanso.
¿El test A/A detecta el efecto de arrastre?
Lo detecta, y es la principal defensa disponible cuando usted no puede re-sortear. En nuestra simulación, un test A/A corrido inmediatamente después de un experimento que dejó el tratamiento 0,60 punto porcentual abajo acusó resultado significativo en 93,30 por ciento de las réplicas, contra el 5 por ciento esperado. Un único A/A de esos devolvió 4,8800 por ciento contra 4,3333 por ciento, con valor p de 0,001404 e intervalo de confianza de menos 0,8821 a menos 0,2112 punto porcentual: un resultado fuerte y completamente falso.
¿La verificación de SRM no detecta ese problema?
No, y esa es la parte peligrosa. El SRM busca desvío en la PROPORCIÓN de usuarios entre los brazos, y en el efecto de arrastre el reparto está perfecto. En nuestro ejemplo trabajado, los dos brazos recibieron exactamente 30.000 usuarios y el test de chi cuadrado devolvió estadístico 0,0000 y valor p 1,0000. El sorteo está bien, el conteo está bien, y aun así la lectura está mal. Ningún verificador de proporción va a levantar la mano aquí.
¿Cuál es la corrección definitiva del efecto de arrastre?
Re-sortear los usuarios en cada experimento, lo que Kohavi y coautores llaman re-aleatorización localizada. La implementación que describen es un sistema de buckets en dos niveles, en el que el primer nivel define quién entra en el experimento y el segundo hace la asignación de tratamiento con una semilla de hash distinta por experimento. En nuestra simulación, con re-sorteo la tasa de falso positivo quedó entre 4,47 y 6,00 por ciento en todos los intervalos de descanso probados, incluido el descanso cero.
¿Cuál es el costo de re-sortear en cada experimento?
Usted pierde el control compartido. Kohavi y coautores registran esa desventaja de forma explícita: con re-aleatorización por experimento, cada experimento necesita su propio control, para que cualquier residuo del experimento anterior quede mezclado por igual entre control y tratamiento. A cambio aparece una ganancia que compensa bien: se puede correr un test A/A retrospectivo sin gastar tiempo de calendario, reevaluando los últimos días antes del experimento como si fueran un A/A. Si ese A/A acusa efecto en las métricas principales, con valor p por debajo de 0,2 por ejemplo, se cambia la clave de hash y se intenta de nuevo.