Estadística

SRM: reparto desigual de tráfico en test A/B

Qué es el SRM, cómo funciona la prueba chi cuadrado, qué desvío tan pequeño ya invalida el test A/B y cómo encontrar la causa raíz.

Ilustración plana de una tubería que se divide en chorros desiguales de partículas cayendo en recipientes con niveles diferentes, en tonos de verde profundo

El SRM es una diferencia estadísticamente significativa entre el reparto de tráfico que configuraste y el que realmente ocurrió, y es la verificación que decide si el resto de tu análisis significa algo. Si un test 50/50 termina en 50,6 contra 49,4, eso no es un detalle de redondeo. Es evidencia de que algo decidió dónde cayó cada visitante, y en el momento en que algo más allá del aleatorizador está eligiendo, los dos grupos dejan de ser comparables y la diferencia de conversión entre ellos no es el efecto de tu cambio. Esta guía cubre qué es la verificación, qué desvío tan pequeño ya reprueba, cómo leer el resultado del chi cuadrado, de dónde vienen los desvíos y qué hacer cuando encuentras uno. Forma parte de nuestra guía completa de test A/B y es la otra mitad, junto a significancia estadística en test A/B, de un resultado confiable.

Qué significa el SRM de verdad

La aleatorización es el argumento entero de un test A/B. Es ella la que permite afirmar que la única diferencia sistemática entre control y variante es el cambio que subiste. El reparto de muestra es la evidencia observable más barata de que la aleatorización funcionó, porque ya sabes la respuesta de antemano: configuraste 50/50, esperas algo cerca de 50/50.

“Cerca de” está haciendo trabajo pesado en esa frase, y la prueba chi cuadrado de bondad de ajuste es lo que lo vuelve preciso. Hace una sola pregunta: si la asignación fuera realmente justa, ¿con qué frecuencia el azar por sí solo produciría una diferencia al menos de este tamaño? Cuando esa probabilidad cae por debajo del umbral de alarma, el azar deja de ser una explicación plausible.

Reparto esperado contra reparto observado en un test con SRMUn test configurado al cincuenta por ciento con 48.005 visitantes en total espera 24.002,5 por grupo. Observó 24.301 en el control y 23.704 en la variante, una diferencia de 597 visitantes. El chi cuadrado es 7,42 con un grado de libertad, lo que da un valor p de 0,0064, por debajo del umbral de alarma del uno por ciento.Configurado 50/50, observado otra cosaesperado24.002,524.002,5observado24.301 control23.704 variante597 visitantes a la derivachi cuadrado 7,42 con 1 grado de libertad, valor p 0,0064por debajo del umbral del 1%, así que esto es SRM, no azarUn reparto 50,62 / 49,38 parece inofensivo en un panel. La aritmética discrepa.
La diferencia es el 1,2% del tráfico. A ese tamaño de muestra, ya basta para volver el azar una explicación irracional.

La consecuencia es severa y vale decirla sin rodeos. Fabijan y colegas, escribiendo sobre experimentación en Microsoft, Booking.com, Outreach.io y Online Dialog, describen el SRM como una condición que en la mayoría de los casos invalida por completo el resultado del experimento. No es una salvedad al pie. Es una señal de alto.

Qué desvío tan pequeño ya reprueba

La parte incómoda del SRM es que la tolerancia se encoge a medida que el test crece. La diferencia absoluta que dispara la alarma crece más o menos con la raíz cuadrada de la muestra total, así que, como porcentaje del tráfico, se va apretando. Un reparto que describirías como “prácticamente igual” muchas veces ya es un SRM.

Total de visitantes Menor diferencia que dispara Reparto resultante
2.000 116 visitantes 52,90 / 47,10
10.000 258 visitantes 51,29 / 48,71
20.000 366 visitantes 50,91 / 49,09
50.000 576 visitantes 50,58 / 49,42
100.000 816 visitantes 50,41 / 49,59
200.000 1.152 visitantes 50,29 / 49,71

Números calculados con la misma prueba chi cuadrado de bondad de ajuste que usa la calculadora de abajo, con umbral de alarma del 1% y reparto esperado de 50/50. La columna del medio es la diferencia entre las dos ramas.

