Saltar al contenido

# inferencia-causal-practica-con-dowhy-y-grafos-dirigidos-dags

Inferencia Causal Práctica con DoWhy y Grafos Dirigidos (DAGs)

Volver a la portada del curso
Lectura (Markdown)

Implementación del Proyecto

Sección 6 · Proyecto Final de Inferencia Causal

Implementación del proyecto

Una secretaría de trabajo ofreció un programa de capacitación laboral y quiere saber cuánto aumentó el ingreso mensual de quienes lo tomaron. No hubo sorteo: la gente decidió inscribirse. Tu trabajo es estimar el efecto causal total del programa con DoWhy, defender el grafo y mostrar que la estimación resiste las pruebas. Esta lección recorre la implementación; el notebook adjunto al proyecto tiene la solución completa.

Los datos

Son 4,000 personas simuladas con semilla fija, de modo que tus números coincidan con los de referencia:

import numpy as np
import pandas as pd

def generar_capacitacion(n=4000, semilla=3):
    rng = np.random.default_rng(semilla)
    edad = rng.uniform(20, 55, n)
    educacion = rng.integers(6, 18, n)
    ingreso_previo = 4000 + 300 * educacion + 50 * (edad - 20) + rng.normal(0, 1500, n)
    z = 1.5 - 0.04 * (edad - 20) + 0.08 * (educacion - 12) - 0.0003 * (ingreso_previo - 8000)
    programa = rng.binomial(1, 1 / (1 + np.exp(-z)))
    horas = 30 + 6 * programa + rng.normal(0, 5, n)
    ingreso = (2000 + 0.8 * ingreso_previo + 250 * educacion + 1000 * programa
               + 60 * horas + rng.normal(0, 1500, n))
    responde = rng.binomial(1, 1 / (1 + np.exp(-(-1 + 1.5 * programa + 0.0004 * (ingreso - 12000)))))
    return pd.DataFrame(dict(edad=edad.round(1), educacion=educacion,
                             ingreso_previo=ingreso_previo.round(0), programa=programa,
                             horas=horas.round(1), ingreso=ingreso.round(0), responde=responde))

Las columnas: edad, educacion (años), ingreso_previo (pesos al mes antes del programa), programa (0/1), horas trabajadas por semana después del programa, ingreso mensual después del programa y responde (si la persona contestó la encuesta de seguimiento).

Paso 1: clasificar las variables

Antes de escribir código, decide el papel de cada variable respecto a programa → ingreso:

  • Confusores: edad, educacion e ingreso_previo influyen en quién se inscribe y en el ingreso futuro.
  • Mediador: horas. El programa aumenta las horas trabajadas, y eso aumenta el ingreso. Es parte del efecto total.
  • Colisionador: responde. Depende del programa y del ingreso.

Con esa tabla, el DAG se escribe casi solo, y identify_effect debe proponer como conjunto de puerta trasera exactamente los tres confusores.

Paso 2: la comparación ingenua engaña

Quienes tomaron el programa ganan solo 498.8 pesos más al mes que quienes no lo tomaron. Pero el programa atrajo a personas más jóvenes y con menor ingreso previo (7,972 contra 8,968 pesos): la selección esconde parte del efecto. Este es el caso contrario al de los cupones, donde la selección lo inflaba.

Paso 3: estimar con el conjunto correcto

Con los tres confusores, los estimadores de DoWhy dan:

  • Regresión lineal: 1,382.4 pesos (IC 95%: 1,277.6 a 1,487.3)
  • IPW: 1,423.6
  • Emparejamiento: 1,428.9
  • Estratificación: 1,356.6

El efecto total verdadero de la simulación es de 1,360 pesos: 1,000 directos más 360 a través de las horas (6 horas × 60 pesos).

Paso 4: los dos errores tentadores

Si añades horas al ajuste, la regresión da 1,010.7: estimas solo el efecto directo y pierdes la parte mediada. Si analizas solo a quienes respondieron la encuesta, una práctica muy común, el efecto cae a 1,058.4 aunque ajustes por los confusores, porque condicionaste en un colisionador. Muestra ambos números en tu reporte: explican por qué el grafo importa.

Paso 5: validar

  • Grafo: con df.astype(float), refute_graph encuentra 3 independencias con k=1 y 10 con k=2; los datos cumplen todas.
  • Placebo: el efecto pasa a −5.3 (p = 0.96).
  • Estabilidad: causa común aleatoria, 1,382.5; submuestra del 80%, 1,384.3.
  • Sensibilidad: evaluando celda por celda un confusor oculto que invierte el tratamiento con probabilidad de 0.02 a 0.1 y suma de 500 a 2,000 pesos al ingreso, el efecto queda entre 1,144.0 y 1,568.3. En ningún caso se acerca a cero.

Trampas comunes

  • Meter todas las columnas en la regresión "por si acaso": incluye el mediador y sesga hacia el efecto directo.
  • Filtrar filas incompletas o sin respuesta sin pensar en por qué faltan.
  • Reportar un solo estimador sin intervalos ni refutadores.
  • Confundir efecto total y efecto directo en la conclusión: para decidir si el programa vale la pena, el número relevante es el total.

Cierre

Con estos cinco pasos tienes el contenido del reporte. La siguiente lección define los entregables y la rúbrica.

Recursos