Puntajes de propensión en términos sencillos: emparejamiento, ponderación y cuándo fallan
Lo que vimos la última vez sobre la política de 90 días
Maya — la nueva científica de datos en Blue Harbor Hotels — ha estado investigando la política de 90 días (una tarifa en reservas hechas con más de 90 días de anticipación). En el tutorial anterior, recurrió a una Variable Instrumental — un empujón aleatorio (un fallo en el sitio web) que altera el tratamiento sin tocar el confundidor oculto. Funcionó. También fue excesivo.
Esto es lo que cambia el panorama para Maya: la mayoría de las veces, podemos medir nuestros confundidores. El ejemplo del estrés era el caso extremo. En los datos empresariales del día a día, el problema no es una variable faltante — sino que los dos grupos que estamos comparando no se parecen en absoluto.
Maya tiene una lista de características de los huéspedes: estado de lealtad, tipo de habitación, cancelaciones pasadas. Sabe que estos afectan tanto la anticipación con la que alguien hace su reserva (lead_time) como si cancela o no. Entonces, ¿cómo se compara de manera justa a un huésped de “tiempo de anticipación largo” con uno de “tiempo de anticipación corto” cuando son básicamente especies diferentes de clientes?
Este tutorial es la respuesta: Puntajes de propensión — el caballo de batalla cotidiano al que Maya recurrirá cuando arme su presentación para la junta.
Lo que aprenderás aquí:
- Por qué comparar “manzanas con naranjas” rompe las comparaciones ingenuas (el problema de sesgo de selección)
- Qué es un puntaje de propensión
- Cómo el emparejamiento encuentra “gemelos de datos”
- Cómo la ponderación crea un “ensayo aleatorio sintético”
- La trampa del Soporte Común que hace que ambos métodos mientan
- Cómo elegir entre ellos y refutar el resultado
Requisitos previos: Tutoriales 1–5, o estar cómodo con DoWhy, DAGs, confundidores y el flujo de trabajo básico.
1. El problema de comparar ‘peras con manzanas’
Comparar a las personas que reservan con 6 meses de anticipación con las que reservan con 2 días de anticipación es como comparar a quienes van al gimnasio con quienes no van, en términos de salud. Las personas que se inscriben en un gimnasio ya son más conscientes de su salud. Si resultan ser más saludables, ¿fue por el gimnasio o simplemente eran “personas más saludables” desde el principio?
En los datos de Blue Harbor Hotels, los huéspedes con “Tiempo de antelación largo” (nuestro grupo de tratamiento) suelen ser familias que planifican sus vacaciones de verano. Los huéspedes con “Tiempo de antelación corto” (nuestro grupo de control) suelen ser viajeros de negocios. Personas fundamentalmente diferentes. Entonces, si Maya simplemente compara sus tasas de cancelación, no está comparando el efecto del tiempo de antelación. Está comparando familias con viajeros de negocios. Esto es Sesgo de selección: el sesgo que surge cuando los grupos de tratamiento y control son seleccionados (o se autoseleccionan) para sus grupos basándose en características que también afectan el resultado.
La comparación de los datos brutos muestra qué tan grave es el sesgo:
import pandas as pd
import numpy as np
from dowhy import CausalModel
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
# Create a biased dataset
np.random.seed(42)
n = 5000
# Confounder: Is the guest a 'Planner' (Loyal/Family)?
planner = np.random.binomial(1, 0.5, n)
# Planners are much more likely to have long lead times
# Treatment: 1 if lead_time > 30 days, 0 otherwise
treatment_prob = 0.2 + 0.6 * planner
treatment = np.random.binomial(1, treatment_prob)
# Planners are also naturally less likely to cancel
# Outcome: is_cancelled
cancel_prob = 0.3 - 0.2 * planner + 0.05 * treatment
is_cancelled = np.random.binomial(1, np.clip(cancel_prob, 0, 1))
df = pd.DataFrame({"is_planner": planner, "treatment": treatment, "is_cancelled": is_cancelled})
# Raw comparison
raw_treated = df[df['treatment'] == 1]['is_cancelled'].mean()
raw_control = df[df['treatment'] == 0]['is_cancelled'].mean()
print(f"Raw Difference: {raw_treated - raw_control:.4f}")
Interpreta cada número: la diferencia bruta podría mostrar un número negativo (p. ej., -0.05). Eso sugiere que reservar con anticipación reduce las cancelaciones. Pero programamos los datos para que el tratamiento en realidad aumente las cancelaciones en un 5% (0.05). La característica de “Planificador” es lo suficientemente fuerte como para ocultar el efecto verdadero. Es como comparar peras con manzanas.
Aquí está la prueba de fuego: si Maya le hubiera presentado ese -0.05 a Delgado, le habría dicho que la política de 90 días ayuda, cuando en realidad perjudica en un 5%. La comparación incorrecta conduce a la decisión comercial incorrecta.
2. ¿Qué es un puntaje de propensión, en realidad?
Para solucionar esto, Maya necesita que los grupos luzcan idénticos. Necesita una persona de “control” que coincida con una persona “tratada”. Pero con 20 variables de confusión, una coincidencia perfecta es imposible: no hay dos humanos que coincidan en 20 características.
El puntaje de propensión resuelve esto. En lugar de buscar coincidencias en 20 características, las comprimimos en un solo número: la probabilidad de recibir el tratamiento.
Piénsalo como un puntaje de “tendencia”. Si un viajero de negocios y una familia tienen ambos un 60% de probabilidad de reservar temprano según sus características, están “equilibrados” — igualmente propensos a caer en cualquiera de los dos grupos, por lo que son comparables.
Calculemos este puntaje a mano para desmitificarlo:
# We use Logistic Regression to predict treatment based on confounders
X = df[['is_planner']]
y = df['treatment']
ps_model = LogisticRegression().fit(X, y)
# The propensity score is the probability of being in the '1' (treated) group
df['propensity_score'] = ps_model.predict_proba(X)[:, 1]
print(df[['is_planner', 'treatment', 'propensity_score']].head())
Lo que esto significa en la práctica: cada fila tiene ahora un puntaje entre 0 y 1. Un puntaje de 0.8 significa “según tus características, tenías un 80% de probabilidad de reservar temprano”. La regresión logística es solo una herramienta estadística que aprende la probabilidad de un resultado de sí/no — en este caso, “¿reservaron temprano?” — a partir de las características que le proporcionamos.
La ventaja: dos personas con el mismo puntaje de propensión son, estadísticamente hablando, intercambiables. Una terminó reservando temprano; la otra no. La diferencia en sus resultados es entonces atribuible al tratamiento, no a quiénes son.
3. Método 1: Emparejamiento (encontrando a tu gemelo de datos)
El emparejamiento es la forma más intuitiva de usar el puntaje. Por cada persona que sí reservó con anticipación (tratado), Maya busca en la base de datos a alguien que no lo hizo (control) con un puntaje de propensión casi idéntico.
Piensa en esto como crear “gemelos.” Si los gemelos coinciden en su tendencia a reservar con anticipación, pero solo uno realmente lo hizo, entonces la diferencia en su cancelación tiene que provenir del momento de la reserva en sí.
Aquí está el detalle: a veces una persona tratada es lo suficientemente inusual que no existe un “gemelo” de control. Descartamos esos datos. Así que estás intercambiando calidad de emparejamiento por tamaño de muestra — mejores emparejamientos, menos datos.
# Using DoWhy to perform Propensity Score Matching
model = CausalModel(
data=df,
treatment='treatment',
outcome='is_cancelled',
common_causes=['is_planner']
)
identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)
# We use 'matching' and set a 'caliper' (how close the twins must be)
estimate_match = model.estimate_effect(
identified_estimand,
method_name="backdoor.propensity_score_matching",
method_params={'distance_metric': 'minkowski', 'p': 2}
)
print(f"Causal Effect (Matching): {estimate_match.value:.4f}")
Interpretando el resultado: un valor de 0.051 significa que reservar con anticipación aumenta la probabilidad de cancelación en 5.1%. Eso está mucho más cerca de la verdad (programamos 0.05) que la comparación bruta. El caliper es un control de tolerancia — establece qué tan cercanos deben ser dos puntajes para calificar como “gemelos.” Si es demasiado estricto, descartas demasiados datos; si es demasiado holgado, tus “gemelos” no son realmente gemelos.
4. Método 2: Ponderación (el ‘ensayo aleatorizado sintético’)
¿Qué pasa si Maya no quiere descartar datos? Ella usa Ponderación por Probabilidad Inversa (IPW).
Imagina a un “Planificador” que reservó a última hora y aun así terminó en el grupo de control. Eso es inusual. En IPW, le damos a esta persona más peso — cuenta más en nuestro promedio. Un planificador poco común que reservó tarde es muy informativo, porque es un control que se ve exactamente como una familia tratada.
Al ponderar a todos por el inverso de su puntaje de propensión, construimos una pseudo-población — un mundo imaginario donde los Planificadores y los No Planificadores se distribuyen equitativamente en ambos grupos. Es como si nuestros datos observacionales desordenados se convirtieran en un ensayo controlado aleatorizado (el experimento estándar de oro donde los grupos se asignan lanzando una moneda).
estimate_weight = model.estimate_effect(
identified_estimand,
method_name="backdoor.propensity_score_weighting"
)
print(f"Causal Effect (Weighting): {estimate_weight.value:.4f}")
Interpreta cada número: si la ponderación da 0.049, eso también está muy cerca del verdadero efecto de 0.05. La ponderación suele ser más eficiente ya que utiliza todos los datos. Pero puede ser sensible cuando algunos puntajes se sitúan muy cerca de 0 o 1 — dividir por una probabilidad minúscula produce un peso gigantesco, y un solo peso gigantesco puede dominar todo.
5. La trampa del soporte común
Esta es la parte más difícil de los puntajes de propensión: Soporte Común.
Digamos que todos los “Planificadores” reservan temprano (100% de probabilidad) y todos los “No Planificadores” reservan tarde (0% de probabilidad). No puedes emparejarlos. No hay superposición entre los grupos. Las matemáticas seguirán dándote un número, pero ese número es una mentira. No puedes comparar grupos que no comparten ningún terreno común.
El término técnico es una violación de positividad: algún grupo tiene esencialmente cero probabilidad de recibir el tratamiento (o el control), por lo que no es posible hacer ninguna comparación para ellos.
Verificamos esto graficando la distribución de los puntajes:
# Plotting Common Support
plt.hist(df[df['treatment']==1]['propensity_score'], alpha=0.5, label='Treated')
plt.hist(df[df['treatment']==0]['propensity_score'], alpha=0.5, label='Control')
plt.title("Propensity Score Distribution (Common Support Check)")
plt.legend()
plt.show()
Qué buscar: los dos histogramas deberían superponerse. Si los “Tratados” se agrupan en 0.9 y los de “Control” en 0.1, eso es una violación de positividad. No confíes en la estimación causal; estarías extrapolando a un espacio vacío.
Imagina dos picos de montaña sin ningún valle entre ellos. Puedes imaginar un puente, pero no tienes evidencia de cómo se ve el valle.
6. ¿En cuál deberías confiar?
Entonces, ¿qué método incluye Maya en su presentación para la junta?
- El emparejamiento comunica bien. Decirle a un interesado “encontramos 1,000 pares de clientes idénticos” tiene un impacto inmediato: las personas no técnicas entienden el concepto de “gemelos”.
- La ponderación maneja conjuntos de datos grandes y complejos donde descartar muestras costaría potencia estadística.
Para probar cuál es más robusto, ejecutamos una refutación de Tratamiento Placebo (de la Parte 3 — intentar romper tu propio resultado a propósito). Intercambiamos el tratamiento por ruido aleatorio. Un modelo sólido no debería encontrar ningún efecto.
refute = model.refute_estimate(identified_estimand, estimate_weight,
method_name="placebo_treatment_refuter")
print(refute)
Interpreta cada número: el “Nuevo Efecto” debería acercarse a 0.00. Si lo hace, el método de ponderación se sostiene — no está persiguiendo ruido.
Lo que aprendimos hoy:
- El Sesgo de Selección surge cuando los grupos de tratamiento y control difieren en formas fundamentales.
- Un Puntaje de Propensión es un número que resume qué tan probable era que alguien recibiera tratamiento.
- El Emparejamiento encuentra “gemelos” y descarta el resto.
- La Ponderación reequilibra la balanza para que los casos raros cuenten más.
- El Soporte Común es la verificación esencial de que tus grupos realmente se superpongan.
Maya ahora tiene un promedio defendible: reservar con anticipación aumenta las cancelaciones en aproximadamente 5%. Está lista para presentárselo a Delgado.
Pero mientras construye la presentación, un patrón extraño llama su atención. El promedio es 5% — pero los invitados individuales responden de maneras muy diferentes. Algunas familias cancelan mucho más a menudo, más de un 5% adicional. Algunos viajeros de negocios leales cancelan menos.
Un número está ocultando muchas historias. Ese es el problema que el próximo tutorial está a punto de exponer — de una manera que hará que Delgado se sienta muy incómodo.
En este tutorial, aprendiste:
- El problema del sesgo de selección detrás de las comparaciones de manzanas con naranjas
- Qué es un puntaje de propensión y por qué resume 20 características en un solo número
- Cómo el emparejamiento crea gemelos de datos, y cómo la ponderación reequilibra los casos raros
- La trampa del soporte común y las violaciones de positividad
- Cómo refutar un resultado con una prueba de placebo
A continuación: Tutorial 7 — Más allá del Promedio: encontrar a qué clientes el tratamiento realmente ayuda.
Comprueba tu comprensión
Las preguntas a continuación van desde el recuerdo simple hasta el diseño abierto, siguiendo aproximadamente la Taxonomía de Bloom.
Recordar ¿Qué es un puntaje de propensión y qué única cantidad resume?
Comprender
Con sus propias palabras, explique por qué la comparación bruta al inicio del tutorial (raw_treated - raw_control) mostró un número negativo a pesar de que el verdadero efecto programado del tratamiento fue +0.05.
Aplicar
El tutorial informa que Matching da 0.051 y Weighting da 0.049, frente a un efecto verdadero de 0.05. Usando estos tres números, ¿qué estimación del método está más cerca del efecto verdadero y por cuánto?
Analizar
El tutorial dice que Matching “descarta el resto” cuando no existe un gemelo, mientras que Weighting “usa más datos” reponderando en su lugar. Recorra un escenario usando la sección de Soporte Común: si un ‘Planner’ tiene un puntaje de propensión de 0.98 y casi no hay ‘Non-Planners’ cerca de ese puntaje, explique qué sucede de manera diferente con ese punto de datos bajo Matching versus bajo Weighting.
Evaluar El tutorial recomienda Matching para la comunicación con los stakeholders (“encontramos 1,000 pares de clientes idénticos”) y Weighting para conjuntos de datos grandes y complejos. Critique esta recomendación: ¿es “más fácil de explicar a un stakeholder” una buena razón para elegir un método estadístico, o podría llevar a un equipo a elegir la opción menos precisa por las razones equivocadas?
Crear
Diseñe una verificación de Soporte Común para un nuevo escenario: una empresa de suscripción quiere saber si “actualizar al soporte premium” reduce el churn, usando company_size y contract_length como factores de confusión. Describa cómo se vería una violación de positividad en este contexto específico (qué grupo casi no tendría representación en ciertos puntajes de propensión) y qué realidad comercial podría causarla.
Esta traducción fue generada automáticamente y puede contener errores. Si el idioma inglés es tu preferencia, puedes leer el artículo original en inglés .
«Aplica lo que aprendiste» es para suscriptores Supporter e Insider.
Suscríbete para desbloquear los ejercicios de este artículo.
Ver planesArtículos relacionados
- Inferencia Causal En revisión
Estimación y validación de efectos causales con DoWhy
Aprende a utilizar DoWhy para identificar, estimar y validar efectos causales mediante el ajuste de puerta trasera, múltiples métodos de estimación y pruebas de refutación.
- Inferencia Causal En revisión
La paradoja de Simpson: cuando los datos agregados cuentan la historia opuesta
Comprende cómo los datos agregados inducen a error a los científicos de datos y los llevan a tomar decisiones incorrectas, y descubre por qué estratificar tu análisis es clave para revelar la verdad.
- Inferencia Causal En revisión
El estudio de caso integral: ¿Qué debería hacer Blue Harbor con la política de 90 días?
Ejecuta el flujo de trabajo causal completo en un caso de hotel, desde la correlación ingenua pasando por DAG, identificación, estimación y refutación, hasta una decisión empresarial.
- Aprendizaje Automático En revisión
Validación cruzada anidada: por qué tu puntaje de validación te miente
El ajuste de hiperparámetros infla los puntajes de validación debido al sesgo de optimización: aprende cómo la validación cruzada anidada con Optuna te ofrece estimaciones honestas.
¿Buscas otra cosa?
Busca en todos los artículos por título, resumen o tema.