Monografico. Arboles de decisión con party

Los árboles de clasificación son una de las técnicas de análisis más utilizadas. No requieren supuestos distribucionales, permite detectar interacciones entre variables y no es muy sensible a la presencia de valores perdidos y outliers. En resumen, es una técnica que no quita mucho tiempo al analista para hacer consultas carentes de valor para sus responsables y permite identificar tanto perfiles positivos como perfiles negativos. Además, sus resultados son muy fáciles de interpretar. Tan fáciles que, INCLUSO, las áreas de negocio pueden entender sus resultados. Por todo esto estamos ante una de las técnicas más extendidas. En el blog ya hicimos un breve monográfico con rpart de R y nos quedaba realizar una revisión al paquete party. La metodología para esta rápida revisión será la habitual, planteamos un ejemplo y realizamos un análisis con las instrucciones de party.

Al igual que no hicimos para el monográfico de Rpart simulamos la cartera de un banco con 20.000 clientes. Deseamos establecer perfiles de clientes propensos a contratar un plan vitalicio de pensión inmediata, las variables con las que contamos son:

* El saldo en vista
* El máximo saldo en planes de pensiones individuales en los últimos 3 años
* El saldo en fondos
* La edad del cliente


clientes=20000
saldo_vista=runif(clientes,0,1)*10000
saldo_ppi=(runif(clientes,0.1,0.2)*rpois(clientes,1))*100000
saldo_fondos=(runif(clientes,0.1,0.9)*(rpois(clientes,1)-1>0))*100000
edad=rpois(clientes,60)
datos_ini<-data.frame(cbind(saldo_vista,saldo_ppi,saldo_fondos,edad))
datos_ini$saldo_ppi=(edad<=68)*datos_ini$saldo_ppi
#Creamos la variable objetivo a partir de un potencial
datos_ini$potencial=runif(1,0,1)+
(log(edad)/(log(68))/100) +
runif(1,0,0.001)*(saldo_vista>5000)+
runif(1,0,0.001)*(saldo_fondos>10000)+
runif(1,0,0.007)*(saldo_ppi>10000)-
runif(1,0,0.2)
datos_ini$pvi=as.factor((datos_ini$potencial>=quantile(datos_ini$potencial,
0.90))*1)

Por supuesto cualquier parecido de estos clientes con la realidad es pura ficción. Cargamos la librería, ejecutamos el modelo con la función ctree y creamos un archivo jpeg con la representación gráfica del mismo:


library(party)
arbol=ctree(pvi~saldo_vista+saldo_ppi+saldo_fondos+edad,data=datos_ini)
jpeg('C:/arbol.jpg', quality = 100, bg = "white", res = 100, width=2500, height=768)
plot(arbol);text(arbol)
dev.off()

Particularmente gusto de hacer gráficas de árboles mucho “más anchas que largas”, por ello genero un archivo jpeg de 2500×768, de este modo podemos ver bien la representación del árbol. Exploremos mejor los nodos generados con party:


arbol
table(where(arbol))
datos_ini=cbind(datos_ini,nodos=(where(arbol)))
summary(datos_ini)
table(datos_ini$nodos,datos_ini$pvi)
nodes(arbol,c(4,7)) #obtenemos los nodos que nos interesan

Prefiero rpart para estos análisis pero no negaréis que la representación gráfica de los árboles es muy interesante, además party nos permite emplear el algoritmo MOB (Multilevel Orthogonal Block) que veremos otro día, si termino de entender como funciona…

5 comentarios en “Monografico. Arboles de decisión con party

  1. Creo que su mayor peligro es también su mayor fortaleza:su sencillez y en que proporcionan respuestas claras como tú muy bien indicas. Pero los árboles de decisión, así a pelo, tienen un sesgo muy fuerte según la métrica de ganancia que escojamos y son muy inestables a los datos iniciales. Hay una abundante literatura sobre este asunto. También hay soluciones que ya no son tan claras y sencillas: los bosques aleatorios o el bagging.

  2. Es cierto que los árboles de decisión son muy inestables, y que, posiblemente, no son la mejor técnica predictiva que exista; pero en lo que si que hay que reconocerles es que son el modelo de más fácil explicación que existe.

    Debido a su estructura incluso los profanos en la materia del modelaje entienden que se está haciendo y harcelo suyo, incluso pueden aportar.

    Debido a esta facilidad de comprensión es una técnica fetiche de muchas consultoras, que sólo aplican esta técnica a la hora de hacer modelos predictivos. Cierto es que muchas veces los individuos que van a utilizar los modelos son profanos en la materia, y que debido a esto es preferible perder un poco de capacidad predictora por facilidad de comprensión; pero esto no es aplicable a todos los casos ni muchos menos. En una organización donde ya exista una cultura con una fuerte carga analítica tendríamos que ir viendo toda clase de modelos, SVM, redes neuronales, GAM’s … cada uno aplicado al problema que resuelva mejor.

    Aprovecho para saludaros a todos y desearos un feliz año nuevo. AGUR.

  3. Francisco:

    dices “En una organización donde ya exista una cultura con una fuerte carga analítica…” Por dios, díme donde se encuentra tal maravilla porque, sinceramente, en España temo que es una quimera. Si les hablas de SVM puede darles un yuyu allí mismo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *