library(rpart)
library(rpart.plot)
library(MASS)
library(caret)
library(pander)
data("Pima.tr");data("Pima.te")
Pima <- rbind(Pima.tr,Pima.te)
rm(Pima.tr,Pima.te)
Age<-Pima$age
Npreg<-Pima$npreg
Glu<-Pima$glu
Bp<-Pima$bp
Skin<-Pima$skin
Bmi<-Pima$bmi
Ped<-Pima$ped
Type<-Pima$type
str(Pima)                           
## 'data.frame':    532 obs. of  8 variables:
##  $ npreg: int  5 7 5 0 0 5 3 1 3 2 ...
##  $ glu  : int  86 195 77 165 107 97 83 193 142 128 ...
##  $ bp   : int  68 70 82 76 60 76 58 50 80 78 ...
##  $ skin : int  28 33 41 43 25 27 31 16 15 37 ...
##  $ bmi  : num  30.2 25.1 35.8 47.9 26.4 35.6 34.3 25.9 32.4 43.3 ...
##  $ ped  : num  0.364 0.163 0.156 0.259 0.133 ...
##  $ age  : int  24 55 35 26 23 52 25 24 63 31 ...
##  $ type : Factor w/ 2 levels "No","Yes": 1 2 1 1 1 2 1 1 1 2 ...
summary(Pima)
##      npreg             glu               bp              skin      
##  Min.   : 0.000   Min.   : 56.00   Min.   : 24.00   Min.   : 7.00  
##  1st Qu.: 1.000   1st Qu.: 98.75   1st Qu.: 64.00   1st Qu.:22.00  
##  Median : 2.000   Median :115.00   Median : 72.00   Median :29.00  
##  Mean   : 3.517   Mean   :121.03   Mean   : 71.51   Mean   :29.18  
##  3rd Qu.: 5.000   3rd Qu.:141.25   3rd Qu.: 80.00   3rd Qu.:36.00  
##  Max.   :17.000   Max.   :199.00   Max.   :110.00   Max.   :99.00  
##       bmi             ped              age         type    
##  Min.   :18.20   Min.   :0.0850   Min.   :21.00   No :355  
##  1st Qu.:27.88   1st Qu.:0.2587   1st Qu.:23.00   Yes:177  
##  Median :32.80   Median :0.4160   Median :28.00            
##  Mean   :32.89   Mean   :0.5030   Mean   :31.61            
##  3rd Qu.:36.90   3rd Qu.:0.6585   3rd Qu.:38.00            
##  Max.   :67.10   Max.   :2.4200   Max.   :81.00

A partir de la base de datos:

1. Cree un árbol de clasificación con todas las variables y genere la matriz de confusión (comente los estadísticos de ajuste del árbol), ¿Que observa?

set.seed(123)
arbol_1<-rpart(Type ~ Age + Npreg + Glu + Bp + Skin + Bmi + Ped,
              data = Pima,
              method = "class")
