# UNIVERSIDAD NACIONAL DEL ALTIPLANO
# FACULTAD DE INGNEIRIA ESTADISTICA E INFORMATICA 
# TECNICAS DE ESTADISTICAS MULTIVARIADAS 
# ARBOLES DE DECISION 

# Utilizar las librerias 
library(ISLR)
## Warning: package 'ISLR' was built under R version 4.1.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.1.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tree)
## Warning: package 'tree' was built under R version 4.1.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.1.3
library(magrittr)
## Warning: package 'magrittr' was built under R version 4.1.3
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.1.3
library(readxl)
## Warning: package 'readxl' was built under R version 4.1.3
# Leer datos 
dato <- read_excel("C:/Users/LENOVO/Downloads/data.xlsx")
dato
## # A tibble: 4,521 x 17
##     edad trabajo     civil   educacion  incumplimiento balance vivienda prestamo
##    <dbl> <chr>       <chr>   <chr>      <chr>            <dbl> <chr>    <chr>   
##  1    30 desempleado casado  primaria   no                1787 no       no      
##  2    33 servicios   casado  secundaria no                4789 si       si      
##  3    35 gerencia    soltero profesion~ no                1350 si       no      
##  4    30 gerencia    casado  profesion~ no                1476 si       si      
##  5    59 obrero      casado  secundaria no                   0 si       no      
##  6    35 gerencia    soltero profesion~ no                 747 no       no      
##  7    36 autonomo    casado  profesion~ no                 307 si       no      
##  8    39 tecnico     casado  secundaria no                 147 si       no      
##  9    41 emprendedor casado  profesion~ no                 221 si       no      
## 10    43 servicios   casado  primaria   no                 -88 si       si      
## # ... with 4,511 more rows, and 9 more variables: contacto <chr>, dia <dbl>,
## #   mes <chr>, duracion <dbl>, campaña <dbl>, pdays <dbl>, anterior <dbl>,
## #   poutcome <chr>, y <chr>
head(dato)
## # A tibble: 6 x 17
##    edad trabajo     civil   educacion   incumplimiento balance vivienda prestamo
##   <dbl> <chr>       <chr>   <chr>       <chr>            <dbl> <chr>    <chr>   
## 1    30 desempleado casado  primaria    no                1787 no       no      
## 2    33 servicios   casado  secundaria  no                4789 si       si      
## 3    35 gerencia    soltero profesional no                1350 si       no      
## 4    30 gerencia    casado  profesional no                1476 si       si      
## 5    59 obrero      casado  secundaria  no                   0 si       no      
## 6    35 gerencia    soltero profesional no                 747 no       no      
## # ... with 9 more variables: contacto <chr>, dia <dbl>, mes <chr>,
## #   duracion <dbl>, campaña <dbl>, pdays <dbl>, anterior <dbl>, poutcome <chr>,
## #   y <chr>
# Convertir las variables en factores
dato$educacion <- ifelse(test = dato$edad > 18, yes = "Si", no = "No")
dato$educacion <- as.factor(dato$educacion)
dato$trabajo <- as.factor(dato$trabajo)
dato$incumplimiento <- as.factor(dato$incumplimiento)
dato$vivienda <- as.factor(dato$vivienda)
dato$civil <- as.factor(dato$civil)
dato$prestamo <- as.factor(dato$prestamo)
dato$contacto <- as.factor(dato$contacto)
dato$mes <- as.factor(dato$mes)
dato$poutcome <- as.factor(dato$poutcome)
dato$y <- as.factor(dato$y)
str(dato)
## tibble [4,521 x 17] (S3: tbl_df/tbl/data.frame)
##  $ edad          : num [1:4521] 30 33 35 30 59 35 36 39 41 43 ...
##  $ trabajo       : Factor w/ 12 levels "admin.","autonomo",..: 4 11 8 8 10 8 2 12 6 11 ...
##  $ civil         : Factor w/ 3 levels "casado","divorciado",..: 1 1 3 1 1 3 1 1 1 1 ...
##  $ educacion     : Factor w/ 1 level "Si": 1 1 1 1 1 1 1 1 1 1 ...
##  $ incumplimiento: Factor w/ 2 levels "no","si": 1 1 1 1 1 1 1 1 1 1 ...
##  $ balance       : num [1:4521] 1787 4789 1350 1476 0 ...
##  $ vivienda      : Factor w/ 2 levels "no","si": 1 2 2 2 2 1 2 2 2 2 ...
##  $ prestamo      : Factor w/ 2 levels "no","si": 1 2 1 2 1 1 1 1 1 2 ...
##  $ contacto      : Factor w/ 3 levels "celular","desconocido",..: 1 1 1 2 2 1 1 1 2 1 ...
##  $ dia           : num [1:4521] 19 11 16 3 5 23 14 6 14 17 ...
##  $ mes           : Factor w/ 12 levels "apr","aug","dec",..: 11 9 1 7 9 4 9 9 9 1 ...
##  $ duracion      : num [1:4521] 79 220 185 199 226 141 341 151 57 313 ...
##  $ campaña       : num [1:4521] 1 1 1 4 1 2 1 2 2 1 ...
##  $ pdays         : num [1:4521] -1 339 330 -1 -1 176 330 -1 -1 147 ...
##  $ anterior      : num [1:4521] 0 4 1 0 0 3 2 0 0 2 ...
##  $ poutcome      : Factor w/ 4 levels "desconocido",..: 1 3 3 1 1 3 4 1 1 3 ...
##  $ y             : Factor w/ 2 levels "no","si": 1 1 1 1 1 1 1 1 1 1 ...
set.seed(1649)
train <- sample_frac(dato,.7)
dim(train)
## [1] 3165   17
test <- setdiff(dato, train)
dim(test)
## [1] 1356   17
# Como tenemos preparada la data, usaremos toda la data
arbol_clasificacion <- tree( y ~ ., train)
summary(arbol_clasificacion)
## 
## Classification tree:
## tree(formula = y ~ ., data = train)
## Variables actually used in tree construction:
## [1] "duracion" "poutcome" "mes"     
## Number of terminal nodes:  8 
## Residual mean deviance:  0.4744 = 1498 / 3157 
## Misclassification error rate: 0.09731 = 308 / 3165
plot(x = arbol_clasificacion, type = "proportional")
text(x = arbol_clasificacion, splits = T, pretty = 0,
     cex = 0.6, col = "firebrick")