Lee la última fila otra vez. Con 200.000 visitantes, un reparto de 50,29 contra 49,71 es SRM. Ningún ser humano mirando un panel marcaría eso. Ese es el motivo entero de que la verificación tenga que ser automática y numérica, y no una mirada.

Verificador de SRM (sample ratio mismatch)
A
B

Completa al menos dos variaciones. La asignación esperada es el peso relativo del split (1 y 1 = 50/50, 9 y 1 = 90/10).

χ² (chi-cuadrado)-
Grados de libertad-
valor-p-
VariaciónVisitantes observadosEsperado% real

Test de chi-cuadrado de bondad de ajuste entre la división observada y la esperada. Da la alarma cuando el valor-p cae por debajo de 0,01: con ese split, una diferencia así es demasiado rara para ser azar. El SRM invalida el test, revisa el motor de asignación antes de leer la conversión.

Leyendo el chi cuadrado sin ceremonia

El estadístico es lo bastante simple para calcularlo a mano, y vale hacerlo una vez para que el número deje de parecer una caja negra. Para cada grupo tomas la distancia al cuadrado entre observado y esperado, la divides por el esperado, y sumas todo.

Con 48.005 visitantes en total y reparto configurado en 50/50, cada grupo esperaba recibir 24.002,5. El control recibió 24.301, la variante recibió 23.704, así que cada uno está a 298,5 de su expectativa.

chi cuadrado = (24.301 - 24.002,5)^2 / 24.002,5
             + (23.704 - 24.002,5)^2 / 24.002,5
             = 89.102,25 / 24.002,5  x  2
             = 7,42   (1 grado de libertad)

valor p      = 0,0064

El grado de libertad es el número de grupos menos uno, así que un test de dos ramas tiene uno. El valor p responde a la única pregunta que importa: una moneda honesta produciría una diferencia de este tamaño o mayor cerca de 6 veces en 1.000. No es imposible, pero es una mala apuesta cuando la explicación alternativa es un bug que puedes ir a buscar.

Dos observaciones que evitan discusión. Primera: el umbral del SRM es deliberadamente más rígido que el 0,05 que usas para conversión, porque cada test que corres es una oportunidad más de disparar una falsa alarma, y el coste de investigar una es de algunas horas mientras que el coste de dejar pasar una es una decisión equivocada. Un umbral del 1% es un estándar de trabajo común y es el que usa la calculadora de arriba. Segunda: el valor p del SRM no mide el tamaño del sesgo. Solo dice cuánto puedes confiar en que el desequilibrio es real. Un sesgo sistemático minúsculo y real en un test enorme produce un valor p aterrador y quizá apenas mueva tu métrica, mientras que un sesgo grande en un test pequeño puede pasar rozando. Úsalo como disparador de investigación, nunca como nota de gravedad.

Ejemplo trabajado: la ganadora que no existía

Un equipo de e-commerce testea un checkout reconstruido. El test se configura 50/50 y corre hasta 48.005 visitantes. Este es el marcador que llevan a la reunión.

Corre esos números y obtienes z = 1,943, valor p = 0,0520, mejora relativa de +8,33% e intervalo de confianza sobre la diferencia de -0,003 a +0,753 puntos porcentuales. Fuera de la significancia por poco, en dirección positiva, y lo bastante grande para importar comercialmente. El instinto de la sala es correr dos días más.

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 instinto está equivocado, y no por el valor p. El reparto es 50,62 / 49,38, que, como calculamos arriba, es SRM con p = 0,0064. Los 597 visitantes que nunca llegaron a la variante son la historia, y nadie en la sala sabe quiénes eran.

He aquí por qué reequilibrar no salva esto. Supongamos que preguntamos cuál habría sido el resultado si esos 597 visitantes hubieran aparecido. Dos escenarios honestos de contorno:

Si se hubieran comportado exactamente como el control y convertido al 4,502%, la variante mostraría 24.301 visitantes y cerca de 1.183 compras. Resultado: p = 0,0561, ganancia +8,14%, intervalo de -0,009 a +0,742 puntos porcentuales.

Si fueran visitantes que no lograron completar y hubieran convertido a cero, la variante mostraría 24.301 visitantes y 1.156 compras, una tasa de 4,757%. Resultado: p = 0,1808, ganancia +5,67%, intervalo de -0,118 a +0,629 puntos porcentuales.

