Python Data Science Program
📓 Abrir notebook en GitHub

Clase 187 — Diseño experimental

Parte: 3 — Estadística Inferencial y Causal · Fuente: Montgomery, Design and Analysis of Experiments (8ª ed.) + Kohavi, Tang & Xu (cap. 4-5). ⏱️ Duración estimada: 80 min.

🎯 Objetivo

Pasar del A/B simple a diseños más ricos: bloques aleatorizados, factorial completo / fraccional, diseños cruzados (cross-over), switchback para experimentos con interferencia, y cluster randomization cuando la unidad de análisis no coincide con la unidad de tratamiento. Saber qué problema resuelve cada diseño y leer las consideraciones de SUTVA (Stable Unit Treatment Value Assumption).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Factorial 2²: simulá CTR con ctr = 0.10 + 0.02·A + 0.015·B + 0.005·A·B + ε. Hacé el experimento con 1 000 obs por celda. Ajustá ols('ctr ~ A * B', data).fit() y reportá los 4 coeficientes (intercepto, A, B, A:B). Verificá contra el verdadero.
  2. Bloqueo: simulá un experimento de uplift en tasa de retención por país con paises = ['AR','BR','MX'] con baselines distintos (p0 ∈ {0.5, 0.3, 0.4}). Compará: A/B sin estratificar vs bloqueado por país. Mostrá cómo el SE de δ cae con bloqueo.
  3. Fraccional 2^(4-1): usá pyDOE2.fracfact('a b c d') y discutí qué interacciones quedan aliased. ¿Cuántas corridas vs full factorial?
  4. Cluster randomization: simulá 50 escuelas con 30 alumnos c/u, ICC=0.10, efecto verdadero 0.3. Compará t-test ingenuo (n=1500) vs análisis correcto a nivel cluster (n=50). El primero infla α; el segundo es correcto.
  5. Switchback: simulá precio dinámico en una ciudad con bloques de 1 h alternando A y B durante 7 días. Análisis: comparar bloques A vs B con tests pareados por hora-del-día.

📝 Homework verificable

Sobre un dataset simulado de factorial 2³ (3 factores binarios, ej.: color × texto × posición sobre conversion):

  1. Generar datos con efectos principales no nulos y una interacción A:B.
  2. Ajustar OLS con todos los términos hasta triple.
  3. Reportar la tabla ANOVA y identificar los términos significativos.
  4. Verificar gráficamente la interacción A:B con sns.pointplot(x='A', y='conv', hue='B').
  5. Discutir en 3 líneas qué pasaría si hubieras hecho 3 A/B tests separados en vez del factorial.

Criterio de aceptación: el OLS recupera los efectos verdaderos; la ANOVA marca A, B y A:B como significativos; el análisis muestra que el factorial requiere menos corridas totales que 3 A/B independientes (típicamente la mitad) y además detecta la interacción.

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Hago A/B en una red social y "el grupo control mejora también" SUTVA violada por contaminación (el control ve features compartidas con el tratamiento). Fix: cluster randomization o switchback.
Análisis a nivel individual de experimento con cluster randomization α inflado por correlación intra-cluster. Fix: análisis a nivel cluster, modelo mixto (statsmodels.MixedLM), o GEE.
Asumo interacción nula y la interpretación es engañosa Si A solo funciona cuando B está activo, los efectos principales son chicos pero la combinación es excelente. Fix: factorial con interacciones.
Cross-over sin washout y carry-over inflado El efecto del tratamiento 1 contamina la medición del 2. Fix: período de washout o diseño Williams.
Hago RBD pero no bloquéo lo que importa Si bloqueás por país pero el efecto importante es plataforma, no ganás nada. Fix: identificá ANTES la variable nuisance de mayor varianza.

❓ Preguntas frecuentes

❓ ¿Cuándo factorial vs A/B múltiple?

Casi siempre factorial. A/B múltiple (1 factor a la vez) requiere más muestra y no detecta interacciones. Factorial 2² con n por celda tiene la misma precisión que dos A/B independientes con ~n total.

❓ ¿Cuántos factores antes de necesitar fraccional?

Con 2^k = 16 (k=4) ya tenés 16 celdas → si querés ~1 000 por celda son 16 000 obs. Manejable. A partir de k=5 (32 celdas) considerar fraccional, sobre todo si esperás interacciones de alto orden insignificantes.

❓ ¿Cuándo cluster randomization?

Cuando hay contaminación natural: educación (alumnos en la misma aula), salud pública (familias), marketplaces (oferta + demanda compartidas). Costo: n efectivo cae con ICC; necesitás muchos clusters.

❓ ¿Switchback es válido si hay tendencia temporal?

Sí pero requiere modelar la tendencia (ej.: incluir hora del día como covariable). Si tu métrica tiene fuerte estacionalidad y bloques son largos, mejor diseño Latin square en el tiempo.

❓ ¿Diseño antes o análisis primero?

Diseño primero, siempre. El análisis sin diseño correcto produce conclusiones sospechosas (Simpson, confounders, peeking). "You can't analyze your way out of a bad design" (Tukey).

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 188 — Inferencia causal: DAGs, confounders, instrumentos