miércoles, 24 de septiembre de 2014

Predecir Perdida de Clientes con Arbol de Decision

Para predecir clientes propensos a desafilarse (también llamado churn o attrition) en una empresa de telecomunicaciones, podría usarse el algoritmo de árbol de decision (decision tree) como clasificador.

Teniendo datos históricos de clientes activos y clientes desafilados, podrian aplicarse los siguientes pasos:

PASO 1: Cargar Datos y crear set de Entrenamiento y Test
El package C50 contiene datos de 5000 clientes, de los cuales se usan 3333 clientes para entrenar el Arbol de Decision (set de Entrenamiento) y 1667 para medir la precisión de la predicción (set de TEST). El resultado de esto sería algo como:





















PASO 2: Crear algoritmo de Árbol de Decision
Se crea el arbol de decision usando los datos de Entrenamiento. Conceptualmente quedaría así:






PASO 3: Medir precisión del Árbol
Con las reglas creadas en el árbol, se aplican a los datos de TEST para realizar predicción y medir precisión del árbol. Conceptualmente quedaría así:








PASO 4: Graficar Arbol de Decision
Para visualizar las reglas creadas, se usa rpart.plot que graficar el arbol. Para mas detalles sobre  rpart.plot ver referencia No. 3.


Nota: Para una mejor validación de un modelo y evitar overfitting, siempre es recomendable usar técnica de Validación Cruzada. Ver ejemplo  publicado AQUI.



# Predecir Perdida de Clientes con Arbol de Decision
 
 
# PASO 1:   Carga Package y Set de datos
# ---------------------------------------------------------------------------
library(C50)
library(rpart)
library(rpart.plot) 
data(churn); # carga tablas
 
Variables      <-c(4,7,16,19,17,20)               # variables elegidas
Entrenamiento  <-churnTrain[,Variables]           # tabla entrenamiento
Test           <-churnTest [,Variables]           # tabla  Test
 
 
# PASO 2:   Crea Arbol de Decision
# ---------------------------------------------------------------------------
ModeloArbol<-rpart(churn ~ .,data=Entrenamiento,parms=list(split="information"))
 
 
# PASO 3:  Predice Desafiliación en datos de TEST
# ---------------------------------------------------------------------------
Prediccion <- predict(ModeloArbol, Test,type="class") # Prediccción en Test
MC         <- table(Test[, "churn"],Prediccion) # Matriz de Confusión
 
 
# PASO 4: Crea Grafico
# ---------------------------------------------------------------------------
rpart.plot(ModeloArbol, type=1, extra=100,cex = .7,
           box.col=c("gray99", "gray88")[ModeloArbol$frame$yval])


1. Conceptos Arbol de Decision: http://web.fdi.ucm.es/posgrado/conferencias/JorgeMartin-slides.pdf
2. Detalles de rpart: http://cran.r-project.org/web/packages/rpart/rpart.pdf
3. Graficos con rpart.plot: http://www.milbo.org/rpart-plot/prp.pdf
4. Teoria Arbol de decision:
https://www.dropbox.com/s/adqd9hafnaq7t2o/ArbolDesicion_Teoria.pdf?dl=0






9 comentarios:

  1. Hola, quisiera saber como puedo descargar los datos de prueba: Datos set de Entrenamiento y Test

    Mil gracias

    ResponderEliminar
    Respuestas
    1. Los archivos son de la libreria C50. Fijate en Paso 1, se crean 2 data.frame(churnTrain y churnTrain). Para bajarlo a disco puedes usar desde R: write.csv(churnTrain,"c:/carpeta/churnTrain.csv")

      Eliminar
    2. Por favor podrias colocar en algun link los datos de entrenamiento. Gracias

      Eliminar
  2. Hola, que debo remplazar para hacerlo con unos datos diferentes?

    ResponderEliminar
  3. Excelente aplicación Dr.Enmanuel Santana, pero tambien me gustaría ver aplicaciones sobre modelos de pronóstico(ARIMA-GARCH)

    ResponderEliminar
  4. Excelente Web. Con respeto indico que el archivo de teoría del árbol de decisión no está en línea, agradezco que nos lo pueda compartir. Muchas gracias.

    ResponderEliminar
  5. Muchas gracias por compartir sus conocimientos.
    Pude correr todo con datos míos, todo OK menos cuando quiero ver la MC; sale el siguiente err:
    > MC <- table(test[, "tipo_isib"],prediccion) # Matriz de Confusión
    Error in sort.list(y) : 'x' must be atomic for 'sort.list'
    Have you called 'sort' on a list?
    "tipo_isib" es factor y tiene tres valores posibles. ¿Alguna sugerencia? Gracias

    ResponderEliminar
    Respuestas
    1. Hola, lo pude solucionar con:
      mc <- with(test,table(prediccion, tipo_isib)) saludos

      Eliminar