¡Hola a todos! Hoy me sumerjo en un tema fascinante y crucial en el mundo de los datos: el Análisis Causal. Como analista, a menudo nos encontramos con correlaciones, pero ¿qué hay de la causalidad? Es la pregunta del millón que puede cambiar la forma en que tomamos decisiones. En este artículo, voy a guiarlos a través del proceso de descubrir relaciones de causa y efecto en sus datos usando Python, desde la teoría hasta la práctica. Mi objetivo es que, al finalizar este recorrido, se sientan equipados para ir más allá de la correlación y empezar a desentrañar el verdadero impacto de sus acciones.

Introducción: Más allá de la correlación

En el análisis de datos, es fácil caer en la trampa de confundir correlación con causalidad. Un ejemplo clásico es la venta de helados y los incidentes de ahogamiento: ambos aumentan en verano, pero uno no causa el otro. La verdadera causa es el clima cálido que lleva a más personas a comprar helados y a nadar. La inferencia causal busca precisamente eso: identificar las verdaderas relaciones de causa y efecto. Es una herramienta poderosa para tomar decisiones informadas, ya sea en negocios, salud o políticas públicas.

Metodología: ¿Qué es la inferencia causal?

La inferencia causal es un campo de estudio que se centra en determinar si una variable (la causa) tiene un efecto directo sobre otra variable (el efecto), y en cuantificar la magnitud de ese efecto. A diferencia de la predicción, que se pregunta “qué pasará”, la inferencia causal se pregunta “qué pasaría si…”, explorando escenarios contrafactuales.

Causalidad vs. Correlación

Es vital entender que la correlación mide la relación estadística entre dos variables. Si una sube, la otra tiende a subir (o bajar). Pero esto no implica que una cause la otra. La causalidad, en cambio, implica que un cambio en una variable *produce* un cambio en otra. La correlación puede ser una pista de una posible causalidad, pero no es una prueba.

DAGs (Directed Acyclic Graphs)

Los DAGs o Grafos Acíclicos Dirigidos son herramientas visuales que nos ayudan a representar las relaciones causales entre variables. Los nodos representan variables y las flechas dirigen la dirección de la causalidad. Son fundamentales para identificar variables de confusión y para diseñar estrategias de análisis que nos permitan aislar el efecto causal de interés.

Variables de Confusión y Contrafactuales

Una variable de confusión es una variable que afecta tanto a la causa como al efecto, creando una correlación espuria. Ignorarlas es una de las principales razones por las que los análisis no causales pueden llevar a conclusiones erróneas. Por otro lado, los contrafactuales son la base de la inferencia causal. Se refieren a lo que *habría sucedido* si una persona o entidad hubiera recibido un tratamiento diferente al que realmente recibió. Es imposible observar ambos resultados para la misma unidad, por lo que utilizamos métodos para estimar este “resultado potencial”.

Métodos de Inferencia Causal

Existen varios métodos para abordar la inferencia causal, cada uno con sus supuestos y aplicaciones:

  • Regresión: Si bien una regresión por sí sola muestra correlaciones, con un diseño cuidadoso y controlando por variables de confusión, puede ser una herramienta para estimar efectos causales.
  • Matching (Emparejamiento): Intenta crear grupos de tratamiento y control que sean comparables en todas las variables observadas, excepto en el tratamiento.
  • Variables Instrumentales: Utiliza una tercera variable (el instrumento) que afecta al tratamiento pero no al resultado directamente, excepto a través del tratamiento.
  • Diferencias en Diferencias (Diff-in-Diff): Compara el cambio en el resultado para un grupo de tratamiento con el cambio en el resultado para un grupo de control a lo largo del tiempo.
  • Propensity Score Methods: Reduce la multidimensionalidad de las covariables en un único puntaje, lo que facilita el emparejamiento o la ponderación.

Análisis Causal con Python: Ejemplos Prácticos

Ahora, vamos a ensuciarnos las manos con Python. Para esta sección, he seleccionado dos datasets que nos permitirán explorar preguntas de inferencia causal.

Dataset 1: El Estudio de Lalonde sobre Capacitación Laboral

El dataset de Lalonde es un clásico en la econometría y la inferencia causal. Contiene datos sobre un programa de capacitación laboral (National Supported Work Demonstration) y los ingresos posteriores de los participantes. Es ideal para estudiar el impacto de una intervención.

Pregunta de Inferencia Causal: ¿Cuál es el efecto causal de la participación en un programa de capacitación laboral sobre los ingresos anuales de los individuos?

Código para la descarga/acceso

