Unidad 5 - Práctica: tu árbol con los datos de Cóndor
Práctica opcional fuera de clase · Semana 11 · 06327-ECO
Esta práctica es opcional y no se entrega: es para afianzar, a tu ritmo, lo que hicimos en la sesión. Reproduce el recorrido completo de la clase — los datos, el sobre, el árbol y su evaluación — con los datos reales de Cóndor, en celdas que corren en tu navegador: puedes ejecutarlas, editarlas y volver a correrlas sin instalar nada.
La primera celda tarda unos segundos: el navegador descarga R (webR) y los paquetes dplyr, rpart y rpart.plot. Verás el estado de la carga debajo del título. Las celdas comparten memoria: córrelas en orden, de arriba hacia abajo.
1 Los datos y las variables
El target es la columna que el modelo intenta predecir: abandono (1 = el cliente se fue). Las predictoras son las columnas con las que puede preguntar. Dos reglas para elegirlas:
- que existan el día de la decisión: nada que se conozca después, como
dias_moraogasto_proximo_trim— la fuga de información de la semana 6; - que no tengan vacíos: el árbol necesita un valor para cada cliente.
Nos quedamos con cinco señales de comportamiento, las mismas que el EDA de la semana 6 mostró que separan a quienes se van: recencia, sesiones, frecuencia, antigüedad y gasto promedio.
Debes ver 8.000 filas con 29 columnas, y después 7 columnas sin un solo vacío. La línea factor(abandono) le dice a R que 0 y 1 son categorías (se queda / se va), no cantidades: sin ella, el árbol intentaría predecir un promedio en vez de una clase.
2 Entrenamiento y prueba
Lo que queremos del árbol es que generalice: que aprenda el patrón del abandono, no que se memorice la respuesta de cada cliente. Y eso solo se comprueba con clientes que no vio: si se califica con los mismos con los que aprendió, el examen trae las respuestas vistas y la nota sale inflada. Por eso los datos se parten en dos: una parte para entrenar (el árbol ve qué hicieron los clientes y si se fueron) y otra para probar (el árbol no los ve al entrenar; ahí se mide la nota).
Con proporcion = 0.8 quedan 6.400 clientes para entrenar y 1.600 para probar, y de esos 1.600 se fueron 354. Prueba 0.5 (más examen, menos material de estudio) y 0.95 (al revés: el árbol aprende de casi todos, pero la nota se mide en apenas 400 clientes) y mira cómo cambian los tamaños.
Antes de seguir, deja proporcion = 0.8 y corre la celda otra vez. Con set.seed(10) y 80/20, este es exactamente el sobre de la clase: los mismos 1.600 clientes que calificaron a los proveedores en la semana 10. Para comparar árboles entre sí, la partición se congela: si cada modelo rindiera examen con preguntas distintas, la comparación no diría nada.
3 El árbol inicial
Un árbol aprende haciendo preguntas a los datos. Mira todas las variables, prueba todos los cortes posibles (¿recencia_dias >= 158?, ¿frecuencia_tx >= 9?, …) y elige el que mejor separa a quienes se van de quienes se quedan. Luego repite el proceso dentro de cada grupo que creó. Cada punto donde pregunta es un nodo; cada grupo final donde ya no pregunta más es una hoja, y la profundidad es el número máximo de preguntas en cadena que le permitimos.
Los otros tres argumentos de rpart.control solo sueltan los demás frenos de rpart, para que la profundidad sea el único límite: no los cambies (extra = 101 solo cambia qué muestra el dibujo). Cómo leer cada caja — un grupo de clientes:
- arriba, la clase que el árbol predice para ese grupo (1 = se va);
- en el medio, cuántos se quedaron y cuántos se fueron (ceros | unos: la raíz trae los 6.400, con 4.982 | 1.418);
- abajo, qué porcentaje de los clientes cae en ese grupo.
El árbol queda con 2 nodos de decisión y 3 hojas: pregunta ¿frecuencia_tx >= 9? y, para quienes transan poco, ¿recencia_dias < 158? Solo la hoja que transa poco y lleva 158 días o más sin transar recibe la predicción «se va»: ahí hay 94 que se quedaron y 269 que se fueron. De las cinco variables, el árbol usó dos — las demás no mejoraban la separación lo suficiente para ganarse una pregunta.
Este árbol de profundidad 2 es exactamente el que rpart entrega con su configuración de fábrica (rpart(abandono ~ ..., data = train, method = "class"), sin control). En clase lo entrenaremos así.
4 Predicciones y evaluación
El árbol ya puede predecir sobre los 1.600 clientes que no vio. A cada predicción se le pega lo que de verdad pasó, en las mismas cuatro casillas de la semana 10: TP (predijo que se iba y se fue), FP (predijo que se iba y se quedó: un envío de más), FN (predijo que se quedaba y se fue: un cliente perdido) y TN (predijo que se quedaba y se quedó).
Debes ver 59 TP, 17 FP, 295 FN y 1.229 TN, y las métricas respondiendo cada una a una pregunta de Growth:
- Accuracy 0.805 — ¿qué fracción clasificó bien? Gana poco: la línea base ya acertaba 0.779 sin encontrar a nadie.
- Precisión 0.776 — de los que recibirían la campaña, ¿cuántos se iban de verdad? 3 de cada 4 envíos aciertan.
- Recall 0.167 — de los que se van, ¿a cuántos encontró? Solo 59 de 354: a los otros 295 nadie los busca.
5 El árbol ajustado: mueve la profundidad
¿Y si lo dejamos preguntar más? Sube la profundidad y vuelve a entrenar sobre la misma partición:
Esto es lo que verás al probar distintas profundidades (todas con la misma partición):
| Profundidad | Hojas | Accuracy en train | Accuracy en test | Recall en test |
|---|---|---|---|---|
| 2 | 3 | 0.806 | 0.805 | 0.167 |
| 4 | 7 | 0.807 | 0.811 | 0.370 |
| 8 | 128 | 0.836 | 0.796 | 0.263 |
| 15 | 739 | 0.930 | 0.742 | 0.319 |
| 30 | 1.360 | 1.000 | 0.693 | 0.359 |
Dos cosas pasan a la vez. Hasta profundidad 4, el árbol aprende: pregunta más y encuentra más de los que se van (el recall sube de 0.167 a 0.370) sin perder nota en test. De ahí en adelante memoriza: en train la nota sube hasta 1.000 — se sabe a cada cliente de memoria — mientras en test cae hasta 0.693. Eso es el sobreajuste: el modelo estudió las respuestas en vez de la materia, y se nota exactamente cuando la nota en train sube y la nota en test baja.
Explorar no es evaluar. Aquí movimos la profundidad para entender cómo cambia el árbol. En un proyecto real no se elige el parámetro persiguiendo la nota del test una y otra vez: a fuerza de intentos, el test deja de ser examen y se vuelve parte del estudio. Esa búsqueda se hace con los datos de entrenamiento (se llama validación, y la verás si sigues en esto); el test se abre una sola vez, al final, para la nota oficial.
6 Comparar y decidir
Deja PROFUNDIDAD_2 = 4 (el ajustado que aprende sin memorizar) y arma la tabla final: la línea base y las dos configuraciones del árbol, con sus envíos y su costo a $2.250 cada uno.
Léela como la leería Growth, con la lógica de dinero de la semana 10:
- El inicial envía 76 campañas ($171.000) y encuentra a 59: $2.898 por cliente encontrado — más barato que los $3.214 del proveedor A de la semana pasada.
- El ajustado envía 210 ($472.500) y encuentra a 131: $3.607 por encontrado. Los 72 clientes adicionales que encuentra frente al inicial cuestan $4.188 cada uno ($301.500 ÷ 72).
- La línea base no cuesta nada y no encuentra a nadie: deja escapar a los 354.
¿Cuál llevarías a la reunión? No basta la accuracy: el inicial casi no comete envíos de más (precisión 0.776) pero deja escapar a 295; el ajustado encuentra el doble pagando más por cada uno. La respuesta depende de cuánto vale un cliente encontrado — exactamente la discusión de la semana 10, y la del taller de esta semana.
El cierre. Con los valores de referencia (proporcion = 0.8, PROFUNDIDAD = 2, PROFUNDIDAD_2 = 4) esta página reproduce exactamente la clase: el árbol inicial es el de la presentación y el ajustado es el del taller. A partir de ahí, explora lo que quieras — otra proporción, otras profundidades, quitar una variable — y mira cómo cambian el árbol y sus números: aquí nada se entrega y nada se daña.