El resultado observado queda entre “casi ahí” y “claramente nada”, y los datos no consiguen decir cuál de los dos es. Esa es la definición de experimento inválido. En este caso la causa raíz era una redirección que agotaba el tiempo en conexiones móviles lentas, lo que significa que el segundo escenario está más cerca de la verdad: los visitantes que desaparecieron eran desproporcionadamente los menos propensos a comprar, y su ausencia infló la tasa de la variante. Después de corregir la redirección y correr de nuevo, el reparto volvió en 24.102 / 24.088 (chi cuadrado 0,004, p = 0,949) y el resultado fue 4,502% contra 4,583%: p = 0,6675, ganancia +1,81%, intervalo de -0,290 a +0,453 puntos porcentuales. Inconcluso, y honesto.

Lo que el resultado contaminado podría ser, y lo que mostró el retest limpioEl test contaminado reportó un valor p de 0,052 y una ganancia relativa del 8,33 por ciento. Si los visitantes ausentes hubieran convertido como el control, el valor p sería 0,056; si hubieran convertido a cero, sería 0,181. El retest limpio tras corregir la redirección devolvió un valor p de 0,667 y una ganancia del 1,81 por ciento.Un número reportado, tres verdades posibles, una respuesta limpiap 0,052reportado+8,33%contaminadop 0,056+8,14%ausentes = controlp 0,181+5,67%ausentes = cerop 0,667+1,81%retest limpioLa altura de la barra es peso visual de la evidencia, no escala del valor p.
Las tres barras del medio son todas compatibles con los datos recogidos. Solo el retest responde a la pregunta que el equipo realmente hizo.

De dónde vienen los desvíos

La taxonomía del KDD 2019 es útil justamente porque organiza las causas por la etapa en la que aparecen, que es también cómo decides de quién es la corrección. El artículo identifica 25 causas distintas agrupadas en cinco etapas.

Etapa Qué sale mal Síntoma típico
Asignación El aleatorizador no es independiente: semilla compartida, bucket heredado de un test anterior, regla de exclusión que pilla una sola rama Desvío presente desde la primera hora, estable en tamaño, visible en un test A/A
Ejecución Una variante carga más despacio, una redirección falla, el flag llega tarde, la telemetría nunca dispara para parte de los usuarios El desvío aparece solo en ciertos dispositivos o conexiones, y las métricas de rendimiento empeoran del mismo lado
Procesamiento de logs Filtro de bots, deduplicación o un join que descarta filas de forma desigual entre las variantes El desvío aparece en el data warehouse pero no en los logs crudos de asignación
Análisis Disparo o filtro aplicado a un solo grupo, segmento definido después del hecho, recorte de fechas que corta una rama Desvío presente en el informe filtrado y ausente en el informe completo
Interferencia Otro experimento corriendo a la vez, con segmentación correlacionada con la tuya El desvío aparece solo mientras el otro test está en el aire

La distinción entre la etapa de análisis y las demás es la que más tiempo ahorra. Si el reparto está bien en la población completa y roto solo en tu vista filtrada, el experimento probablemente está sano y tu consulta no.

El orden de diagnóstico que encuentra más rápido

Fabijan y colegas publican diez reglas prácticas para estrechar la causa. Condensadas en el orden que resuelve la mayoría de los casos rápido:

  1. Compara el informe filtrado con el informe completo. Si el desvío solo existe en la vista filtrada, la condición de disparo está mal, no el experimento. Relaja el filtro por etapas hasta que desaparezca.
  2. Segmenta por atributo de usuario. Un desvío confinado a un navegador, una versión de app o un país es causa localizada, normalmente un recurso que la variante asume y ese segmento no tiene.
  3. Segmenta por tiempo. Evidencia más fuerte el primer día que luego desaparece apunta a caché, despliegue tardío de la variante o inicio escalonado, no a un aleatorizador roto.
  4. Mira las métricas de rendimiento del lado que perdió gente. Una variante que aumentó el tiempo de carga pierde telemetría de los usuarios más lentos, y eso produce el desvío y la métrica peor por la misma causa raíz.
  5. Mira el engagement. Si el engagement medio por usuario es mayor en la rama que perdió usuarios, la causa está golpeando más a los usuarios menos comprometidos, y viceversa.
  6. Cuenta cuántos experimentos fueron afectados. Varios tests sin relación saltando a la vez significa causa sistémica, que vive en la plataforma y no en ningún test específico.
  7. Corre un test A/A. Un desvío en un A/A es problema de plataforma por definición, y la calculadora de test A/A es la forma más barata de mantener esa línea base honesta.

