# inferencia-causal-practica-con-dowhy-y-grafos-dirigidos-dags
Inferencia Causal Práctica con DoWhy y Grafos Dirigidos (DAGs)
Volver a la portada del cursoImplementació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,educacioneingreso_previoinfluyen 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_graphencuentra 3 independencias conk=1y 10 conk=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.