Vender o no vender ese es el problema (II)Árboles de Decisión
Xavi Barber
Centro de Investigación Operativa.Universidad Miguel Hernández de Elche
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 1 / 58
1 Introducción al Concepto de Árbol
2 Los datos
3 Modelo Logístico
4 Partición Recursiva con R
5 Árboles de Regresión
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 2 / 58
Introducción al Concepto de Árbol
Introducción al Concepto de Árbol
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 3 / 58
Introducción al Concepto de Árbol
Árboles de Desición
Habitualmente llamados como Árboles de Decisión, o simplementeÁrboles. Son métodos para modelizar la predicción.
Un ejemplo clásico es “Considerar una regla para decidir que tarjeta decrédito ofrecer al cliente”:
Interés inferior al 15%Meses de carencia de pago >1Salario mensual superior a 3000eSi ya dispone de alguna tarjeta similar,. . .
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 4 / 58
Introducción al Concepto de Árbol
Reseña histórica
Tanto el programa comercial CART como la función rpart() estánbasados en el libro Classification and Regression TreesCART comenzó como un enorme programa en Fortran que escribió JerryFriedman y que sirvió para contrastar las ideas contenidas en el libro.Pero Fortran no es el lenguaje adecuado para un algoritmo recursivoSalford Systems©adquirió los derechos de dicho código.El paquete clásico en R se llama rpart debido a a que se registro elnombre de CART, esto ha hecho que la gente hable de “particónrecursiva” habitualmente y no de método CART.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 5 / 58
Introducción al Concepto de Árbol
El Algoritmo de búsquedaPara crear un árbol usaremos un algoritmo basado en la información de losdatos. El algoritmo de búsqueda para la regla de decisión se basa en lavariables predictoras para progresivamente dividir los “casos” en pequeñosgrupos “afines”.
Los grupos finales los llamamos “hojas”.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 6 / 58
Introducción al Concepto de Árbol
Tress vs. Logística
Ambos modelos necesitan información histórica, variables predictoras yuna variable OBJETIVO (Target) binaria.Ambos algoritmos usan información histórica para crear (estimar) elmodelo que relaciona a los predictores con el Target. Los modelos deregresión necesitan de una formula algebraica, mientras que losÁrboles son una secuencia de reglas.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 7 / 58
Introducción al Concepto de Árbol
Tress vs. Logística
Uno y otro modelo, una vez generado, puede usar un nuevo caso parapredecir el comportamiento de la variable Target.El modelo de regresión calcula la probabilidad de que una variabletarget tome un valor “bueno” para ese caso. Se utilizarán estasprobabilidades para dividir en dos grupos.El modelo de Árbol puede saignar directamente un nuevo caso al grupodel Target.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 8 / 58
Introducción al Concepto de Árbol
Ventajas y Desventajas
La interpretación del calibrado del árbol es muy sencilla, siendo muyútil su uso para audiencias no especializadas.Es más flexible que la regresión logística en las asunciones para suajuste, y se ve menos afectado por los valores perdidos.Pero los modelos de regresión pueden detectar efectos más débiles conun número menor de datos
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 9 / 58
Introducción al Concepto de Árbol
Diferentes tipos de modelos
Los algoritmos varían según su características, incluyendo el tipo deobjetivo , manejando la complejidad de las ramas.Utilizaremos la librería de R, rpart (recursive partitioning) (Venablesand Ripley 2002). Tambien se utilizarán las librerías party ypartykit.Más recientemente están apareciendo librerías que hacen incapie enobtener un arbol “publicable” y con técnicas más enfocadas al BigData: CORElearn, C50, etc.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 10 / 58
Introducción al Concepto de Árbol
Partes de un Árbol
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 11 / 58
Introducción al Concepto de Árbol
Índice Gini
Definimos PI y PD com olas proporciones de el nodo original a laderecha y a la izquierda, cuyo resultado es:
PI = nSI/N
PD = nNO/N.
Definimos la porporción de un tipo (1) dentro de los subnodos derechoe izquierdo como pI y pD, dadod por:
pI = nX1A/nSI pD = nX1B /nNO.
Definimos entonces el índice GINI como medida asociada al resultadodeparticiona los datos por:
PI(pI)(1 − pI) + PD(pD)(1 − pD).
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 12 / 58
Introducción al Concepto de Árbol
Selección Recursiva
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 13 / 58
Introducción al Concepto de Árbol
Reglas de Parada
Todos los casos en un nodo tienes igual valor para los predictoresLa “profundidad”" del árbol sobrepasa el máximo establecido.El tamaño del nodo es más pequeño que el mínimo establecido.El corte de un nodo va a provocar un tamaño menor del establecido.El nodo se convierte en “puro”.etc.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 14 / 58
Introducción al Concepto de Árbol
Validación del Resultado
Como en los métodos de regresión es muy importante validar el modelo:
Particionar la base de datos en dos y utilizar uan para Estimar y otrapara Validar.Realizar una validación cruzada (ajustar tantos modelos como Datos,eliminando el i-ésimo dato en el modelo i-ésimo).Utilizar Random Forest (próxima Sesión).
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 15 / 58
Los datos
Los datos
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 16 / 58
Los datos
El ejemplo
Tenemos los datos de uan encuesta alos visitantes de Terra Mítica. Losdatos contienen la siguiente información:
Si es o no visitante de fin de semana (weekend),Número de niños que le acompañan (num.cild),La distnacia desde su hogar al parque (ditance).Satisfacción general (overall),satisfacción con las atracciones(rides), juegos (games),tiempos deespera (wait) y limpieza (clean).
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 17 / 58
Los datos
El ejemplo
sat.df <- read.csv("http://goo.gl/HKnl74")#'sat.df <- read.csv2("~/Dropbox/xavi-umh/docencia/TEIM/2015-2016/material/sat_df.csv")str(sat.df)
## 'data.frame': 500 obs. of 8 variables:## $ weekend : Factor w/ 2 levels "no","yes": 2 2 1 2 1 1 2 1 1 2 ...## $ num.child: int 0 2 1 0 4 5 1 0 0 3 ...## $ distance : num 114.6 27 63.3 25.9 54.7 ...## $ rides : int 87 87 85 88 84 81 77 82 90 88 ...## $ games : int 73 78 80 72 87 79 73 70 88 86 ...## $ wait : int 60 76 70 66 74 48 58 70 79 55 ...## $ clean : int 89 87 88 89 87 79 85 83 95 88 ...## $ overall : int 47 65 61 37 68 27 40 30 58 36 ...
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 18 / 58
Los datos
El ejemplo
Vamos a categorizar la variable overall como medida que indique si uncliente está o no satisfecho.
Lo primero pintaré un histograma para ver cómo es esta variable:
library(ggplot2)ggplot(data=sat.df, aes(overall)) +
geom_histogram(aes(y =..density..),breaks=seq(0, 100, by = 10),col="red",fill="green",alpha = .2) +
geom_density(col=4) +labs(title="Histograma para Satisfacción") +labs(x="Satisfacción", y="Casos")
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 19 / 58
Los datos
0.00
0.01
0.02
0 25 50 75 100Satisfacción
Cas
os
Histograma para Satisfacción
Vemos como su comportamiento es bastante "normal", por que deberemosdecirdir dónde cortar para ver a los insatisfechos.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 20 / 58
Los datos
El ejemplo
Ahora nos guardaremos unos datos para la fase de estimación y otroa parala fase de validación:
library(caret)dividir<- createDataPartition(sat.df$overall,p=0.5, list=FALSE)#'ajuste <- sat.df[ dividir, ]#'valida <- sat.df[ -dividir, ]
Veamos pues diferentes posibilidades de categorización de esta variabledependiendo del punto de corte realizado. - Overall < 50
sat.df$Satis<-factor(ifelse(sat.df$overall<50,"Insatisfecho","Satisfecho"))#'valida$Satis<-factor(ifelse(valida$overall<50,"Insatisfecho","Satisfecho"))
#'mytable<-table(ajuste$Satis)/length(ajuste$Satis)#'mytable
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 21 / 58
Los datos
Los datos
Tenemos los datos de uan encuesta alos visitantes de Terra Mítica. Losdatos contienen la siguiente información:
Si es o no visitante de fin de semana (weekend),Número de niños que le acompañan (num.cild),La distnacia desde su hogar al parque (ditance).satisfacción con las atracciones(rides), juegos (games),tiempos deespera (wait) y limpieza (clean).
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 22 / 58
Modelo Logístico
Modelo Logístico
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 23 / 58
Modelo Logístico
Ajustando el modelo Completo
fit1<-glm(Satis~weekend+num.child+distance+rides+games+wait+clean, data=sat.df,family=binomial(link="logit"), subset=dividir)
Estimate Std. Error z value Pr(>|z|)
weekendyes -0.5129 0.3703 -1.385 0.166num.child 0.8803 0.1486 5.924 3.135e-09distance 0.008859 0.006868 1.29 0.1971rides 0.03333 0.0542 0.6149 0.5386games 0.07254 0.02806 2.585 0.009729wait 0.1202 0.02273 5.288 1.236e-07clean 0.2285 0.06988 3.27 0.001075
(Intercept) -38.57 5.333 -7.232 4.756e-13
(Dispersion parameter for binomial family taken to be 1 )
Null deviance: 348.0 on 250 degrees of freedomResidual deviance: 189.4 on 243 degrees of freedom
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 24 / 58
Modelo Logístico
El modelo Bondadoso
Tratamos de ajustar mejor el modelo:
fit2<-glm(Satis~num.child+rides+games+wait, data=sat.df,family=binomial(link="logit"), subset=dividir)
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 25 / 58
Modelo Logístico
Capacidad predictiva del modelo
varPred<-c(2,4,5,6)casos<-predict(fit2,sat.df[-dividir,varPred], type="response")prediccion1<-factor(ifelse(casos<0.5,
"Insatisfecho","Satisfecho"))mt<-table(prediccion1,sat.df$Satis[-dividir])kable(addmargins(mt))
Insatisfecho Satisfecho Sum
Insatisfecho 95 32 127Satisfecho 27 95 122Sum 122 127 249
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 26 / 58
Modelo Logístico
Capacidad predictiva del modeloprint(confusionMatrix(prediccion1,sat.df$Satis[-dividir]))
## Confusion Matrix and Statistics#### Reference## Prediction Insatisfecho Satisfecho## Insatisfecho 95 32## Satisfecho 27 95#### Accuracy : 0.7631## 95% CI : (0.7053, 0.8145)## No Information Rate : 0.51## P-Value [Acc > NIR] : <2e-16#### Kappa : 0.5263## Mcnemar's Test P-Value : 0.6025#### Sensitivity : 0.7787## Specificity : 0.7480## Pos Pred Value : 0.7480## Neg Pred Value : 0.7787## Prevalence : 0.4900## Detection Rate : 0.3815## Detection Prevalence : 0.5100## Balanced Accuracy : 0.7634#### 'Positive' Class : Insatisfecho##
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 27 / 58
Partición Recursiva con R
Partición Recursiva con R
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 28 / 58
Partición Recursiva con R
El algoritmo de ajuste
Para más información: [link]https://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 29 / 58
Partición Recursiva con R
Ajustando el Árbollibrary(rpart)arbol1<-rpart(Satis~weekend+num.child+distance+
rides+games+wait+clean, data=sat.df, subset=dividir,method="class")
Los parámetros de rpart más importantes son:
1 subset: para bases de datos Ajuste-Validación.2 method:
“anova” para variables Dependientes Contínuas
“poisson” para modelos de tasas-eventos (Poisson Regression)
“class” cuando la variable Dependiente es un Factor (0/1)
“exp” para modelos de supervivencia (survival regression)
y otros más
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 30 / 58
Partición Recursiva con R
Ajustando el Árbollibrary(rpart)arbol1<-rpart(Satis~weekend+num.child+distance+
rides+games+wait+clean, data=sat.df, subset=dividir,method="class")
Los parámetros de rpart más importantes son:
1 subset: para bases de datos Ajuste-Validación.2 method:
“anova” para variables Dependientes Contínuas
“poisson” para modelos de tasas-eventos (Poisson Regression)
“class” cuando la variable Dependiente es un Factor (0/1)
“exp” para modelos de supervivencia (survival regression)
y otros más
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 30 / 58
Partición Recursiva con R
Ajustando el Árbollibrary(rpart)arbol1<-rpart(Satis~weekend+num.child+distance+
rides+games+wait+clean, data=sat.df, subset=dividir,method="class")
Los parámetros de rpart más importantes son:
1 subset: para bases de datos Ajuste-Validación.2 method:
“anova” para variables Dependientes Contínuas
“poisson” para modelos de tasas-eventos (Poisson Regression)
“class” cuando la variable Dependiente es un Factor (0/1)
“exp” para modelos de supervivencia (survival regression)
y otros más
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 30 / 58
Partición Recursiva con R
Ajustando el Árbollibrary(rpart)arbol1<-rpart(Satis~weekend+num.child+distance+
rides+games+wait+clean, data=sat.df, subset=dividir,method="class")
Los parámetros de rpart más importantes son:
1 subset: para bases de datos Ajuste-Validación.2 method:
“anova” para variables Dependientes Contínuas
“poisson” para modelos de tasas-eventos (Poisson Regression)
“class” cuando la variable Dependiente es un Factor (0/1)
“exp” para modelos de supervivencia (survival regression)
y otros más
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 30 / 58
Partición Recursiva con R
Ajustando el Árbollibrary(rpart)arbol1<-rpart(Satis~weekend+num.child+distance+
rides+games+wait+clean, data=sat.df, subset=dividir,method="class")
Los parámetros de rpart más importantes son:
1 subset: para bases de datos Ajuste-Validación.2 method:
“anova” para variables Dependientes Contínuas
“poisson” para modelos de tasas-eventos (Poisson Regression)
“class” cuando la variable Dependiente es un Factor (0/1)
“exp” para modelos de supervivencia (survival regression)
y otros más
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 30 / 58
Partición Recursiva con R
## n= 251#### node), split, n, loss, yval, (yprob)## * denotes terminal node#### 1) root 251 123 Satisfecho (0.49003984 0.50996016)## 2) clean< 87.5 124 33 Insatisfecho (0.73387097 0.26612903)## 4) wait< 78.5 111 22 Insatisfecho (0.80180180 0.19819820)## 8) rides< 83.5 71 7 Insatisfecho (0.90140845 0.09859155) *## 9) rides>=83.5 40 15 Insatisfecho (0.62500000 0.37500000)## 18) num.child< 0.5 10 0 Insatisfecho (1.00000000 0.00000000) *## 19) num.child>=0.5 30 15 Insatisfecho (0.50000000 0.50000000)## 38) clean< 84.5 7 1 Insatisfecho (0.85714286 0.14285714) *## 39) clean>=84.5 23 9 Satisfecho (0.39130435 0.60869565)## 78) wait< 72 16 7 Insatisfecho (0.56250000 0.43750000) *## 79) wait>=72 7 0 Satisfecho (0.00000000 1.00000000) *## 5) wait>=78.5 13 2 Satisfecho (0.15384615 0.84615385) *## 3) clean>=87.5 127 32 Satisfecho (0.25196850 0.74803150)## 6) num.child< 0.5 38 12 Insatisfecho (0.68421053 0.31578947)## 12) games< 87.5 28 4 Insatisfecho (0.85714286 0.14285714) *## 13) games>=87.5 10 2 Satisfecho (0.20000000 0.80000000) *## 7) num.child>=0.5 89 6 Satisfecho (0.06741573 0.93258427) *
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 31 / 58
Partición Recursiva con R
print(arbol1$frame)
## var n wt dev yval complexity ncompete nsurrogate yval2.V1## 1 clean 251 251 123 2 0.47154472 4 5 2.00000000## 2 wait 124 124 33 1 0.07317073 4 0 1.00000000## 4 rides 111 111 22 1 0.01355014 4 5 1.00000000## 8 <leaf> 71 71 7 1 0.00000000 0 0 1.00000000## 9 num.child 40 40 15 1 0.01355014 4 1 1.00000000## 18 <leaf> 10 10 0 1 0.01000000 0 0 1.00000000## 19 clean 30 30 15 1 0.01355014 4 0 1.00000000## 38 <leaf> 7 7 1 1 0.01000000 0 0 1.00000000## 39 wait 23 23 9 2 0.01355014 4 2 2.00000000## 78 <leaf> 16 16 7 1 0.01000000 0 0 1.00000000## 79 <leaf> 7 7 0 2 0.01000000 0 0 2.00000000## 5 <leaf> 13 13 2 2 0.01000000 0 0 2.00000000## 3 num.child 127 127 32 2 0.11382114 4 0 2.00000000## 6 games 38 38 12 1 0.04878049 4 2 1.00000000## 12 <leaf> 28 28 4 1 0.00000000 0 0 1.00000000## 13 <leaf> 10 10 2 2 0.01000000 0 0 2.00000000## 7 <leaf> 89 89 6 2 0.00000000 0 0 2.00000000## yval2.V2 yval2.V3 yval2.V4 yval2.V5 yval2.nodeprob## 1 123.00000000 128.00000000 0.49003984 0.50996016 1.00000000## 2 91.00000000 33.00000000 0.73387097 0.26612903 0.49402390## 4 89.00000000 22.00000000 0.80180180 0.19819820 0.44223108## 8 64.00000000 7.00000000 0.90140845 0.09859155 0.28286853## 9 25.00000000 15.00000000 0.62500000 0.37500000 0.15936255## 18 10.00000000 0.00000000 1.00000000 0.00000000 0.03984064## 19 15.00000000 15.00000000 0.50000000 0.50000000 0.11952191## 38 6.00000000 1.00000000 0.85714286 0.14285714 0.02788845## 39 9.00000000 14.00000000 0.39130435 0.60869565 0.09163347## 78 9.00000000 7.00000000 0.56250000 0.43750000 0.06374502## 79 0.00000000 7.00000000 0.00000000 1.00000000 0.02788845## 5 2.00000000 11.00000000 0.15384615 0.84615385 0.05179283## 3 32.00000000 95.00000000 0.25196850 0.74803150 0.50597610## 6 26.00000000 12.00000000 0.68421053 0.31578947 0.15139442## 12 24.00000000 4.00000000 0.85714286 0.14285714 0.11155378## 13 2.00000000 8.00000000 0.20000000 0.80000000 0.03984064## 7 6.00000000 83.00000000 0.06741573 0.93258427 0.35458167
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 32 / 58
Partición Recursiva con R
Índice de Complejidad
Se define Rα(T ) = R(T ) + α|T | como el coste para el árbol, y se define Tα como el sub-árbolde la hipótesis nula el cual tiene un coste mínimo. Obviamente T0 = el modelo completo yT∞=el modelo sin “cortes”.
1 Si T1 y T2 son sub-árboles de T con Rα(T1) = Rα(T2), entonces o bien T1 es unsub-árbol de T2 o T2 es un sub-arbol de T1; por lo tanto, ya sea |T1| < |T2| or|T2| < |T1|.
2 If α > β entonces o bien Tα = Tβ o Tα es un subárbol (estricto) de Tβ .3 Dado un conjunto de números α1, α2, . . . , αm; ambos Tα1 , . . . ,Tαm y R(Tα1 ), . . .,
R(Tαm ) se pueden calcular de manera eficiente.
Podemos definir Tα como el árbol más pequeño T para el cual Rα(T ) se minimiza.
Por tanto el parámetro de complejidad cp se obtiene de: Rcp(T ) ≡ R(T ) + cp ∗ |T | ∗ R(T1)donde T1 es el árbol sin cortes, |T | es el número de cortes pra el árbol, y R es el riesgo.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 33 / 58
Partición Recursiva con R
Índice de Complejidad
CP = El Parámetro de Complejidad, siendorel error= rel error(antes) - (nsplit - nsplit(antes)) * CP(antes); donde (antes)denota siempre la entrada en la fila de arriba.xerror=The xerror column contains of estimates of cross-validated prediction errorfor different numbers of splits.xstd= El error estandar de esas estimaciones.
kable(arbol1$cptable)
CP nsplit rel error xerror xstd
0.4715447 0 1.0000000 1.1219512 0.06408210.1138211 1 0.5284553 0.5284553 0.05642490.0731707 2 0.4146341 0.4715447 0.05429390.0487805 3 0.3414634 0.4146341 0.05182720.0135501 4 0.2926829 0.3414634 0.04807900.0100000 8 0.2357724 0.3577236 0.0489744
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 34 / 58
Partición Recursiva con R
kable(arbol1$splits)
count ncat improve index adj
clean 251 -1 29.1406996 87.500000 0.0000000rides 251 -1 22.6392937 83.500000 0.0000000wait 251 -1 20.4638046 72.500000 0.0000000games 251 -1 19.5163579 78.500000 0.0000000num.child 251 -1 18.6524091 0.500000 0.0000000rides 0 -1 0.8127490 84.500000 0.6209677games 0 -1 0.7211155 79.500000 0.4354839wait 0 -1 0.6573705 66.500000 0.3064516distance 0 1 0.5418327 84.855383 0.0725806num.child 0 -1 0.5219124 2.500000 0.0322581wait 124 -1 9.7715892 78.500000 0.0000000games 124 -1 4.3291009 79.500000 0.0000000rides 124 -1 4.1601216 83.500000 0.0000000num.child 124 -1 3.5767882 0.500000 0.0000000clean 124 -1 2.9543493 84.500000 0.0000000rides 111 -1 3.9095610 83.500000 0.0000000games 111 -1 3.9095610 77.500000 0.0000000clean 111 -1 3.6325260 84.500000 0.0000000wait 111 -1 3.4141026 60.500000 0.0000000num.child 111 -1 2.9419299 0.500000 0.0000000clean 0 -1 0.7207207 84.500000 0.2250000wait 0 -1 0.6756757 74.500000 0.1000000num.child 0 -1 0.6576577 4.500000 0.0500000distance 0 -1 0.6576577 99.396816 0.0500000games 0 -1 0.6486486 91.000000 0.0250000num.child 40 -1 3.7500000 0.500000 0.0000000wait 40 -1 3.7500000 60.000000 0.0000000distance 40 -1 2.8409091 19.264180 0.0000000games 40 -1 2.6886189 77.500000 0.0000000clean 40 -1 1.2500000 84.500000 0.0000000distance 0 -1 0.8000000 4.175389 0.2000000clean 30 -1 2.3291925 84.500000 0.0000000wait 30 -1 1.9841270 72.500000 0.0000000distance 30 -1 1.7942584 19.264180 0.0000000games 30 -1 1.6666667 77.500000 0.0000000rides 30 -1 0.8385093 87.500000 0.0000000wait 23 -1 3.0815217 72.000000 0.0000000games 23 -1 1.5411371 77.500000 0.0000000distance 23 1 1.3398551 37.170717 0.0000000clean 23 1 0.4898551 85.500000 0.0000000rides 23 -1 0.2243789 87.500000 0.0000000games 0 -1 0.7391304 80.500000 0.1428571clean 0 -1 0.7391304 86.500000 0.1428571num.child 127 -1 20.2619519 0.500000 0.0000000wait 127 -1 3.5224176 71.500000 0.0000000games 127 -1 3.1989165 83.500000 0.0000000clean 127 -1 2.4417415 94.500000 0.0000000rides 127 -1 1.6827114 94.500000 0.0000000games 38 -1 6.3639098 87.500000 0.0000000distance 38 1 2.0210526 42.143628 0.0000000weekend 38 2 1.6500381 1.000000 0.0000000clean 38 -1 1.1215135 93.500000 0.0000000rides 38 -1 0.7377193 85.500000 0.0000000clean 0 -1 0.8157895 94.500000 0.3000000rides 0 -1 0.7894737 95.000000 0.2000000
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 35 / 58
Partición Recursiva con R
kable(arbol1$variable.importance)
clean 34.698934num.child 25.147452rides 23.277777wait 22.174281games 19.592171distance 3.060529
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 36 / 58
Partición Recursiva con R
Dibujando el árbol
library(rpart.plot)prp(arbol1,type=2)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
Satisfec
Insatisf
Insatisf
Insatisf Insatisf
Insatisf Insatisf
Insatisf Satisfec
Insatisf Satisfec
Satisfec
Satisfec
Insatisf
Insatisf Satisfec
Satisfec
yes no
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 37 / 58
Partición Recursiva con R
prp(arbol1,type=4)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
Satisfec
Insatisf
Insatisf
Insatisf Insatisf
Insatisf Insatisf
Insatisf Satisfec
Insatisf Satisfec
Satisfec
Satisfec
Insatisf
Insatisf Satisfec
Satisfec
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 38 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=3)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
Satisfec123 / 251
Insatisf33 / 124
Insatisf22 / 111
Insatisf7 / 71
Insatisf15 / 40
Insatisf0 / 10
Insatisf15 / 30
Insatisf1 / 7
Satisfec9 / 23
Insatisf7 / 16
Satisfec0 / 7
Satisfec2 / 13
Satisfec32 / 127
Insatisf12 / 38
Insatisf4 / 28
Satisfec2 / 10
Satisfec6 / 89
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 39 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=103)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
Satisfec123 / 251
100%
Insatisf33 / 124
49%
Insatisf22 / 111
44%
Insatisf7 / 7128%
Insatisf15 / 4016%
Insatisf0 / 104%
Insatisf15 / 3012%
Insatisf1 / 73%
Satisfec9 / 239%
Insatisf7 / 166%
Satisfec0 / 73%
Satisfec2 / 135%
Satisfec32 / 127
51%
Insatisf12 / 3815%
Insatisf4 / 2811%
Satisfec2 / 104%
Satisfec6 / 8935%
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 40 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=103, under=T)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
123 / 251100%
33 / 12449%
22 / 11144%
7 / 7128%
15 / 4016%
0 / 104%
15 / 3012%
1 / 73%
9 / 239%
7 / 166%
0 / 73%
2 / 135%
32 / 12751%
12 / 3815%
4 / 2811%
2 / 104%
6 / 8935%
Satisfec
Insatisf
Insatisf
Insatisf Insatisf
Insatisf Insatisf
Insatisf Satisfec
Insatisf Satisfec
Satisfec
Satisfec
Insatisf
Insatisf Satisfec
Satisfec
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 41 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=103, under=T, nn=T,fallen.leaves=T)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
123 / 251100%
33 / 12449%
22 / 11144%
7 / 7128%
15 / 4016%
0 / 104%
15 / 3012%
1 / 73%
9 / 239%
7 / 166%
0 / 73%
2 / 135%
32 / 12751%
12 / 3815%
4 / 2811%
2 / 104%
6 / 8935%
Satisfec
Insatisf
Insatisf
Insatisf
Insatisf
Insatisf
Insatisf
Insatisf
Satisfec
Insatisf Satisfec Satisfec
Satisfec
Insatisf
Insatisf Satisfec Satisfec
1
2
4
8
9
18
19
38
39
78 79 5
3
6
12 13 7
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 42 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=103, under=T,nn=F, fallen.leaves=F,yflip=T)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
123 / 251100%
33 / 12449%
22 / 11144%
7 / 7128%
15 / 4016%
0 / 104%
15 / 3012%
1 / 73%
9 / 239%
7 / 166%
0 / 73%
2 / 135%
32 / 12751%
12 / 3815%
4 / 2811%
2 / 104%
6 / 8935%
Satisfec
Insatisf
Insatisf
Insatisf Insatisf
Insatisf Insatisf
Insatisf Satisfec
Insatisf Satisfec
Satisfec
Satisfec
Insatisf
Insatisf Satisfec
Satisfec
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 43 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=103, under=T,nn=F, fallen.leaves=F, yflip=F, trace=T)
## cex 0.188 xlim c(0, 1) ylim c(-0.2, 1.2)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
123 / 251100%
33 / 12449%
22 / 11144%
7 / 7128%
15 / 4016%
0 / 104%
15 / 3012%
1 / 73%
9 / 239%
7 / 166%
0 / 73%
2 / 135%
32 / 12751%
12 / 3815%
4 / 2811%
2 / 104%
6 / 8935%
Satisfec
Insatisf
Insatisf
Insatisf Insatisf
Insatisf Insatisf
Insatisf Satisfec
Insatisf Satisfec
Satisfec
Satisfec
Insatisf
Insatisf Satisfec
Satisfec
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 44 / 58
Partición Recursiva con R
prp(arbol1,type=4, extra=103, under=T,nn=F, fallen.leaves=F, yflip=F, trace=T,box.col="red", border.col="blue", shadow.col="gray")
## cex 0.188 xlim c(0, 1) ylim c(-0.2, 1.2)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
>= 88
>= 78
>= 84
>= 0.5
>= 84
>= 72
>= 0.5
>= 88
123 / 251100%
33 / 12449%
22 / 11144%
7 / 7128%
15 / 4016%
0 / 104%
15 / 3012%
1 / 73%
9 / 239%
7 / 166%
0 / 73%
2 / 135%
32 / 12751%
12 / 3815%
4 / 2811%
2 / 104%
6 / 8935%
Satisfec
Insatisf
Insatisf
Insatisf Insatisf
Insatisf Insatisf
Insatisf Satisfec
Insatisf Satisfec
Satisfec
Satisfec
Insatisf
Insatisf Satisfec
Satisfec
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 45 / 58
Partición Recursiva con R
rpart.plot(arbol1)
clean < 88
wait < 78
rides < 84
num.chil < 0.5
clean < 84
wait < 72
num.chil < 0.5
games < 88
Insatisf
Insatisf
Insatisf
Insatisf Satisfec
Satisfec
Insatisf Satisfec
Satisfec
yes no
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 46 / 58
Partición Recursiva con R
library(rpart.plot)library(rattle)fancyRpartPlot(arbol1, sub="")
yes no
1
2
4
8
9
18
19
38
39
78 79 5
3
6
12 13 7
clean < 88
wait < 78
rides < 84
num.child < 0.5
clean < 84
wait < 72
num.child < 0.5
games < 88
Satisfecho.49 .51100%
Insatisfecho.73 .27
49%
Insatisfecho.80 .20
44%
Insatisfecho.90 .10
28%
Insatisfecho.62 .38
16%
Insatisfecho1.00 .00
4%
Insatisfecho.50 .50
12%
Insatisfecho.86 .14
3%
Satisfecho.39 .61
9%
Insatisfecho.56 .44
6%
Satisfecho.00 1.00
3%
Satisfecho.15 .85
5%
Satisfecho.25 .75
51%
Insatisfecho.68 .32
15%
Insatisfecho.86 .14
11%
Satisfecho.20 .80
4%
Satisfecho.07 .93
35%
yes no
1
2
4
8
9
18
19
38
39
78 79 5
3
6
12 13 7
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 47 / 58
Partición Recursiva con R
Perfeccionando el Árbolkable(printcp(arbol1))
#### Classification tree:## rpart(formula = Satis ~ weekend + num.child + distance + rides +## games + wait + clean, data = sat.df, subset = dividir, method = "class")#### Variables actually used in tree construction:## [1] clean games num.child rides wait#### Root node error: 123/251 = 0.49004#### n= 251#### CP nsplit rel error xerror xstd## 1 0.471545 0 1.00000 1.12195 0.064082## 2 0.113821 1 0.52846 0.52846 0.056425## 3 0.073171 2 0.41463 0.47154 0.054294## 4 0.048780 3 0.34146 0.41463 0.051827## 5 0.013550 4 0.29268 0.34146 0.048079## 6 0.010000 8 0.23577 0.35772 0.048974
CP nsplit rel error xerror xstd
0.4715447 0 1.0000000 1.1219512 0.06408210.1138211 1 0.5284553 0.5284553 0.05642490.0731707 2 0.4146341 0.4715447 0.05429390.0487805 3 0.3414634 0.4146341 0.05182720.0135501 4 0.2926829 0.3414634 0.04807900.0100000 8 0.2357724 0.3577236 0.0489744
*Esta función devuelve el Cp óptim o:arbol1$cptab le[which. min(arbol1$c ptable[,“xer ror“]),”CP“]=
## [1] 0.01355014
cp
X−
val R
elat
ive
Err
or
0.2
0.8
Inf 0.091 0.026
1 2 3 4 5 9
size of tree
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 48 / 58
Partición Recursiva con R
Cortamos el arbol según el Cp óptimo:
parbol1<-prune(arbol1,cp=arbol1$cptable[which.min(arbol1$cptable[,"xerror"]),"CP"])
yes no
1
2
4 5
3
6
12 13 7
clean < 88
wait < 78 num.child < 0.5
games < 88
Satisfecho.49 .51100%
Insatisfecho.73 .27
49%
Insatisfecho.80 .20
44%
Satisfecho.15 .85
5%
Satisfecho.25 .75
51%
Insatisfecho.68 .32
15%
Insatisfecho.86 .14
11%
Satisfecho.20 .80
4%
Satisfecho.07 .93
35%
yes no
1
2
4 5
3
6
12 13 7
Pruned Classification Tree
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 49 / 58
Partición Recursiva con R
Predicción
Utilizaremos los datos de “Validación”: sat.df[-dividir,]
newdata<-sat.df[-dividir,]p <- predict(parbol1, newdata)
Insatisfecho Satisfecho
Insatisfecho 100 22Satisfecho 36 91
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 50 / 58
Partición Recursiva con R
Y los datos de Sensibilidad y especificiadad de nuestro modelo:
## Confusion Matrix and Statistics#### Satispred## Insatisfecho Satisfecho## Insatisfecho 100 22## Satisfecho 36 91#### Accuracy : 0.7671## 95% CI : (0.7095, 0.8181)## No Information Rate : 0.5462## P-Value [Acc > NIR] : 3.959e-13#### Kappa : 0.535## Mcnemar's Test P-Value : 0.08783#### Sensitivity : 0.7353## Specificity : 0.8053## Pos Pred Value : 0.8197## Neg Pred Value : 0.7165## Prevalence : 0.5462## Detection Rate : 0.4016## Detection Prevalence : 0.4900## Balanced Accuracy : 0.7703#### 'Positive' Class : Insatisfecho##
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 51 / 58
Árboles de Regresión
Árboles de Regresión
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 52 / 58
Árboles de Regresión
Variable contínuaAhora vamos a trabajar con la variable overall:
arbol2<-rpart(overall~weekend+num.child+distance+rides+games+wait+clean, data=sat.df,
subset=dividir,method="anova")
## n= 251#### node), split, n, deviance, yval## * denotes terminal node#### 1) root 251 59268.5300 51.47012## 2) clean< 87.5 124 15367.9700 43.01613## 4) wait< 60.5 38 2931.8160 33.71053## 8) distance< 34.65876 28 1941.4290 31.14286 *## 9) distance>=34.65876 10 288.9000 40.90000 *## 5) wait>=60.5 86 7691.5930 47.12791## 10) num.child< 0.5 20 1188.9500 37.95000 *## 11) num.child>=0.5 66 4307.4550 49.90909## 22) rides< 82.5 34 1396.9410 46.17647 *## 23) rides>=82.5 32 1933.5000 53.87500 *## 3) clean>=87.5 127 26385.3500 59.72441## 6) num.child< 0.5 38 2774.7630 45.92105## 12) games< 87.5 28 1496.4290 43.35714 *## 13) games>=87.5 10 578.9000 53.10000 *## 7) num.child>=0.5 89 13279.0100 65.61798## 14) wait< 82.5 68 7187.4710 61.91176## 28) clean< 90.5 27 1986.9630 55.96296 *## 29) clean>=90.5 41 3615.8050 65.82927## 58) rides< 87.5 9 348.0000 57.00000 *## 59) rides>=87.5 32 2368.8750 68.31250## 118) wait< 71.5 15 871.6000 63.60000 *## 119) wait>=71.5 17 870.2353 72.47059 *## 15) wait>=82.5 21 2132.9520 77.61905## 30) clean< 93.5 13 525.0769 72.61538 *## 31) clean>=93.5 8 753.5000 85.75000 *
## n= 251#### node), split, n, deviance, yval## * denotes terminal node#### 1) root 251 59268.5300 51.47012## 2) clean< 87.5 124 15367.9700 43.01613## 4) wait< 60.5 38 2931.8160 33.71053## 8) distance< 34.65876 28 1941.4290 31.14286 *## 9) distance>=34.65876 10 288.9000 40.90000 *## 5) wait>=60.5 86 7691.5930 47.12791## 10) num.child< 0.5 20 1188.9500 37.95000 *## 11) num.child>=0.5 66 4307.4550 49.90909## 22) rides< 82.5 34 1396.9410 46.17647 *## 23) rides>=82.5 32 1933.5000 53.87500 *## 3) clean>=87.5 127 26385.3500 59.72441## 6) num.child< 0.5 38 2774.7630 45.92105## 12) games< 87.5 28 1496.4290 43.35714 *## 13) games>=87.5 10 578.9000 53.10000 *## 7) num.child>=0.5 89 13279.0100 65.61798## 14) wait< 82.5 68 7187.4710 61.91176## 28) clean< 90.5 27 1986.9630 55.96296 *## 29) clean>=90.5 41 3615.8050 65.82927## 58) rides< 87.5 9 348.0000 57.00000 *## 59) rides>=87.5 32 2368.8750 68.31250## 118) wait< 71.5 15 871.6000 63.60000 *## 119) wait>=71.5 17 870.2353 72.47059 *## 15) wait>=82.5 21 2132.9520 77.61905## 30) clean< 93.5 13 525.0769 72.61538 *## 31) clean>=93.5 8 753.5000 85.75000 *
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 53 / 58
Árboles de Regresión
yes no
1
2
4
8 9
5
10
11
22 23
3
6
12 13
7
14
28
29
58
59
118 119
15
30 31
clean < 88
wait < 60
distance < 35 num.child < 0.5
rides < 82
num.child < 0.5
games < 88 wait < 82
clean < 90
rides < 88
wait < 72
clean < 94
51n=251 100%
43n=124 49%
34n=38 15%
31n=28 11%
41n=10 4%
47n=86 34%
38n=20 8%
50n=66 26%
46n=34 14%
54n=32 13%
60n=127 51%
46n=38 15%
43n=28 11%
53n=10 4%
66n=89 35%
62n=68 27%
56n=27 11%
66n=41 16%
57n=9 4%
68n=32 13%
64n=15 6%
72n=17 7%
78n=21 8%
73n=13 5%
86n=8 3%
yes no
1
2
4
8 9
5
10
11
22 23
3
6
12 13
7
14
28
29
58
59
118 119
15
30 31
Regression Tree
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 54 / 58
Árboles de Regresión
#### Regression tree:## rpart(formula = overall ~ weekend + num.child + distance + rides +## games + wait + clean, data = sat.df, subset = dividir, method = "anova")#### Variables actually used in tree construction:## [1] clean distance games num.child rides wait#### Root node error: 59269/251 = 236.13#### n= 251#### CP nsplit rel error xerror xstd## 1 0.295523 0 1.00000 1.00262 0.090749## 2 0.174318 1 0.70448 0.71216 0.062483## 3 0.080052 2 0.53016 0.53734 0.051181## 4 0.066791 3 0.45011 0.50298 0.049938## 5 0.037038 4 0.38332 0.43109 0.037743## 6 0.026738 5 0.34628 0.41667 0.037355## 7 0.016485 6 0.31954 0.40286 0.034720## 8 0.015167 7 0.30306 0.39102 0.033168## 9 0.014415 8 0.28789 0.38618 0.032346## 10 0.011836 9 0.27347 0.38051 0.033079## 11 0.011801 10 0.26164 0.38164 0.033116## 12 0.010580 11 0.24984 0.37705 0.033132## 13 0.010000 12 0.23926 0.37563 0.033131
## CP nsplit rel error xerror xstd## 1 0.29552285 0 1.0000000 1.0026215 0.09074932## 2 0.17431815 1 0.7044771 0.7121625 0.06248340## 3 0.08005191 2 0.5301590 0.5373398 0.05118075## 4 0.06679073 3 0.4501071 0.5029815 0.04993813## 5 0.03703801 4 0.3833163 0.4310932 0.03774330## 6 0.02673768 5 0.3462783 0.4166726 0.03735489## 7 0.01648452 6 0.3195407 0.4028611 0.03472002## 8 0.01516707 7 0.3030561 0.3910190 0.03316817## 9 0.01441533 8 0.2878891 0.3861817 0.03234638## 10 0.01183575 9 0.2734737 0.3805123 0.03307890## 11 0.01180111 10 0.2616380 0.3816400 0.03311638## 12 0.01057964 11 0.2498369 0.3770522 0.03313192## 13 0.01000000 12 0.2392572 0.3756264 0.03313120
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 55 / 58
Árboles de Regresión
¿Cuál es el Cp óptimo?
## [1] 0.01
cp
X−
val R
elat
ive
Err
or
0.4
0.8
1.2
Inf 0.05 0.015 0.01
1 3 5 7 9 12
size of tree
No hay un Cp óptimo, nosquedamos con este modelo completo.
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 56 / 58
Árboles de Regresión
Veamos cómo se predice en un modelo “anova”. . . fácil.
pred2<-predict(arbol2, sat.df[-dividir,], type="vector")print(summary(pred2))
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 31.14 43.36 53.10 51.27 55.96 85.75
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 57 / 58
Árboles de Regresión
0 20 40 60 80
040
80Predichos vs Observados
observados
Pre
dicc
ión
Xavi Barber (Cio-UMH) Vender o no vender ese es el problema (II) 58 / 58