rpart.plot(arbol_1,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

El árbol de clasificación con todas las variables muestra el primer nodo elegido con la clasificación a partir de la glucosa, este nodo contiene 355 datos de los 532 totales categorizados en ‘Si’ y ‘No’. Luego, al clasificar por glucosa menor a 128 se empiezan a ramificar diferentes nodos respecto a la edad e índice de masa corporal, entre otros.

Matriz de confusión

prediccion_1<-predict(arbol_1, newdata=Pima,type="class")
caret::confusionMatrix(prediccion_1,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  326  46
##        Yes  29 131
##                                           
##                Accuracy : 0.859           
##                  95% CI : (0.8265, 0.8875)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.6747          
##                                           
##  Mcnemar's Test P-Value : 0.06467         
##                                           
##             Sensitivity : 0.7401          
##             Specificity : 0.9183          
##          Pos Pred Value : 0.8187          
##          Neg Pred Value : 0.8763          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2462          
##    Detection Prevalence : 0.3008          
##       Balanced Accuracy : 0.8292          
##                                           
##        'Positive' Class : Yes             
## 

Nuestra matriz de confusión nos arrojó un valor de 326 mujeres jóvenes que no tenían diabetes y 121 que sí estaban diagnosticadas contra dos valores correspondientes a los falsos positivos y negativos, es decir 29 y 46 mujeres que fueron mal diagnosticadas por el modelo. Respecto al análisis de precisión se obtiene un 86% de exactitud, siendo un valor bastante significativo para explicar la cercanía de estos resultados con la medición de sus valores reales.

Ahora, el valor Kappa nos muestra que no se ha logrado aislar el efecto aleatorio alcanzando sólo un 67%, lo cual se debería aumentar para lograr una mejor precisión de la clasificación. La primera parte de la matriz nos había mostrado que la cantidad de mujeres que habían sido catalogadas con diabetes de manera errónea había sido importante (29) dejando así un 74% de capacidad para detectar los verdaderos positivos. Por otra parte, la especificidad tiene una habilidad muy alta para discriminar los falsos negativos de los verdaderos negativos con un 91% de éxito. En conclusión, el árbol presenta una clasificación aceptable con detalles a corregir para que el efecto aleatorio no afecte su precisión y lograr una mejor predicción.

2. Cambie las alternativas o hiper parámetros minbucket y minsplit a 30 y 50 respectivamente. ¿Qué cambio percibe?

arbol_2<-rpart(Type ~ Age + Npreg + Glu + Bp + Skin + Bmi + Ped,
                      data = Pima,
                      control = rpart.control(minsplit = 50,minbucket = 30),
                      method = "class")

rpart.plot(arbol_2,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

Al modificar el minbucket y minsplit se puede ver una especie de “zoom” ya que se están reduciendo las observaciones en los nodos, pero, a pesar de que permite una lectura más simple, para saber si este cambio tiene un efecto positivo sobre el árbol lo mejor es analizar su matriz de confusión.

Matriz de confusión

prediccion_2<-predict(arbol_2, newdata=Pima,type="class")
caret::confusionMatrix(prediccion_2,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  313  58
##        Yes  42 119
##                                           
##                Accuracy : 0.812           
##                  95% CI : (0.7762, 0.8444)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 7.571e-14       
##                                           
##                   Kappa : 0.5669          
##                                           
##  Mcnemar's Test P-Value : 0.1336          
##                                           
##             Sensitivity : 0.6723          
##             Specificity : 0.8817          
##          Pos Pred Value : 0.7391          
##          Neg Pred Value : 0.8437          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2237          
##    Detection Prevalence : 0.3026          
##       Balanced Accuracy : 0.7770          
##                                           
##        'Positive' Class : Yes             
## 

En la primera parte ya podemos ver como la diagonal de los valores reales disminuyó y la diagonal de los falsos positivos y negativos aumentó, es decir que ya partimos de un aumento en la incorrecta asignación de mujeres con y sin la enfermedad. De igual manera los valores que indican la precisión del modelo, el efecto aleatorio, la sensibilidad y especificidad se vieron afectados de manera negativa, es decir que el cambio de los hiperparametros perjudica su capacidad predictiva en todos los niveles.

3. Ahora, cambie el CP a 0.05 y explique su comportamiento.

arbol_3<-rpart(Type ~ Age + Npreg + Glu + Bp + Skin + Bmi + Ped,
                      data = Pima,
                      control = rpart.control(minsplit = 50,minbucket = 30,cp=0.05),
                      method = "class")

rpart.plot(arbol_3,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

__ Matriz de confusión__

prediccion_3<-predict(arbol_3, newdata=Pima,type="class")
caret::confusionMatrix(prediccion_3,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  311  66
##        Yes  44 111
##                                           
##                Accuracy : 0.7932          
##                  95% CI : (0.7563, 0.8269)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 9.62e-11        
##                                           
##                   Kappa : 0.5194          
##                                           
##  Mcnemar's Test P-Value : 0.04526         
##                                           
##             Sensitivity : 0.6271          
##             Specificity : 0.8761          
##          Pos Pred Value : 0.7161          
##          Neg Pred Value : 0.8249          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2086          
##    Detection Prevalence : 0.2914          
##       Balanced Accuracy : 0.7516          
##                                           
##        'Positive' Class : Yes             
## 

Nuevamente el árbol recibe una reducción de sus observaciones volviéndose más estricto confirmando que entre más disminuya, en este caso el ajuste del parámetro de complejidad, menor serán sus habilidades de predicción. Al exigirle al modelo una mejor aplicación en un 5% para clasificar, este estará más segado llevando a disminuir aún más la exactitud del modelo y su lectura hacia los falsos positivos y negativos, los cuales incrementaron desmejorando así la predicción, tal como se puede ver en la caída de la sensibilidad y especificidad.

4. Por último, use el comando para podar el árbol y poder el árbol inicial aplicando un CP de 0.03 e interprete sus hallazgos.

arbol_4<-prune(arbol_3,cp=0.03)
rpart.plot(arbol_4,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE) 

prediccion_4<-predict(arbol_4, newdata=Pima,type="class")
caret::confusionMatrix(prediccion_4,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  311  66
##        Yes  44 111
##                                           
##                Accuracy : 0.7932          
##                  95% CI : (0.7563, 0.8269)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 9.62e-11        
##                                           
##                   Kappa : 0.5194          
##                                           
##  Mcnemar's Test P-Value : 0.04526         
##                                           
##             Sensitivity : 0.6271          
##             Specificity : 0.8761          
##          Pos Pred Value : 0.7161          
##          Neg Pred Value : 0.8249          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2086          
##    Detection Prevalence : 0.2914          
##       Balanced Accuracy : 0.7516          
##                                           
##        'Positive' Class : Yes             
## 

Al podar y descartar las particiones que no disminuyen la impureza por medio del parámetro de complejidad, el árbol que obtenemos es el mismo resultado que clasificar a un 3% de complejidad, es decir que no resultan significativos para el modelo.