El estudio de caso integral: ¿Qué debería hacer Blue Harbor con la política de 90 días?
Anteriormente en la política de 90 días
Durante nueve tutoriales, Maya — la científica de datos de Blue Harbor Hotels — ha estado investigando la política de 90 días: un cargo en cualquier reserva hecha más de 90 días antes de la llegada, implementada por un equipo anterior para reducir cancelaciones. Ella ha:
- dibujado el DAG (imagen causal) y estimado el efecto (Tutoriales 2–3),
- sometido a prueba de estrés contra confusores ocultos (Tutorial 4),
- encontrado una puerta lateral para sortear fantasmas no medibles (Tutorial 5),
- balanceado sus grupos con puntajes de propensión (Tutorial 6),
- descubierto que el promedio ocultaba una división: los huéspedes nuevos se beneficiaban, los huéspedes leales se perjudicaban (Tutorial 7),
- rastreado una crisis falsa hasta un error del proveedor con análisis de causa raíz (Tutorial 8),
- e identificado qué huéspedes específicos eran realmente “salvables” con contrafactuales (Tutorial 9).
Ahora es momento de escribir el memorándum. Cada herramienta que aprendió se integra en una investigación de principio a fin — desde una correlación ingenua hasta una decisión de negocio. El flujo de trabajo causal completo, en un problema, de principio a fin. Vas a ejecutarlo junto a ella.
Lo que aprenderás aquí:
- Cómo ejecutar el flujo de trabajo causal completo de principio a fin en un problema real
- Por qué la respuesta ingenua (correlación) sobreestima el efecto
- Cómo recorrer los cinco pasos: Por qué → DAG → Identificar → Estimar → Refutar
- Cómo convertir una estimación causal en una recomendación de negocio
- Los límites honestos de lo que el análisis puede y no puede decirte
Requisitos previos: Tutoriales 1–9. Este es el proyecto final — todo vuelve.
La pregunta del millón: ¿El tiempo de antelación realmente causa cancelaciones?
Maya es la analista de ingresos de Blue Harbor Hotels. Ha detectado un patrón claro: los huéspedes que reservan 200 días por anticipado cancelan con mucha más frecuencia que los que reservan dos días antes de su llegada.
Su instinto, y el del equipo que implementó la política de 90 días, es tratar los tiempos de antelación largos como el enemigo. Pero, ¿el tiempo de antelación largo causa la cancelación, o es solo un marcador de otra cosa? Tal vez las personas que reservan con mucha anticipación son simplemente “soñadores de vacaciones” que cambian de opinión, independientemente de cuándo reserven.
Si Blue Harbor se equivoca en esto, ahuyenta a clientes leales con una política que no soluciona el problema. Los modelos predictivos pueden decirnos que los tiempos de antelación largos se correlacionan con las cancelaciones. Guardan silencio sobre el por qué. Para cambiar una política, Maya necesita pasar de la predicción a la causalidad: el objetivo principal de esta serie.
Así que empezaremos con el enfoque ingenuo: la forma en la que la mayoría de los analistas quedan atrapados. Carguemos el conjunto de datos del hotel y veamos qué nos dice una correlación simple.
import pandas as pd
import numpy as np
from dowhy import CausalModel
import networkx as nx
import matplotlib.pyplot as plt
# Let's recreate our hotel dataset with a known causal structure
np.random.seed(42)
n = 10000
# Confounders: things that affect both lead time and cancellation
is_repeat_guest = np.random.binomial(1, 0.10, n)
market_segment = np.random.choice(["Direct", "Corporate", "Online TA"], n, p=[0.2, 0.3, 0.5])
# Lead time (Treatment): influenced by segment
lead_time = np.random.exponential(scale=50, size=n)
lead_time = np.where(market_segment == "Online TA", lead_time + 40, lead_time)
# Cancellation (Outcome): influenced by lead time and confounders
# True causal effect: 0.001 increase in cancel prob per day of lead time
cancel_prob = (0.1 + 0.001 * lead_time - 0.1 * is_repeat_guest + 0.05 * (market_segment == "Online TA"))
is_cancelled = np.random.binomial(1, np.clip(cancel_prob, 0, 1))
df = pd.DataFrame({
"lead_time": lead_time,
"is_cancelled": is_cancelled,
"is_repeat_guest": is_repeat_guest,
"market_segment": market_segment
})
# The Naive Approach: Simple Correlation
correlation = df['lead_time'].corr(df['is_cancelled'])
print(f"Naive Correlation: {correlation:.4f}")
# Simple Linear Regression (Naive Estimate)
import statsmodels.api as sm
X = sm.add_constant(df['lead_time'])
model_naive = sm.OLS(df['is_cancelled'], X).fit()
print(f"Naive Regression Coefficient: {model_naive.params['lead_time']:.6f}")
La regresión ingenua le indica a Maya que por cada día adicional de tiempo de antelación, la probabilidad de cancelación aumenta. Sin embargo, este número está ‘contaminado’: no tiene en cuenta el hecho de que los usuarios de Agencias de Viajes en Línea (OTA) reservan antes y cancelan con más frecuencia por razones no relacionadas con el tiempo de antelación en sí. Si Blue Harbor basa su política en este número, sobrestimará el impacto del tiempo de antelación.
Un breve recordatorio de vocabulario: una variable de confusión (en este caso, market_segment) es una variable que influye tanto en el tratamiento (tiempo de antelación) como en el resultado (cancelación), fingiendo una conexión entre ellos. Esa es la trampa de la que Maya advirtió en el Tutorial 1: el error del “helado y el ahogamiento”, oculto dentro de una decisión comercial real.
Paso 1: Mapeando el caos (El DAG)
Para solucionar esto, Maya necesita dibujar un mapa de sus suposiciones: un Grafo Acíclico Dirigido (DAG). Piénsalo como decir: “Creo que X causa Y, y que Z causa ambas”. Las flechas apuntan de la causa al efecto. Nada apunta hacia atrás en el tiempo.
Esta es la parte más difícil de la inferencia causal. Te sientas con expertos del dominio y preguntas: “¿Qué más podría estar impulsando esto?” En el caso del hotel, sabemos que market_segment afecta qué tan temprano reservan las personas y qué tan probable es que cancelen. También sabemos que is_repeat_guest importa — los clientes frecuentes podrían reservar más tarde y cancelar menos.
Construyamos este mapa en DoWhy, diciéndole explícitamente al modelo que market_segment e is_repeat_guest son factores de confusión:
# Define the causal graph
# Arrows represent 'causes'
causal_graph = """digraph {
market_segment -> lead_time;
market_segment -> is_cancelled;
is_repeat_guest -> lead_time;
is_repeat_guest -> is_cancelled;
lead_time -> is_cancelled;
}"""
model = CausalModel(
data=df,
treatment="lead_time",
outcome="is_cancelled",
graph=causal_graph
)
# Visualize the graph to ensure it matches our intuition
model.view_model()
Lo que esto significa: Maya está reconociendo los caminos traseros (backdoor paths). Hay un camino desde lead_time que regresa a través de market_segment hasta is_cancelled, por ejemplo. Esto crea una relación falsa que ella necesita bloquear manteniendo market_segment constante. (Un camino trasero, del Tutorial 3, es cualquier ruta desde el tratamiento hasta el resultado que va en contra de la flecha causal y luego a favor de ella — arrastrando sesgo en el camino.)
Paso 2: ¿Podemos siquiera resolver esto? (Identificación)
Antes de realizar cualquier cálculo matemático, Maya se pregunta: “Dado este grafo, ¿es siquiera posible encontrar la respuesta?” Esto es Identificación — demostrar si tu pregunta causal puede responderse con los datos que tienes.
Considéralo como una comprobación de cordura. Si Maya olvidó medir un factor de confusión importante, DoWhy le advertirá. Aquí, busca un Conjunto de Ajuste de Puerta Trasera — las variables que necesitamos controlar para aislar el verdadero efecto del tiempo de antelación.
identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)
print(identified_estimand)
Cuando Maya ejecuta esto, DoWhy identifica que debe ajustar por market_segment e is_repeat_guest para obtener el efecto causal. Si estos no estuvieran en los datos, DoWhy le diría que el efecto es no identificable — ninguna cantidad de datos podría solucionarlo. Esa comprobación por sí sola evita que publique un resultado erróneo.
Paso 3: Calculando el número (Estimación)
Ahora, el cálculo real. Maya utiliza la Estratificación por puntaje de propensión. En lugar de una regresión simple, este método agrupa a huéspedes similares y compara a un huésped de “alto tiempo de antelación” con uno de “bajo tiempo de antelación” que comparte el mismo segmento de mercado y estado de fidelidad. Al mantener una comparación de igual a igual, se elimina el sesgo.
# Estimate the causal effect
causal_estimate = model.estimate_effect(
identified_estimand,
method_name="backdoor.propensity_score_stratification",
target_units="ate" # Average Treatment Effect
)
print(f"Causal Estimate (ATE): {causal_estimate.value:.6f}")
print(f"Difference from Naive: {((causal_estimate.value - model_naive.params['lead_time']) / model_naive.params['lead_time'] * 100):.2f}%")
Entonces, ¿cómo se sostiene esto frente a los datos? Es probable que Maya descubra que la estimación causal es menor que la ingenua. El tiempo de antelación sí causa cancelaciones — simplemente no tanto como Blue Harbor pensaba. Una parte de la correlación original era el “efecto OTA” disfrazado, y el sesgo comienza a desvanecerse.
El número ingenuo habría justificado la política de 90 días a primera vista. El número honesto es menor. Eso significa que la política estaba reaccionando de forma exagerada a una señal parcialmente verdadera.
Paso 4: Intentando romper nuestro resultado (Refutación)
En la ciencia, no solo aceptamos un número: intentamos romperlo. DoWhy llama a esto Refutación. Maya ejecuta dos pruebas:
- Tratamiento de placebo: reemplazar
lead_timecon ruido aleatorio. Si la lógica se mantiene, el “efecto causal” de ese ruido debería ser cero. Si no lo es, el modelo está captando fantasmas. - Refutador de subconjunto de datos: descartar un 20% aleatorio de los datos y luego volver a ejecutar el análisis. La estimación debería mantenerse más o menos igual. Si fluctúa drásticamente, el resultado fue una casualidad de esa muestra en particular.
# Refute 1: Placebo Treatment
refute_placebo = model.refute_estimate(
identified_estimand,
causal_estimate,
method_name="placebo_treatment_refuter",
placebo_type="permute"
)
print(refute_placebo)
# Refute 2: Subset Refuter
refute_subset = model.refute_estimate(
identified_estimand,
causal_estimate,
method_name="data_subset_refuter",
subset_fraction=0.8
)
print(refute_subset)
Pero aquí está la cuestión: revisa los valores p. Un valor p es un número de 0 a 1 que mide la probabilidad de que se obtuviera tu resultado si no hubiera un efecto real. Uno muy pequeño —digamos, 0.01— significa que el resultado sería muy improbable por pura casualidad. Uno grande, como 0.5, significa que podría ocurrir fácilmente por azar.
Para una refutación, un valor p alto es lo que deseas. Significa que:
- En la prueba de placebo, no podemos demostrar que el efecto del ruido puro sea real. (Si ese valor p cae por debajo de ~0.05, el modelo encontró un “efecto causal” para el ruido aleatorio —una bandera roja de que el DAG es incorrecto).
- En la prueba de subconjunto, descartar datos no cambió significativamente el resultado.
Los resultados de Maya: ningún efecto real del ruido en el placebo y una estimación estable en el subconjunto. Su número sobrevive a su propia prueba de estrés.
De los datos a la decisión: ¿Y ahora qué?
Maya comenzó con una pregunta de negocios: ¿debería Blue Harbor seguir penalizando los tiempos de espera prolongados?
El flujo de trabajo causal le dio algunas respuestas:
- El verdadero efecto causal es menor de lo que sugería la correlación bruta.
- Una parte importante de las cancelaciones se debe al tipo de huésped (
market_segment), no solo a la anticipación con la que reservan. - El resultado es robusto frente al ruido y a los subconjuntos de datos.
La serie completa añade otra capa. A partir del Tutorial 7, ella sabe que el efecto no es uniforme: el promedio oculta que la política perjudica a los huéspedes recurrentes y leales, justo los clientes que una cadena de hoteles no puede permitirse perder. A partir del Tutorial 9, sabe que solo algunos huéspedes que cancelan son “salvables” al cambiar las condiciones de reserva.
Recomendación de negocios: En lugar de una política general no reembolsable para todos los tiempos de espera prolongados, Blue Harbor debería considerar una política dirigida aplicando escrutinio específicamente al segmento de Online TA, u ofreciendo pequeños incentivos para que los huéspedes confirmen su estadía 30 días antes. Una tarifa general penaliza a los huéspedes leales “Direct” que simplemente prefieren planificar con anticipación. Esos son los clientes que el promedio estaba ocultando.
Cabe destacar: este análisis demuestra por qué ocurren las cancelaciones. No demuestra que un depósito no reembolsable cambie el comportamiento del huésped. Esa es una intervención diferente con sus propios factores de confusión: ¿una tarifa ahuyenta a los soñadores o simplemente los empuja hacia la competencia? El flujo de trabajo causal te dice qué corregir; no garantiza que la corrección funcione. Querrás probar la política real a continuación.
Tu lista de verificación causal:
- Comienza con el ‘Por qué’: ¿qué política intentas cambiar?
- Dibuja el DAG: no omitas este paso — es donde ocurre la ciencia.
- Identifica: deja que DoWhy verifique tu lógica.
- Estima: usa puntajes de propensión para comparar peras con peras.
- Refuta: intenta romper tu resultado antes de que lo haga tu jefe.
Priya lee el memorando y sonríe. Delgado, por una vez, está en silencio. Maya ha pasado de “la diapositiva del correo electrónico era una mentira” a “aquí está la verdad sobre una política que ha estado cobrando a nuestros mejores clientes durante nueve meses” — y puede defender cada paso.
Ese es el arco de esta serie. Desde detectar una correlación ingenua, pasando por dibujar un DAG, identificar y estimar el efecto, someterlo a pruebas de estrés, descubrir a quién ayuda y a quién perjudica, y finalmente convertir todo en una decisión: el flujo de trabajo causal completo, de principio a fin.
Lo que aprendiste:
- Cómo la correlación ingenua sobrestima un efecto causal
- El flujo de trabajo causal de cinco pasos: Por qué → DAG → Identificar → Estimar → Refutar
- Cómo interpretar los valores p en la refutación (¡allí, un valor alto es bueno!)
- Cómo convertir una estimación en una recomendación de negocios
- La brecha honesta entre “por qué ocurren las cancelaciones” y “esta política lo solucionará”
Comprueba tu comprensión
Las preguntas a continuación van desde el simple recuerdo hasta el diseño abierto, siguiendo aproximadamente la Taxonomía de Bloom.
Recordar ¿Cuáles son los cinco pasos en la “Causal Checklist” del tutorial?
Entender Con tus propias palabras, explica qué significa un “valor p alto” en el contexto del refutador Placebo Treatment, y por qué un valor p alto es el buen resultado aquí (a diferencia de la mayoría de las pruebas de hipótesis, donde un valor p bajo es el resultado emocionante).
Aplicar
El tutorial calcula la “Difference from Naive” como un porcentaje: (causal_estimate - naive_estimate) / naive_estimate * 100. Si el coeficiente de regresión ingenuo fuera 0.0015 y la estimación causal (estratificada por propensión) fuera 0.0009, ¿qué reportaría esta fórmula como diferencia porcentual?
Analizar El Data Subset Refuter del tutorial elimina el 20% de los datos y vuelve a ejecutar el análisis, esperando que el efecto “se mantenga más o menos igual”. Explica por qué un resultado completamente diferente después de eliminar un subconjunto aleatorio del 20% sugeriría específicamente que la estimación original era “un capricho de la muestra específica”, en lugar de sugerir que el DAG en sí está mal (que es lo que prueba el refutador Placebo Treatment).
Evaluar
La recomendación comercial final del tutorial sugiere una política dirigida para el segmento “Online TA” en lugar de una política general no reembolsable. Critica esta recomendación: el caso de estudio completo solo probó si lead_time causa la cancelación — nunca probó causalmente si un depósito no reembolsable cambia el comportamiento de los huéspedes. ¿Cuál es la brecha entre “entendemos por qué ocurren las cancelaciones” y “sabemos que esta política específica lo solucionará”?
Crear Diseña tu propio esquema de caso de estudio causal de principio a fin (siguiendo la lista de verificación del tutorial: Por qué → DAG → Identificar → Estimar → Refutar) para una pregunta comercial diferente: “¿ofrecer envío gratis causa valores de pedido más altos?” Nombra el tratamiento, el resultado, al menos un factor de confusión y una prueba de refutación que ejecutarías antes de confiar en el resultado.
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
Puntajes de propensión en términos sencillos: emparejamiento, ponderación y cuándo fallan
Aprende cómo los puntajes de propensión corrigen el sesgo de selección en la inferencia causal — mediante el emparejamiento, la ponderación y la trampa del soporte común que hace que ambos métodos fallen.
- Aprendizaje Profundo En revisión
Referencia: Optimizadores
Una referencia que cubre los optimizadores de redes neuronales desde GD hasta AdamW, con programación de la tasa de aprendizaje, árboles de decisión y guía práctica para cada arquitectura.
¿Buscas otra cosa?
Busca en todos los artículos por título, resumen o tema.