La regla 7 merece destaque porque invierte el clima de la sala. Cuando un test salta SRM, la discusión siempre es sobre si ese test específico está roto. Un A/A resuelve eso sin ninguna de esas políticas, porque no hay resultado al que nadie esté apegado.

Qué hacer cuando encuentras uno

Las reglas aquí son cortas, y una de ellas es impopular.

No reequilibres. Recortar la rama mayor o reponderar los conteos asume que los visitantes que sobraron o faltaron eran un sorteo aleatorio. El desvío es la evidencia de que no lo eran. Lo que hagas después hereda el sesgo.

No reportes el resultado con una salvedad. Un test que saltó no es un resultado más débil, es un resultado desconocido, y un número en una diapositiva sobrevive a todo asterisco que le claves.

Encuentra la etapa primero, la causa después. La tabla de arriba convierte una cacería vaga en tres o cuatro verificaciones dirigidas, y la mayoría de los desvíos se resuelve en las dos primeras reglas de la lista de diagnóstico.

Guarda el test reprobado en el acervo. Un desvío que diagnosticaste es una mejora permanente en la plataforma y pertenece al repositorio de experimentos exactamente igual que una ganadora que subió. Los programas que borran los tests inválidos redescubren el mismo bug cada trimestre.

Comprueba temprano y al final. Correr la verificación el primer día pilla bugs de asignación y de despliegue mientras reiniciar todavía es barato. Correrla otra vez al final pilla problemas de procesamiento de logs y de análisis, que solo aparecen después de que el dato es agregado. Ninguna de las dos es peeking, porque estás mirando el reparto de tráfico y no la métrica de resultado. El problema del peeking vale para mirar el resultado y decidir si paras, que es un acto completamente distinto.

Errores comunes con el SRM

Error Qué produce
Nunca correr la verificación Todo sesgo de este tipo sube en silencio, y el programa no distingue victoria real de reparto roto
Mirar el reparto en vez de testearlo A escala, un desvío que importa parece perfectamente equilibrado en un panel
Tratar el valor p del SRM como nota de gravedad Los tests enormes saltan por sesgos reales minúsculos con valores p aterradores; los tests pequeños esconden sesgos grandes
Reequilibrar o reponderar las ramas Preserva el sesgo y elimina su evidencia
Comprobar solo el informe filtrado Confunde una consulta de análisis rota con un experimento roto
Reiniciar sin encontrar la causa El mismo desvío vuelve, normalmente en el test que más importaba
Usar umbral de 0,05 Demasiada falsa alarma en un programa movido, lo que entrena al equipo a ignorar la verificación

Hazlo automático en Donnu

Una verificación de SRM solo protege el programa si corre en todos los tests sin que nadie tenga que acordarse de pedirla. Donnu A/B compara el reparto observado con el configurado de forma continua, salta el desvío antes de que los números de conversión sean presentados y no después, y retiene el veredicto en vez de mostrar una ganancia que el reparto ya invalidó. El reparto, los conteos esperados y el resultado del chi cuadrado quedan al lado del resultado, así que la primera pregunta de la reunión ya está respondida antes de que nadie abra la discusión.

Empieza una prueba gratis de 14 días y corre la verificación contra tu propio reparto de tráfico.

Referencias

Lee también: Qué es un test A/B · Significancia estadística en test A/B · El problema del peeking · Errores que invalidan un test A/B · Verificador de SRM gratis · Leia em português · Read in English

Preguntas frecuentes

