Inspiración Desde el arranque ya sabíamos que el problema era grande. Arca Continental pierde 12 millones de pesos al mes en riesgo por tienditas que dejaban de comprar, y lo más frustrante era que se detectaba tarde, cuando el cliente ya se había ido. No queríamos hacer otro reporte bonito que nadie abre, sino algo que un equipo comercial pudiera usar el lunes en la mañana para saber a quién llamar y por qué. De ahí salió el nombre: Centinela, algo que vigila la cartera y avisa antes de que el cliente se vaya.

Función Centinela predice qué tiendita está por irse un mes antes de que pase, le pone a cada cliente un score de 0 a 100 con un semáforo de riesgo, y explica por qué está en peligro (si va cayendo en ventas, si está perdiendo enfriadores, su territorio, su tamaño). Pero no se queda en predecir: cierra el ciclo hasta la acción. Te muestra la tiendita en riesgo, le puedes preguntar al asistente qué hacer, y hasta lanza una llamada con IA en español que conversa con el dueño para retenerlo, dejando todo registrado para darle seguimiento.

Proceso Lo primero fue explorar los datos, y ahí salieron dos hallazgos que guiaron todo: que el riesgo está súper concentrado (apenas el 5% de la cartera, unas 9,997 tienditas, explica la mayor parte de la fuga) y que las que más se van son las chiquitas (una tiendita Mini tiene como 29 veces más riesgo que una grande). El insight clave para el modelo fue que no importa cuánto vende una tiendita, sino la caída. Así que convertimos las ventas crudas en 36 señales que capturan tendencia y deterioro: caídas contra sus propios promedios de 3 y 6 meses, contra su mejor mes, rachas sin pedir, y sobre todo cuántos enfriadores ha perdido respecto a su máximo.

Como solo 1 de cada 30 tienditas se va al mes, manejamos el desbalance ponderando las clases en lugar de inventar datos sintéticos. Para predecir usamos gradient boosting (HistGradientBoosting) en vez de reglas simples, porque las reglas ignoran las interacciones entre tamaño, territorio y enfriadores y generan muchísimas falsas alarmas. Validamos en el tiempo, entrenando con los meses viejos y probando con los recientes para no hacer trampa con el futuro, y terminamos con un AUC de 0.966 y un lift de 49 veces sobre actuar al azar. Todo corre sobre un stack abierto: Python, scikit-learn y FastAPI en el backend, y React en el frontend.

Obstáculos El reto más sutil fue evitar la fuga de información: es muy fácil que el modelo "vea el futuro" sin querer e infle las métricas, así que tuvimos que ser muy disciplinados con la definición de churn y la validación temporal. Pero el reto más humano fue el tiempo. Tuvimos que aprender a cortar cosas que nos encantaban pero que no eran esenciales, priorizar lo que de verdad respondía a la pregunta de negocio y organizarnos.

Logros Estamos orgullosas de haber llegado a un modelo con un AUC de 0.966 y un lift de 49x, pero más de haberlo convertido en algo accionable de verdad. Estimamos que contactando solo el riesgo alto y reteniendo a 1 de cada 3 se podrían salvar unas 540 tienditas al mes y reducir las perdidas. Y nos enorgullece especialmente haber cerrado el ciclo completo, del dato a una llamada de retención con IA en español, en lugar de quedarnos en un modelo que solo avisa el riesgo.

Aprendizajes Aprendimos que el deterioro delata al cliente, no el nivel: la caída reciente predice mucho mejor que el volumen absoluto. Descubrimos que los enfriadores no solo predicen el abandono sino que son una conexión directa de retención, porque son el espacio de Arca en la tienda y se recuperan con una visita; de hecho resultaron ser la tercera variable más importante, por encima de territorio y tamaño. Y la lección más grande fue que la analítica solo vale si termina en una decisión, y que conviene diseñar pensando en quien va a usar la herramienta y no en la métrica.

Próximos pasos para Ctrl + Slay :: Centinela Queremos enriquecer la documentación del repositorio para que cualquiera pueda correrlo paso a paso, medir en campo el impacto real de las llamadas de retención con IA mediante pruebas

Built With

Share this project:

Updates