arbol_clasificacion
## node), split, n, deviance, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 3165 2201.00 no ( 0.889415 0.110585 )  
##    2) duracion < 306.5 2296  877.10 no ( 0.952526 0.047474 )  
##      4) poutcome: desconocido,fracaso,other 2245  670.70 no ( 0.965702 0.034298 )  
##        8) mes: aug,dec,jan,jul,jun,may,nov 1921  365.60 no ( 0.980739 0.019261 )  
##         16) duracion < 204.5 1461  129.50 no ( 0.992471 0.007529 ) *
##         17) duracion > 204.5 460  199.90 no ( 0.943478 0.056522 ) *
##        9) mes: apr,feb,mar,oct,sep 324  242.20 no ( 0.876543 0.123457 ) *
##      5) poutcome: exitos 51   67.35 si ( 0.372549 0.627451 ) *
##    3) duracion > 306.5 869 1026.00 no ( 0.722670 0.277330 )  
##      6) duracion < 647 632  623.00 no ( 0.805380 0.194620 )  
##       12) poutcome: desconocido,fracaso,other 604  542.10 no ( 0.834437 0.165563 )  
##         24) mes: apr,aug,dec,feb,jan,jul,jun,may,nov 583  480.70 no ( 0.855918 0.144082 ) *
##         25) mes: mar,oct,sep 21   23.05 si ( 0.238095 0.761905 ) *
##       13) poutcome: exitos 28   26.28 si ( 0.178571 0.821429 ) *
##      7) duracion > 647 237  328.50 no ( 0.502110 0.497890 ) *
set.seed(2)
# Evaluando el modelo
predicciones <- predict(arbol_clasificacion, newdata = test, type = "class")
table(predicciones, test$y)
##             
## predicciones   no   si
##           no 1162  145
##           si   23   26
paste("El porcentaje de acierto es de",
      100 * ((1162 + 26) / (1162 + 26 + 23 + 145)), "%") 
## [1] "El porcentaje de acierto es de 87.6106194690265 %"
# Podado del arbol (pruning)
set.seed(3)
cv_arbol <- cv.tree(arbol_clasificacion, FUN = prune.misclass, K = 10)
cv_arbol
## $size
## [1] 8 6 1
## 
## $dev
## [1] 329 329 353
## 
## $k
## [1] -Inf  0.0  8.4
## 
## $method
## [1] "misclass"
## 
## attr(,"class")
## [1] "prune"         "tree.sequence"
# Grafico de Arboles
resultados_cv <- data.frame(n_nodos = cv_arbol$size, clas_error = cv_arbol$dev,
                            alpha = cv_arbol$k)
p1 <- ggplot(data = resultados_cv, aes(x = n_nodos, y = clas_error)) +
  geom_line() +
  geom_point() +
  labs(title = "error de clasificacion vs. n tamano del arbol") + theme_bw()
p2 <- ggplot(data = resultados_cv, aes(x = alpha, y = clas_error)) +
  geom_line() +
  geom_point() +
  labs(title = " Error de clasificacion vs \n hiperparametro alpha") +
  theme_bw()
ggarrange(p1, p2)

cv_arbol$size[which.min(cv_arbol$dev)]
## [1] 8
# Existe un error en la respuesta
arbol_pruning <- prune.misclass(tree = arbol_clasificacion, best = 9)
## Warning in prune.tree(tree = arbol_clasificacion, best = 9, method =
## "misclass"): best is bigger than tree size
plot(x = arbol_pruning, type = "proportional")
text(x = arbol_pruning, splits = TRUE, pretty = 0,
     cex = 0.8, col = "firebrick")