¿Qué es el SRM en un test A/B?
El SRM (sample ratio mismatch, o reparto desigual de muestra) es una diferencia estadísticamente significativa entre el reparto de tráfico que configuraste y el reparto que realmente ocurrió. Si configuraste 50/50 y terminaste con el 50,6% de los visitantes en el control, esa diferencia es azar o es un bug, y una prueba chi cuadrado de bondad de ajuste dice cuál de los dos. Cuando la prueba salta, los dos grupos han dejado de ser poblaciones comparables, así que la diferencia de conversión entre ellos ya no puede leerse como efecto del cambio. Fabijan y colegas (KDD 2019) describen el SRM como una condición que, en la mayoría de los casos, invalida por completo el resultado del experimento.
¿Qué desvío tan pequeño ya cuenta como SRM?
Menor de lo que casi todo el mundo imagina, y el límite se aprieta a medida que el test crece. En un reparto 50/50 con 10.000 visitantes en total, una diferencia de unos 258 visitantes entre las ramas (51,29% contra 48,71%) ya cruza el umbral del 1% en el valor p. Con 100.000 visitantes bastan unos 816 visitantes de diferencia, lo que da un reparto de 50,41% contra 49,59%. La diferencia absoluta crece más o menos con la raíz cuadrada de la muestra, así que la tolerancia porcentual solo se encoge. Por eso mirar el panel nunca funciona: a escala, un reparto que parece perfectamente equilibrado puede ser un SRM claro.
¿Puedo reequilibrar los grupos y analizar igualmente?
No, y ese es el error más caro de todo el tema. Recortar el grupo mayor o reponderar los números asume que los visitantes que faltaron (o sobraron) eran una muestra aleatoria, y es exactamente esa suposición la que el SRM derriba. Los visitantes que desaparecieron normalmente desaparecieron por un motivo ligado al propio cambio: página más lenta, redirección que falla, filtro de bots que se comporta distinto entre variantes. Reequilibrar esconde el síntoma y mantiene el sesgo. El único camino seguro es encontrar la causa raíz, corregir y volver a correr.
¿El SRM es común en programas reales?
Más común de lo que los equipos suponen. Fabijan, Gupchup, Gupta, Omhover, Qin, Vermeer y Dmitriev reportan que aproximadamente el 6% de los experimentos en Microsoft presentaron SRM en el periodo estudiado, y observan que un producto que corre diez mil experimentos al año puede esperar al menos un SRM por día. El mismo artículo cita trabajo en LinkedIn indicando que cerca del 10% de los análisis con disparo (triggered) tenían SRM. Si tu programa nunca ha saltado uno, la explicación más probable es que nadie está corriendo la verificación.
¿El SRM vale para repartos que no son 50/50?
Vale, y los repartos desiguales merecen más atención, no menos. La prueba chi cuadrado de bondad de ajuste compara cada grupo con su conteo esperado, así que funciona para 90/10, 80/20 o cualquier número de ramas. Los diseños desiguales también son más frágiles: una rampa 90/10 que termina en 44.600 y 5.400 usuarios de un total de 50.000 parece cerca del objetivo, pero produce un chi cuadrado de cerca de 35,6 y un valor p cercano a 2,5 en mil millones, porque la rama pequeña es donde unos cientos de usuarios mal enrutados duelen más.
¿Cuáles son las causas más frecuentes de SRM?
La taxonomía del KDD 2019 agrupa las causas por la etapa en la que aparecen: asignación, ejecución, procesamiento de logs, análisis e interferencia entre experimentos. En la práctica, los reincidentes son una redirección que pierde tráfico de un lado, una variante que carga más despacio y pierde telemetría de los usuarios más lentos, un filtro de bots que trata a las variantes de forma distinta, un filtro de análisis aplicado a un solo grupo, y un segundo experimento solapando el tuyo. La etapa importa porque es la que dice de quién es la corrección.
¿Debo comprobar el SRM durante el test o solo al final?
Los dos, y la comprobación temprana es la que ahorra dinero. Córrela el primer día para pillar bugs de asignación y de despliegue mientras reiniciar todavía es barato, y córrela otra vez al final, antes de leer cualquier número de conversión. Comprobar el reparto a mitad de camino no es peeking: estás mirando el reparto de tráfico, no la métrica de resultado, así que eso no infla la tasa de falso positivo de la prueba de conversión. El peeking es mirar el resultado y decidir si paras, que es otro acto.