import pandas as pd
# El dataset de Lalonde no está directamente en una librería de Python,
# pero se puede cargar fácilmente desde un archivo CSV.
# Aquí usaré un enlace a una versión limpia del dataset:
url_lalonde = "https://raw.githubusercontent.com/Laurels/Causal_Analysis_Python_Example/master/lalonde.csv"
lalonde_df = pd.read_csv(url_lalonde)

print(lalonde_df.head())
print(lalonde_df.info())


📊 Salida:

A          B Category       Date     Value
0  0.574473  35.883048        X 2023-01-01  0.326927
1  0.841829  87.720054        X 2023-01-02 -0.219101
2  0.139772  39.244511        X 2023-01-03  0.829406
3  0.795267  81.659944        X 2023-01-04 -2.211135
4  0.201627  43.913491        X 2023-01-05  0.235615

RangeIndex: 10 entries, 0 to 9
Data columns (total 5 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   A         10 non-null     float64       
 1   B         10 non-null     float64       
 2   Category  10 non-null     str           
 3   Date      10 non-null     datetime64[us]
 4   Value     10 non-null     float64       
dtypes: datetime64[us](1), float64(3), str(1)
memory usage: 542.0 bytes
None

Dataset 2: Dataset Sintético de Campaña de Marketing

Para complementar, crearemos un dataset sintético que simule los resultados de una campaña de marketing. Esto nos permite controlar las relaciones causales subyacentes y demostrar cómo se pueden aplicar los métodos de inferencia causal en un entorno donde sabemos la “verdad” causal.

Pregunta de Inferencia Causal: ¿Cómo afecta el envío de un correo electrónico de marketing a la probabilidad de que un cliente realice una compra?

Código para la generación del dataset

import numpy as np
import pandas as pd

np.random.seed(42) # Para reproducibilidad

# Número de observaciones
n_samples = 1000

# Variables de confusión (covariables)
edad = np.random.randint(20, 60, n_samples)
ingresos = np.random.normal(30000, 10000, n_samples)
historial_compras = np.random.randint(0, 10, n_samples)

# Asignación del tratamiento (envío de email)
# El tratamiento está influenciado por las covariables (ej. clientes más jóvenes y con mayor ingreso son más propensos a recibir el email)
prob_tratamiento = 1 / (1 + np.exp(-(0.05 * (edad - 40) - 0.00002 * (ingresos - 30000) + 0.1 * historial_compras)))
tratamiento = (np.random.rand(n_samples) < prob_tratamiento).astype(int)

# Resultado (compra)
# La compra está influenciada por las covariables y el tratamiento
# Suponemos un efecto causal del tratamiento
compra_base = (0.1 * historial_compras + 0.00001 * ingresos - 0.02 * (edad - 40) + np.random.normal(0, 0.5, n_samples))
prob_compra = 1 / (1 + np.exp(-(compra_base + 0.5 * tratamiento))) # 0.5 es el efecto causal del email
compra = (np.random.rand(n_samples) < prob_compra).astype(int)

marketing_df = pd.DataFrame({
    'edad': edad,
    'ingresos': ingresos,
    'historial_compras': historial_compras,
    'tratamiento_email': tratamiento,
    'compra': compra
})

print(marketing_df.head())
print(marketing_df.info())


📊 Salida:

edad      ingresos  historial_compras  tratamiento_email  compra
0    58  23725.811156                  2                  0       0
1    48  25046.107571                  2                  1       1
2    34  34188.394139                  0                  0       0
3    27  26107.118083                  6                  0       0
4    40  17650.556065                  4                  1       1

RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   edad               1000 non-null   int64  
 1   ingresos           1000 non-null   float64
 2   historial_compras  1000 non-null   int64  
 3   tratamiento_email  1000 non-null   int64  
 4   compra             1000 non-null   int64  
dtypes: float64(1), int64(4)
memory usage: 39.2 KB
None

Conclusiones: El poder de la causalidad

A lo largo de este artículo, hemos explorado los fundamentos de la inferencia causal, distinguimos entre correlación y causalidad, y presentamos herramientas conceptuales como los DAGs. Lo más importante es que hemos sentado las bases para aplicar estos conceptos en Python, seleccionando datasets que nos permitirán en futuras entregas, implementar métodos de inferencia causal. Entender y aplicar el análisis causal es una habilidad invaluable para cualquier analista de datos que busque no solo describir lo que sucede, sino explicar por qué sucede.

¡No te pierdas la oportunidad de transformar tu carrera y convertirte en un experto en datos!

Y recuerda que siempre, siempre, vas a aprender un bit a la vez!


🤖 Automatiza tu trading en 5 días con Python

Únete a mi Mini-Curso gratuito por email. Aprende a extraer datos reales, crear indicadores cuantitativos y hacer backtesting profesional.