Deserción Estudiantil Universitaria - Univ Pública

El presente modelo de aprendizaje permita predecir de manera predictiva aquellos alumnos universitarios desertantes; se han desarrollado modelos anteriores que los pueden encontrar en => https://rpubs.com/jhampier
* De requerir utilizar el dataset lo pueden descargar de la ruta Universidad Pública=> https://docs.google.com/spreadsheets/d/e/2PACX-1vSIntwA0sI2ClKu43ZWmfvsERzl_zm4OByOJwvwyMkuHhThDqWOxebHvWZQGUaISbu92ZMz9RiMXlFQ/pub?gid=791157846&single=true&output=csv
* De requerir utilizar el dataset lo pueden descargar de la ruta Universidad Privada=> https://docs.google.com/spreadsheets/d/e/2PACX-1vTtwC1ng4pLS5K8ZxzvMDcEdBRTv0_B8xwGOBZczl_RCzsQZeI3cL0Omdhi1rz-kt6ywTcf65jh7Q1R/pub?gid=1141535866&single=true&output=csv

#############################################Librerias de Carga
library(caret) # for model-building
library(DMwR)  # for smote implementation
library(purrr) # for functional programming (map)
library(pROC)
library(knitr)
library(ggraph)
library(nortest)
library(magrittr)
library(dplyr)
library(dplyr)
library(tidyr) 
library(e1071)
library(OneR) 
library(tidyverse)  # data manipulation and visualization
library(ggplot2)    # plot arrangement
library(gridExtra)  # plot arrangement
library(caret)
library(ggplot2)
library(FactoMineR)
library(factoextra)
#library(modes)      # MODA  VER EL COMPORTAMIENTO GENERAL DE LA INF
library(randomForest)

#CARGAS DATOS PARA TRABAJAR MODELO PREDICTIVO
############################################
ruta <- 'C:'
setwd('C:')
DataSetUpublica <-  read.table(paste(ruta, "/DataSetUnsaBinarizadaSinRuidoFuturo.csv",sep=""),header=TRUE,sep=";",stringsAsFactors = FALSE)
str(DataSetUpublica)
'data.frame':   17509 obs. of  20 variables:
 $ ESCUELA             : chr  " INGENIERIA INDUSTRIAL            " " INGENIERIA INDUSTRIAL            " " INGENIERIA INDUSTRIAL            " " INGENIERIA INDUSTRIAL            " ...
 $ Anio_Ingreso        : int  1989 1989 1989 1989 1989 1993 1993 1993 1993 1993 ...
 $ CUI                 : int  19890258 19890258 19890258 19890258 19890258 19930161 19930161 19930161 19930161 19930161 ...
 $ APELLI_NOMBRES      : chr  "ARMA/DEL CARPIO, JAIME RAFAEL" "ARMA/DEL CARPIO, JAIME RAFAEL" "ARMA/DEL CARPIO, JAIME RAFAEL" "ARMA/DEL CARPIO, JAIME RAFAEL" ...
 $ periodo_matricula   : int  2010 2011 2012 2013 2014 2010 2011 2012 2013 2014 ...
 $ SEXO                : chr  "M" "M" "M" "M" ...
 $ Edad                : int  38 39 40 41 42 33 34 35 36 37 ...
 $ LUGAR_NACIMIENTO    : chr  "Arequipa-Arequipa" "Arequipa-Arequipa" "Arequipa-Arequipa" "Arequipa-Arequipa" ...
 $ PRDO_HASTA_MATRICULA: chr  "7,8221" "8,4346" "9,0696" "9,864" ...
 $ CREDS__APROBADOS    : int  78 102 131 173 222 65 73 78 98 124 ...
 $ ASIGS__APROBADAS    : int  19 25 32 42 54 16 18 19 24 31 ...
 $ ASIGS__DESAPROBADAS : int  0 0 0 0 0 0 0 0 0 0 ...
 $ LUGAR_RESIDENCIA    : chr  "Arequipa-Arequipa-Yura" "Arequipa-Arequipa-Yura" "Arequipa-Arequipa-Yura" "Arequipa-Arequipa-Yura" ...
 $ ANO_EGRESO_COLEGIO  : int  23 24 25 26 27 18 19 20 21 22 ...
 $ TIPO_COLEGIO        : chr  "Nacional" "Nacional" "Nacional" "Nacional" ...
 $ LUGAR_COLEGIO       : chr  "Arequipa-Arequipa-Jacobo Hunter" "Arequipa-Arequipa-Jacobo Hunter" "Arequipa-Arequipa-Jacobo Hunter" "Arequipa-Arequipa-Jacobo Hunter" ...
 $ MODALIDAD_INGRESO   : chr  "Ordinario" "Ordinario" "Ordinario" "Ordinario" ...
 $ categoria           : chr  "CONTINUA" "CONTINUA" "CONTINUA" "CONTINUA" ...
 $ categoriaBinarizada : int  0 0 0 0 0 0 0 0 0 0 ...
 $ ProbabDesercion     : num  4.98 6.67 6.27 7.6 6.86 4.98 6.67 6.27 7.6 6.86 ...
#View(DataSetUpublica)
DataSetUpublica

Preparación de datos

Se mostrara la cantidad de datos que se tiene para aplicar modelos de ML. * Se validara y reemplara cada variable por su respecivo tipo de dato. * Se ordenará cronológimante el dataset debido a que la data es histórica.

########################################################
###########  PREPARACIÓN DE DATA POR VARIABLES  ########
########################################################
##Cantidad de Registros
nrow(DataSetUpublica)#[1] 35693
[1] 17509
#Cantidad de Variables
ncol(DataSetUpublica)#[1] 27 -1 de categoria(var categorica)
[1] 20
#Nombres de Variables
colnames(DataSetUpublica)
 [1] "ESCUELA"              "Anio_Ingreso"         "CUI"                 
 [4] "APELLI_NOMBRES"       "periodo_matricula"    "SEXO"                
 [7] "Edad"                 "LUGAR_NACIMIENTO"     "PRDO_HASTA_MATRICULA"
[10] "CREDS__APROBADOS"     "ASIGS__APROBADAS"     "ASIGS__DESAPROBADAS" 
[13] "LUGAR_RESIDENCIA"     "ANO_EGRESO_COLEGIO"   "TIPO_COLEGIO"        
[16] "LUGAR_COLEGIO"        "MODALIDAD_INGRESO"    "categoria"           
[19] "categoriaBinarizada"  "ProbabDesercion"     
###Conversion para tipo de dato correcto
DataSetUpublicaFRMTO <-transform(DataSetUpublica, 
                                 ESCUELA = as.factor(ESCUELA),
                             CUI = as.character(CUI),
                             APELLI_NOMBRES = as.character(APELLI_NOMBRES),
                             SEXO = as.factor(SEXO),
                             LUGAR_NACIMIENTO = as.factor(LUGAR_NACIMIENTO),
                             LUGAR_RESIDENCIA = as.factor(LUGAR_RESIDENCIA),
                             TIPO_COLEGIO = as.factor(TIPO_COLEGIO),
                             LUGAR_COLEGIO = as.factor(LUGAR_COLEGIO),
                             MODALIDAD_INGRESO = as.factor(MODALIDAD_INGRESO),
                             categoriaBinarizada = as.factor(as.character(categoriaBinarizada))
)
#Retiramos el campo Categoría
DataSetUpublicaFRMTO$categoria <- NULL
#Convertimos a Factor a la varaible Objetivo
levels(DataSetUpublicaFRMTO$categoriaBinarizada) <- c("NO","SI")
#Por útlimo remobramos el nombre de la Variable objetivo
colnames(DataSetUpublicaFRMTO)[18] <- "DESERTOR"

DataSetUpublicaFRMTO[,'PRDO_HASTA_MATRICULA'] <- round(as.double(sub(",", "."
                                                                 ,  DataSetUpublicaFRMTO[,'PRDO_HASTA_MATRICULA']
                                                                 , fixed = TRUE)),2)
DataSetUpublicaFRMTO[,'ProbabDesercion'] <- round(as.double(sub(",", "."
                                                                 ,  DataSetUpublicaFRMTO[,'ProbabDesercion']
                                                                 , fixed = TRUE)),2)
DataSetUpublicaFRMTO[,'Anio_Ingreso'] <- as.integer(DataSetUpublicaFRMTO[,'Anio_Ingreso'])

####################################################################################
#Organizamos las variables en Categóricas(Cualitativas) y Cuantitativas(Contínuas)

#Lista de variables categóricas 12 Variables en Total
ListVar.Categ <-    c(  'ESCUELA',
                        'SEXO',
                        'LUGAR_NACIMIENTO',
                        'LUGAR_RESIDENCIA',
                        'TIPO_COLEGIO',
                        'LUGAR_COLEGIO',
                        'MODALIDAD_INGRESO'
                        )    # 8

#Lista de variables Continuas 13 Variables en Total
ListVar.Continuas <- c('Anio_Ingreso',
                        'periodo_matricula',
                        'Edad',
                        'CREDS__APROBADOS',
                        'ASIGS__APROBADAS',
                        'ASIGS__DESAPROBADAS',
                        'ANO_EGRESO_COLEGIO',
                        'PRDO_HASTA_MATRICULA',
                        'ProbabDesercion'
)
#Variable Objetivo(Target)
Var.Objetivo       <- c('DESERTOR')  #c('categoria')                                             # 1

#Variable de Idenfitifación
Var.Identificacion <- c('CUI','APELLI_NOMBRES')                                    

#Listado de todas las variables que influenciaran en el modelo
Var.TodasUprivada <- c(ListVar.Continuas,ListVar.Categ  , Var.Objetivo)

##############################################################################
#  ###ORDENAMOS EL DATASET CRONOLOGICAMENTE 
############################################################################
# Se utilizará el campo del Codigo de Alumno para poder ordenar el dataframe

TotalFilas <- nrow(DataSetUpublicaFRMTO)  #17509
SortUltimaFila=vector(mode='numeric', length=TotalFilas)

NuevoDataSetUpublicaFRMTO = data.frame(DataSetUpublicaFRMTO, SortUltimaFila)
NuevoDataSetUpublicaFRMTO$SortUltimaFila=as.numeric(NuevoDataSetUpublicaFRMTO$CUI)

###ORDENAMOS EL DATA SET
SortNuevoDataSetUpublicaFRMTO <- NuevoDataSetUpublicaFRMTO[order(NuevoDataSetUpublicaFRMTO$periodo_matricula,NuevoDataSetUpublicaFRMTO$SortUltimaFila),] 

SortNuevoDataSetUpublicaFRMTO$SortUltimaFila <- NULL ##ELIMINARNOS LAS FILAS DE ORDENAMIENTO


##Reemplamos en el dataset que se trabajarn los modelos
DataSetUpublicaFRMTO<-SortNuevoDataSetUpublicaFRMTO

####################################################
##ANALISIS DE CANTIDAD DE REGISTROS POR SEMESTRE 
####################################################
#Solo se trabaja con datos hasta el primer semestre del 2017 
##SE toma la decisón del filtrar los registro del año 2017 que son 491 debido a que no se tienen los registro completos
DataSetUpublicaFRMTO.tmp  <-  DataSetUpublicaFRMTO[DataSetUpublicaFRMTO$periodo_matricula!=2017
                                                   ,c( "CUI",Var.TodasUprivada)] %>%  droplevels 
Tabla_FrecAcumuladas <-table(DataSetUpublicaFRMTO.tmp$periodo_matricula) %>% as.data.frame() 
colnames(Tabla_FrecAcumuladas) <- c("AnioMatricula","Cant")
Tabla_FrecAcumuladas$ACUMULADO<- cumsum(Tabla_FrecAcumuladas$Cant)
Tabla_FrecAcumuladas$PorcetAcum = round(100 *Tabla_FrecAcumuladas$ACUMULADO / sum(Tabla_FrecAcumuladas$Cant))
#Tabla de Frecuencias absolutas y relativas acumuladas por Semestre  
Tabla_FrecAcumuladas ### SE TOMA LA DECISIÓN DE PARTICINAR  para el entrenamiento del 68% de la data es decir hasta el año 2014 registro 11511
DataSetUpublicaFRMTO <- DataSetUpublicaFRMTO.tmp 
DataSetUpublicaFRMTO.tmp <- NULL

##############################################
str(DataSetUpublicaFRMTO)
'data.frame':   17018 obs. of  18 variables:
 $ CUI                 : chr  "19890258" "19930161" "19932057" "19940844" ...
 $ Anio_Ingreso        : int  1989 1993 1993 1994 1995 1995 1996 1996 1996 1997 ...
 $ periodo_matricula   : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
 $ Edad                : int  38 33 35 36 33 37 31 31 30 30 ...
 $ CREDS__APROBADOS    : int  78 65 216 103 156 208 162 72 78 208 ...
 $ ASIGS__APROBADAS    : int  19 16 55 25 38 51 41 18 21 47 ...
 $ ASIGS__DESAPROBADAS : int  0 0 0 0 0 0 0 0 0 0 ...
 $ ANO_EGRESO_COLEGIO  : int  23 18 19 11 15 21 15 10 11 15 ...
 $ PRDO_HASTA_MATRICULA: num  7.82 9.54 10.98 11.03 11.92 ...
 $ ProbabDesercion     : num  4.98 4.98 4.98 4.98 4.98 4.98 4.98 4.98 4.98 4.98 ...
 $ ESCUELA             : Factor w/ 7 levels " CIENCIA DE LA COMPUTACION        ",..: 6 7 7 6 6 6 7 6 4 2 ...
 $ SEXO                : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 1 2 2 ...
 $ LUGAR_NACIMIENTO    : Factor w/ 65 levels "Áncash-Huaraz",..: 10 10 10 10 10 10 10 42 10 10 ...
 $ LUGAR_RESIDENCIA    : Factor w/ 27 levels "Arequipa-Arequipa-Alto Selva Alegre",..: 26 14 3 8 2 10 7 1 25 10 ...
 $ TIPO_COLEGIO        : Factor w/ 3 levels "Nacional","Parroquial",..: 1 2 1 1 3 1 1 1 1 1 ...
 $ LUGAR_COLEGIO       : Factor w/ 143 levels "Amazonas-Bagua-Aramango",..: 16 33 10 11 11 18 16 11 32 17 ...
 $ MODALIDAD_INGRESO   : Factor w/ 8 levels "Convenios y Otros",..: 4 4 4 6 4 8 4 6 6 4 ...
 $ DESERTOR            : Factor w/ 2 levels "NO","SI": 1 1 2 1 1 1 1 1 1 2 ...

DataFrame Inicial

Con 17018 registros

#knitr::kable(head(DataSetUpublicaFRMTO), caption = "Table with kable",)
##S
DataSetUpublicaFRMTO

Comprensión de Datos

Una vez obtenido el dataframe(dataset) con sus respectivos tipos de datos ahora analizaremos los datos para poder comprenderlos aplicando estadistica descriptiva

## 
##    NO    SI 
## 93.45  6.55

Analisis de Datos Perdidos

Actualmente el dataframe no tiene datos perdidos debido a que ya fue preparado en un proceso anterior de ETL.

#####################################
#### ANALISIS DE DATOS PERDIDOS ####
#####################################

# Verificación de datos perdidos
library(DataExplorer)
plot_missing(DataSetUpublicaFRMTO)#,ylab="Variables/Características") 

Histogramas

Una vez observada nuestra variable objetivo y su distribución analizaremos las variables CUANTITATIVAS

  • Linea Roja = Media
  • Linea Azul = Mediana
    Observaremso su distribución, para poder luego transformarlas
##Resumen con summary del dataframe
summary(DataSetUpublicaFRMTO)
     CUI             Anio_Ingreso  periodo_matricula      Edad     
 Length:17018       Min.   :1989   Min.   :2010      Min.   :15.0  
 Class :character   1st Qu.:2009   1st Qu.:2012      1st Qu.:18.0  
 Mode  :character   Median :2010   Median :2013      Median :20.0  
                    Mean   :2010   Mean   :2013      Mean   :20.5  
                    3rd Qu.:2013   3rd Qu.:2015      3rd Qu.:22.0  
                    Max.   :2016   Max.   :2016      Max.   :45.0  
                                                                   
 CREDS__APROBADOS ASIGS__APROBADAS ASIGS__DESAPROBADAS ANO_EGRESO_COLEGIO
 Min.   :  0.0    Min.   : 0.00    Min.   : 0.0000     Min.   : 0.000    
 1st Qu.: 43.0    1st Qu.:12.00    1st Qu.: 0.0000     1st Qu.: 3.000    
 Median : 86.0    Median :23.00    Median : 0.0000     Median : 5.000    
 Mean   :100.4    Mean   :26.38    Mean   : 0.1231     Mean   : 5.213    
 3rd Qu.:154.0    3rd Qu.:40.00    3rd Qu.: 0.0000     3rd Qu.: 7.000    
 Max.   :241.0    Max.   :78.00    Max.   :49.0000     Max.   :29.000    
                                                                         
 PRDO_HASTA_MATRICULA ProbabDesercion                               ESCUELA    
 Min.   : 0.000       Min.   :4.980    CIENCIA DE LA COMPUTACION        : 810  
 1st Qu.: 9.252       1st Qu.:6.120    INGENIERIA DE SISTEMAS           :2431  
 Median :11.070       Median :6.670    INGENIERIA ELECTRICA             :2537  
 Mean   :10.583       Mean   :6.798    INGENIERIA ELECTRONICA           :2976  
 3rd Qu.:12.560       3rd Qu.:7.600    INGENIERIA EN TELECOMUNICACIONES : 802  
 Max.   :18.660       Max.   :8.500    INGENIERIA INDUSTRIAL            :4163  
                                       INGENIERIA MECANICA              :3299  
 SEXO                 LUGAR_NACIMIENTO
 F: 3553   Arequipa-Arequipa  :13347  
 M:13465   Arequipa-Camaná    :  399  
           Arequipa-Islay     :  359  
           Lambayeque-Chiclayo:  347  
           Piura-Piura        :  254  
           Piura-Talara       :  234  
           (Other)            : 2078  
                                        LUGAR_RESIDENCIA     TIPO_COLEGIO  
 Arequipa-Arequipa-Mariano Melgar               :2558    Nacional  :10586  
 Arequipa-Arequipa-Cayma                        :2009    Parroquial: 1336  
 Arequipa-Arequipa-Yura                         :1622    Particular: 5096  
 Arequipa-Arequipa-Alto Selva Alegre            :1591                      
 Arequipa-Arequipa-José Luis Bustamante y Rivero:1448                      
 Arequipa-Arequipa-Jacobo Hunter                :1227                      
 (Other)                                        :6563                      
                                         LUGAR_COLEGIO 
 Arequipa-Arequipa-Arequipa                     :5347  
 Arequipa-Arequipa-Alto Selva Alegre            :1462  
 Arequipa-Arequipa-Mariano Melgar               :1318  
 Arequipa-Arequipa-José Luis Bustamante y Rivero: 995  
 Arequipa-Arequipa-Cayma                        : 984  
 Arequipa-Arequipa-Yanahuara                    : 898  
 (Other)                                        :6014  
                     MODALIDAD_INGRESO DESERTOR  
 Ordinario                    :9155    NO:15903  
 CPU                          :4961    SI: 1115  
 Primeros Puestos             :2390              
 Traslados Internos           : 218              
 Profesionales                :  91              
 Traslados Externos Nacionales:  90              
 (Other)                      : 113              
par(mfrow = c(2,2))

hist(DataSetUpublicaFRMTO$Anio_Ingreso,col="orange"
     ,xlab="Anio de Ingreso"
     ,ylab="Frecuencia Absoluta",main="Anio de Ingreso"
     ,breaks =12)
hist(DataSetUpublicaFRMTO$Anio_Ingreso,col="orange"
     ,xlab="Anio de Ingreso"
     ,ylab="Frecuencia Relativa",main="Anio de Ingreso %"
     ,breaks =12,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$Anio_Ingreso),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$Anio_Ingreso), col = "red",lwd=3)
abline(v = median(DataSetUpublicaFRMTO$Anio_Ingreso), col = "blue",lwd=3)


hist(DataSetUpublicaFRMTO$periodo_matricula,col="orange"
     ,xlab="Periodo de Matricula"
     ,ylab="Frecuencia Absoluta",main="Periodo de Matricula"
     ,breaks =7)
hist(DataSetUpublicaFRMTO$periodo_matricula,col="orange"
     ,xlab="Periodo de Matriculas"
     ,ylab="Frecuencia Relativa",main="Periodo de Matricula %"
     ,breaks =7,probability =TRUE)
lines (density(DataSetUpublicaFRMTO$periodo_matricula) , col = "red"  ,lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$periodo_matricula), col = "red"  ,lwd=3)
abline(v=median(DataSetUpublicaFRMTO$periodo_matricula), col = "blue" ,lwd=3)

#par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$Edad,col="orange"
     ,xlab="Edad"
     ,ylab="Frecuencia Absoluta",main="Edad"
     ,breaks =7)
hist(DataSetUpublicaFRMTO$Edad,col="orange"
     ,xlab="Edad"
     ,ylab="Frecuencia Relativa",main="Edad %"
     ,breaks =7,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$Edad),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$Edad), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$Edad), col = "blue",lwd=3)


hist(DataSetUpublicaFRMTO$CREDS__APROBADOS,col="orange"
     ,xlab="Cant Creditos Acumulados"
     ,ylab="Frecuencia Absoluta",main="Cant Creditos Acumulados"
     ,breaks =10)
hist(DataSetUpublicaFRMTO$CREDS__APROBADOS,col="orange"
     ,xlab="Cant Creditos Acumulados"
     ,ylab="Frecuencia Relativa",main="Cant Creditos Acumulados %"
     ,breaks =10,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$CREDS__APROBADOS),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$CREDS__APROBADOS), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$CREDS__APROBADOS), col = "blue",lwd=3)

par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$ASIGS__APROBADAS,col="orange"
     ,xlab="Cant Asignaturas Acum"
     ,ylab="Frecuencia Absoluta",main="Cant Asignaturas Acum"
     ,breaks =10)
hist(DataSetUpublicaFRMTO$ASIGS__APROBADAS,col="orange"
     ,xlab="Cant Asignaturas Acum"
     ,ylab="Frecuencia Relativa",main="Cant Asignaturas Acum %"
     ,breaks =10,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$ASIGS__APROBADAS),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$ASIGS__APROBADAS), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$ASIGS__APROBADAS), col = "blue",lwd=3)


hist(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS,col="orange"
     ,xlab="Cant Asignaturas Desaprob."
     ,ylab="Frecuencia Absoluta",main="Cant Asignaturas Desaprob."
     ,breaks =7)
hist(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS,col="orange"
     ,xlab="Cant Asignaturas Desaprob."
     ,ylab="Frecuencia Relativa",main="Cant Asignaturas Desaprob.s %"
     ,breaks =7,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS), col = "blue",lwd=3)

par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO,col="orange"
     ,xlab="Cant Anios egreso Coleg"
     ,ylab="Frecuencia Absoluta",main="Cant Anios egreso Coleg"
     ,breaks =10)
hist(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO,col="orange"
     ,xlab="Cant Anios egreso Coleg "
     ,ylab="Frecuencia Relativa",main="Cant Anios egreso Coleg %"
     ,breaks =10,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO), col = "blue",lwd=3)

hist(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA,col="orange"
     ,xlab="Ponderado a Matricula"
     ,ylab="Frecuencia Absoluta",main="Ponderado a Matricula"
     ,breaks =10)
hist(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA,col="orange"
     ,xlab="Ponderado a Matricula"
     ,ylab="Frecuencia Relativa",main="Ponderado a Matricula %"
     ,breaks =10,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA), col = "blue",lwd=3)

par(mfrow = c(1,2))
hist(DataSetUpublicaFRMTO$ProbabDesercion,col="orange"
     ,xlab="Probabilidad Deserción Ref Año Anterior",main="Probabilidad de Deserción"
     ,breaks =7)
hist(DataSetUpublicaFRMTO$ProbabDesercion,col="orange"
     ,xlab="Probabilidad Deserción Ref Año Anterior"
     ,ylab="Frecuencia Relativa",main="Probabilidad de Deserción %"
     ,breaks =7,probability =TRUE)
lines(density(DataSetUpublicaFRMTO$ProbabDesercion),col="red", lwd=3)
abline(v = mean(DataSetUpublicaFRMTO$ProbabDesercion), col = "red",lwd=3)
abline(v=median(DataSetUpublicaFRMTO$ProbabDesercion), col = "blue",lwd=3)

### Análisis Exploratorio

####$ Distribución y diagrama de CAja y Bigotes
Seguimos analizando las variables cuantitativas y hacemos tomamos el logaritmo para aquellas que no se pueden visualizar correctamente.

##########################################################################################
##### ANALISIS EXPLORATORIA DE DATOS (EDA) => VISUALIZACION SIMPLIFICADA DE DATOS  ## DEMOSTRACIÓN EN EL POWER BI
##################################
 par(mfrow = c(1,1))
DataSetUpublicaFRMTO %>% 
  dplyr::select(ListVar.Continuas) %>% 
  gather(metric, value) %>% 
  ggplot(aes(value, fill = metric)) + 
  geom_density(show.legend = FALSE) + 
  facet_wrap(~ metric, scales  = "free")

##Se tomo la desición de quitar las variables   #CantCursosAnulados  y AvgVezMatriAcum
##Ojo no se considera la varaible #CantCursosAnulados  y AvgVezMatriAcum

#######################################
##### DIAGRAMA DE CAJA Y BIGOTES 
#################################
p1 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=Anio_Ingreso))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='Anio_Ingreso')
p2 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=periodo_matricula))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='periodo_matricula')
p3 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=Edad))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='Edad')
p4 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=CREDS__APROBADOS))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='CREDS__APROBADOS')
p5 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=ASIGS__APROBADAS))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='ASIGS__APROBADAS')
p6 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=ASIGS__DESAPROBADAS))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='ASIGS__DESAPROBADAS')
p7 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=ANO_EGRESO_COLEGIO))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='ANO_EGRESO_COLEGIO')
p8 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=PRDO_HASTA_MATRICULA))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='PRDO_HASTA_MATRICULA')
p9 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=ProbabDesercion))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='ProbabDesercion')


grid.arrange(p1,p2,p3,p4,p5,p6,ncol=2)    # CursosLlevadosFueraCarreraAcum  CursosLlevadosFueraCarreraAcum 

grid.arrange(p7,p8,p9,ncol=2) # SumCredTeoAcum

######################################################
#Aplicamos logaritmos  a las variables EDAD, AvgVezMatriAcum y CantCursosAnulados para poder visualizarlas mejor
########################################################
p6 <- DataSetUpublicaFRMTO %>%ggplot(aes(x=DESERTOR,y=ASIGS__DESAPROBADAS))+geom_boxplot(aes(fill=DESERTOR))+labs(tittle='ASIGS_DESAPROBADAS')+scale_y_log10() 
p3 <- DataSetUpublicaFRMTO %>%  ggplot(aes(x=DESERTOR,y=Edad))    +geom_boxplot(aes(fill=DESERTOR))    +labs(tittle='Edad')    +scale_y_log10() 
grid.arrange(p1,p2,p3,p4,p5,p6,ncol=2)   

### Análsis de variables categóricas

###################################
# Ahora Visualizaremos las variables CATEGÓRICAS

DataSetUpublicaFRMTO %>% 
  dplyr::select(ListVar.Categ) %>% 
  gather(metric, value) %>% 
  ggplot(aes(value, fill = metric)) + 
  geom_density(show.legend = FALSE) + 
  facet_wrap(~ metric, scales = "free")

# GRAFICO DE BARRAS ABSOLUTAS y RELATIVAS  
# ListVar.Categ

par(mfrow = c(2,2))
barplot(table(DataSetUpublicaFRMTO$ESCUELA),main = "DISTRIBUCIÓN",xlab = "ESCUELA",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$ESCUELA)/length(DataSetUpublicaFRMTO$ESCUELA))*100,main = "DISTRIBUCIÓN",xlab = "ESCUELA",ylab = "%")
barplot(table(DataSetUpublicaFRMTO$SEXO),main = "DISTRIBUCIÓN",xlab = "SEXO",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$SEXO)/length(DataSetUpublicaFRMTO$SEXO))*100,main = "DISTRIBUCIÓN",xlab = "SEXO",ylab = "%")

par(mfrow = c(2,2))
barplot(table(DataSetUpublicaFRMTO$LUGAR_NACIMIENTO),main = "DISTRIBUCIÓN",xlab = "LUGAR_NACIMIENTO",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$LUGAR_NACIMIENTO)/length(DataSetUpublicaFRMTO$MODALIDAD_INGRE))*100,main = "DISTRIBUCIÓN",xlab = "LUGAR_NACIMIENTO",ylab = "%")
barplot(table(DataSetUpublicaFRMTO$LUGAR_RESIDENCIA),main = "DISTRIBUCIÓN",xlab = "LUGAR_RESIDENCIA",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$LUGAR_RESIDENCIA)/length(DataSetUpublicaFRMTO$LUGAR_RESIDENCIA))*100,main = "DISTRIBUCIÓN",xlab = "LUGAR_RESIDENCIA",ylab = "%")

par(mfrow = c(2,2))
barplot(table(DataSetUpublicaFRMTO$TIPO_COLEGIO),main = "DISTRIBUCIÓN",xlab = "TIPO_COLEGIO",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$TIPO_COLEGIO)/length(DataSetUpublicaFRMTO$TIPO_COLEGIO))*100,main = "DISTRIBUCIÓN",xlab = "TIPO_COLEGIO",ylab = "%")
barplot(table(DataSetUpublicaFRMTO$LUGAR_COLEGIO),main = "DISTRIBUCIÓN",xlab = "LUGAR_COLEGIO",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$LUGAR_COLEGIO)/length(DataSetUpublicaFRMTO$LUGAR_COLEGIO))*100,main = "DISTRIBUCIÓN",xlab = "LUGAR_COLEGIO",ylab = "%")

par(mfrow = c(1,2))
barplot(table(DataSetUpublicaFRMTO$MODALIDAD_INGRESO),main = "DISTRIBUCIÓN",xlab = "MODALIDAD_INGRESO",ylab = "FRECUENCIA ABSOLUTA")
barplot((table(DataSetUpublicaFRMTO$MODALIDAD_INGRESO)/length(DataSetUpublicaFRMTO$MODALIDAD_INGRESO))*100,main = "DISTRIBUCIÓN",xlab = "MODALIDAD_INGRESO",ylab = "%")

TRATAMIENTO DE DATOS (Retirando Outlayers) de variables numéricas(cuantitavitas)

Comparación del ANTES y DESPUES de retirar outlayers; actualmente se esta retirando todos aquellos datos que sean menor al percentil 5 y mayores al percentil 95 con el objetivo de reducir el sesgo.

########################I################################################I
######################## IMPUTAR o  RETIRANDO OUTLAYERS 
########################################################################

#Función para imputar outlayers con la media los por debajo del 5% y con la mediana los por encima del 95%
impute_outliers <- function(x, removeNA = TRUE){
  quantiles <- quantile(x, c(0.05, 0.95), na.rm = removeNA)
  x[x<quantiles[1]] <- mean(x, na.rm = removeNA)
  x[x>quantiles[2]] <- median(x, na.rm = removeNA)
  x
}
#Si se desea ver especificamente cuales son los outlayers pero con referencia a categoria Desertor
#boxplot(edad ~ DESERTOR, data = DataSetUpublicaFRMTO, main = "Edad por Desertor")$out


######################### Anio_Ingreso ##########################
#Retiramos las medidas de outlayer 
T_SinOut_Anio_Ingreso <- impute_outliers(DataSetUpublicaFRMTO$Anio_Ingreso)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$Anio_Ingreso, main = "Con outliers")
hist(T_SinOut_Anio_Ingreso, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$Anio_Ingreso, main = "Con outliers")
boxplot(T_SinOut_Anio_Ingreso, main = "Sin outliers")

par(mfrow = c(1,1))

######################### periodo_matricula ##########################
#Retiramos las medidas de outlayer 
T_SinOut_periodo_matricula <- impute_outliers(DataSetUpublicaFRMTO$periodo_matricula)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$periodo_matricula, main = "Con outliers")
hist(T_SinOut_periodo_matricula, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$periodo_matricula, main = "Con outliers")
boxplot(T_SinOut_periodo_matricula, main = "Sin outliers")

par(mfrow = c(1,1))

######################### Edad ##########################
#Retiramos las medidas de outlayer 
T_SinOut_Edad <- impute_outliers(DataSetUpublicaFRMTO$Edad)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$Edad, main = "Con outliers")
hist(T_SinOut_Edad, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$Edad, main = "Con outliers")
boxplot(T_SinOut_Edad, main = "Sin outliers")

par(mfrow = c(1,1))

######################### CREDS__APROBADOS ##########################
#Retiramos las medidas de outlayer 
T_SinOut_CREDS__APROBADOS <- impute_outliers(DataSetUpublicaFRMTO$CREDS__APROBADOS)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$CREDS__APROBADOS, main = "Con outliers")
hist(T_SinOut_CREDS__APROBADOS, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$CREDS__APROBADOS, main = "Con outliers")
boxplot(T_SinOut_CREDS__APROBADOS, main = "Sin outliers")

par(mfrow = c(1,1))

######################### ASIGS__APROBADAS ##########################
#Retiramos las medidas de outlayer 
T_SinOut_ASIGS__APROBADAS <- impute_outliers(DataSetUpublicaFRMTO$ASIGS__APROBADAS)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$ASIGS__APROBADAS, main = "Con outliers")
hist(T_SinOut_ASIGS__APROBADAS, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$ASIGS__APROBADAS, main = "Con outliers")
boxplot(T_SinOut_ASIGS__APROBADAS, main = "Sin outliers")

par(mfrow = c(1,1))

######################### ASIGS__DESAPROBADAS ##########################
#Retiramos las medidas de outlayer 
T_SinOut_ASIGS__DESAPROBADAS <- impute_outliers(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS, main = "Con outliers")
hist(T_SinOut_ASIGS__DESAPROBADAS, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS, main = "Con outliers")
boxplot(T_SinOut_ASIGS__DESAPROBADAS, main = "Sin outliers")

par(mfrow = c(1,1))
T_SinOut_ASIGS__DESAPROBADAS <- DataSetUpublicaFRMTO$ASIGS__DESAPROBADAS # Para esta caso no retiraremos los outlayers debido a que son las diferencias


######################### ANO_EGRESO_COLEGIO ##########################
#Retiramos las medidas de outlayer 
T_SinOut_ANO_EGRESO_COLEGIO <- impute_outliers(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO, main = "Con outliers")
hist(T_SinOut_ANO_EGRESO_COLEGIO, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$ANO_EGRESO_COLEGIO, main = "Con outliers")
boxplot(T_SinOut_ANO_EGRESO_COLEGIO, main = "Sin outliers")

par(mfrow = c(1,1))


######################### PRDO_HASTA_MATRICULA ##########################
#Retiramos las medidas de outlayer 
T_SinOut_PRDO_HASTA_MATRICULA <- impute_outliers(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA, main = "Con outliers")
hist(T_SinOut_PRDO_HASTA_MATRICULA, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$PRDO_HASTA_MATRICULA, main = "Con outliers")
boxplot(T_SinOut_PRDO_HASTA_MATRICULA, main = "Sin outliers")

par(mfrow = c(1,1))


######################### ProbabDesercion ##########################
#Retiramos las medidas de outlayer 
T_SinOut_ProbabDesercion <- impute_outliers(DataSetUpublicaFRMTO$ProbabDesercion)

#Observamos el antes y despues del tratamiento de datos(Imputar los outlayers)
par(mfrow = c(2,2))
hist(DataSetUpublicaFRMTO$ProbabDesercion, main = "Con outliers")
hist(T_SinOut_ProbabDesercion, main = "Sin outliers")
boxplot(DataSetUpublicaFRMTO$ProbabDesercion, main = "Con outliers")
boxplot(T_SinOut_ProbabDesercion, main = "Sin outliers")

par(mfrow = c(1,1))

TRANSFORMACION DE VARIABLES CONTINUAS

Se estan transformando las variables Cuantitavas en base a su distribución. Se estan utilizando transformaciónes de Normalización y Estandarización asi como transformaciones logaritmicas para distribuciones exponenciales…

###############################################
#### TRANSFORMACION DE VARIABLES CONTINUAS ####
###############################################

# Normalización de variables entre [0, 1]   utilizaos la la función scales::rescale(
#Z = (X - min(x)) / (max(x) - min(x))

#Estandarización de variables
#Z = X - mean(x) / sd(x)      utilizamos scale( VARIABLE , center = TRUE, scale = TRUE)

library("scales")
TT_SinOut_Anio_Ingreso                    <- scale(T_SinOut_Anio_Ingreso, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_periodo_matricula               <- scale(T_SinOut_periodo_matricula, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_Edad                            <- scale(T_SinOut_Edad, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_CREDS__APROBADOS                <- scale(T_SinOut_CREDS__APROBADOS, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_ASIGS__APROBADAS                <- scale(T_SinOut_ASIGS__APROBADAS, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_ASIGS__DESAPROBADAS             <- scales::rescale(T_SinOut_ASIGS__DESAPROBADAS) %>% as.data.frame() ## Se Normaliza, Debido a que tiene muchos 0
TT_SinOut_ANO_EGRESO_COLEGIO              <- scale(T_SinOut_ANO_EGRESO_COLEGIO, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_PRDO_HASTA_MATRICULA            <- scale(T_SinOut_PRDO_HASTA_MATRICULA, center = TRUE, scale = TRUE) %>% as.data.frame()
TT_SinOut_ProbabDesercion                 <- scale(T_SinOut_ProbabDesercion, center = TRUE, scale = TRUE) %>% as.data.frame()

#TT_SinOut_CantCursosAplzAcum              <- scales::rescale(T_SinOut_CantCursosAplzAcum) %>% as.data.frame() ## Se Normaliza, Debido a que tiene muchos 0
#TT_SinOut_ASIGSsdDAS                <- log(T_SinOut_ASIGS__APROBADAS) %>% as.data.frame() # se tiene una distribución exponencial
##########################################################################################
##Renombrar lo nombres de las variables para identificarlas que son variables transformadas
colnames(TT_SinOut_Anio_Ingreso)               <-c("TT_SinOut_Anio_Ingreso")
colnames(TT_SinOut_periodo_matricula)        <-c("TT_SinOut_periodo_matricula")
colnames(TT_SinOut_Edad)                     <-c("TT_SinOut_Edad")
colnames(TT_SinOut_CREDS__APROBADOS)         <-c("TT_SinOut_CREDS__APROBADOS")
colnames(TT_SinOut_ASIGS__APROBADAS)         <-c("TT_SinOut_ASIGS__APROBADAS")
colnames(TT_SinOut_ASIGS__DESAPROBADAS)      <-c("TT_SinOut_ASIGS__DESAPROBADAS")
colnames(TT_SinOut_ANO_EGRESO_COLEGIO)       <-c("TT_SinOut_ANO_EGRESO_COLEGIO")
colnames(TT_SinOut_PRDO_HASTA_MATRICULA)     <-c("TT_SinOut_PRDO_HASTA_MATRICULA")
colnames(TT_SinOut_ProbabDesercion)          <-c("TT_SinOut_ProbabDesercion")

ANALISIS DE VARIABLES CATEGÓRICAS

Ahora realizaremos las prueba de cHI CUADRADO para ver si las variables categóricas estan relacionadas con la variable objetivo
library(stats)
chisq.test(table(DataSetUpublicaFRMTO$ESCUELA,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test

data:  table(DataSetUpublicaFRMTO$ESCUELA, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 247.24, df = 6, p-value < 2.2e-16
chisq.test(table(DataSetUpublicaFRMTO$SEXO,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test with Yates' continuity correction

data:  table(DataSetUpublicaFRMTO$SEXO, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 37.452, df = 1, p-value = 9.368e-10
chisq.test(table(DataSetUpublicaFRMTO$LUGAR_NACIMIENTO,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test

data:  table(DataSetUpublicaFRMTO$LUGAR_NACIMIENTO, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 89.785, df = 64, p-value = 0.01846
chisq.test(table(DataSetUpublicaFRMTO$LUGAR_RESIDENCIA,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test

data:  table(DataSetUpublicaFRMTO$LUGAR_RESIDENCIA, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 41.829, df = 26, p-value = 0.02556
chisq.test(table(DataSetUpublicaFRMTO$TIPO_COLEGIO,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test

data:  table(DataSetUpublicaFRMTO$TIPO_COLEGIO, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 47.112, df = 2, p-value = 5.885e-11
chisq.test(table(DataSetUpublicaFRMTO$LUGAR_COLEGIO,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test

data:  table(DataSetUpublicaFRMTO$LUGAR_COLEGIO, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 366.31, df = 142, p-value < 2.2e-16
chisq.test(table(DataSetUpublicaFRMTO$MODALIDAD_INGRESO,DataSetUpublicaFRMTO$DESERTOR))

    Pearson's Chi-squared test

data:  table(DataSetUpublicaFRMTO$MODALIDAD_INGRESO, DataSetUpublicaFRMTO$DESERTOR)
X-squared = 83.709, df = 7, p-value = 2.408e-15
####  Ninguna de las variables categóricas sobrepasa el 5% en el Pvalue es por ello que no se retira ninguno

Tablas Cruzadas para variables categóricas

El objetivo de este analisis es encontrar la relación de los elementos de cada categórica con la variable objetivo. Se analiza tambien un ratio de porcentajes con respecto de la categoria que nos interesa en la variable objetivo-Alumnos que (“SI”) desertan (Se eligen aquellas categórias que su ratio se aleje de 1.0 sea inferior o superior)

library(gmodels)

X <-table(DataSetUpublicaFRMTO$ESCUELA,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3))
                                     NO  SI  NO%  SI% Ratio_SI_NO
 CIENCIA DE LA COMPUTACION          682 128  4.3 11.5       2.674
 INGENIERIA DE SISTEMAS            2227 204 14.0 18.3       1.307
 INGENIERIA ELECTRICA              2369 168 14.9 15.1       1.013
 INGENIERIA ELECTRONICA            2747 229 17.3 20.5       1.185
 INGENIERIA EN TELECOMUNICACIONES   726  76  4.6  6.8       1.478
 INGENIERIA INDUSTRIAL             4051 112 25.5 10.0       0.392
 INGENIERIA MECANICA               3101 198 19.5 17.8       0.913
## Basicamente se seleccionarán las variables que tengas como ratio lo mas lejano a 1
# Para el caso retiramos solo Ing Eléctrica por que el ratio estar cerca a 1 
## Tablas CRuzadas con variable Objetivo
X <-table(DataSetUpublicaFRMTO$SEXO,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3))
     NO  SI  NO%  SI% Ratio_SI_NO
F  3401 152 21.4 13.6       0.636
M 12502 963 78.6 86.4       1.099
CrossTable(DataSetUpublicaFRMTO$SEXO,DataSetUpublicaFRMTO$DESERTOR, prop.t=FALSE, prop.r=FALSE, prop.c=TRUE, prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Col Total |
|-------------------------|

 
Total Observations in Table:  17018 

 
                          | DataSetUpublicaFRMTO$DESERTOR 
DataSetUpublicaFRMTO$SEXO |        NO |        SI | Row Total | 
--------------------------|-----------|-----------|-----------|
                        F |      3401 |       152 |      3553 | 
                          |     0.214 |     0.136 |           | 
--------------------------|-----------|-----------|-----------|
                        M |     12502 |       963 |     13465 | 
                          |     0.786 |     0.864 |           | 
--------------------------|-----------|-----------|-----------|
             Column Total |     15903 |      1115 |     17018 | 
                          |     0.934 |     0.066 |           | 
--------------------------|-----------|-----------|-----------|

 
### Para el caso se selecciona F 
X <-table(DataSetUpublicaFRMTO$LUGAR_NACIMIENTO,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3)) 
                                NO  SI  NO%  SI% Ratio_SI_NO
Áncash-Huaraz                    7   2  0.0  0.2         Inf
Áncash-Huari                     3   0  0.0  0.0         NaN
Áncash-Mariscal Luzuriaga       12   0  0.1  0.0       0.000
Apurímac-Abancay                18   1  0.1  0.1       1.000
Apurímac-Andahuaylas            12   0  0.1  0.0       0.000
Apurímac-Antabamba               5   0  0.0  0.0         NaN
Apurímac-Aymaraes                6   0  0.0  0.0         NaN
Apurímac-Chincheros             14   1  0.1  0.1       1.000
Apurímac-Cotabambas             21   4  0.1  0.4       4.000
Arequipa-Arequipa            12512 835 78.7 74.9       0.952
Arequipa-Camaná                364  35  2.3  3.1       1.348
Arequipa-Caravelí              182  13  1.1  1.2       1.091
Arequipa-Castilla               86   7  0.5  0.6       1.200
Arequipa-Caylloma              202  20  1.3  1.8       1.385
Arequipa-Condesuyos            148  12  0.9  1.1       1.222
Arequipa-Islay                 336  23  2.1  2.1       1.000
Arequipa-La Unión               81  10  0.5  0.9       1.800
Ayacucho-Huamanga                9   1  0.1  0.1       1.000
Ayacucho-La Mar                  1   0  0.0  0.0         NaN
Ayacucho-Lucanas                 7   1  0.0  0.1         Inf
Ayacucho-Parinacochas            4   0  0.0  0.0         NaN
Cajamarca-Cajamarca              6   1  0.0  0.1         Inf
Cajamarca-Jaén                   1   1  0.0  0.1         Inf
Cajamarca-San Miguel             6   0  0.0  0.0         NaN
Cajamarca-Santa Cruz             7   0  0.0  0.0         NaN
Callao-Callao                   98   8  0.6  0.7       1.167
Cusco-Anta                       7   0  0.0  0.0         NaN
Cusco-Chumbivilcas               1   0  0.0  0.0         NaN
Huancavelica-Huaytará            7   0  0.0  0.0         NaN
Huánuco-Ambo                     0   1  0.0  0.1         Inf
Huánuco-Dos de Mayo             11   2  0.1  0.2       2.000
Huánuco-Huánuco                  9   2  0.1  0.2       2.000
Ica-Chincha                      7   0  0.0  0.0         NaN
Ica-Ica                          8   2  0.1  0.2       2.000
Ica-Pisco                       13   0  0.1  0.0       0.000
Junín-Huancayo                  23   0  0.1  0.0       0.000
Junín-Junín                      1   1  0.0  0.1         Inf
Junín-Satipo                    10   1  0.1  0.1       1.000
Junín-Tarma                      3   1  0.0  0.1         Inf
Junín-Yauli                      3   0  0.0  0.0         NaN
La Libertad-Trujillo             3   0  0.0  0.0         NaN
Lambayeque-Chiclayo            318  29  2.0  2.6       1.300
Lima-Lima                        8   0  0.1  0.0       0.000
Loreto-Alto Amazonas             1   0  0.0  0.0         NaN
Loreto-Loreto                    2   0  0.0  0.0         NaN
Loreto-Maynas                   26   0  0.2  0.0       0.000
Madre de Dios-Manu              63   3  0.4  0.3       0.750
Madre de Dios-Tahuamanu        178  10  1.1  0.9       0.818
Madre de Dios-Tambopata        131  11  0.8  1.0       1.250
Pasco-Daniel Alcides Carrión     2   0  0.0  0.0         NaN
Pasco-Pasco                      3   0  0.0  0.0         NaN
Piura-Ayabaca                  146  14  0.9  1.3       1.444
Piura-Huancabamba               32   3  0.2  0.3       1.500
Piura-Morropón                  14   3  0.1  0.3       3.000
Piura-Paita                     37   3  0.2  0.3       1.500
Piura-Piura                    238  16  1.5  1.4       0.933
Piura-Sechura                   33   1  0.2  0.1       0.500
Piura-Sullana                   31   2  0.2  0.2       1.000
Piura-Talara                   221  13  1.4  1.2       0.857
Puno-El Collao                   2   1  0.0  0.1         Inf
Puno-Melgar                      1   0  0.0  0.0         NaN
San Martín-El Dorado            42   4  0.3  0.4       1.333
San Martín-Moyobamba           104  14  0.7  1.3       1.857
Tumbes-Tumbes                   14   2  0.1  0.2       2.000
Ucayali-Coronel Portillo         2   1  0.0  0.1         Inf
####    Áncash-Huaraz                     Inf               ####    Áncash-Mariscal Luzuriaga       0.000
####    Apurímac-Andahuaylas            0.000               ####    Apurímac-Cotabambas             4.000
####    Arequipa-Arequipa               0.952               ####    Arequipa-Camaná                 1.348
#####    Arequipa-Caravelí               1.091              ####    Arequipa-Castilla               1.200
####    Arequipa-Caylloma               1.385               ####    Arequipa-Condesuyos             1.222
####    Arequipa-La Unión               1.800               ####    Ayacucho-Lucanas                  Inf
####    Cajamarca-Cajamarca               Inf               ####    Cajamarca-Jaén                    Inf
####    Callao-Callao                   1.167               ####    Huánuco-Ambo                      Inf
####    Huánuco-Dos de Mayo             2.000               ####    Huánuco-Huánuco                 2.000
####    Ica-Ica                         2.000               ####    Ica-Pisco                       0.000
####    Junín-Huancayo                  0.000               ####    Junín-Junín                       Inf
####    Junín-Tarma                       Inf               ####    Lambayeque-Chiclayo             1.300
####    Lima-Lima                       0.000               ####    Loreto-Maynas                   0.000
####    Madre de Dios-Manu              0.750               ####    Madre de Dios-Tahuamanu         0.818
####    Madre de Dios-Tambopata         1.250               ####    Piura-Ayabaca                   1.444
####    Piura-Huancabamba               1.500               ####    Piura-Morropón                  3.000
####    Piura-Paita                     1.500               #####    Piura-Piura                     0.933
####    Piura-Sechura                   0.500               ####    Piura-Talara                    0.857
####    Puno-El Collao                    Inf               ####    San Martín-El Dorado            1.333
####    San Martín-Moyobamba            1.857               ####    Tumbes-Tumbes                   2.000
####    Ucayali-Coronel Portillo          Inf               
## Tablas CRuzadas con variable Objetivo
X <-table(DataSetUpublicaFRMTO$LUGAR_RESIDENCIA,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3))
                                                  NO  SI  NO%  SI% Ratio_SI_NO
Arequipa-Arequipa-Alto Selva Alegre             1492  99  9.4  8.9       0.947
Arequipa-Arequipa-Arequipa                      1106  91  7.0  8.2       1.171
Arequipa-Arequipa-Cayma                         1858 151 11.7 13.5       1.154
Arequipa-Arequipa-Cerro Colorado                 282  22  1.8  2.0       1.111
Arequipa-Arequipa-Characato                       30   2  0.2  0.2       1.000
Arequipa-Arequipa-Chiguata                       175  11  1.1  1.0       0.909
Arequipa-Arequipa-Jacobo Hunter                 1149  78  7.2  7.0       0.972
Arequipa-Arequipa-José Luis Bustamante y Rivero 1366  82  8.6  7.4       0.860
Arequipa-Arequipa-La Joya                        129   7  0.8  0.6       0.750
Arequipa-Arequipa-Mariano Melgar                2367 191 14.9 17.1       1.148
Arequipa-Arequipa-Miraflores                     268   4  1.7  0.4       0.235
Arequipa-Arequipa-Pocsi                           30   1  0.2  0.1       0.500
Arequipa-Arequipa-Polobaya                       236  21  1.5  1.9       1.267
Arequipa-Arequipa-Quequeña                        26   0  0.2  0.0       0.000
Arequipa-Arequipa-Sabandia                         1   0  0.0  0.0         NaN
Arequipa-Arequipa-San Juan de Siguas               5   0  0.0  0.0         NaN
Arequipa-Arequipa-San Juan de Tarucani          1134  71  7.1  6.4       0.901
Arequipa-Arequipa-Santa Isabel de Siguas         358  16  2.3  1.4       0.609
Arequipa-Arequipa-Santa Rita de Siguas           160   7  1.0  0.6       0.600
Arequipa-Arequipa-Socabaya                        19   0  0.1  0.0       0.000
Arequipa-Arequipa-Tiabaya                        195  17  1.2  1.5       1.250
Arequipa-Arequipa-Uchumayo                        12   0  0.1  0.0       0.000
Arequipa-Arequipa-Vítor                          196  17  1.2  1.5       1.250
Arequipa-Arequipa-Yanahuara                      914  50  5.7  4.5       0.789
Arequipa-Arequipa-Yarabamba                      882  64  5.5  5.7       1.036
Arequipa-Arequipa-Yura                          1510 112  9.5 10.0       1.053
Arequipa-Islay-Mollendo                            3   1  0.0  0.1         Inf
#CrossTable(DataSetUpublicaFRMTO$UBIG_NACIMIENTO,DataSetUpublicaFRMTO$DESERTOR, prop.t=FALSE, prop.r=FALSE, prop.c=TRUE, prop.chisq=FALSE)
## Nos quedamos con las siguientes variables

## Arequipa-Arequipa-Alto Selva Alegre               0.947
## Arequipa-Arequipa-Arequipa                        1.171
## Arequipa-Arequipa-Cayma                           1.154
## Arequipa-Arequipa-Cerro Colorado                  1.111
## Arequipa-Arequipa-Chiguata                        0.909
## Arequipa-Arequipa-José Luis Bustamante y Rivero   0.860
## Arequipa-Arequipa-La Joya                         0.750
## Arequipa-Arequipa-Mariano Melgar                  1.148
## Arequipa-Arequipa-Miraflores                      0.235
## Arequipa-Arequipa-Pocsi                           0.500
## Arequipa-Arequipa-Polobaya                        1.267
## Arequipa-Arequipa-Quequeña                        0.000
## Arequipa-Arequipa-Sabandia                          NaN
## Arequipa-Arequipa-San Juan de Siguas                NaN
## Arequipa-Arequipa-San Juan de Tarucani            0.901
## Arequipa-Arequipa-Santa Isabel de Siguas          0.609
## Arequipa-Arequipa-Santa Rita de Siguas            0.600
## Arequipa-Arequipa-Socabaya                        0.000
## Arequipa-Arequipa-Tiabaya                         1.250
## Arequipa-Arequipa-Uchumayo                        0.000
## Arequipa-Arequipa-Vítor                           1.250
## Arequipa-Arequipa-Yanahuara                       0.789
## Arequipa-Islay-Mollendo                             Inf
## Tablas CRuzadas con variable Objetivo
X <-table(DataSetUpublicaFRMTO$TIPO_COLEGIO,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3))
             NO  SI  NO%  SI% Ratio_SI_NO
Nacional   9959 627 62.6 56.2       0.898
Parroquial 1278  58  8.0  5.2       0.650
Particular 4666 430 29.3 38.6       1.317
### Para el caso se seleccionan todas la variables TIPO_COLEGIO
#CrossTable(DataSetUpublicaFRMTO$LUGAR_COLEGIO,DataSetUpublicaFRMTO$DESERTOR, prop.t=FALSE, prop.r=FALSE, prop.c=TRUE, prop.chisq=FALSE)
## Tablas CRuzadas con variable Objetivo
X <-table(DataSetUpublicaFRMTO$LUGAR_COLEGIO,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3))
                                                  NO  SI  NO%  SI% Ratio_SI_NO
Amazonas-Bagua-Aramango                            3   0  0.0  0.0         NaN
Áncash-Huaraz-Cochabamba                           1   1  0.0  0.1         Inf
Áncash-Huaraz-Huaraz                               1   1  0.0  0.1         Inf
Apurímac-Abancay-Abancay                          14   0  0.1  0.0       0.000
Apurímac-Andahuaylas-San Miguel de Chaccrampa      5   0  0.0  0.0         NaN
Apurímac-Antabamba-Antabamba                       7   1  0.0  0.1         Inf
Apurímac-Aymaraes-Chalhuanca                       5   0  0.0  0.0         NaN
Apurímac-Chincheros-Ongoy                          1   0  0.0  0.0         NaN
Apurímac-Cotabambas-Haquira                        6   5  0.0  0.4         Inf
Arequipa-Arequipa-Alto Selva Alegre             1368  94  8.6  8.4       0.977
Arequipa-Arequipa-Arequipa                      5000 347 31.4 31.1       0.990
Arequipa-Arequipa-Cayma                          926  58  5.8  5.2       0.897
Arequipa-Arequipa-Cerro Colorado                  24   1  0.2  0.1       0.500
Arequipa-Arequipa-Characato                        2   0  0.0  0.0         NaN
Arequipa-Arequipa-Chiguata                       190  12  1.2  1.1       0.917
Arequipa-Arequipa-Jacobo Hunter                  450  30  2.8  2.7       0.964
Arequipa-Arequipa-José Luis Bustamante y Rivero  941  54  5.9  4.8       0.814
Arequipa-Arequipa-Mariano Melgar                1218 100  7.7  9.0       1.169
Arequipa-Arequipa-Pocsi                            9   1  0.1  0.1       1.000
Arequipa-Arequipa-Polobaya                        85  11  0.5  1.0       2.000
Arequipa-Arequipa-Quequeña                        10   0  0.1  0.0       0.000
Arequipa-Arequipa-Sabandia                         7   0  0.0  0.0         NaN
Arequipa-Arequipa-Sachaca                          0   1  0.0  0.1         Inf
Arequipa-Arequipa-San Juan de Siguas              17   0  0.1  0.0       0.000
Arequipa-Arequipa-San Juan de Tarucani           482  35  3.0  3.1       1.033
Arequipa-Arequipa-Santa Isabel de Siguas         151   8  0.9  0.7       0.778
Arequipa-Arequipa-Santa Rita de Siguas            36   1  0.2  0.1       0.500
Arequipa-Arequipa-Tiabaya                        604  36  3.8  3.2       0.842
Arequipa-Arequipa-Uchumayo                         6   1  0.0  0.1         Inf
Arequipa-Arequipa-Vítor                          122  15  0.8  1.3       1.625
Arequipa-Arequipa-Yanahuara                      860  38  5.4  3.4       0.630
Arequipa-Arequipa-Yarabamba                      563  38  3.5  3.4       0.971
Arequipa-Arequipa-Yura                           697  43  4.4  3.9       0.886
Arequipa-Camaná-Camaná                            78  11  0.5  1.0       2.000
Arequipa-Camaná-José María Quimper                 9   1  0.1  0.1       1.000
Arequipa-Camaná-Mariano Nicolás Valcárcel         15   0  0.1  0.0       0.000
Arequipa-Camaná-Mariscal Cáceres                  12   0  0.1  0.0       0.000
Arequipa-Camaná-Nicolás de Piérola                 5   0  0.0  0.0         NaN
Arequipa-Camaná-Ocoña                             14   2  0.1  0.2       2.000
Arequipa-Camaná-Quilca                             7   0  0.0  0.0         NaN
Arequipa-Caravelí-Acarí                            7   0  0.0  0.0         NaN
Arequipa-Caravelí-Bella Unión                      8   1  0.1  0.1       1.000
Arequipa-Caravelí-Cahuacho                        17   2  0.1  0.2       2.000
Arequipa-Caravelí-Caravelí                       161  12  1.0  1.1       1.100
Arequipa-Caravelí-Cháparra                        38   4  0.2  0.4       2.000
Arequipa-Castilla-Andagua                         24   1  0.2  0.1       0.500
Arequipa-Castilla-Aplao                           25   2  0.2  0.2       1.000
Arequipa-Castilla-Ayo                             18   3  0.1  0.3       3.000
Arequipa-Castilla-Huancarqui                      12   1  0.1  0.1       1.000
Arequipa-Castilla-Machaguay                       23   3  0.1  0.3       3.000
Arequipa-Castilla-Orcopampa                        2   2  0.0  0.2         Inf
Arequipa-Castilla-Pampacolca                       3   1  0.0  0.1         Inf
Arequipa-Castilla-Tipán                            6   0  0.0  0.0         NaN
Arequipa-Castilla-Uñón                             4   1  0.0  0.1         Inf
Arequipa-Castilla-Uraca                            1   1  0.0  0.1         Inf
Arequipa-Caylloma-Achoma                           4   1  0.0  0.1         Inf
Arequipa-Caylloma-Callalli                         0   1  0.0  0.1         Inf
Arequipa-Caylloma-Caylloma                         1   0  0.0  0.0         NaN
Arequipa-Caylloma-Chivay                          85   6  0.5  0.5       1.000
Arequipa-Caylloma-Huambo                           1   0  0.0  0.0         NaN
Arequipa-Caylloma-Huanca                           2   1  0.0  0.1         Inf
Arequipa-Caylloma-Ichupampa                       82  12  0.5  1.1       2.200
Arequipa-Caylloma-Lari                             9   1  0.1  0.1       1.000
Arequipa-Caylloma-Lluta                            1   1  0.0  0.1         Inf
Arequipa-Caylloma-Maca                            22   1  0.1  0.1       1.000
Arequipa-Caylloma-San Antonio de Chuca             1   2  0.0  0.2         Inf
Arequipa-Condesuyos-Andaray                        1   0  0.0  0.0         NaN
Arequipa-Condesuyos-Chuquibamba                   24   6  0.2  0.5       2.500
Arequipa-Condesuyos-Salamanca                     27   3  0.2  0.3       1.500
Arequipa-Condesuyos-Yanaquihua                    55   2  0.3  0.2       0.667
Arequipa-Islay-Cocachacra                         28   2  0.2  0.2       1.000
Arequipa-Islay-Deán Valdivia                      25   1  0.2  0.1       0.500
Arequipa-Islay-Islay                               5   0  0.0  0.0         NaN
Arequipa-Islay-Mejía                               7   1  0.0  0.1         Inf
Arequipa-Islay-Mollendo                          151  12  0.9  1.1       1.222
Arequipa-Islay-Punta de Bombón                    37   2  0.2  0.2       1.000
Arequipa-La Unión-Alca                             6   4  0.0  0.4         Inf
Arequipa-La Unión-Charcana                         1   1  0.0  0.1         Inf
Arequipa-La Unión-Cotahuasi                       11   1  0.1  0.1       1.000
Arequipa-La Unión-Huaynacotas                     28   3  0.2  0.3       1.500
Arequipa-La Unión-Puyca                           10   0  0.1  0.0       0.000
Arequipa-La Unión-Tauria                           7   0  0.0  0.0         NaN
Arequipa-La Unión-Tomepampa                        0   1  0.0  0.1         Inf
Arequipa-La Unión-Toro                             4   0  0.0  0.0         NaN
Ayacucho-Huamanga-Ayacucho                         1   0  0.0  0.0         NaN
Ayacucho-La Mar-San Miguel                         1   0  0.0  0.0         NaN
Ayacucho-Lucanas-Chaviña                           2   1  0.0  0.1         Inf
Ayacucho-Lucanas-Puquio                            5   0  0.0  0.0         NaN
Ayacucho-Páucar del Sara Sara-Pausa                1   1  0.0  0.1         Inf
Cajamarca-Cajamarca-Cajamarca                      6   0  0.0  0.0         NaN
Cajamarca-Jaén-Jaén                                4   0  0.0  0.0         NaN
Callao-Callao-Callao                              23   1  0.1  0.1       1.000
Callao-Callao-La Punta                             2   0  0.0  0.0         NaN
Huancavelica-Huancavelica-Huancavelica             1   0  0.0  0.0         NaN
Huánuco-Ambo-Ambo                                  3   0  0.0  0.0         NaN
Huánuco-Dos de Mayo-La Unión                       1   1  0.0  0.1         Inf
Huánuco-Huacaybamba-Huacaybamba                    2   0  0.0  0.0         NaN
Ica-Ica-Ica                                        1   0  0.0  0.0         NaN
Junín-Chanchamayo-Chanchamayo                      5   0  0.0  0.0         NaN
Junín-Huancayo-Chilca                              2   0  0.0  0.0         NaN
Junín-Yauli-Marcapomacocha                         2   0  0.0  0.0         NaN
Lambayeque-Chiclayo-Chiclayo                      17   2  0.1  0.2       2.000
Lambayeque-Chiclayo-Eten                           3   1  0.0  0.1         Inf
Lambayeque-Chiclayo-Eten Puerto                    8   0  0.1  0.0       0.000
Lambayeque-Chiclayo-José Leonardo Ortiz            0   1  0.0  0.1         Inf
Lambayeque-Chiclayo-La Victoria                    5   2  0.0  0.2         Inf
Lambayeque-Chiclayo-Lagunas                       25   1  0.2  0.1       0.500
Lambayeque-Chiclayo-Oyotún                         1   0  0.0  0.0         NaN
Lambayeque-Chiclayo-Patapo                         4   0  0.0  0.0         NaN
Lambayeque-Chiclayo-Picsi                          4   1  0.0  0.1         Inf
Lambayeque-Chiclayo-Pimentel                       3   0  0.0  0.0         NaN
Lambayeque-Chiclayo-Pucalá                         6   0  0.0  0.0         NaN
Lambayeque-Chiclayo-Santa Rosa                     1   0  0.0  0.0         NaN
Loreto-Loreto-Parinari                             2   0  0.0  0.0         NaN
Loreto-Maynas-Iquitos                             25   0  0.2  0.0       0.000
Madre de Dios-Manu-Huepetuhe                       0   1  0.0  0.1         Inf
Madre de Dios-Tahuamanu-Iñapari                  130  13  0.8  1.2       1.500
Madre de Dios-Tahuamanu-Tahuamanu                 77   1  0.5  0.1       0.200
Madre de Dios-Tambopata-Tambopata                104   5  0.7  0.4       0.571
Piura-Ayabaca-Ayabaca                             86   6  0.5  0.5       1.000
Piura-Ayabaca-Paimas                              13   0  0.1  0.0       0.000
Piura-Huancabamba-Huancabamba                     15   0  0.1  0.0       0.000
Piura-Huancabamba-Huarmaca                         2   0  0.0  0.0         NaN
Piura-Huancabamba-Lalaquiz                         3   0  0.0  0.0         NaN
Piura-Huancabamba-San Miguel de El Faique          0   1  0.0  0.1         Inf
Piura-Morropón-Buenos Aires                        4   1  0.0  0.1         Inf
Piura-Morropón-Chulucanas                          7   1  0.0  0.1         Inf
Piura-Morropón-San Juan de Bigote                  3   0  0.0  0.0         NaN
Piura-Paita-Paita                                  4   0  0.0  0.0         NaN
Piura-Piura-El Tallán                              6   0  0.0  0.0         NaN
Piura-Piura-Piura                                118   4  0.7  0.4       0.571
Piura-Sechura-Cristo Nos Valga                     3   0  0.0  0.0         NaN
Piura-Sullana-Sullana                              3   0  0.0  0.0         NaN
Piura-Talara-Los Órganos                           0   1  0.0  0.1         Inf
Piura-Talara-Máncora                              11   0  0.1  0.0       0.000
Piura-Talara-Pariñas                             115  10  0.7  0.9       1.286
Puno-El Collao-Ilave                               2   1  0.0  0.1         Inf
San Martín-El Dorado-Agua Blanca                   1   0  0.0  0.0         NaN
San Martín-El Dorado-San Martín                   22   1  0.1  0.1       1.000
San Martín-Moyobamba-Moyobamba                    68   9  0.4  0.8       2.000
Tumbes-Tumbes-Pampas de Hospital                   0   2  0.0  0.2         Inf
Tumbes-Tumbes-Tumbes                               2   1  0.0  0.1         Inf
Ucayali-Coronel Portillo-Calleria                  3   0  0.0  0.0         NaN
###
# Amazonas-Bagua-Aramango                              NaN          # Áncash-Huaraz-Cochabamba                             Inf
# Áncash-Huaraz-Huaraz                                 Inf          # Apurímac-Abancay-Abancay                           0.000
# Apurímac-Andahuaylas-San Miguel de Chaccrampa        NaN          # Apurímac-Antabamba-Antabamba                         Inf
# Apurímac-Aymaraes-Chalhuanca                         NaN          # Apurímac-Chincheros-Ongoy                            NaN
# Apurímac-Cotabambas-Haquira                          Inf          # Arequipa-Arequipa-Alto Selva Alegre                0.977
# Arequipa-Arequipa-Arequipa                         0.990          # Arequipa-Arequipa-Cayma                            0.897
# Arequipa-Arequipa-Cerro Colorado                   0.500          # Arequipa-Arequipa-Characato                          NaNa
# Arequipa-Arequipa-Chiguata                         0.917          # Arequipa-Arequipa-Jacobo Hunter                    0.964
# Arequipa-Arequipa-José Luis Bustamante y Rivero    0.814          # Arequipa-Arequipa-Mariano Melgar                   1.169
# Arequipa-Arequipa-Polobaya                         2.000          # Arequipa-Arequipa-Quequeña                         0.000
# Arequipa-Arequipa-Sabandia                           NaN          # Arequipa-Arequipa-Sachaca                            Inf
# Arequipa-Arequipa-San Juan de Siguas               0.000          # Arequipa-Arequipa-San Juan de Tarucani             1.033
# Arequipa-Arequipa-Santa Isabel de Siguas           0.778          # Arequipa-Arequipa-Santa Rita de Siguas             0.500
# Arequipa-Arequipa-Tiabaya                          0.842          # Arequipa-Arequipa-Uchumayo                           Inf
# Arequipa-Arequipa-Vítor                            1.625          # Arequipa-Arequipa-Yanahuara                        0.630
# Arequipa-Arequipa-Yarabamba                        0.971          # Arequipa-Arequipa-Yura                             0.886
# Arequipa-Camaná-Camaná                             2.000          # Arequipa-Camaná-Mariano Nicolás Valcárcel          0.000
# Arequipa-Camaná-Mariscal Cáceres                   0.000          # Arequipa-Camaná-Nicolás de Piérola                   NaN
# Arequipa-Camaná-Ocoña                              2.000          # Arequipa-Camaná-Quilca                               NaN
# Arequipa-Caravelí-Acarí                              NaN          # Arequipa-Caravelí-Cahuacho                         2.000
# Arequipa-Caravelí-Caravelí                         1.100          # Arequipa-Caravelí-Cháparra                         2.000
# Arequipa-Castilla-Andagua                          0.500          # Arequipa-Castilla-Ayo                              3.000
# Arequipa-Castilla-Machaguay                        3.000          # Arequipa-Castilla-Orcopampa                          Inf
# Arequipa-Castilla-Pampacolca                         Inf          # Arequipa-Castilla-Tipán                              NaN
# Arequipa-Castilla-Uñón                               Inf          # Arequipa-Castilla-Uraca                              Inf
# Arequipa-Caylloma-Achoma                             Inf          # Arequipa-Caylloma-Callalli                           Inf
# Arequipa-Caylloma-Caylloma                           NaN          # Arequipa-Caylloma-Huambo                             NaN
# Arequipa-Caylloma-Huanca                             Inf          # Arequipa-Caylloma-Ichupampa                        2.200
# Arequipa-Caylloma-Lluta                              Inf          # Arequipa-Caylloma-San Antonio de Chuca               Inf
# Arequipa-Condesuyos-Andaray                          NaN          # Arequipa-Condesuyos-Chuquibamba                    2.500
# Arequipa-Condesuyos-Salamanca                      1.500          # Arequipa-Condesuyos-Yanaquihua                     0.667
# Arequipa-Islay-Deán Valdivia                       0.500          # Arequipa-Islay-Islay                                 NaN
# Arequipa-Islay-Mejía                                 Inf          # Arequipa-Islay-Mollendo                            1.222
# Arequipa-La Unión-Alca                               Inf          # Arequipa-La Unión-Charcana                           Inf
# Arequipa-La Unión-Huaynacotas                      1.500          # Arequipa-La Unión-Puyca                            0.000
# Arequipa-La Unión-Tauria                             NaN          # Arequipa-La Unión-Tomepampa                          Inf
# Arequipa-La Unión-Toro                               NaN          # Ayacucho-Huamanga-Ayacucho                           NaN
# Ayacucho-La Mar-San Miguel                           NaN          # Ayacucho-Lucanas-Chaviña                             Inf
# Ayacucho-Lucanas-Puquio                              NaN          # Ayacucho-Páucar del Sara Sara-Pausa                  Inf
# Cajamarca-Cajamarca-Cajamarca                        NaN          # Cajamarca-Jaén-Jaén                                  NaN
# Callao-Callao-La Punta                               NaN          # Huancavelica-Huancavelica-Huancavelica               NaN
# Huánuco-Ambo-Ambo                                    NaN          # Huánuco-Dos de Mayo-La Unión                         Inf
# Huánuco-Huacaybamba-Huacaybamba                      NaN          # Ica-Ica-Ica                                          NaN
# Junín-Chanchamayo-Chanchamayo                        NaN          # Junín-Huancayo-Chilca                                NaN
# Junín-Yauli-Marcapomacocha                           NaN          # Lambayeque-Chiclayo-Chiclayo                       2.000
# Lambayeque-Chiclayo-Eten                             Inf          # Lambayeque-Chiclayo-Eten Puerto                    0.000
# Lambayeque-Chiclayo-José Leonardo Ortiz              Inf          # Lambayeque-Chiclayo-La Victoria                      Inf
# Lambayeque-Chiclayo-Lagunas                        0.500          # Lambayeque-Chiclayo-Oyotún                           NaN
# Lambayeque-Chiclayo-Patapo                           NaN          # Lambayeque-Chiclayo-Picsi                            Inf
# Lambayeque-Chiclayo-Pimentel                         NaN          # Lambayeque-Chiclayo-Pucalá                           NaN
# Lambayeque-Chiclayo-Santa Rosa                       NaN          # Loreto-Loreto-Parinari                               NaN
# Loreto-Maynas-Iquitos                              0.000          # Madre de Dios-Manu-Huepetuhe                         Inf
# Madre de Dios-Tahuamanu-Iñapari                    1.500          # Madre de Dios-Tahuamanu-Tahuamanu                  0.200
# Madre de Dios-Tambopata-Tambopata                  0.571          # Piura-Ayabaca-Paimas                               0.000
# Piura-Huancabamba-Huancabamba                      0.000          # Piura-Huancabamba-Huarmaca                           NaN
# Piura-Huancabamba-Lalaquiz                           NaN          # Piura-Huancabamba-San Miguel de El Faique            Inf
# Piura-Morropón-Buenos Aires                          Inf          # Piura-Morropón-Chulucanas                            Inf
# Piura-Morropón-San Juan de Bigote                    NaN          # Piura-Paita-Paita                                    NaN
# Piura-Piura-El Tallán                                NaN          # Piura-Piura-Piura                                  0.571
# Piura-Sechura-Cristo Nos Valga                       NaN          # Piura-Sullana-Sullana                                NaN
# Piura-Talara-Los Órganos                             Inf          # Piura-Talara-Máncora                               0.000
# Piura-Talara-Pariñas                               1.286          # Puno-El Collao-Ilave                                 Inf
# San Martín-El Dorado-Agua Blanca                     NaN          # San Martín-Moyobamba-Moyobamba                     2.000
# Tumbes-Tumbes-Pampas de Hospital                     Inf          # Tumbes-Tumbes-Tumbes                                 Inf
# Ucayali-Coronel Portillo-Calleria                    Na           
X <-table(DataSetUpublicaFRMTO$MODALIDAD_INGRESO,DataSetUpublicaFRMTO$DESERTOR)
Y = round((100 * apply(X, 2, function(z) z / sum(z))),1);
colnames(Y) <-  c("NO%","SI%")
cbind(X,Y, Ratio_SI_NO = round((Y[,'SI%'] / Y[,'NO%']),3))
                                NO  SI  NO%  SI% Ratio_SI_NO
Convenios y Otros               20   5  0.1  0.4       4.000
CPU                           4673 288 29.4 25.8       0.878
Deportistas Calificados         75  13  0.5  1.2       2.400
Ordinario                     8597 558 54.1 50.0       0.924
Primeros Puestos              2160 230 13.6 20.6       1.515
Profesionales                   87   4  0.5  0.4       0.800
Traslados Externos Nacionales   76  14  0.5  1.3       2.600
Traslados Internos             215   3  1.4  0.3       0.214
### Variables Seleccionadas TODAS

Procedemos a generar las variables Dummies (dicotómicas)

Por cada variable categórica seleccionada en el anterior paso; se procedera a seleccionar cuales utilizar en base al análisis de “Tablas Cruzadas”

#VARIABLES CATEGORICAS
library(dummies)

#Dicotomizacion de variables categoricas
Datos_Dico_cat <- dplyr::select(DataSetUpublicaFRMTO,
                                ESCUELA,SEXO,LUGAR_NACIMIENTO,LUGAR_RESIDENCIA,TIPO_COLEGIO,LUGAR_COLEGIO,MODALIDAD_INGRESO)
Datos_Dico_cat <- dummy.data.frame(Datos_Dico_cat,names=c(
                                "ESCUELA","SEXO","LUGAR_NACIMIENTO","LUGAR_RESIDENCIA","TIPO_COLEGIO","LUGAR_COLEGIO","MODALIDAD_INGRESO"))

colnames(Datos_Dico_cat) <- c(
"ESCUELA_CIENCIADELACOMPUTACION",                            "ESCUELA_INGENIERIADESISTEMAS",
"ESCUELA_INGENIERIAELECTRICA",                               "ESCUELA_INGENIERIAELECTRONICA",
"ESCUELA_INGENIERIAENTELECOMUNICACIONES",                    "ESCUELA_INGENIERIAINDUSTRIAL",
"ESCUELA_INGENIERIAMECANICA",                                "SEXO_F",
"SEXO_M",                                                    "LUGAR_NACIMIENTO_ancash_Huaraz",
"LUGAR_NACIMIENTO_ancash_Huari",                             "LUGAR_NACIMIENTO_ancash_MariscalLuzuriaga",
"LUGAR_NACIMIENTO_Apurimac_Abancay",                         "LUGAR_NACIMIENTO_Apurimac_Andahuaylas",
"LUGAR_NACIMIENTO_Apurimac_Antabamba",                       "LUGAR_NACIMIENTO_Apurimac_Aymaraes",
"LUGAR_NACIMIENTO_Apurimac_Chincheros",                      "LUGAR_NACIMIENTO_Apurimac_Cotabambas",
"LUGAR_NACIMIENTO_Arequipa_Arequipa",                        "LUGAR_NACIMIENTO_Arequipa_Camana",
"LUGAR_NACIMIENTO_Arequipa_Caraveli",                        "LUGAR_NACIMIENTO_Arequipa_Castilla",
"LUGAR_NACIMIENTO_Arequipa_Caylloma",                        "LUGAR_NACIMIENTO_Arequipa_Condesuyos",
"LUGAR_NACIMIENTO_Arequipa_Islay",                           "LUGAR_NACIMIENTO_Arequipa_LaUnión",
"LUGAR_NACIMIENTO_Ayacucho_Huamanga",                        "LUGAR_NACIMIENTO_Ayacucho_LaMar",
"LUGAR_NACIMIENTO_Ayacucho_Lucanas",                         "LUGAR_NACIMIENTO_Ayacucho_Parinacochas",
"LUGAR_NACIMIENTO_Cajamarca_Cajamarca",                      "LUGAR_NACIMIENTO_Cajamarca_Jaen",
"LUGAR_NACIMIENTO_Cajamarca_SanMiguel",                      "LUGAR_NACIMIENTO_Cajamarca_SantaCruz",
"LUGAR_NACIMIENTO_Callao_Callao",                            "LUGAR_NACIMIENTO_Cusco_Anta",
"LUGAR_NACIMIENTO_Cusco_Chumbivilcas",                       "LUGAR_NACIMIENTO_Huancavelica_Huaytara",
"LUGAR_NACIMIENTO_Huanuco_Ambo",                             "LUGAR_NACIMIENTO_Huanuco_DosdeMayo",
"LUGAR_NACIMIENTO_Huanuco_Huanuco",                          "LUGAR_NACIMIENTO_Ica_Chincha",
"LUGAR_NACIMIENTO_Ica_Ica",                                  "LUGAR_NACIMIENTO_Ica_Pisco",
"LUGAR_NACIMIENTO_Junin_Huancayo",                           "LUGAR_NACIMIENTO_Junin_Junin",
"LUGAR_NACIMIENTO_Junin_Satipo",                             "LUGAR_NACIMIENTO_Junin_Tarma",
"LUGAR_NACIMIENTO_Junin_Yauli",                              "LUGAR_NACIMIENTO_LaLibertad_Trujillo",
"LUGAR_NACIMIENTO_Lambayeque_Chiclayo",                      "LUGAR_NACIMIENTO_Lima_Lima",
"LUGAR_NACIMIENTO_Loreto_AltoAmazonas",                      "LUGAR_NACIMIENTO_Loreto_Loreto",
"LUGAR_NACIMIENTO_Loreto_Maynas",                            "LUGAR_NACIMIENTO_MadredeDios_Manu",
"LUGAR_NACIMIENTO_MadredeDios_Tahuamanu",                    "LUGAR_NACIMIENTO_MadredeDios_Tambopata",
"LUGAR_NACIMIENTO_Pasco_DanielAlcidesCarrión",               "LUGAR_NACIMIENTO_Pasco_Pasco",
"LUGAR_NACIMIENTO_Piura_Ayabaca",                            "LUGAR_NACIMIENTO_Piura_Huancabamba",
"LUGAR_NACIMIENTO_Piura_Morropón",                           "LUGAR_NACIMIENTO_Piura_Paita",
"LUGAR_NACIMIENTO_Piura_Piura",                              "LUGAR_NACIMIENTO_Piura_Sechura",
"LUGAR_NACIMIENTO_Piura_Sullana",                            "LUGAR_NACIMIENTO_Piura_Talara",
"LUGAR_NACIMIENTO_Puno_ElCollao",                            "LUGAR_NACIMIENTO_Puno_Melgar",
"LUGAR_NACIMIENTO_SanMartin_ElDorado",                       "LUGAR_NACIMIENTO_SanMartin_Moyobamba",
"LUGAR_NACIMIENTO_Tumbes_Tumbes",                            "LUGAR_NACIMIENTO_Ucayali_CoronelPortillo",
"LUGAR_RESIDENCIA_AA_AltoSelvaAlegre",                       "LUGAR_RESIDENCIA_AA_Arequipa",
"LUGAR_RESIDENCIA_AA_Cayma",                                 "LUGAR_RESIDENCIA_AA_CerroColorado",
"LUGAR_RESIDENCIA_AA_Characato",                             "LUGAR_RESIDENCIA_AA_Chiguata",
"LUGAR_RESIDENCIA_AA_JacoboHunter",                          "LUGAR_RESIDENCIA_AA_JoseLuisBustamanteyRivero",
"LUGAR_RESIDENCIA_AA_LaJoya",                                "LUGAR_RESIDENCIA_AA_MarianoMelgar",
"LUGAR_RESIDENCIA_AA_Miraflores",                            "LUGAR_RESIDENCIA_AA_Pocsi",
"LUGAR_RESIDENCIA_AA_Polobaya",                              "LUGAR_RESIDENCIA_AA_Quequeña",
"LUGAR_RESIDENCIA_AA_Sabandia",                              "LUGAR_RESIDENCIA_AA_SanJuandeSiguas",
"LUGAR_RESIDENCIA_AA_SanJuandeTarucani",                     "LUGAR_RESIDENCIA_AA_SantaIsabeldeSiguas",
"LUGAR_RESIDENCIA_AA_SantaRitadeSiguas",                     "LUGAR_RESIDENCIA_AA_Socabaya",
"LUGAR_RESIDENCIA_AA_Tiabaya",                               "LUGAR_RESIDENCIA_AA_Uchumayo",
"LUGAR_RESIDENCIA_AA_Vitor",                                 "LUGAR_RESIDENCIA_AA_Yanahuara",
"LUGAR_RESIDENCIA_AA_Yarabamba",                             "LUGAR_RESIDENCIA_AA_Yura",
"LUGAR_RESIDENCIA_AI_Mollendo",                              "TIPO_COLEGIO_Nacional",
"TIPO_COLEGIO_Parroquial",                                   "TIPO_COLEGIO_Particular",
"LUGAR_COLEGIO_Amazonas_Bagua_Aramango",                     "LUGAR_COLEGIO_Ancash_Huaraz_Cochabamba",
"LUGAR_COLEGIO_Ancash_Huaraz_Huaraz",                        "LUGAR_COLEGIO_Apurimac_Abancay_Abancay",
"LUGAR_COLEGIO_Apurimac_Andahuaylas_SanMiguelChaccrampa",    "LUGAR_COLEGIO_Apurimac_Antabamba_Antabamba",
"LUGAR_COLEGIO_Apurimac_Aymaraes_Chalhuanca",                "LUGAR_COLEGIO_Apurimac_Chincheros_Ongoy",
"LUGAR_COLEGIO_Apurimac_Cotabambas_Haquira",                 "LUGAR_COLEGIO_Arequipa_Arequipa_AltoSelvaAlegre",
"LUGAR_COLEGIO_Arequipa_Arequipa_Arequipa",                  "LUGAR_COLEGIO_Arequipa_Arequipa_Cayma",
"LUGAR_COLEGIO_Arequipa_Arequipa_CerroColorado",             "LUGAR_COLEGIO_Arequipa_Arequipa_Characato",
"LUGAR_COLEGIO_Arequipa_Arequipa_Chiguata",                  "LUGAR_COLEGIO_Arequipa_Arequipa_JacoboHunter",
"LUGAR_COLEGIO_Arequipa_Arequipa_JoseLuisBustamanteyRivero", "LUGAR_COLEGIO_Arequipa_Arequipa_MarianoMelgar",
"LUGAR_COLEGIO_Arequipa_Arequipa_Pocsi",                     "LUGAR_COLEGIO_Arequipa_Arequipa_Polobaya",
"LUGAR_COLEGIO_Arequipa_Arequipa_Quequeña",                  "LUGAR_COLEGIO_Arequipa_Arequipa_Sabandia",
"LUGAR_COLEGIO_Arequipa_Arequipa_Sachaca",                   "LUGAR_COLEGIO_Arequipa_Arequipa_SanJuandeSiguas",
"LUGAR_COLEGIO_Arequipa_Arequipa_SanJuandeTarucani",         "LUGAR_COLEGIO_Arequipa_Arequipa_SantaIsabeldeSiguas",
"LUGAR_COLEGIO_Arequipa_Arequipa_SantaRitadeSiguas",         "LUGAR_COLEGIO_Arequipa_Arequipa_Tiabaya",
"LUGAR_COLEGIO_Arequipa_Arequipa_Uchumayo",                  "LUGAR_COLEGIO_Arequipa_Arequipa_Vitor",
"LUGAR_COLEGIO_Arequipa_Arequipa_Yanahuara",                 "LUGAR_COLEGIO_Arequipa_Arequipa_Yarabamba",
"LUGAR_COLEGIO_Arequipa_Arequipa_Yura",                      "LUGAR_COLEGIO_Arequipa_Camana_Camana",
"LUGAR_COLEGIO_Arequipa_Camana_JoseMariaQuimper",            "LUGAR_COLEGIO_Arequipa_Camana_MarianoNicolasValcarcel",
"LUGAR_COLEGIO_Arequipa_Camana_MariscalCaceres",             "LUGAR_COLEGIO_Arequipa_Camana_NicolasdePierola",
"LUGAR_COLEGIO_Arequipa_Camana_Ocoña",                       "LUGAR_COLEGIO_Arequipa_Camana_Quilca",
"LUGAR_COLEGIO_Arequipa_Caraveli_Acari",                     "LUGAR_COLEGIO_Arequipa_Caraveli_BellaUnión",
"LUGAR_COLEGIO_Arequipa_Caraveli_Cahuacho",                  "LUGAR_COLEGIO_Arequipa_Caraveli_Caraveli",
"LUGAR_COLEGIO_Arequipa_Caraveli_Chaparra",                  "LUGAR_COLEGIO_Arequipa_Castilla_Andagua",
"LUGAR_COLEGIO_Arequipa_Castilla_Aplao",                     "LUGAR_COLEGIO_Arequipa_Castilla_Ayo",
"LUGAR_COLEGIO_Arequipa_Castilla_Huancarqui",                "LUGAR_COLEGIO_Arequipa_Castilla_Machaguay",
"LUGAR_COLEGIO_Arequipa_Castilla_Orcopampa",                 "LUGAR_COLEGIO_Arequipa_Castilla_Pampacolca",
"LUGAR_COLEGIO_Arequipa_Castilla_Tipan",                     "LUGAR_COLEGIO_Arequipa_Castilla_Uñón",
"LUGAR_COLEGIO_Arequipa_Castilla_Uraca",                     "LUGAR_COLEGIO_Arequipa_Caylloma_Achoma",
"LUGAR_COLEGIO_Arequipa_Caylloma_Callalli",                  "LUGAR_COLEGIO_Arequipa_Caylloma_Caylloma",
"LUGAR_COLEGIO_Arequipa_Caylloma_Chivay",                    "LUGAR_COLEGIO_Arequipa_Caylloma_Huambo",
"LUGAR_COLEGIO_Arequipa_Caylloma_Huanca",                    "LUGAR_COLEGIO_Arequipa_Caylloma_Ichupampa",
"LUGAR_COLEGIO_Arequipa_Caylloma_Lari",                      "LUGAR_COLEGIO_Arequipa_Caylloma_Lluta",
"LUGAR_COLEGIO_Arequipa_Caylloma_Maca",                      "LUGAR_COLEGIO_Arequipa_Caylloma_SanAntoniodeChuca",
"LUGAR_COLEGIO_Arequipa_Condesuyos_Andaray",                 "LUGAR_COLEGIO_Arequipa_Condesuyos_Chuquibamba",
"LUGAR_COLEGIO_Arequipa_Condesuyos_Salamanca",               "LUGAR_COLEGIO_Arequipa_Condesuyos_Yanaquihua",
"LUGAR_COLEGIO_Arequipa_Islay_Cocachacra",                   "LUGAR_COLEGIO_Arequipa_Islay_DeanValdivia",
"LUGAR_COLEGIO_Arequipa_Islay_Islay",                        "LUGAR_COLEGIO_Arequipa_Islay_Mejia",
"LUGAR_COLEGIO_Arequipa_Islay_Mollendo",                     "LUGAR_COLEGIO_Arequipa_Islay_PuntadeBombón",
"LUGAR_COLEGIO_Arequipa_LaUnión_Alca",                       "LUGAR_COLEGIO_Arequipa_LaUnión_Charcana",
"LUGAR_COLEGIO_Arequipa_LaUnión_Cotahuasi",                  "LUGAR_COLEGIO_Arequipa_LaUnión_Huaynacotas",
"LUGAR_COLEGIO_Arequipa_LaUnión_Puyca",                      "LUGAR_COLEGIO_Arequipa_LaUnión_Tauria",
"LUGAR_COLEGIO_Arequipa_LaUnión_Tomepampa",                  "LUGAR_COLEGIO_Arequipa_LaUnión_Toro",
"LUGAR_COLEGIO_Ayacucho_Huamanga_Ayacucho",                  "LUGAR_COLEGIO_Ayacucho_LaMar_SanMiguel",
"LUGAR_COLEGIO_Ayacucho_Lucanas_Chaviña",                    "LUGAR_COLEGIO_Ayacucho_Lucanas_Puquio",
"LUGAR_COLEGIO_Ayacucho_PaucardelSaraSara_Pausa",            "LUGAR_COLEGIO_Cajamarca_Cajamarca_Cajamarca",
"LUGAR_COLEGIO_Cajamarca_Jaen_Jaen",                         "LUGAR_COLEGIO_Callao_Callao_Callao",
"LUGAR_COLEGIO_Callao_Callao_LaPunta",                       "LUGAR_COLEGIO_Huancavelica_Huancavelica",
"LUGAR_COLEGIO_Huanuco_Ambo_Ambo",                           "LUGAR_COLEGIO_Huanuco_DosdeMayo_LaUnión",
"LUGAR_COLEGIO_Huanuco_Huacaybamba_Huacaybamba",             "LUGAR_COLEGIO_Ica_Ica_Ica",
"LUGAR_COLEGIO_Junin_Chanchamayo_Chanchamayo",               "LUGAR_COLEGIO_Junin_Huancayo_Chilca",
"LUGAR_COLEGIO_Junin_Yauli_Marcapomacocha",                  "LUGAR_COLEGIO_Lambayeque_Chiclayo_Chiclayo",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_Eten",                    "LUGAR_COLEGIO_Lambayeque_Chiclayo_EtenPuerto",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_JoseLeonardoOrtiz",       "LUGAR_COLEGIO_Lambayeque_Chiclayo_LaVictoria",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_Lagunas",                 "LUGAR_COLEGIO_Lambayeque_Chiclayo_Oyotún",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_Patapo",                  "LUGAR_COLEGIO_Lambayeque_Chiclayo_Picsi",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_Pimentel",                "LUGAR_COLEGIO_Lambayeque_Chiclayo_Pucala",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_SantaRosa",               "LUGAR_COLEGIO_Loreto_Loreto_Parinari",
"LUGAR_COLEGIO_Loreto_Maynas_Iquitos",                       "LUGAR_COLEGIO_MadredeDios_Manu_Huepetuhe",
"LUGAR_COLEGIO_MadredeDios_Tahuamanu_Iñapari",               "LUGAR_COLEGIO_MadredeDios_Tahuamanu_Tahuamanu",
"LUGAR_COLEGIO_MadredeDios_Tambopata_Tambopata",             "LUGAR_COLEGIO_Piura_Ayabaca_Ayabaca",
"LUGAR_COLEGIO_Piura_Ayabaca_Paimas",                        "LUGAR_COLEGIO_Piura_Huancabamba_Huancabamba",
"LUGAR_COLEGIO_Piura_Huancabamba_Huarmaca",                  "LUGAR_COLEGIO_Piura_Huancabamba_Lalaquiz",
"LUGAR_COLEGIO_Piura_Huancabamba_SanMigueldeElFaique",       "LUGAR_COLEGIO_Piura_Morropón_BuenosAires",
"LUGAR_COLEGIO_Piura_Morropón_Chulucanas",                   "LUGAR_COLEGIO_Piura_Morropón_SanJuandeBigote",
"LUGAR_COLEGIO_Piura_Paita_Paita",                           "LUGAR_COLEGIO_Piura_Piura_ElTallan",
"LUGAR_COLEGIO_Piura_Piura_Piura",                           "LUGAR_COLEGIO_Piura_Sechura_CristoNosValga",
"LUGAR_COLEGIO_Piura_Sullana_Sullana",                       "LUGAR_COLEGIO_Piura_Talara_LosÓrganos",
"LUGAR_COLEGIO_Piura_Talara_Mancora",                        "LUGAR_COLEGIO_Piura_Talara_Pariñas",
"LUGAR_COLEGIO_Puno_ElCollao_Ilave",                         "LUGAR_COLEGIO_SanMartin_ElDorado_AguaBlanca",
"LUGAR_COLEGIO_SanMartin_ElDorado_SanMartin",                "LUGAR_COLEGIO_SanMartin_Moyobamba_Moyobamba",
"LUGAR_COLEGIO_Tumbes_Tumbes_PampasHospital",                "LUGAR_COLEGIO_Tumbes_Tumbes_Tumbes",
"LUGAR_COLEGIO_Ucayali_CoronelPortillo_Calleria",            "MODALIDAD_INGRESO_ConveniosyOtros",
"MODALIDAD_INGRESO_CPU",                                     "MODALIDAD_INGRESO_DeportistasCalificados",
"MODALIDAD_INGRESO_Ordinario",                               "MODALIDAD_INGRESO_PrimerosPuestos",
"MODALIDAD_INGRESO_Profesionales",                           "MODALIDAD_INGRESO_TrasladosExternosNacionales",
"MODALIDAD_INGRESO_TrasladosInternos")

#glimpse(Datos_Dico_cat)
ListVar.Categ.Dico.seleccionados <- 
c("ESCUELA_CIENCIADELACOMPUTACION","ESCUELA_INGENIERIADESISTEMAS","ESCUELA_INGENIERIAELECTRONICA","ESCUELA_INGENIERIAENTELECOMUNICACIONES","ESCUELA_INGENIERIAINDUSTRIAL","ESCUELA_INGENIERIAMECANICA",
"SEXO_F",
"LUGAR_NACIMIENTO_ancash_Huaraz","LUGAR_NACIMIENTO_ancash_MariscalLuzuriaga","LUGAR_NACIMIENTO_Apurimac_Andahuaylas","LUGAR_NACIMIENTO_Arequipa_Arequipa","LUGAR_NACIMIENTO_Arequipa_Camana","LUGAR_NACIMIENTO_Arequipa_Caraveli","LUGAR_NACIMIENTO_Arequipa_Castilla","LUGAR_NACIMIENTO_Arequipa_Caylloma","LUGAR_NACIMIENTO_Arequipa_Condesuyos","LUGAR_NACIMIENTO_Arequipa_LaUnión","LUGAR_NACIMIENTO_Ayacucho_Lucanas",
"LUGAR_NACIMIENTO_Cajamarca_Cajamarca","LUGAR_NACIMIENTO_Cajamarca_Jaen","LUGAR_NACIMIENTO_Callao_Callao","LUGAR_NACIMIENTO_Huanuco_Ambo","LUGAR_NACIMIENTO_Huanuco_DosdeMayo","LUGAR_NACIMIENTO_Huanuco_Huanuco",
"LUGAR_NACIMIENTO_Ica_Ica","LUGAR_NACIMIENTO_Ica_Pisco","LUGAR_NACIMIENTO_Junin_Huancayo","LUGAR_NACIMIENTO_Junin_Junin","LUGAR_NACIMIENTO_Junin_Tarma","LUGAR_NACIMIENTO_Lambayeque_Chiclayo","LUGAR_NACIMIENTO_Lima_Lima",
"LUGAR_NACIMIENTO_Loreto_Maynas","LUGAR_NACIMIENTO_MadredeDios_Manu","LUGAR_NACIMIENTO_MadredeDios_Tahuamanu","LUGAR_NACIMIENTO_MadredeDios_Tambopata","LUGAR_NACIMIENTO_Piura_Ayabaca","LUGAR_NACIMIENTO_Piura_Huancabamba",
"LUGAR_NACIMIENTO_Piura_Morropón","LUGAR_NACIMIENTO_Piura_Paita","LUGAR_NACIMIENTO_Piura_Piura","LUGAR_NACIMIENTO_Piura_Sechura","LUGAR_NACIMIENTO_Piura_Talara",
"LUGAR_NACIMIENTO_Puno_ElCollao","LUGAR_NACIMIENTO_SanMartin_ElDorado","LUGAR_NACIMIENTO_SanMartin_Moyobamba","LUGAR_NACIMIENTO_Tumbes_Tumbes","LUGAR_NACIMIENTO_Ucayali_CoronelPortillo",
"LUGAR_RESIDENCIA_AA_AltoSelvaAlegre","LUGAR_RESIDENCIA_AA_Arequipa","LUGAR_RESIDENCIA_AA_Cayma","LUGAR_RESIDENCIA_AA_CerroColorado","LUGAR_RESIDENCIA_AA_Characato","LUGAR_RESIDENCIA_AA_Chiguata",
"LUGAR_RESIDENCIA_AA_JoseLuisBustamanteyRivero","LUGAR_RESIDENCIA_AA_LaJoya","LUGAR_RESIDENCIA_AA_MarianoMelgar","LUGAR_RESIDENCIA_AA_Miraflores","LUGAR_RESIDENCIA_AA_Pocsi","LUGAR_RESIDENCIA_AA_Polobaya","LUGAR_RESIDENCIA_AA_Quequeña",
"LUGAR_RESIDENCIA_AA_Sabandia","LUGAR_RESIDENCIA_AA_SanJuandeSiguas","LUGAR_RESIDENCIA_AA_SanJuandeTarucani","LUGAR_RESIDENCIA_AA_SantaIsabeldeSiguas","LUGAR_RESIDENCIA_AA_SantaRitadeSiguas","LUGAR_RESIDENCIA_AA_Socabaya",
"LUGAR_RESIDENCIA_AA_Tiabaya","LUGAR_RESIDENCIA_AA_Uchumayo","LUGAR_RESIDENCIA_AA_Vitor","LUGAR_RESIDENCIA_AA_Yanahuara","LUGAR_RESIDENCIA_AI_Mollendo","TIPO_COLEGIO_Nacional",

"TIPO_COLEGIO_Parroquial","TIPO_COLEGIO_Particular",
"LUGAR_COLEGIO_Amazonas_Bagua_Aramango","LUGAR_COLEGIO_Ancash_Huaraz_Cochabamba","LUGAR_COLEGIO_Ancash_Huaraz_Huaraz","LUGAR_COLEGIO_Apurimac_Abancay_Abancay",
"LUGAR_COLEGIO_Apurimac_Andahuaylas_SanMiguelChaccrampa","LUGAR_COLEGIO_Apurimac_Antabamba_Antabamba","LUGAR_COLEGIO_Apurimac_Aymaraes_Chalhuanca","LUGAR_COLEGIO_Apurimac_Chincheros_Ongoy","LUGAR_COLEGIO_Apurimac_Cotabambas_Haquira","LUGAR_COLEGIO_Arequipa_Arequipa_AltoSelvaAlegre","LUGAR_COLEGIO_Arequipa_Arequipa_Arequipa","LUGAR_COLEGIO_Arequipa_Arequipa_Cayma","LUGAR_COLEGIO_Arequipa_Arequipa_CerroColorado","LUGAR_COLEGIO_Arequipa_Arequipa_Characato",
"LUGAR_COLEGIO_Arequipa_Arequipa_Chiguata","LUGAR_COLEGIO_Arequipa_Arequipa_JacoboHunter","LUGAR_COLEGIO_Arequipa_Arequipa_JoseLuisBustamanteyRivero","LUGAR_COLEGIO_Arequipa_Arequipa_MarianoMelgar",
"LUGAR_COLEGIO_Arequipa_Arequipa_Polobaya","LUGAR_COLEGIO_Arequipa_Arequipa_Quequeña","LUGAR_COLEGIO_Arequipa_Arequipa_Sabandia","LUGAR_COLEGIO_Arequipa_Arequipa_Sachaca","LUGAR_COLEGIO_Arequipa_Arequipa_SanJuandeSiguas",
"LUGAR_COLEGIO_Arequipa_Arequipa_SanJuandeTarucani","LUGAR_COLEGIO_Arequipa_Arequipa_SantaIsabeldeSiguas","LUGAR_COLEGIO_Arequipa_Arequipa_SantaRitadeSiguas","LUGAR_COLEGIO_Arequipa_Arequipa_Tiabaya",
"LUGAR_COLEGIO_Arequipa_Arequipa_Uchumayo","LUGAR_COLEGIO_Arequipa_Arequipa_Vitor","LUGAR_COLEGIO_Arequipa_Arequipa_Yanahuara","LUGAR_COLEGIO_Arequipa_Arequipa_Yarabamba",
"LUGAR_COLEGIO_Arequipa_Arequipa_Yura","LUGAR_COLEGIO_Arequipa_Camana_Camana","LUGAR_COLEGIO_Arequipa_Camana_MarianoNicolasValcarcel","LUGAR_COLEGIO_Arequipa_Camana_MariscalCaceres","LUGAR_COLEGIO_Arequipa_Camana_NicolasdePierola",
"LUGAR_COLEGIO_Arequipa_Camana_Ocoña","LUGAR_COLEGIO_Arequipa_Camana_Quilca","LUGAR_COLEGIO_Arequipa_Caraveli_Acari","LUGAR_COLEGIO_Arequipa_Caraveli_Cahuacho","LUGAR_COLEGIO_Arequipa_Caraveli_Caraveli",
"LUGAR_COLEGIO_Arequipa_Caraveli_Chaparra","LUGAR_COLEGIO_Arequipa_Castilla_Andagua","LUGAR_COLEGIO_Arequipa_Castilla_Aplao","LUGAR_COLEGIO_Arequipa_Castilla_Ayo",
"LUGAR_COLEGIO_Arequipa_Castilla_Machaguay","LUGAR_COLEGIO_Arequipa_Castilla_Orcopampa","LUGAR_COLEGIO_Arequipa_Castilla_Pampacolca","LUGAR_COLEGIO_Arequipa_Castilla_Tipan","LUGAR_COLEGIO_Arequipa_Castilla_Uñón",
"LUGAR_COLEGIO_Arequipa_Castilla_Uraca","LUGAR_COLEGIO_Arequipa_Caylloma_Achoma","LUGAR_COLEGIO_Arequipa_Caylloma_Callalli","LUGAR_COLEGIO_Arequipa_Caylloma_Caylloma","LUGAR_COLEGIO_Arequipa_Caylloma_Huambo",
"LUGAR_COLEGIO_Arequipa_Caylloma_Huanca","LUGAR_COLEGIO_Arequipa_Caylloma_Ichupampa","LUGAR_COLEGIO_Arequipa_Caylloma_Lluta","LUGAR_COLEGIO_Arequipa_Caylloma_SanAntoniodeChuca",
"LUGAR_COLEGIO_Arequipa_Condesuyos_Andaray","LUGAR_COLEGIO_Arequipa_Condesuyos_Chuquibamba","LUGAR_COLEGIO_Arequipa_Condesuyos_Salamanca","LUGAR_COLEGIO_Arequipa_Condesuyos_Yanaquihua",
"LUGAR_COLEGIO_Arequipa_Islay_DeanValdivia","LUGAR_COLEGIO_Arequipa_Islay_Islay","LUGAR_COLEGIO_Arequipa_Islay_Mejia","LUGAR_COLEGIO_Arequipa_Islay_Mollendo",
"LUGAR_COLEGIO_Arequipa_LaUnión_Alca","LUGAR_COLEGIO_Arequipa_LaUnión_Charcana","LUGAR_COLEGIO_Arequipa_LaUnión_Huaynacotas","LUGAR_COLEGIO_Arequipa_LaUnión_Puyca","LUGAR_COLEGIO_Arequipa_LaUnión_Tauria",
"LUGAR_COLEGIO_Arequipa_LaUnión_Tomepampa","LUGAR_COLEGIO_Arequipa_LaUnión_Toro","LUGAR_COLEGIO_Ayacucho_Huamanga_Ayacucho","LUGAR_COLEGIO_Ayacucho_LaMar_SanMiguel",
"LUGAR_COLEGIO_Ayacucho_Lucanas_Chaviña","LUGAR_COLEGIO_Ayacucho_Lucanas_Puquio","LUGAR_COLEGIO_Ayacucho_PaucardelSaraSara_Pausa","LUGAR_COLEGIO_Cajamarca_Cajamarca_Cajamarca",
"LUGAR_COLEGIO_Cajamarca_Jaen_Jaen","LUGAR_COLEGIO_Callao_Callao_LaPunta","LUGAR_COLEGIO_Huancavelica_Huancavelica","LUGAR_COLEGIO_Huanuco_Ambo_Ambo","LUGAR_COLEGIO_Huanuco_DosdeMayo_LaUnión",
"LUGAR_COLEGIO_Huanuco_Huacaybamba_Huacaybamba","LUGAR_COLEGIO_Ica_Ica_Ica","LUGAR_COLEGIO_Junin_Chanchamayo_Chanchamayo","LUGAR_COLEGIO_Junin_Huancayo_Chilca",
"LUGAR_COLEGIO_Junin_Yauli_Marcapomacocha","LUGAR_COLEGIO_Lambayeque_Chiclayo_Chiclayo","LUGAR_COLEGIO_Lambayeque_Chiclayo_Eten","LUGAR_COLEGIO_Lambayeque_Chiclayo_EtenPuerto",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_JoseLeonardoOrtiz","LUGAR_COLEGIO_Lambayeque_Chiclayo_LaVictoria","LUGAR_COLEGIO_Lambayeque_Chiclayo_Lagunas","LUGAR_COLEGIO_Lambayeque_Chiclayo_Oyotún",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_Patapo","LUGAR_COLEGIO_Lambayeque_Chiclayo_Picsi","LUGAR_COLEGIO_Lambayeque_Chiclayo_Pimentel","LUGAR_COLEGIO_Lambayeque_Chiclayo_Pucala",
"LUGAR_COLEGIO_Lambayeque_Chiclayo_SantaRosa","LUGAR_COLEGIO_Loreto_Loreto_Parinari","LUGAR_COLEGIO_Loreto_Maynas_Iquitos","LUGAR_COLEGIO_MadredeDios_Manu_Huepetuhe",
"LUGAR_COLEGIO_MadredeDios_Tahuamanu_Iñapari","LUGAR_COLEGIO_MadredeDios_Tahuamanu_Tahuamanu","LUGAR_COLEGIO_MadredeDios_Tambopata_Tambopata",
"LUGAR_COLEGIO_Piura_Ayabaca_Paimas","LUGAR_COLEGIO_Piura_Huancabamba_Huancabamba","LUGAR_COLEGIO_Piura_Huancabamba_Huarmaca","LUGAR_COLEGIO_Piura_Huancabamba_Lalaquiz",
"LUGAR_COLEGIO_Piura_Huancabamba_SanMigueldeElFaique","LUGAR_COLEGIO_Piura_Morropón_BuenosAires","LUGAR_COLEGIO_Piura_Morropón_Chulucanas","LUGAR_COLEGIO_Piura_Morropón_SanJuandeBigote",
"LUGAR_COLEGIO_Piura_Paita_Paita","LUGAR_COLEGIO_Piura_Piura_ElTallan","LUGAR_COLEGIO_Piura_Piura_Piura","LUGAR_COLEGIO_Piura_Sechura_CristoNosValga",
"LUGAR_COLEGIO_Piura_Sullana_Sullana","LUGAR_COLEGIO_Piura_Talara_LosÓrganos","LUGAR_COLEGIO_Piura_Talara_Mancora","LUGAR_COLEGIO_Piura_Talara_Pariñas",
"LUGAR_COLEGIO_Puno_ElCollao_Ilave","LUGAR_COLEGIO_SanMartin_ElDorado_AguaBlanca","LUGAR_COLEGIO_SanMartin_Moyobamba_Moyobamba","LUGAR_COLEGIO_Tumbes_Tumbes_PampasHospital","LUGAR_COLEGIO_Tumbes_Tumbes_Tumbes",
"LUGAR_COLEGIO_Ucayali_CoronelPortillo_Calleria",

"MODALIDAD_INGRESO_ConveniosyOtros","MODALIDAD_INGRESO_CPU","MODALIDAD_INGRESO_DeportistasCalificados","MODALIDAD_INGRESO_Ordinario","MODALIDAD_INGRESO_PrimerosPuestos",
"MODALIDAD_INGRESO_Profesionales","MODALIDAD_INGRESO_TrasladosExternosNacionales",
"MODALIDAD_INGRESO_TrasladosInternos")

MODELO RAMDOM FOREST

##############################################################
################## MODELAMIENTO ESTADISTICO ##################
##############################################################

data<- cbind(
  as.data.frame(DataSetUpublicaFRMTO$DESERTOR),
  TT_SinOut_Anio_Ingreso,
  TT_SinOut_periodo_matricula,
  TT_SinOut_Edad,
  TT_SinOut_CREDS__APROBADOS,
  TT_SinOut_ASIGS__APROBADAS,
  TT_SinOut_ASIGS__DESAPROBADAS,
  TT_SinOut_ANO_EGRESO_COLEGIO,
  TT_SinOut_PRDO_HASTA_MATRICULA,
  TT_SinOut_ProbabDesercion,
  Datos_Dico_cat[,c(ListVar.Categ.Dico.seleccionados)])
colnames(data)[1] <- "DESERTOR"

#data <- cbind(DataSetUpublicaFRMTO[,ListVar.Continuas],Datos_Dico_cat)

# Selección de muestra de entrenamiento (60%) y de Validación (40%)
library(caret)

set.seed(696) 
#index   <- createDataPartition(data$DESERTOR, p=0.7, list=FALSE)
Tabla_FrecAcumuladas
index <- c(1:11511)## Se considera el registro 24541 por represetnar el 70% de los datos
Training <- data[ index, ]
Testing <- data[-index, ]

# Verificando que se mantenga la proporción original
round(prop.table(table(data$DESERTOR))*100,2)

   NO    SI 
93.45  6.55 
round(prop.table(table(Training$DESERTOR))*100,2)

   NO    SI 
93.56  6.44 
round(prop.table(table(Testing$DESERTOR))*100,2)

   NO    SI 
93.21  6.79 
#Balanceo de la data

#UnderSampling
set.seed(696)
under_train <- downSample(x = Training[,!(names(data) %in% c("DESERTOR"))], 
                          y = Training$DESERTOR,
                          yname="DESERTOR")
#Colocando la variable dependiente(objetivo) al inicio
tmp = under_train$DESERTOR
under_train$DESERTOR <- NULL
under_train <- cbind(tmp,under_train)
colnames(under_train)[1] <- "DESERTOR"
#--------------------------
table(Training$DESERTOR)

   NO    SI 
10770   741 
table(under_train$DESERTOR)

 NO  SI 
741 741 
# OverSampling
set.seed(696)
over_train <- upSample(x = Training[,!(names(data) %in% c("DESERTOR"))], 
                       y = Training$DESERTOR,
                       yname="DESERTOR")
#Colocando la variable dependiente al inicio
tmp = over_train$DESERTOR
over_train$DESERTOR <- NULL
over_train <- cbind(tmp,over_train)
colnames(over_train)[1] <- "DESERTOR"
#--------------------------
table(Training$DESERTOR)

   NO    SI 
10770   741 
table(over_train$DESERTOR)

   NO    SI 
10770 10770 
# SMOOTE
library(DMwR)
#Eliminamos la columna de identificación
#Training <- Training[,!(names(Training) %in% c("CodAlumno"))]
set.seed(696)
smote_train <- DMwR::SMOTE(DESERTOR ~ ., 
                     Training, 
                     perc.over = 540, 
                     k = 5, 
                     perc.under = 120) %>% as.data.frame()

table(Training$DESERTOR)

   NO    SI 
10770   741 
table(smote_train$DESERTOR)

  NO   SI 
4446 4446 
# No_deserta Si_Deserta
#     3676  198
#   19761   1656 
# perc.over  = 500   significa que va a adicionar 5 veces (500%) a la 
#                    clase minoritaria 1656 + 5*1656 = 9936
# perc.under = 120   significa que por cada caso adicionado (5*1656=8280) 
#                    escogerá el 120% (5*1656) = 9936 de la clase mayoritaria
# No_Fuga Si_Fuga 
#     678     678 


###############################################################################################################################
##############################  LIBRERIA BORUTA (Selecciones de Variables automatizada) ##########################################
###############################################################################################################################
boruta_output <- Boruta::Boruta(DESERTOR ~ .,
                                data =  data,
                                doTrace=2)
Computing permutation importance.. Progress: 75%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 77%. Estimated remaining time: 9 seconds.
Computing permutation importance.. Progress: 75%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 75%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 74%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 75%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 76%. Estimated remaining time: 9 seconds.
Computing permutation importance.. Progress: 74%. Estimated remaining time: 11 seconds.
Computing permutation importance.. Progress: 76%. Estimated remaining time: 9 seconds.
Computing permutation importance.. Progress: 76%. Estimated remaining time: 9 seconds.
Computing permutation importance.. Progress: 75%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 73%. Estimated remaining time: 11 seconds.
Computing permutation importance.. Progress: 75%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 76%. Estimated remaining time: 10 seconds.
Computing permutation importance.. Progress: 77%. Estimated remaining time: 9 seconds.
boruta_signif <- names(boruta_output$finalDecision[boruta_output$finalDecision %in% c("Confirmed", "Tentative")])  # collect Confirmed and Tentative variables
print(boruta_signif)  # significant variables
 [1] "TT_SinOut_Anio_Ingreso"                           
 [2] "TT_SinOut_periodo_matricula"                      
 [3] "TT_SinOut_Edad"                                   
 [4] "TT_SinOut_CREDS__APROBADOS"                       
 [5] "TT_SinOut_ASIGS__APROBADAS"                       
 [6] "TT_SinOut_ANO_EGRESO_COLEGIO"                     
 [7] "TT_SinOut_PRDO_HASTA_MATRICULA"                   
 [8] "TT_SinOut_ProbabDesercion"                        
 [9] "ESCUELA_CIENCIADELACOMPUTACION"                   
[10] "ESCUELA_INGENIERIAENTELECOMUNICACIONES"           
[11] "ESCUELA_INGENIERIAINDUSTRIAL"                     
[12] "ESCUELA_INGENIERIAMECANICA"                       
[13] "SEXO_F"                                           
[14] "LUGAR_NACIMIENTO_Huanuco_DosdeMayo"               
[15] "LUGAR_NACIMIENTO_Piura_Paita"                     
[16] "LUGAR_RESIDENCIA_AA_CerroColorado"                
[17] "TIPO_COLEGIO_Nacional"                            
[18] "TIPO_COLEGIO_Particular"                          
[19] "LUGAR_COLEGIO_Apurimac_Cotabambas_Haquira"        
[20] "LUGAR_COLEGIO_Arequipa_Arequipa_Arequipa"         
[21] "LUGAR_COLEGIO_Arequipa_Caylloma_SanAntoniodeChuca"
[22] "LUGAR_COLEGIO_Arequipa_Islay_Mollendo"            
[23] "LUGAR_COLEGIO_Tumbes_Tumbes_PampasHospital"       
[24] "MODALIDAD_INGRESO_CPU"                            
[25] "MODALIDAD_INGRESO_DeportistasCalificados"         
[26] "MODALIDAD_INGRESO_Ordinario"                      
[27] "MODALIDAD_INGRESO_PrimerosPuestos"                
[28] "MODALIDAD_INGRESO_TrasladosExternosNacionales"    
plot(boruta_output,
    cex.axis=.7,
    las=2,
    xlab="",
    main="Importancia de variables")  # plot variable importance

#DataModeloFinal <- boruta_signif #Data con variables finales a modelar


###########################################################
#  RANDOM FOREST CON CARET Y VALIDACIÓN CRUZADA REPETIDA  #
###########################################################

# Relación de parámetros a ajustar de un modelo
modelLookup(model='rf')
# Aplicando el modelo con Validación Cruzada Repetida 
ctrl <- trainControl(method="cv", number=2, repeats = 1)#repeatedcv

set.seed(696)
modelo_rf_smote <- train(DESERTOR ~ ., 
                   data = smote_train, 
                   method = "rf", 
                   trControl = ctrl, 
                   #tuneLength = 20,
                   metric="Accuracy")
modelo_rf_smote
Random Forest 

8892 samples
 221 predictor
   2 classes: 'NO', 'SI' 

No pre-processing
Resampling: Cross-Validated (2 fold) 
Summary of sample sizes: 4446, 4446 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
    2   0.8775304  0.7550607
  111   0.9300495  0.8600990
  221   0.9228520  0.8457040

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 111.
#plot(modelo_rf_smote)
varImp(modelo_rf_smote)
rf variable importance

  only 20 most important variables shown (out of 221)

                                                          Overall
TT_SinOut_ProbabDesercion                                 100.000
TT_SinOut_Anio_Ingreso                                     52.274
TT_SinOut_PRDO_HASTA_MATRICULA                             43.026
TT_SinOut_periodo_matricula                                36.117
LUGAR_COLEGIO_Arequipa_Arequipa_MarianoMelgar              28.964
TT_SinOut_CREDS__APROBADOS                                 27.553
TT_SinOut_ASIGS__APROBADAS                                 21.562
ESCUELA_INGENIERIADESISTEMAS                               18.479
LUGAR_RESIDENCIA_AA_Tiabaya                                17.269
LUGAR_RESIDENCIA_AA_MarianoMelgar                          12.828
LUGAR_COLEGIO_Arequipa_Condesuyos_Salamanca                12.504
TT_SinOut_ANO_EGRESO_COLEGIO                               11.761
TT_SinOut_Edad                                              8.753
LUGAR_COLEGIO_Arequipa_Arequipa_JoseLuisBustamanteyRivero   7.767
ESCUELA_INGENIERIAINDUSTRIAL                                5.863
TIPO_COLEGIO_Parroquial                                     4.460
TIPO_COLEGIO_Particular                                     4.095
ESCUELA_INGENIERIAMECANICA                                  3.375
MODALIDAD_INGRESO_Ordinario                                 2.806
ESCUELA_INGENIERIAELECTRONICA                               2.622
### Entrenamos 2 modelos adicionales con la data de UNDER y OVER
set.seed(696)
modelo_rf_under <- train(DESERTOR ~ ., data = under_train, method = "rf", trControl = ctrl, metric="Accuracy")
modelo_rf_over  <- train(DESERTOR ~ ., data = over_train, method = "rf", trControl = ctrl, metric="Accuracy")

Indicadores del Modelo

########################################
######## INDICADORES DEL MODELO ########
########################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbRf_smote <- predict(modelo_rf_smote,smote_train,type="prob") %>% as.data.frame()
colnames(ProbRf_smote) <- c("ProbRf_NO","ProbRf_SI")
head(ProbRf_smote,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredRf_Smote <- as.factor(ifelse(ProbRf_smote$ProbRf_SI >= 0.5, "SI", "NO")) 
levels(ClasePredRf_Smote) <- c("NO","SI")

#Data balanceada con la probabilidad y clase predicha
DataRf_smote_train <- cbind(smote_train,ProbRf_smote,ClasePredRf_Smote)

# Prediciendo la probabilidad en la muestra de entrenamiento desbalaceada
ProbRf_Training <- predict(modelo_rf_smote,Training,type="prob") %>% as.data.frame()
colnames(ProbRf_Training) <- c("ProbRf_NO","ProbRf_SI")
head(ProbRf_Training)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredRf_Training <- as.factor(ifelse(ProbRf_Training$ProbRf_SI >= 0.5, 1, 0)) 
levels(ClasePredRf_Training) <- c("NO","SI")

#Data desbalanceada con la probabilidad y clase predicha
DataRf_Training <- cbind(Training,ProbRf_Training,ClasePredRf_Training)


##########################
# Tabla de clasificación #
##########################


# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Rf_Smote <- mean(ClasePredRf_Smote==smote_train$DESERTOR)
Accuracy_Rf_Smote
[1] 1
# Calcular el % de acierto (accuracy) en la muestra desbalanceada
Accuracy_Rf_Train <- mean(ClasePredRf_Training==Training$DESERTOR)
Accuracy_Rf_Train
[1] 0.9767179
# Calcular el error de mala clasificación en la muestra balanceada
Error_Rf_Smote <- mean(ClasePredRf_Smote!=smote_train$DESERTOR)
Error_Rf_Smote 
[1] 0
# Calcular el error de mala clasificación en la muestra desbalanceada
Error_Rf_Train <- mean(ClasePredRf_Training!=Training$DESERTOR)
Error_Rf_Train 
[1] 0.02328208
#Cruce de clase real y predicha en la muestra balanceada
library(gmodels)
CrossTable(smote_train$DESERTOR,ClasePredRf_Smote,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  8892 

 
                     | ClasePredRf_Smote 
smote_train$DESERTOR |        NO |        SI | Row Total | 
---------------------|-----------|-----------|-----------|
                  NO |      4446 |         0 |      4446 | 
                     |     1.000 |     0.000 |     0.500 | 
---------------------|-----------|-----------|-----------|
                  SI |         0 |      4446 |      4446 | 
                     |     0.000 |     1.000 |     0.500 | 
---------------------|-----------|-----------|-----------|
        Column Total |      4446 |      4446 |      8892 | 
---------------------|-----------|-----------|-----------|

 
#Cruce de clase real y predicha en la muestra desbalanceada
library(gmodels)
CrossTable(Training$DESERTOR,ClasePredRf_Training,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  11511 

 
                  | ClasePredRf_Training 
Training$DESERTOR |        NO |        SI | Row Total | 
------------------|-----------|-----------|-----------|
               NO |     10502 |       268 |     10770 | 
                  |     0.975 |     0.025 |     0.936 | 
------------------|-----------|-----------|-----------|
               SI |         0 |       741 |       741 | 
                  |     0.000 |     1.000 |     0.064 | 
------------------|-----------|-----------|-----------|
     Column Total |     10502 |      1009 |     11511 | 
------------------|-----------|-----------|-----------|

 
#Matriz de confusión
library(caret)
caret::confusionMatrix(ClasePredRf_Smote,smote_train$DESERTOR,positive="SI") #Muestra balanceada
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4446    0
        SI    0 4446
                                     
               Accuracy : 1          
                 95% CI : (0.9996, 1)
    No Information Rate : 0.5        
    P-Value [Acc > NIR] : < 2.2e-16  
                                     
                  Kappa : 1          
                                     
 Mcnemar's Test P-Value : NA         
                                     
            Sensitivity : 1.0        
            Specificity : 1.0        
         Pos Pred Value : 1.0        
         Neg Pred Value : 1.0        
             Prevalence : 0.5        
         Detection Rate : 0.5        
   Detection Prevalence : 0.5        
      Balanced Accuracy : 1.0        
                                     
       'Positive' Class : SI         
                                     
caret::confusionMatrix(ClasePredRf_Training,Training$DESERTOR,positive="SI") #Muestra desbalanceada
Confusion Matrix and Statistics

          Reference
Prediction    NO    SI
        NO 10502     0
        SI   268   741
                                          
               Accuracy : 0.9767          
                 95% CI : (0.9738, 0.9794)
    No Information Rate : 0.9356          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.8346          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 1.00000         
            Specificity : 0.97512         
         Pos Pred Value : 0.73439         
         Neg Pred Value : 1.00000         
             Prevalence : 0.06437         
         Detection Rate : 0.06437         
   Detection Prevalence : 0.08766         
      Balanced Accuracy : 0.98756         
                                          
       'Positive' Class : SI              
                                          
#CURVAS DE ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Rf_Smote <- colAUC(ProbRf_smote$ProbRf_SI,smote_train$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 

AUC_Rf_Train <- colAUC(ProbRf_Training$ProbRf_SI,Training$DESERTOR,plotROC = TRUE) #Muestra desbalanceada

#abline(0, 1,col="red") 


AUC_Rf_Smote #Devuelve el área bajo la curva en la muestra balanceada
          [,1]
NO vs. SI    1
AUC_Rf_Train #Devuelve el área bajo la curva en la muestra desbalanceada
              [,1]
NO vs. SI 0.995095
#CURVAS DE ROC
# Usando el paquete pROC
library(pROC)

# Área bajo la curva
roc_modelo_rf_smote <- roc(smote_train$DESERTOR,ProbRf_smote$ProbRf_SI)
roc_modelo_rf_smote

Call:
roc.default(response = smote_train$DESERTOR, predictor = ProbRf_smote$ProbRf_SI)

Data: ProbRf_smote$ProbRf_SI in 4446 controls (smote_train$DESERTOR NO) < 4446 cases (smote_train$DESERTOR SI).
Area under the curve: 1
roc_modelo_rf_train <- roc(Training$DESERTOR,ProbRf_Training$ProbRf_SI)
roc_modelo_rf_train

Call:
roc.default(response = Training$DESERTOR, predictor = ProbRf_Training$ProbRf_SI)

Data: ProbRf_Training$ProbRf_SI in 10770 controls (Training$DESERTOR NO) < 741 cases (Training$DESERTOR SI).
Area under the curve: 0.9951
#Puntos de corte muestra balanceada
PtosCorte_Smote <- data.frame(prob1=roc_modelo_rf_smote$thresholds,
                              sen1=roc_modelo_rf_smote$sensitivities,
                              esp1=roc_modelo_rf_smote$specificities)

#Puntos de corte muestra desbalanceada
PtosCorte_Train <- data.frame(prob2=roc_modelo_rf_train$thresholds,
                              sen2=roc_modelo_rf_train$sensitivities,
                              esp2=roc_modelo_rf_train$specificities)

# Punto de corte óptimo (mayor sensibilidad y especificidad) usando pROC
coords(roc_modelo_rf_smote, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
      0.483       1.000       1.000       1.000 
coords(roc_modelo_rf_train, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  0.6010000   0.9862581   0.9986505   0.9870559 
coords(roc_modelo_rf_smote, "best")
  threshold specificity sensitivity 
      0.483       1.000       1.000 
coords(roc_modelo_rf_train, "best")
  threshold specificity sensitivity 
  0.6010000   0.9862581   0.9986505 
plot(roc_modelo_rf_smote,print.thres=T)

plot(roc_modelo_rf_train,print.thres=T)

######################################
######## EVALUCION DE MODELOS ######## 
######################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbRf_Test <- predict(modelo_rf_smote,Testing,type="prob") %>% as.data.frame()
colnames(ProbRf_Test) <- c("ProbRf_NO","ProbRf_SI")
head(ProbRf_Test,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredRf_Test <- as.factor(ifelse(ProbRf_Test$ProbRf_SI >=   0.595 , 1, 0))
levels(ClasePredRf_Test) <- c("NO","SI")

head(cbind(Testing,ProbRf_Test,ClasePredRf_Test),8)
# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Rf_Test <- mean(ClasePredRf_Test==Testing$DESERTOR)
Accuracy_Rf_Test
[1] 0.4977302
#Matriz de confusión ... vamos a sacar las matrices para muestras de smote, under y over
library(caret)
cm_rf_smote <- caret::confusionMatrix(ClasePredRf_Test,Testing$DESERTOR,positive="SI") #Muestra balanceada
cm_rf_smote
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 2549  182
        SI 2584  192
                                         
               Accuracy : 0.4977         
                 95% CI : (0.4844, 0.511)
    No Information Rate : 0.9321         
    P-Value [Acc > NIR] : 1              
                                         
                  Kappa : 0.0025         
                                         
 Mcnemar's Test P-Value : <2e-16         
                                         
            Sensitivity : 0.51337        
            Specificity : 0.49659        
         Pos Pred Value : 0.06916        
         Neg Pred Value : 0.93336        
             Prevalence : 0.06791        
         Detection Rate : 0.03486        
   Detection Prevalence : 0.50409        
      Balanced Accuracy : 0.50498        
                                         
       'Positive' Class : SI             
                                         
cm_rf_under <- caret::confusionMatrix(predict(modelo_rf_under,Testing)
                                      ,Testing$DESERTOR,positive="SI") #Muestra under
cm_rf_under
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 3995  105
        SI 1138  269
                                         
               Accuracy : 0.7743         
                 95% CI : (0.763, 0.7853)
    No Information Rate : 0.9321         
    P-Value [Acc > NIR] : 1              
                                         
                  Kappa : 0.2182         
                                         
 Mcnemar's Test P-Value : <2e-16         
                                         
            Sensitivity : 0.71925        
            Specificity : 0.77830        
         Pos Pred Value : 0.19119        
         Neg Pred Value : 0.97439        
             Prevalence : 0.06791        
         Detection Rate : 0.04885        
   Detection Prevalence : 0.25549        
      Balanced Accuracy : 0.74877        
                                         
       'Positive' Class : SI             
                                         
cm_rf_over <- caret::confusionMatrix(predict(modelo_rf_under,Testing)
                                      ,Testing$DESERTOR,positive="SI") #Muestra over
cm_rf_over
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 3995  105
        SI 1138  269
                                         
               Accuracy : 0.7743         
                 95% CI : (0.763, 0.7853)
    No Information Rate : 0.9321         
    P-Value [Acc > NIR] : 1              
                                         
                  Kappa : 0.2182         
                                         
 Mcnemar's Test P-Value : <2e-16         
                                         
            Sensitivity : 0.71925        
            Specificity : 0.77830        
         Pos Pred Value : 0.19119        
         Neg Pred Value : 0.97439        
             Prevalence : 0.06791        
         Detection Rate : 0.04885        
   Detection Prevalence : 0.25549        
      Balanced Accuracy : 0.74877        
                                         
       'Positive' Class : SI             
                                         
# Calculando el estadístico KS
library(InformationValue)
ks_stat(Testing$DESERTOR,ProbRf_Test$ProbRf_SI,returnKSTable = T)
ks_stat(Testing$DESERTOR,ProbRf_Test$ProbRf_SI)
[1] 0.1866
# Graficando el estadístico KS 
ks_plot(Testing$DESERTOR,ProbRf_Test$ProbRf_SI)

#Curvas de ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Rf_Test <- colAUC(ProbRf_Test$ProbRf_SI,Testing$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 
AUC_Rf_Test
               [,1]
NO vs. SI 0.5930206
#Coeficiente de Gini
gini_test <-  2*AUC_Rf_Test -1 ; gini_test
               [,1]
NO vs. SI 0.1860411

RAMDOM FOREST II

#####################################################################################################



###########################################################
#  RAMDOM FOREST OWN   #
###########################################################


library(caret)
library(randomForest)

set.seed(696)
modelo_RF_own_smote <- randomForest(DESERTOR ~ ., 
                        data = smote_train,
                    ntree = 500,
                    keep.forest = TRUE)
set.seed(696)
modelo_RF_own_under <- randomForest(DESERTOR ~ ., data = under_train, ntree = 1000, keep.forest = TRUE)
modelo_RF_own_over  <- randomForest(DESERTOR ~ ., data = over_train, ntree = 500, keep.forest = TRUE)

summary(modelo_RF_own_smote)
                Length Class  Mode     
call                5  -none- call     
type                1  -none- character
predicted        8892  factor numeric  
err.rate         1500  -none- numeric  
confusion           6  -none- numeric  
votes           17784  matrix numeric  
oob.times        8892  -none- numeric  
classes             2  -none- character
importance        221  -none- numeric  
importanceSD        0  -none- NULL     
localImportance     0  -none- NULL     
proximity           0  -none- NULL     
ntree               1  -none- numeric  
mtry                1  -none- numeric  
forest             14  -none- list     
y                8892  factor numeric  
test                0  -none- NULL     
inbag               0  -none- NULL     
terms               3  terms  call     
############

#pred <- predict(modelo_RF_own_smote, Testing, type = "class")
#tab <- table(Testing[,"DESERTOR"], pred, dnn= c("Actual", "Predicho"))
#caret::confusionMatrix(tab,positive="SI")

# library(ROCR)
# probs <- predict(modelo_RF_own_smote, Testing, type = "prob")
# head(probs)
# pred <- prediction(probs[,2], Testing[,"DESERTOR"])
# perf <- performance(pred, "tpr", "fpr")
# perf



########################################
######## INDICADORES DEL MODELO ########
########################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbRFO_smote <- predict(modelo_RF_own_smote,smote_train,type="prob") %>% as.data.frame()
colnames(ProbRFO_smote) <- c("ProbNb_NO","ProbNb_SI")
head(ProbRFO_smote,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredRFo_Smote <- as.factor(ifelse(ProbRFO_smote$ProbNb_SI >= 0.5, "SI", "NO")) 
levels(ClasePredRFo_Smote) <- c("NO","SI")

#Data balanceada con la probabilidad y clase predicha
DataRFo_smote_train <- cbind(smote_train,ProbRFO_smote,ClasePredRFo_Smote)

# Prediciendo la probabilidad en la muestra de entrenamiento desbalaceada
ProbRFo_Training <- predict(modelo_RF_own_smote,Training,type="prob") %>% as.data.frame()
colnames(ProbRFo_Training) <- c("ProbNb_NO","ProbNb_SI")
head(ProbRFo_Training)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredRFo_Training <- as.factor(ifelse(ProbRFo_Training$ProbNb_SI >= 0.5, 1, 0))
levels(ClasePredRFo_Training) <- c("NO","SI")

#Data desbalanceada con la probabilidad y clase predicha
DataNb_Training <- cbind(Training,ProbRFo_Training,ClasePredRFo_Training)


##########################
# Tabla de clasificación #
##########################


# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_RFo_Smote <- mean(ClasePredRFo_Smote==smote_train$DESERTOR)
Accuracy_RFo_Smote
[1] 0.9594017
# Calcular el % de acierto (accuracy) en la muestra desbalanceada
Accuracy_RFo_Train <- mean(ClasePredRFo_Training==Training$DESERTOR)
Accuracy_RFo_Train
[1] 0.9631657
# Calcular el error de mala clasificación en la muestra balanceada
Error_RFo_Smote <- mean(ClasePredRFo_Smote!=smote_train$DESERTOR)
Error_RFo_Smote 
[1] 0.04059829
# Calcular el error de mala clasificación en la muestra desbalanceada
Error_RFo_Train <- mean(ClasePredRFo_Training!=Training$DESERTOR)
Error_RFo_Train 
[1] 0.03683433
#Cruce de clase real y predicha en la muestra balanceada
library(gmodels)
CrossTable(smote_train$DESERTOR,ClasePredRFo_Smote,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  8892 

 
                     | ClasePredRFo_Smote 
smote_train$DESERTOR |        NO |        SI | Row Total | 
---------------------|-----------|-----------|-----------|
                  NO |      4444 |         2 |      4446 | 
                     |     1.000 |     0.000 |     0.500 | 
---------------------|-----------|-----------|-----------|
                  SI |       359 |      4087 |      4446 | 
                     |     0.081 |     0.919 |     0.500 | 
---------------------|-----------|-----------|-----------|
        Column Total |      4803 |      4089 |      8892 | 
---------------------|-----------|-----------|-----------|

 
#Cruce de clase real y predicha en la muestra desbalanceada
library(gmodels)
CrossTable(Training$DESERTOR,ClasePredRFo_Training,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  11511 

 
                  | ClasePredRFo_Training 
Training$DESERTOR |        NO |        SI | Row Total | 
------------------|-----------|-----------|-----------|
               NO |     10705 |        65 |     10770 | 
                  |     0.994 |     0.006 |     0.936 | 
------------------|-----------|-----------|-----------|
               SI |       359 |       382 |       741 | 
                  |     0.484 |     0.516 |     0.064 | 
------------------|-----------|-----------|-----------|
     Column Total |     11064 |       447 |     11511 | 
------------------|-----------|-----------|-----------|

 
#Matriz de confusión
library(caret)
caret::confusionMatrix(ClasePredRFo_Smote,smote_train$DESERTOR,positive="SI") #Muestra balanceada
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4444  359
        SI    2 4087
                                          
               Accuracy : 0.9594          
                 95% CI : (0.9551, 0.9634)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9188          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.9193          
            Specificity : 0.9996          
         Pos Pred Value : 0.9995          
         Neg Pred Value : 0.9253          
             Prevalence : 0.5000          
         Detection Rate : 0.4596          
   Detection Prevalence : 0.4599          
      Balanced Accuracy : 0.9594          
                                          
       'Positive' Class : SI              
                                          
caret::confusionMatrix(ClasePredRFo_Training,Training$DESERTOR,positive="SI") #Muestra desbalanceada
Confusion Matrix and Statistics

          Reference
Prediction    NO    SI
        NO 10705   359
        SI    65   382
                                          
               Accuracy : 0.9632          
                 95% CI : (0.9596, 0.9665)
    No Information Rate : 0.9356          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.6249          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.51552         
            Specificity : 0.99396         
         Pos Pred Value : 0.85459         
         Neg Pred Value : 0.96755         
             Prevalence : 0.06437         
         Detection Rate : 0.03319         
   Detection Prevalence : 0.03883         
      Balanced Accuracy : 0.75474         
                                          
       'Positive' Class : SI              
                                          
#CURVAS DE ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Nb_Smote <- colAUC(ProbRFO_smote$ProbNb_SI,smote_train$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 

AUC_Nb_Train <- colAUC(ProbRFo_Training$ProbNb_SI,Training$DESERTOR,plotROC = TRUE) #Muestra desbalanceada

#abline(0, 1,col="red") 


AUC_Nb_Smote #Devuelve el área bajo la curva en la muestra balanceada
               [,1]
NO vs. SI 0.9993734
AUC_Nb_Train #Devuelve el área bajo la curva en la muestra desbalanceada
               [,1]
NO vs. SI 0.9857357
#CURVAS DE ROC
# Usando el paquete pROC
library(pROC)

# Área bajo la curva
roc_modelo_RF_own_smote <- roc(smote_train$DESERTOR,ProbRFO_smote$ProbNb_SI)
roc_modelo_RF_own_smote

Call:
roc.default(response = smote_train$DESERTOR, predictor = ProbRFO_smote$ProbNb_SI)

Data: ProbRFO_smote$ProbNb_SI in 4446 controls (smote_train$DESERTOR NO) < 4446 cases (smote_train$DESERTOR SI).
Area under the curve: 0.9994
roc_modelo_RF_own_train <- roc(Training$DESERTOR,ProbRFo_Training$ProbNb_SI)
roc_modelo_RF_own_train

Call:
roc.default(response = Training$DESERTOR, predictor = ProbRFo_Training$ProbNb_SI)

Data: ProbRFo_Training$ProbNb_SI in 10770 controls (Training$DESERTOR NO) < 741 cases (Training$DESERTOR SI).
Area under the curve: 0.9857
#Puntos de corte muestra balanceada
PtosCorte_Smote <- data.frame(prob1=roc_modelo_RF_own_smote$thresholds,
                              sen1=roc_modelo_RF_own_smote$sensitivities,
                              esp1=roc_modelo_RF_own_smote$specificities)

#Puntos de corte muestra desbalanceada
PtosCorte_Train <- data.frame(prob2=roc_modelo_RF_own_train$thresholds,
                              sen2=roc_modelo_RF_own_train$sensitivities,
                              esp2=roc_modelo_RF_own_train$specificities)

# Punto de corte óptimo (mayor sensibilidad y especificidad) usando pROC
coords(roc_modelo_RF_own_smote, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  0.2810000   0.9849303   0.9887539   0.9868421 
coords(roc_modelo_RF_own_train, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  0.2550000   0.9409471   0.9581646   0.9420554 
coords(roc_modelo_RF_own_smote, "best")
  threshold specificity sensitivity 
  0.2810000   0.9849303   0.9887539 
coords(roc_modelo_RF_own_train, "best")
  threshold specificity sensitivity 
  0.2550000   0.9409471   0.9581646 
plot(roc_modelo_RF_own_smote,print.thres=T)

plot(roc_modelo_RF_own_train,print.thres=T)

######################################
######## EVALUCION DE MODELOS ######## 
######################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbRFo_Test <- predict(modelo_RF_own_smote,Testing,type="prob") %>% as.data.frame()
colnames(ProbRFo_Test) <- c("ProbNb_NO","ProbNb_SI")
head(ProbRFo_Test,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredRFo_Test <- as.factor(ifelse(ProbRFo_Test$ProbNb_SI >= 0.437, 1, 0))
levels(ClasePredRFo_Test) <- c("NO","SI")

head(cbind(Testing,ProbRFo_Test,ClasePredRFo_Test),8)
# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Nb_Test <- mean(ClasePredRFo_Test==Testing$DESERTOR)
Accuracy_Nb_Test
[1] 0.8974033
#Matriz de confusión
library(caret)
cm_RF_own_smote<- caret::confusionMatrix(ClasePredRFo_Test,Testing$DESERTOR,positive="SI") #Muestra balanceada
cm_RF_own_smote
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4856  288
        SI  277   86
                                          
               Accuracy : 0.8974          
                 95% CI : (0.8891, 0.9053)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1.000           
                                          
                  Kappa : 0.1784          
                                          
 Mcnemar's Test P-Value : 0.674           
                                          
            Sensitivity : 0.22995         
            Specificity : 0.94604         
         Pos Pred Value : 0.23691         
         Neg Pred Value : 0.94401         
             Prevalence : 0.06791         
         Detection Rate : 0.01562         
   Detection Prevalence : 0.06592         
      Balanced Accuracy : 0.58799         
                                          
       'Positive' Class : SI              
                                          
cm_RF_own_under<- caret::confusionMatrix(predict(modelo_RF_own_under,Testing)
                                         ,Testing$DESERTOR,positive="SI") #Muestra under
cm_RF_own_under
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 3736  111
        SI 1397  263
                                          
               Accuracy : 0.7262          
                 95% CI : (0.7142, 0.7379)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.1662          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.70321         
            Specificity : 0.72784         
         Pos Pred Value : 0.15843         
         Neg Pred Value : 0.97115         
             Prevalence : 0.06791         
         Detection Rate : 0.04776         
   Detection Prevalence : 0.30143         
      Balanced Accuracy : 0.71552         
                                          
       'Positive' Class : SI              
                                          
cm_RF_own_over<- caret::confusionMatrix(predict(modelo_RF_own_over,Testing)
                                         ,Testing$DESERTOR,positive="SI") #Muestra over
cm_RF_own_over
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4797  233
        SI  336  141
                                          
               Accuracy : 0.8967          
                 95% CI : (0.8883, 0.9046)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.2763          
                                          
 Mcnemar's Test P-Value : 1.902e-05       
                                          
            Sensitivity : 0.37701         
            Specificity : 0.93454         
         Pos Pred Value : 0.29560         
         Neg Pred Value : 0.95368         
             Prevalence : 0.06791         
         Detection Rate : 0.02560         
   Detection Prevalence : 0.08662         
      Balanced Accuracy : 0.65577         
                                          
       'Positive' Class : SI              
                                          
# Calculando el estadístico KS
library(InformationValue)
ks_stat(Testing$DESERTOR,ProbRFo_Test$ProbNb_SI,returnKSTable = T)
ks_stat(Testing$DESERTOR,ProbRFo_Test$ProbNb_SI)
[1] 0.2672
# Graficando el estadístico KS 
ks_plot(Testing$DESERTOR,ProbRFo_Test$ProbNb_SI)

#Curvas de ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Nb_Test <- colAUC(ProbRFo_Test$ProbNb_SI,Testing$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 
AUC_Nb_Test
               [,1]
NO vs. SI 0.6754533
#Coeficiente de Gini
gini_test <-  2*AUC_Nb_Test -1 ; gini_test
               [,1]
NO vs. SI 0.3509065
#####################################################################################################

NAIVE BAYES

#####################################################################################################



###########################################################
#  NAIBBY BAYES CON CARET    #
###########################################################


library(e1071)
set.seed(696)
modelo_Nb_smote <- naiveBayes(DESERTOR ~ ., 
                        data = smote_train,
                        probability = TRUE)
modelo_Nb_under <- naiveBayes(DESERTOR ~ ., data = under_train)
modelo_Nb_over  <- naiveBayes(DESERTOR ~ ., data = over_train)

summary(modelo_Nb_smote)
          Length Class  Mode     
apriori     2    table  numeric  
tables    221    -none- list     
levels      2    -none- character
isnumeric 221    -none- logical  
call        5    -none- call     
########################################
######## INDICADORES DEL MODELO ########
########################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbNb_smote <- predict(modelo_Nb_smote,smote_train,type="raw") %>% as.data.frame()
colnames(ProbNb_smote) <- c("ProbNb_NO","ProbNb_SI")
head(ProbNb_smote,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredNb_Smote <- as.factor(ifelse(ProbNb_smote$ProbNb_SI >= 0.5, "SI", "NO")) 
levels(ClasePredNb_Smote) <- c("NO","SI")

#Data balanceada con la probabilidad y clase predicha
DataNb_smote_train <- cbind(smote_train,ProbNb_smote,ClasePredNb_Smote)

# Prediciendo la probabilidad en la muestra de entrenamiento desbalaceada
ProbNb_Training <- predict(modelo_Nb_smote,Training,type="raw") %>% as.data.frame()
colnames(ProbNb_Training) <- c("ProbNb_NO","ProbNb_SI")
head(ProbNb_Training)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredNb_Training <- as.factor(ifelse(ProbNb_Training$ProbNb_SI >= 0.5, 1, 0))
levels(ClasePredNb_Training) <- c("NO","SI")

#Data desbalanceada con la probabilidad y clase predicha
DataNb_Training <- cbind(Training,ProbNb_Training,ClasePredNb_Training)


##########################
# Tabla de clasificación #
##########################


# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Nb_Smote <- mean(ClasePredNb_Smote==smote_train$DESERTOR)
Accuracy_Nb_Smote
[1] 0.5372245
# Calcular el % de acierto (accuracy) en la muestra desbalanceada
Accuracy_Nb_Train <- mean(ClasePredNb_Training==Training$DESERTOR)
Accuracy_Nb_Train
[1] 0.1600208
# Calcular el error de mala clasificación en la muestra balanceada
Error_Nb_Smote <- mean(ClasePredNb_Smote!=smote_train$DESERTOR)
Error_Nb_Smote 
[1] 0.4627755
# Calcular el error de mala clasificación en la muestra desbalanceada
Error_Nb_Train <- mean(ClasePredNb_Training!=Training$DESERTOR)
Error_Nb_Train 
[1] 0.8399792
#Cruce de clase real y predicha en la muestra balanceada
library(gmodels)
CrossTable(smote_train$DESERTOR,ClasePredNb_Smote,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  8892 

 
                     | ClasePredNb_Smote 
smote_train$DESERTOR |        NO |        SI | Row Total | 
---------------------|-----------|-----------|-----------|
                  NO |       497 |      3949 |      4446 | 
                     |     0.112 |     0.888 |     0.500 | 
---------------------|-----------|-----------|-----------|
                  SI |       166 |      4280 |      4446 | 
                     |     0.037 |     0.963 |     0.500 | 
---------------------|-----------|-----------|-----------|
        Column Total |       663 |      8229 |      8892 | 
---------------------|-----------|-----------|-----------|

 
#Cruce de clase real y predicha en la muestra desbalanceada
library(gmodels)
CrossTable(Training$DESERTOR,ClasePredNb_Training,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  11511 

 
                  | ClasePredNb_Training 
Training$DESERTOR |        NO |        SI | Row Total | 
------------------|-----------|-----------|-----------|
               NO |      1161 |      9609 |     10770 | 
                  |     0.108 |     0.892 |     0.936 | 
------------------|-----------|-----------|-----------|
               SI |        60 |       681 |       741 | 
                  |     0.081 |     0.919 |     0.064 | 
------------------|-----------|-----------|-----------|
     Column Total |      1221 |     10290 |     11511 | 
------------------|-----------|-----------|-----------|

 
#Matriz de confusión
library(caret)
caret::confusionMatrix(ClasePredNb_Smote,smote_train$DESERTOR,positive="SI") #Muestra balanceada
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO  497  166
        SI 3949 4280
                                          
               Accuracy : 0.5372          
                 95% CI : (0.5268, 0.5476)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : 1.167e-12       
                                          
                  Kappa : 0.0744          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.9627          
            Specificity : 0.1118          
         Pos Pred Value : 0.5201          
         Neg Pred Value : 0.7496          
             Prevalence : 0.5000          
         Detection Rate : 0.4813          
   Detection Prevalence : 0.9254          
      Balanced Accuracy : 0.5372          
                                          
       'Positive' Class : SI              
                                          
caret::confusionMatrix(ClasePredNb_Training,Training$DESERTOR,positive="SI") #Muestra desbalanceada
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 1161   60
        SI 9609  681
                                          
               Accuracy : 0.16            
                 95% CI : (0.1534, 0.1668)
    No Information Rate : 0.9356          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.0038          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.91903         
            Specificity : 0.10780         
         Pos Pred Value : 0.06618         
         Neg Pred Value : 0.95086         
             Prevalence : 0.06437         
         Detection Rate : 0.05916         
   Detection Prevalence : 0.89393         
      Balanced Accuracy : 0.51341         
                                          
       'Positive' Class : SI              
                                          
#CURVAS DE ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Nb_Smote <- colAUC(ProbNb_smote$ProbNb_SI,smote_train$DESERTOR,plotROC = TRUE) #Muestra balanceada
abline(0, 1,col="red") 

AUC_Nb_Train <- colAUC(ProbNb_Training$ProbNb_SI,Training$DESERTOR,plotROC = TRUE) #Muestra desbalanceada
abline(0, 1,col="red") 

AUC_Nb_Smote #Devuelve el área bajo la curva en la muestra balanceada
               [,1]
NO vs. SI 0.5417514
AUC_Nb_Train #Devuelve el área bajo la curva en la muestra desbalanceada
               [,1]
NO vs. SI 0.5166035
#CURVAS DE ROC
# Usando el paquete pROC
library(pROC)

# Área bajo la curva
roc_modelo_Nb_smote <- roc(smote_train$DESERTOR,ProbNb_smote$ProbNb_SI)
roc_modelo_Nb_smote

Call:
roc.default(response = smote_train$DESERTOR, predictor = ProbNb_smote$ProbNb_SI)

Data: ProbNb_smote$ProbNb_SI in 4446 controls (smote_train$DESERTOR NO) < 4446 cases (smote_train$DESERTOR SI).
Area under the curve: 0.5418
roc_modelo_Nb_train <- roc(Training$DESERTOR,ProbNb_Training$ProbNb_SI)
roc_modelo_Nb_train

Call:
roc.default(response = Training$DESERTOR, predictor = ProbNb_Training$ProbNb_SI)

Data: ProbNb_Training$ProbNb_SI in 10770 controls (Training$DESERTOR NO) < 741 cases (Training$DESERTOR SI).
Area under the curve: 0.5166
#Puntos de corte muestra balanceada
PtosCorte_Smote <- data.frame(prob1=roc_modelo_Nb_smote$thresholds,
                              sen1=roc_modelo_Nb_smote$sensitivities,
                              esp1=roc_modelo_Nb_smote$specificities)

#Puntos de corte muestra desbalanceada
PtosCorte_Train <- data.frame(prob2=roc_modelo_Nb_train$thresholds,
                              sen2=roc_modelo_Nb_train$sensitivities,
                              esp2=roc_modelo_Nb_train$specificities)

# Punto de corte óptimo (mayor sensibilidad y especificidad) usando pROC
coords(roc_modelo_Nb_smote, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  1.0000000   0.1311291   0.9516419   0.5413855 
coords(roc_modelo_Nb_train, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
   threshold  specificity  sensitivity     accuracy 
4.500366e-08 9.721448e-02 9.352227e-01 1.511598e-01 
coords(roc_modelo_Nb_smote, "best")
  threshold specificity sensitivity 
  1.0000000   0.1311291   0.9516419 
coords(roc_modelo_Nb_train, "best")
   threshold  specificity  sensitivity 
4.500366e-08 9.721448e-02 9.352227e-01 
plot(roc_modelo_Nb_smote,print.thres=T)

plot(roc_modelo_Nb_train,print.thres=T)

######################################
######## EVALUCION DE MODELOS ######## 
######################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbNb_Test <- predict(modelo_Nb_smote,Testing,type="raw") %>% as.data.frame()
colnames(ProbNb_Test) <- c("ProbNb_NO","ProbNb_SI")
head(ProbNb_Test,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredNb_Test <- as.factor(ifelse(ProbNb_Test$ProbNb_SI >= 0.5, 1, 0))
levels(ClasePredNb_Test) <- c("NO","SI")

head(cbind(Testing,ProbNb_Test,ClasePredNb_Test),8)
# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Nb_Test <- mean(ClasePredNb_Test==Testing$DESERTOR)
Accuracy_Nb_Test
[1] 0.1450881
#Matriz de confusión
library(caret)
cm_Nb_smote<- caret::confusionMatrix(ClasePredNb_Test,Testing$DESERTOR,positive="SI") #Muestra balanceada
cm_Nb_smote
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO  454   29
        SI 4679  345
                                          
               Accuracy : 0.1451          
                 95% CI : (0.1359, 0.1547)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.0016          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.92246         
            Specificity : 0.08845         
         Pos Pred Value : 0.06867         
         Neg Pred Value : 0.93996         
             Prevalence : 0.06791         
         Detection Rate : 0.06265         
   Detection Prevalence : 0.91229         
      Balanced Accuracy : 0.50545         
                                          
       'Positive' Class : SI              
                                          
cm_Nb_under<- caret::confusionMatrix(predict(modelo_Nb_under,Testing),Testing$DESERTOR,positive="SI") #Muestra under
cm_Nb_under
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4844  350
        SI  289   24
                                          
               Accuracy : 0.884           
                 95% CI : (0.8752, 0.8923)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1.00000         
                                          
                  Kappa : 0.0085          
                                          
 Mcnemar's Test P-Value : 0.01762         
                                          
            Sensitivity : 0.064171        
            Specificity : 0.943698        
         Pos Pred Value : 0.076677        
         Neg Pred Value : 0.932615        
             Prevalence : 0.067914        
         Detection Rate : 0.004358        
   Detection Prevalence : 0.056837        
      Balanced Accuracy : 0.503934        
                                          
       'Positive' Class : SI              
                                          
cm_Nb_over<- caret::confusionMatrix(predict(modelo_Nb_over,Testing),Testing$DESERTOR,positive="SI") #Muestra Over
cm_Nb_over
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO  157    7
        SI 4976  367
                                          
               Accuracy : 0.0952          
                 95% CI : (0.0875, 0.1032)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.0017          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.98128         
            Specificity : 0.03059         
         Pos Pred Value : 0.06869         
         Neg Pred Value : 0.95732         
             Prevalence : 0.06791         
         Detection Rate : 0.06664         
   Detection Prevalence : 0.97022         
      Balanced Accuracy : 0.50593         
                                          
       'Positive' Class : SI              
                                          
# Calculando el estadístico KS
library(InformationValue)
ks_stat(Testing$DESERTOR,ProbNb_Test$ProbNb_SI,returnKSTable = T)
ks_stat(Testing$DESERTOR,ProbNb_Test$ProbNb_SI)
[1] 0.015
# Graficando el estadístico KS 
ks_plot(Testing$DESERTOR,ProbNb_Test$ProbNb_SI)

#Curvas de ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Nb_Test <- colAUC(ProbNb_Test$ProbNb_SI,Testing$DESERTOR,plotROC = TRUE) #Muestra balanceada
abline(0, 1,col="red") 

AUC_Nb_Test
               [,1]
NO vs. SI 0.5026761
#Coeficiente de Gini
gini_test <-  2*AUC_Nb_Test -1 ; gini_test
                 [,1]
NO vs. SI 0.005352282
#####################################################################################################

ARBOLES DE DECISIÓN - BAGGING

#####################################################################################################



####################################################
#  BAGGING CON CARET Y VALIDACIÓN CRUZADA REPETIDA #
####################################################

# Relación de parámetros a ajustar de un modelo
modelLookup(model='treebag')
# Aplicando el modelo con Validación Cruzada Repetida 
ctrl <- trainControl(method="cv", repeats = 1, number=2)#repeatedcv

set.seed(696)
modelo_TreeBagg_smote <- train(DESERTOR ~ ., 
                    data = smote_train, 
                    method = "treebag",
                    trControl = ctrl, 
                    #tuneLength = 20, 
                    metric="se")#Accuracy
modelo_TreeBagg_under <- caret::train(DESERTOR ~ ., data = under_train,method = "treebag",trControl = ctrl, 
                    #tuneLength = 20, 
                    metric="se")
modelo_TreeBagg_over <- caret::train(DESERTOR ~ ., data = over_train,method = "treebag",trControl = ctrl, 
                    #tuneLength = 20, 
                    metric="se")
modelo_TreeBagg_smote
Bagged CART 

8892 samples
 221 predictor
   2 classes: 'NO', 'SI' 

No pre-processing
Resampling: Cross-Validated (2 fold) 
Summary of sample sizes: 4446, 4446 
Resampling results:

  Accuracy   Kappa    
  0.9203779  0.8407557
#plot(modelo_TreeBagg_smote)
varImp(modelo_TreeBagg_smote)
treebag variable importance

  only 20 most important variables shown (out of 221)

                                                          Overall
TT_SinOut_Anio_Ingreso                                    100.000
TT_SinOut_ProbabDesercion                                  81.806
TT_SinOut_periodo_matricula                                74.737
LUGAR_COLEGIO_Arequipa_Arequipa_MarianoMelgar              54.161
TT_SinOut_ASIGS__APROBADAS                                 48.673
TT_SinOut_PRDO_HASTA_MATRICULA                             47.558
TT_SinOut_CREDS__APROBADOS                                 44.078
ESCUELA_INGENIERIADESISTEMAS                               40.653
LUGAR_COLEGIO_Arequipa_Condesuyos_Salamanca                24.471
TT_SinOut_ANO_EGRESO_COLEGIO                               20.614
LUGAR_RESIDENCIA_AA_MarianoMelgar                          19.487
TT_SinOut_Edad                                             19.023
LUGAR_RESIDENCIA_AA_Tiabaya                                16.393
TIPO_COLEGIO_Particular                                    15.584
LUGAR_COLEGIO_Arequipa_Arequipa_JoseLuisBustamanteyRivero  12.235
ESCUELA_INGENIERIAINDUSTRIAL                                9.960
ESCUELA_INGENIERIAMECANICA                                  9.626
LUGAR_COLEGIO_Arequipa_Arequipa_Arequipa                    5.705
TIPO_COLEGIO_Parroquial                                     5.319
MODALIDAD_INGRESO_Ordinario                                 4.176
########################################
######## INDICADORES DEL MODELO ########
########################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbBag_smote <- predict(modelo_TreeBagg_smote,smote_train,type="prob") %>% as.data.frame()
colnames(ProbBag_smote) <- c("ProbBag_NO","ProbBag_SI")
head(ProbBag_smote,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredBag_Smote <- as.factor(ifelse(ProbBag_smote$ProbBag_SI >= 0.5, "SI", "NO")) 
levels(ClasePredBag_Smote) <- c("NO","SI")

#Data balanceada con la probabilidad y clase predicha
DataBag_smote_train <- cbind(smote_train,ProbBag_smote,ClasePredBag_Smote)

# Prediciendo la probabilidad en la muestra de entrenamiento desbalaceada
ProbBag_Training <- predict(modelo_TreeBagg_smote,Training,type="prob") %>% as.data.frame()
colnames(ProbBag_Training) <- c("ProbBag_NO","ProbBag_SI")
head(ProbBag_Training)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredBag_Training <- as.factor(ifelse(ProbBag_Training$ProbBag_SI >= 0.5, 1, 0))
levels(ClasePredBag_Training) <- c("NO","SI")

#Data desbalanceada con la probabilidad y clase predicha
DataBag_Training <- cbind(Training,ProbBag_Training,ClasePredBag_Training)


##########################
# Tabla de clasificación #
##########################


# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Bag_Smote <- mean(ClasePredBag_Smote==smote_train$DESERTOR)
Accuracy_Bag_Smote
[1] 0.9988754
# Calcular el % de acierto (accuracy) en la muestra desbalanceada
Accuracy_Bag_Train <- mean(ClasePredBag_Training==Training$DESERTOR)
Accuracy_Bag_Train
[1] 0.9666406
# Calcular el error de mala clasificación en la muestra balanceada
Error_Bag_Smote <- mean(ClasePredBag_Smote!=smote_train$DESERTOR)
Error_Bag_Smote 
[1] 0.001124606
# Calcular el error de mala clasificación en la muestra desbalanceada
Error_Bag_Train <- mean(ClasePredBag_Training!=Training$DESERTOR)
Error_Bag_Train 
[1] 0.0333594
#Cruce de clase real y predicha en la muestra balanceada
library(gmodels)
CrossTable(smote_train$DESERTOR,ClasePredBag_Smote,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  8892 

 
                     | ClasePredBag_Smote 
smote_train$DESERTOR |        NO |        SI | Row Total | 
---------------------|-----------|-----------|-----------|
                  NO |      4443 |         3 |      4446 | 
                     |     0.999 |     0.001 |     0.500 | 
---------------------|-----------|-----------|-----------|
                  SI |         7 |      4439 |      4446 | 
                     |     0.002 |     0.998 |     0.500 | 
---------------------|-----------|-----------|-----------|
        Column Total |      4450 |      4442 |      8892 | 
---------------------|-----------|-----------|-----------|

 
#Cruce de clase real y predicha en la muestra desbalanceada
library(gmodels)
CrossTable(Training$DESERTOR,ClasePredBag_Training,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  11511 

 
                  | ClasePredBag_Training 
Training$DESERTOR |        NO |        SI | Row Total | 
------------------|-----------|-----------|-----------|
               NO |     10393 |       377 |     10770 | 
                  |     0.965 |     0.035 |     0.936 | 
------------------|-----------|-----------|-----------|
               SI |         7 |       734 |       741 | 
                  |     0.009 |     0.991 |     0.064 | 
------------------|-----------|-----------|-----------|
     Column Total |     10400 |      1111 |     11511 | 
------------------|-----------|-----------|-----------|

 
#Matriz de confusión
library(caret)
caret::confusionMatrix(ClasePredBag_Smote,smote_train$DESERTOR,positive="SI") #Muestra balanceada
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4443    7
        SI    3 4439
                                          
               Accuracy : 0.9989          
                 95% CI : (0.9979, 0.9995)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : <2e-16          
                                          
                  Kappa : 0.9978          
                                          
 Mcnemar's Test P-Value : 0.3428          
                                          
            Sensitivity : 0.9984          
            Specificity : 0.9993          
         Pos Pred Value : 0.9993          
         Neg Pred Value : 0.9984          
             Prevalence : 0.5000          
         Detection Rate : 0.4992          
   Detection Prevalence : 0.4996          
      Balanced Accuracy : 0.9989          
                                          
       'Positive' Class : SI              
                                          
caret::confusionMatrix(ClasePredBag_Training,Training$DESERTOR,positive="SI") #Muestra desbalanceada
Confusion Matrix and Statistics

          Reference
Prediction    NO    SI
        NO 10393     7
        SI   377   734
                                          
               Accuracy : 0.9666          
                 95% CI : (0.9632, 0.9698)
    No Information Rate : 0.9356          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.7753          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.99055         
            Specificity : 0.96500         
         Pos Pred Value : 0.66067         
         Neg Pred Value : 0.99933         
             Prevalence : 0.06437         
         Detection Rate : 0.06377         
   Detection Prevalence : 0.09652         
      Balanced Accuracy : 0.97777         
                                          
       'Positive' Class : SI              
                                          
#CURVAS DE ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Bag_Smote <- colAUC(ProbBag_smote$ProbBag_SI,smote_train$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 

AUC_Bag_Train <- colAUC(ProbBag_Training$ProbBag_SI,Training$DESERTOR,plotROC = TRUE) #Muestra desbalanceada

#abline(0, 1,col="red") 


AUC_Bag_Smote #Devuelve el área bajo la curva en la muestra balanceada
               [,1]
NO vs. SI 0.9999957
AUC_Bag_Train #Devuelve el área bajo la curva en la muestra desbalanceada
              [,1]
NO vs. SI 0.990725
#CURVAS DE ROC
# Usando el paquete pROC
library(pROC)

# Área bajo la curva
roc_modelo_bag_smote <- roc(smote_train$DESERTOR,ProbBag_smote$ProbBag_SI)
roc_modelo_bag_smote

Call:
roc.default(response = smote_train$DESERTOR, predictor = ProbBag_smote$ProbBag_SI)

Data: ProbBag_smote$ProbBag_SI in 4446 controls (smote_train$DESERTOR NO) < 4446 cases (smote_train$DESERTOR SI).
Area under the curve: 1
roc_modelo_bag_train <- roc(Training$DESERTOR,ProbBag_Training$ProbBag_SI)
roc_modelo_bag_train

Call:
roc.default(response = Training$DESERTOR, predictor = ProbBag_Training$ProbBag_SI)

Data: ProbBag_Training$ProbBag_SI in 10770 controls (Training$DESERTOR NO) < 741 cases (Training$DESERTOR SI).
Area under the curve: 0.9907
#Puntos de corte muestra balanceada
PtosCorte_Smote <- data.frame(prob1=roc_modelo_bag_smote$thresholds,
                              sen1=roc_modelo_bag_smote$sensitivities,
                              esp1=roc_modelo_bag_smote$specificities)

#Puntos de corte muestra desbalanceada
PtosCorte_Train <- data.frame(prob2=roc_modelo_bag_train$thresholds,
                              sen2=roc_modelo_bag_train$sensitivities,
                              esp2=roc_modelo_bag_train$specificities)

# Punto de corte óptimo (mayor sensibilidad y especificidad) usando pROC
coords(roc_modelo_bag_smote, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
                 best      best
threshold   0.4200000 0.4600000
specificity 0.9982006 0.9991003
sensitivity 0.9997751 0.9988754
accuracy    0.9989879 0.9989879
coords(roc_modelo_bag_train, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  0.5000000   0.9649954   0.9905533   0.9666406 
coords(roc_modelo_bag_smote, "best")
                 best      best
threshold   0.4200000 0.4600000
specificity 0.9982006 0.9991003
sensitivity 0.9997751 0.9988754
coords(roc_modelo_bag_train, "best")
  threshold specificity sensitivity 
  0.5000000   0.9649954   0.9905533 
plot(roc_modelo_bag_smote,print.thres=T)

plot(roc_modelo_bag_train,print.thres=T)

######################################
######## EVALUCION DE MODELOS ######## 
######################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbBag_Test <- predict(modelo_TreeBagg_smote,Testing,type="prob") %>% as.data.frame()
colnames(ProbBag_Test) <- c("ProbBag_NO","ProbBag_SI")
head(ProbBag_Test,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredBag_Test <- as.factor(ifelse(ProbBag_Test$ProbBag_SI >=  0.46, 1, 0))
levels(ClasePredBag_Test) <- c("NO","SI")

head(cbind(Testing,ProbBag_Test,ClasePredBag_Test),8)
# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Bag_Test <- mean(ClasePredBag_Test==Testing$DESERTOR)
Accuracy_Bag_Test
[1] 0.4632286
#Matriz de confusión
library(caret)
cm_TreeBagg_smote <- caret::confusionMatrix(ClasePredBag_Test,Testing$DESERTOR,positive="SI") #Muestra balanceada
cm_TreeBagg_smote
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 2313  136
        SI 2820  238
                                        
               Accuracy : 0.4632        
                 95% CI : (0.45, 0.4765)
    No Information Rate : 0.9321        
    P-Value [Acc > NIR] : 1             
                                        
                  Kappa : 0.0201        
                                        
 Mcnemar's Test P-Value : <2e-16        
                                        
            Sensitivity : 0.63636       
            Specificity : 0.45061       
         Pos Pred Value : 0.07783       
         Neg Pred Value : 0.94447       
             Prevalence : 0.06791       
         Detection Rate : 0.04322       
   Detection Prevalence : 0.55529       
      Balanced Accuracy : 0.54349       
                                        
       'Positive' Class : SI            
                                        
cm_TreeBagg_under <- caret::confusionMatrix( predict(modelo_TreeBagg_under,Testing)
                                             ,Testing$DESERTOR,positive="SI") #Muestra Under
cm_TreeBagg_under
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 3944  103
        SI 1189  271
                                         
               Accuracy : 0.7654         
                 95% CI : (0.754, 0.7765)
    No Information Rate : 0.9321         
    P-Value [Acc > NIR] : 1              
                                         
                  Kappa : 0.2101         
                                         
 Mcnemar's Test P-Value : <2e-16         
                                         
            Sensitivity : 0.72460        
            Specificity : 0.76836        
         Pos Pred Value : 0.18562        
         Neg Pred Value : 0.97455        
             Prevalence : 0.06791        
         Detection Rate : 0.04921        
   Detection Prevalence : 0.26512        
      Balanced Accuracy : 0.74648        
                                         
       'Positive' Class : SI             
                                         
cm_TreeBagg_over <- caret::confusionMatrix( predict(modelo_TreeBagg_over,Testing)
                                             ,Testing$DESERTOR,positive="SI") #Muestra Over
cm_TreeBagg_over
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4974  271
        SI  159  103
                                          
               Accuracy : 0.9219          
                 95% CI : (0.9145, 0.9289)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 0.9985          
                                          
                  Kappa : 0.2838          
                                          
 Mcnemar's Test P-Value : 8.656e-08       
                                          
            Sensitivity : 0.27540         
            Specificity : 0.96902         
         Pos Pred Value : 0.39313         
         Neg Pred Value : 0.94833         
             Prevalence : 0.06791         
         Detection Rate : 0.01870         
   Detection Prevalence : 0.04758         
      Balanced Accuracy : 0.62221         
                                          
       'Positive' Class : SI              
                                          
# Calculando el estadístico KS
library(InformationValue)
ks_stat(Testing$DESERTOR,ProbBag_Test$ProbBag_SI,returnKSTable = T)
ks_stat(Testing$DESERTOR,ProbBag_Test$ProbBag_SI)
[1] 0.1448
# Graficando el estadístico KS 
ks_plot(Testing$DESERTOR,ProbBag_Test$ProbBag_SI)

#Curvas de ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Bag_Test <- colAUC(ProbBag_Test$ProbBag_SI,Testing$DESERTOR,plotROC = TRUE) #Muestra balanceada
abline(0, 1,col="red") 

AUC_Bag_Test
               [,1]
NO vs. SI 0.5238144
#Coeficiente de Gini
gini_test <-  2*AUC_Bag_Test -1 ; gini_test
               [,1]
NO vs. SI 0.0476288

MODELO ARBOLES DE DESICIÓN CART

#####################################################################################################



#####################################################################
############################ MODELO CART ############################
#####################################################################


##################################################
#  CART CON CARET Y VALIDACIÓN CRUZADA REPETIDA  #
##################################################

# Relación de modelos 
library(caret)
#names(getModelInfo())

#Relación de parámetros a ajustar de un modelo
modelLookup(model='rpart')
# Aplicando el modelo con Validación Cruzada Repetida 
ctrl <- trainControl(method="cv", number=2, repeats = 1)

set.seed(696)
modelo_cart_smote <- train(DESERTOR ~ ., 
                     data = smote_train, 
                     method = "rpart", 
                     trControl = ctrl, 
                     tuneLength= 20,
                     metric="Accuracy")

modelo_cart_under <- train(DESERTOR ~ ., data = under_train, method = "rpart", trControl = ctrl, metric="Accuracy")
modelo_cart_over  <- train(DESERTOR ~ ., data = over_train,  method = "rpart", trControl = ctrl, metric="Accuracy")

ImpVar_Cart <- varImp(modelo_cart_smote)
plot(ImpVar_Cart)

########################################
######## INDICADORES DEL MODELO ########
########################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbCart_smote <- predict(modelo_cart_smote,smote_train,type="prob") %>% as.data.frame()
colnames(ProbCart_smote) <- c("ProbCart_NO","ProbCart_SI")
head(ProbCart_smote,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredCart_Smote <- as.factor(ifelse(ProbCart_smote$ProbCart_SI >= 0.5, "SI", "NO")) 
levels(ClasePredCart_Smote) <- c("NO","SI")

#Data balanceada con la probabilidad y clase predicha
DataCart_smote_train <- cbind(smote_train,ProbCart_smote,ClasePredCart_Smote)

# Prediciendo la probabilidad en la muestra de entrenamiento desbalaceada
ProbCart_Training <- predict(modelo_cart_smote,Training,type="prob") %>% as.data.frame()
colnames(ProbCart_Training) <- c("ProbCart_NO","ProbCart_SI")
head(ProbCart_Training)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredCart_Training <- as.factor(ifelse(ProbCart_Training$ProbCart_SI >= 0.5, 1, 0))
levels(ClasePredCart_Training) <- c("NO","SI")

#Data desbalanceada con la probabilidad y clase predicha
DataCart_Training <- cbind(Training,ProbCart_Training,ClasePredCart_Training)


##########################
# Tabla de clasificación #
##########################


# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Cart_Smote <- mean(ClasePredCart_Smote==smote_train$DESERTOR)
Accuracy_Cart_Smote
[1] 0.9229645
# Calcular el % de acierto (accuracy) en la muestra desbalanceada
Accuracy_Cart_Train <- mean(ClasePredCart_Training==Training$DESERTOR)
Accuracy_Cart_Train
[1] 0.9311962
# Calcular el error de mala clasificación en la muestra balanceada
Error_Cart_Smote <- mean(ClasePredCart_Smote!=smote_train$DESERTOR)
Error_Cart_Smote 
[1] 0.07703554
# Calcular el error de mala clasificación en la muestra desbalanceada
Error_Cart_Train <- mean(ClasePredCart_Training!=Training$DESERTOR)
Error_Cart_Train 
[1] 0.06880375
#Cruce de clase real y predicha en la muestra balanceada
library(gmodels)
CrossTable(smote_train$DESERTOR,ClasePredCart_Smote,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  8892 

 
                     | ClasePredCart_Smote 
smote_train$DESERTOR |        NO |        SI | Row Total | 
---------------------|-----------|-----------|-----------|
                  NO |      4327 |       119 |      4446 | 
                     |     0.973 |     0.027 |     0.500 | 
---------------------|-----------|-----------|-----------|
                  SI |       566 |      3880 |      4446 | 
                     |     0.127 |     0.873 |     0.500 | 
---------------------|-----------|-----------|-----------|
        Column Total |      4893 |      3999 |      8892 | 
---------------------|-----------|-----------|-----------|

 
#Cruce de clase real y predicha en la muestra desbalanceada
library(gmodels)
CrossTable(Training$DESERTOR,ClasePredCart_Training,
           prop.t=FALSE, prop.c=FALSE,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|-------------------------|

 
Total Observations in Table:  11511 

 
                  | ClasePredCart_Training 
Training$DESERTOR |        NO |        SI | Row Total | 
------------------|-----------|-----------|-----------|
               NO |     10475 |       295 |     10770 | 
                  |     0.973 |     0.027 |     0.936 | 
------------------|-----------|-----------|-----------|
               SI |       497 |       244 |       741 | 
                  |     0.671 |     0.329 |     0.064 | 
------------------|-----------|-----------|-----------|
     Column Total |     10972 |       539 |     11511 | 
------------------|-----------|-----------|-----------|

 
#Matriz de confusión
library(caret)
caret::confusionMatrix(ClasePredCart_Smote,smote_train$DESERTOR,positive="SI") #Muestra balanceada
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4327  566
        SI  119 3880
                                          
               Accuracy : 0.923           
                 95% CI : (0.9172, 0.9284)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.8459          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.8727          
            Specificity : 0.9732          
         Pos Pred Value : 0.9702          
         Neg Pred Value : 0.8843          
             Prevalence : 0.5000          
         Detection Rate : 0.4363          
   Detection Prevalence : 0.4497          
      Balanced Accuracy : 0.9230          
                                          
       'Positive' Class : SI              
                                          
caret::confusionMatrix(ClasePredCart_Training,Training$DESERTOR,positive="SI") #Muestra desbalanceada
Confusion Matrix and Statistics

          Reference
Prediction    NO    SI
        NO 10475   497
        SI   295   244
                                          
               Accuracy : 0.9312          
                 95% CI : (0.9264, 0.9358)
    No Information Rate : 0.9356          
    P-Value [Acc > NIR] : 0.9739          
                                          
                  Kappa : 0.3458          
                                          
 Mcnemar's Test P-Value : 9.183e-13       
                                          
            Sensitivity : 0.32928         
            Specificity : 0.97261         
         Pos Pred Value : 0.45269         
         Neg Pred Value : 0.95470         
             Prevalence : 0.06437         
         Detection Rate : 0.02120         
   Detection Prevalence : 0.04682         
      Balanced Accuracy : 0.65095         
                                          
       'Positive' Class : SI              
                                          
#CURVAS DE ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Cart_Smote <- colAUC(ProbCart_smote$ProbCart_SI,smote_train$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 

AUC_Cart_Train <- colAUC(ProbCart_Training$ProbCart_SI,Training$DESERTOR,plotROC = TRUE) #Muestra desbalanceada

#abline(0, 1,col="red") 


AUC_Cart_Smote #Devuelve el área bajo la curva en la muestra balanceada
               [,1]
NO vs. SI 0.9655362
AUC_Cart_Train #Devuelve el área bajo la curva en la muestra desbalanceada
               [,1]
NO vs. SI 0.8182813
#CURVAS DE ROC
# Usando el paquete pROC
library(pROC)

# Área bajo la curva
roc_modelo_cart_smote <- roc(smote_train$DESERTOR,ProbCart_smote$ProbCart_SI)
roc_modelo_cart_smote

Call:
roc.default(response = smote_train$DESERTOR, predictor = ProbCart_smote$ProbCart_SI)

Data: ProbCart_smote$ProbCart_SI in 4446 controls (smote_train$DESERTOR NO) < 4446 cases (smote_train$DESERTOR SI).
Area under the curve: 0.9655
roc_modelo_cart_train <- roc(Training$DESERTOR,ProbCart_Training$ProbCart_SI)
roc_modelo_cart_train

Call:
roc.default(response = Training$DESERTOR, predictor = ProbCart_Training$ProbCart_SI)

Data: ProbCart_Training$ProbCart_SI in 10770 controls (Training$DESERTOR NO) < 741 cases (Training$DESERTOR SI).
Area under the curve: 0.8183
#Puntos de corte muestra balanceada
PtosCorte_Smote <- data.frame(prob1=roc_modelo_cart_smote$thresholds,
                              sen1=roc_modelo_cart_smote$sensitivities,
                              esp1=roc_modelo_cart_smote$specificities)

#Puntos de corte muestra desbalanceada
PtosCorte_Train <- data.frame(prob2=roc_modelo_cart_train$thresholds,
                              sen2=roc_modelo_cart_train$sensitivities,
                              esp2=roc_modelo_cart_train$specificities)

# Punto de corte óptimo (mayor sensibilidad y especificidad) usando pROC
coords(roc_modelo_cart_smote, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  0.5492398   0.9732344   0.8726946   0.9229645 
coords(roc_modelo_cart_train, "best",ret=c("threshold","specificity", "sensitivity","accuracy"))
  threshold specificity sensitivity    accuracy 
  0.1871429   0.6606314   0.8785425   0.6746590 
coords(roc_modelo_cart_smote, "best")
  threshold specificity sensitivity 
  0.5492398   0.9732344   0.8726946 
coords(roc_modelo_cart_train, "best")
  threshold specificity sensitivity 
  0.1871429   0.6606314   0.8785425 
plot(roc_modelo_cart_smote,print.thres=T)

plot(roc_modelo_cart_train,print.thres=T)

######################################
######## EVALUCION DE MODELOS ######## 
######################################


# Prediciendo la probabilidad en la muestra de entrenamiento balaceada
ProbCart_Test <- predict(modelo_cart_smote,Testing,type="prob") %>% as.data.frame()
colnames(ProbCart_Test) <- c("ProbCart_NO","ProbCart_SI")
head(ProbCart_Test,20)
# Prediciendo la clase (con punto de corte = 0.5)
ClasePredCart_Test <- as.factor(ifelse(ProbCart_Test$ProbCart_SI >= 0.1760868, 1, 0))
levels(ClasePredCart_Test) <- c("NO","SI")

head(cbind(Testing,ProbCart_Test,ClasePredCart_Test),8)
# Calcular el % de acierto (accuracy) en la muestra balanceada
Accuracy_Cart_Test <- mean(ClasePredCart_Test==Testing$DESERTOR)
Accuracy_Cart_Test
[1] 0.3777011
#Matriz de confusión
library(caret)
cm_cart_smote <- caret::confusionMatrix(ClasePredCart_Test,Testing$DESERTOR,positive="SI") #Muestra balanceada
cm_cart_smote
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 1740   34
        SI 3393  340
                                          
               Accuracy : 0.3777          
                 95% CI : (0.3649, 0.3907)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.048           
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.90909         
            Specificity : 0.33898         
         Pos Pred Value : 0.09108         
         Neg Pred Value : 0.98083         
             Prevalence : 0.06791         
         Detection Rate : 0.06174         
   Detection Prevalence : 0.67786         
      Balanced Accuracy : 0.62404         
                                          
       'Positive' Class : SI              
                                          
cm_cart_under <- caret::confusionMatrix(predict(modelo_cart_under,Testing)
                                        ,Testing$DESERTOR,positive="SI") #Muestra under
cm_cart_under
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 4336  154
        SI  797  220
                                          
               Accuracy : 0.8273          
                 95% CI : (0.8171, 0.8372)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.2409          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.58824         
            Specificity : 0.84473         
         Pos Pred Value : 0.21632         
         Neg Pred Value : 0.96570         
             Prevalence : 0.06791         
         Detection Rate : 0.03995         
   Detection Prevalence : 0.18467         
      Balanced Accuracy : 0.71648         
                                          
       'Positive' Class : SI              
                                          
cm_cart_over <- caret::confusionMatrix(predict(modelo_cart_over,Testing)
                                        ,Testing$DESERTOR,positive="SI") #Muestra under
cm_cart_over
Confusion Matrix and Statistics

          Reference
Prediction   NO   SI
        NO 3991  123
        SI 1142  251
                                         
               Accuracy : 0.7703         
                 95% CI : (0.759, 0.7813)
    No Information Rate : 0.9321         
    P-Value [Acc > NIR] : 1              
                                         
                  Kappa : 0.1982         
                                         
 Mcnemar's Test P-Value : <2e-16         
                                         
            Sensitivity : 0.67112        
            Specificity : 0.77752        
         Pos Pred Value : 0.18019        
         Neg Pred Value : 0.97010        
             Prevalence : 0.06791        
         Detection Rate : 0.04558        
   Detection Prevalence : 0.25295        
      Balanced Accuracy : 0.72432        
                                         
       'Positive' Class : SI             
                                         
# Calculando el estadístico KS
library(InformationValue)
ks_stat(Testing$DESERTOR,ProbCart_Test$ProbCart_SI,returnKSTable = T)
ks_stat(Testing$DESERTOR,ProbCart_Test$ProbCart_SI)
[1] 0.244
# Graficando el estadístico KS 
ks_plot(Testing$DESERTOR,ProbCart_Test$ProbCart_SI)

#Curvas de ROC
# Curva ROC usando el paquete caTools
library(caTools)
AUC_Cart_Test <- colAUC(ProbCart_Test$ProbCart_SI,Testing$DESERTOR,plotROC = TRUE) #Muestra balanceada

#abline(0, 1,col="red") 
AUC_Cart_Test
               [,1]
NO vs. SI 0.5327427
#Coeficiente de Gini
gini_test <-  2*AUC_Cart_Test -1 ; gini_test
                [,1]
NO vs. SI 0.06548536

MODELO XGBOOST

#####################################################################################################

###########################################################
#  XG BOOSTING Y VALIDACIÓN CRUZADA REPETIDA   #
###########################################################


library(caret)
library(randomForest)
library(xgboost)
summary(over_train$DESERTOR)
   NO    SI 
10770 10770 
set.seed(696)
modelo_XGBoot_smote = xgboost::xgboost(data = as.matrix(smote_train[, -1]),#smote_train[, -1]),
                     label = ifelse(as.numeric(smote_train$DESERTOR) == 2, 1, 0)# Es necesario tener una categ. binaria
                     ,objective = "binary:logistic",#num_class 
                     nrounds = 200)
[1] train-error:0.101439 
[2] train-error:0.076586 
[3] train-error:0.071300 
[4] train-error:0.068826 
[5] train-error:0.067589 
[6] train-error:0.064890 
[7] train-error:0.063653 
[8] train-error:0.061853 
[9] train-error:0.061628 
[10]    train-error:0.061291 
[11]    train-error:0.059379 
[12]    train-error:0.058480 
[13]    train-error:0.057242 
[14]    train-error:0.054993 
[15]    train-error:0.054206 
[16]    train-error:0.053531 
[17]    train-error:0.052182 
[18]    train-error:0.051057 
[19]    train-error:0.050720 
[20]    train-error:0.049708 
[21]    train-error:0.049708 
[22]    train-error:0.049820 
[23]    train-error:0.049708 
[24]    train-error:0.049258 
[25]    train-error:0.047121 
[26]    train-error:0.047233 
[27]    train-error:0.046221 
[28]    train-error:0.046559 
[29]    train-error:0.046671 
[30]    train-error:0.046221 
[31]    train-error:0.045996 
[32]    train-error:0.045434 
[33]    train-error:0.044984 
[34]    train-error:0.044309 
[35]    train-error:0.043747 
[36]    train-error:0.043410 
[37]    train-error:0.043297 
[38]    train-error:0.043410 
[39]    train-error:0.042848 
[40]    train-error:0.042735 
[41]    train-error:0.042060 
[42]    train-error:0.041723 
[43]    train-error:0.041161 
[44]    train-error:0.041161 
[45]    train-error:0.040823 
[46]    train-error:0.040261 
[47]    train-error:0.039924 
[48]    train-error:0.039249 
[49]    train-error:0.038686 
[50]    train-error:0.038686 
[51]    train-error:0.038349 
[52]    train-error:0.037000 
[53]    train-error:0.036887 
[54]    train-error:0.036325 
[55]    train-error:0.036100 
[56]    train-error:0.036325 
[57]    train-error:0.035875 
[58]    train-error:0.035650 
[59]    train-error:0.035762 
[60]    train-error:0.034638 
[61]    train-error:0.034300 
[62]    train-error:0.034300 
[63]    train-error:0.034188 
[64]    train-error:0.032951 
[65]    train-error:0.031714 
[66]    train-error:0.030814 
[67]    train-error:0.030589 
[68]    train-error:0.030139 
[69]    train-error:0.029690 
[70]    train-error:0.028790 
[71]    train-error:0.028790 
[72]    train-error:0.029240 
[73]    train-error:0.028228 
[74]    train-error:0.028003 
[75]    train-error:0.027328 
[76]    train-error:0.026878 
[77]    train-error:0.026766 
[78]    train-error:0.026541 
[79]    train-error:0.026091 
[80]    train-error:0.025978 
[81]    train-error:0.025753 
[82]    train-error:0.024741 
[83]    train-error:0.024629 
[84]    train-error:0.024404 
[85]    train-error:0.024404 
[86]    train-error:0.024291 
[87]    train-error:0.023842 
[88]    train-error:0.022267 
[89]    train-error:0.022155 
[90]    train-error:0.021930 
[91]    train-error:0.020918 
[92]    train-error:0.020355 
[93]    train-error:0.020018 
[94]    train-error:0.019906 
[95]    train-error:0.019343 
[96]    train-error:0.019456 
[97]    train-error:0.018781 
[98]    train-error:0.018781 
[99]    train-error:0.018668 
[100]   train-error:0.018444 
[101]   train-error:0.016757 
[102]   train-error:0.015744 
[103]   train-error:0.015407 
[104]   train-error:0.015182 
[105]   train-error:0.014507 
[106]   train-error:0.014395 
[107]   train-error:0.013608 
[108]   train-error:0.013383 
[109]   train-error:0.013383 
[110]   train-error:0.013158 
[111]   train-error:0.013045 
[112]   train-error:0.012821 
[113]   train-error:0.012933 
[114]   train-error:0.012933 
[115]   train-error:0.012708 
[116]   train-error:0.012708 
[117]   train-error:0.012371 
[118]   train-error:0.012708 
[119]   train-error:0.012596 
[120]   train-error:0.012596 
[121]   train-error:0.012146 
[122]   train-error:0.011921 
[123]   train-error:0.011808 
[124]   train-error:0.011359 
[125]   train-error:0.011359 
[126]   train-error:0.011471 
[127]   train-error:0.010796 
[128]   train-error:0.010234 
[129]   train-error:0.009559 
[130]   train-error:0.009784 
[131]   train-error:0.009559 
[132]   train-error:0.009559 
[133]   train-error:0.009222 
[134]   train-error:0.009222 
[135]   train-error:0.008997 
[136]   train-error:0.008997 
[137]   train-error:0.008772 
[138]   train-error:0.008435 
[139]   train-error:0.008097 
[140]   train-error:0.008097 
[141]   train-error:0.008097 
[142]   train-error:0.008097 
[143]   train-error:0.008097 
[144]   train-error:0.008097 
[145]   train-error:0.008097 
[146]   train-error:0.007985 
[147]   train-error:0.007872 
[148]   train-error:0.007422 
[149]   train-error:0.007310 
[150]   train-error:0.007085 
[151]   train-error:0.006860 
[152]   train-error:0.006635 
[153]   train-error:0.006523 
[154]   train-error:0.006635 
[155]   train-error:0.006635 
[156]   train-error:0.006748 
[157]   train-error:0.006748 
[158]   train-error:0.006748 
[159]   train-error:0.006298 
[160]   train-error:0.006298 
[161]   train-error:0.006410 
[162]   train-error:0.006410 
[163]   train-error:0.005735 
[164]   train-error:0.005848 
[165]   train-error:0.005848 
[166]   train-error:0.005623 
[167]   train-error:0.004836 
[168]   train-error:0.004498 
[169]   train-error:0.004386 
[170]   train-error:0.004386 
[171]   train-error:0.004386 
[172]   train-error:0.004274 
[173]   train-error:0.003936 
[174]   train-error:0.003374 
[175]   train-error:0.003261 
[176]   train-error:0.002924 
[177]   train-error:0.002812 
[178]   train-error:0.003036 
[179]   train-error:0.003261 
[180]   train-error:0.003149 
[181]   train-error:0.003149 
[182]   train-error:0.003149 
[183]   train-error:0.002924 
[184]   train-error:0.003149 
[185]   train-error:0.002587 
[186]   train-error:0.002587 
[187]   train-error:0.002362 
[188]   train-error:0.002474 
[189]   train-error:0.002249 
[190]   train-error:0.002137 
[191]   train-error:0.002024 
[192]   train-error:0.002024 
[193]   train-error:0.001912 
[194]   train-error:0.001912 
[195]   train-error:0.002024 
[196]   train-error:0.002024 
[197]   train-error:0.002137 
[198]   train-error:0.002024 
[199]   train-error:0.001912 
[200]   train-error:0.002024 
modelo_XGBoot_over = xgboost::xgboost(data = as.matrix(over_train[, -1]),#smote_train[, -1]),
                     label = ifelse(as.numeric(over_train$DESERTOR) == 2, 1, 0)# Es necesario tener una categ. binaria
                     ,objective = "binary:logistic",#num_class 
                     nrounds = 200)
[1] train-error:0.176091 
[2] train-error:0.165274 
[3] train-error:0.156128 
[4] train-error:0.149814 
[5] train-error:0.146797 
[6] train-error:0.134587 
[7] train-error:0.134448 
[8] train-error:0.122934 
[9] train-error:0.121820 
[10]    train-error:0.120613 
[11]    train-error:0.118477 
[12]    train-error:0.110306 
[13]    train-error:0.109471 
[14]    train-error:0.108682 
[15]    train-error:0.106221 
[16]    train-error:0.104178 
[17]    train-error:0.100139 
[18]    train-error:0.099304 
[19]    train-error:0.095079 
[20]    train-error:0.094568 
[21]    train-error:0.093686 
[22]    train-error:0.090344 
[23]    train-error:0.089322 
[24]    train-error:0.088394 
[25]    train-error:0.086722 
[26]    train-error:0.077994 
[27]    train-error:0.077669 
[28]    train-error:0.077623 
[29]    train-error:0.074884 
[30]    train-error:0.075905 
[31]    train-error:0.075720 
[32]    train-error:0.072006 
[33]    train-error:0.069731 
[34]    train-error:0.068709 
[35]    train-error:0.068292 
[36]    train-error:0.065831 
[37]    train-error:0.064670 
[38]    train-error:0.064160 
[39]    train-error:0.062906 
[40]    train-error:0.061421 
[41]    train-error:0.060492 
[42]    train-error:0.059703 
[43]    train-error:0.059471 
[44]    train-error:0.059007 
[45]    train-error:0.056685 
[46]    train-error:0.054178 
[47]    train-error:0.053296 
[48]    train-error:0.053064 
[49]    train-error:0.052878 
[50]    train-error:0.053064 
[51]    train-error:0.052739 
[52]    train-error:0.048004 
[53]    train-error:0.047539 
[54]    train-error:0.045729 
[55]    train-error:0.045868 
[56]    train-error:0.045636 
[57]    train-error:0.045357 
[58]    train-error:0.044754 
[59]    train-error:0.043268 
[60]    train-error:0.042665 
[61]    train-error:0.042293 
[62]    train-error:0.041922 
[63]    train-error:0.041736 
[64]    train-error:0.041365 
[65]    train-error:0.041411 
[66]    train-error:0.041179 
[67]    train-error:0.040761 
[68]    train-error:0.040204 
[69]    train-error:0.040065 
[70]    train-error:0.040019 
[71]    train-error:0.039786 
[72]    train-error:0.037837 
[73]    train-error:0.037372 
[74]    train-error:0.037187 
[75]    train-error:0.036722 
[76]    train-error:0.036351 
[77]    train-error:0.036305 
[78]    train-error:0.035562 
[79]    train-error:0.034633 
[80]    train-error:0.034587 
[81]    train-error:0.034448 
[82]    train-error:0.034262 
[83]    train-error:0.034215 
[84]    train-error:0.034215 
[85]    train-error:0.032312 
[86]    train-error:0.032358 
[87]    train-error:0.032126 
[88]    train-error:0.031616 
[89]    train-error:0.030223 
[90]    train-error:0.030130 
[91]    train-error:0.029805 
[92]    train-error:0.029759 
[93]    train-error:0.029387 
[94]    train-error:0.029062 
[95]    train-error:0.028087 
[96]    train-error:0.027159 
[97]    train-error:0.026880 
[98]    train-error:0.026880 
[99]    train-error:0.026648 
[100]   train-error:0.026091 
[101]   train-error:0.025766 
[102]   train-error:0.025023 
[103]   train-error:0.025023 
[104]   train-error:0.025070 
[105]   train-error:0.024884 
[106]   train-error:0.024745 
[107]   train-error:0.024141 
[108]   train-error:0.023909 
[109]   train-error:0.023955 
[110]   train-error:0.023955 
[111]   train-error:0.023863 
[112]   train-error:0.023398 
[113]   train-error:0.022516 
[114]   train-error:0.021820 
[115]   train-error:0.021495 
[116]   train-error:0.021402 
[117]   train-error:0.020799 
[118]   train-error:0.020752 
[119]   train-error:0.020706 
[120]   train-error:0.020195 
[121]   train-error:0.019916 
[122]   train-error:0.019824 
[123]   train-error:0.019313 
[124]   train-error:0.019220 
[125]   train-error:0.018802 
[126]   train-error:0.018709 
[127]   train-error:0.018152 
[128]   train-error:0.018059 
[129]   train-error:0.017967 
[130]   train-error:0.017642 
[131]   train-error:0.017409 
[132]   train-error:0.017502 
[133]   train-error:0.017409 
[134]   train-error:0.016527 
[135]   train-error:0.016435 
[136]   train-error:0.016435 
[137]   train-error:0.016481 
[138]   train-error:0.016435 
[139]   train-error:0.016017 
[140]   train-error:0.015831 
[141]   train-error:0.015645 
[142]   train-error:0.015645 
[143]   train-error:0.015692 
[144]   train-error:0.015460 
[145]   train-error:0.015460 
[146]   train-error:0.015413 
[147]   train-error:0.014670 
[148]   train-error:0.014578 
[149]   train-error:0.014578 
[150]   train-error:0.014485 
[151]   train-error:0.013928 
[152]   train-error:0.013556 
[153]   train-error:0.013278 
[154]   train-error:0.013370 
[155]   train-error:0.012999 
[156]   train-error:0.012674 
[157]   train-error:0.012813 
[158]   train-error:0.012488 
[159]   train-error:0.012488 
[160]   train-error:0.012349 
[161]   train-error:0.012256 
[162]   train-error:0.012024 
[163]   train-error:0.012024 
[164]   train-error:0.011885 
[165]   train-error:0.011421 
[166]   train-error:0.011235 
[167]   train-error:0.011003 
[168]   train-error:0.010956 
[169]   train-error:0.011003 
[170]   train-error:0.010910 
[171]   train-error:0.010864 
[172]   train-error:0.010817 
[173]   train-error:0.010492 
[174]   train-error:0.010446 
[175]   train-error:0.010306 
[176]   train-error:0.010306 
[177]   train-error:0.010306 
[178]   train-error:0.010214 
[179]   train-error:0.009981 
[180]   train-error:0.009842 
[181]   train-error:0.009749 
[182]   train-error:0.009656 
[183]   train-error:0.009564 
[184]   train-error:0.009656 
[185]   train-error:0.009285 
[186]   train-error:0.009239 
[187]   train-error:0.009099 
[188]   train-error:0.008914 
[189]   train-error:0.008960 
[190]   train-error:0.008867 
[191]   train-error:0.008774 
[192]   train-error:0.008682 
[193]   train-error:0.008728 
[194]   train-error:0.008728 
[195]   train-error:0.008589 
[196]   train-error:0.008635 
[197]   train-error:0.008449 
[198]   train-error:0.008217 
[199]   train-error:0.008264 
[200]   train-error:0.008124 
modelo_XGBoot_under = xgboost::xgboost(data = as.matrix(under_train[, -1]),#smote_train[, -1]),
                     label = ifelse(as.numeric(under_train$DESERTOR) == 2, 1, 0)# Es necesario tener una categ. binaria
                     ,objective = "binary:logistic",#num_class 
                     nrounds = 200)
[1] train-error:0.177463 
[2] train-error:0.157220 
[3] train-error:0.152497 
[4] train-error:0.143050 
[5] train-error:0.145749 
[6] train-error:0.142375 
[7] train-error:0.134953 
[8] train-error:0.132928 
[9] train-error:0.128880 
[10]    train-error:0.124831 
[11]    train-error:0.123482 
[12]    train-error:0.119433 
[13]    train-error:0.114035 
[14]    train-error:0.110661 
[15]    train-error:0.103914 
[16]    train-error:0.101215 
[17]    train-error:0.099190 
[18]    train-error:0.097166 
[19]    train-error:0.100540 
[20]    train-error:0.087045 
[21]    train-error:0.080297 
[22]    train-error:0.080297 
[23]    train-error:0.077598 
[24]    train-error:0.071525 
[25]    train-error:0.070850 
[26]    train-error:0.068151 
[27]    train-error:0.068151 
[28]    train-error:0.065452 
[29]    train-error:0.062753 
[30]    train-error:0.062078 
[31]    train-error:0.056680 
[32]    train-error:0.052632 
[33]    train-error:0.051282 
[34]    train-error:0.051282 
[35]    train-error:0.049933 
[36]    train-error:0.049933 
[37]    train-error:0.047908 
[38]    train-error:0.047233 
[39]    train-error:0.043860 
[40]    train-error:0.041161 
[41]    train-error:0.041161 
[42]    train-error:0.041161 
[43]    train-error:0.040486 
[44]    train-error:0.039811 
[45]    train-error:0.038462 
[46]    train-error:0.035762 
[47]    train-error:0.034413 
[48]    train-error:0.032389 
[49]    train-error:0.032389 
[50]    train-error:0.029690 
[51]    train-error:0.029015 
[52]    train-error:0.027665 
[53]    train-error:0.024291 
[54]    train-error:0.023617 
[55]    train-error:0.022267 
[56]    train-error:0.021592 
[57]    train-error:0.020243 
[58]    train-error:0.018219 
[59]    train-error:0.018219 
[60]    train-error:0.017544 
[61]    train-error:0.018219 
[62]    train-error:0.016869 
[63]    train-error:0.016869 
[64]    train-error:0.016869 
[65]    train-error:0.014845 
[66]    train-error:0.014170 
[67]    train-error:0.011471 
[68]    train-error:0.010796 
[69]    train-error:0.011471 
[70]    train-error:0.011471 
[71]    train-error:0.010121 
[72]    train-error:0.010121 
[73]    train-error:0.010121 
[74]    train-error:0.010121 
[75]    train-error:0.010121 
[76]    train-error:0.010121 
[77]    train-error:0.009447 
[78]    train-error:0.008772 
[79]    train-error:0.008097 
[80]    train-error:0.008772 
[81]    train-error:0.008772 
[82]    train-error:0.007422 
[83]    train-error:0.006748 
[84]    train-error:0.006748 
[85]    train-error:0.006748 
[86]    train-error:0.007422 
[87]    train-error:0.006748 
[88]    train-error:0.006073 
[89]    train-error:0.006073 
[90]    train-error:0.005398 
[91]    train-error:0.005398 
[92]    train-error:0.004049 
[93]    train-error:0.004723 
[94]    train-error:0.004723 
[95]    train-error:0.004723 
[96]    train-error:0.004723 
[97]    train-error:0.004723 
[98]    train-error:0.004723 
[99]    train-error:0.004723 
[100]   train-error:0.004723 
[101]   train-error:0.005398 
[102]   train-error:0.005398 
[103]   train-error:0.005398 
[104]   train-error:0.005398 
[105]   train-error:0.004723 
[106]   train-error:0.004723 
[107]   train-error:0.004723 
[108]   train-error:0.004723 
[109]   train-error:0.004049 
[110]   train-error:0.004049 
[111]   train-error:0.004723 
[112]   train-error:0.004723 
[113]   train-error:0.004723 
[114]   train-error:0.004723 
[115]   train-error:0.004723 
[116]   train-error:0.004723 
[117]   train-error:0.004723 
[118]   train-error:0.004723 
[119]   train-error:0.004723 
[120]   train-error:0.004723 
[121]   train-error:0.004049 
[122]   train-error:0.004049 
[123]   train-error:0.003374 
[124]   train-error:0.003374 
[125]   train-error:0.003374 
[126]   train-error:0.003374 
[127]   train-error:0.003374 
[128]   train-error:0.003374 
[129]   train-error:0.004049 
[130]   train-error:0.004049 
[131]   train-error:0.004049 
[132]   train-error:0.004049 
[133]   train-error:0.002699 
[134]   train-error:0.003374 
[135]   train-error:0.003374 
[136]   train-error:0.003374 
[137]   train-error:0.002024 
[138]   train-error:0.002024 
[139]   train-error:0.001350 
[140]   train-error:0.001350 
[141]   train-error:0.001350 
[142]   train-error:0.001350 
[143]   train-error:0.001350 
[144]   train-error:0.001350 
[145]   train-error:0.001350 
[146]   train-error:0.001350 
[147]   train-error:0.001350 
[148]   train-error:0.001350 
[149]   train-error:0.001350 
[150]   train-error:0.001350 
[151]   train-error:0.001350 
[152]   train-error:0.001350 
[153]   train-error:0.001350 
[154]   train-error:0.001350 
[155]   train-error:0.001350 
[156]   train-error:0.001350 
[157]   train-error:0.001350 
[158]   train-error:0.001350 
[159]   train-error:0.001350 
[160]   train-error:0.001350 
[161]   train-error:0.001350 
[162]   train-error:0.001350 
[163]   train-error:0.000675 
[164]   train-error:0.000675 
[165]   train-error:0.001350 
[166]   train-error:0.001350 
[167]   train-error:0.001350 
[168]   train-error:0.000675 
[169]   train-error:0.000000 
[170]   train-error:0.000000 
[171]   train-error:0.000675 
[172]   train-error:0.000675 
[173]   train-error:0.001350 
[174]   train-error:0.001350 
[175]   train-error:0.001350 
[176]   train-error:0.001350 
[177]   train-error:0.001350 
[178]   train-error:0.001350 
[179]   train-error:0.001350 
[180]   train-error:0.000675 
[181]   train-error:0.000675 
[182]   train-error:0.000675 
[183]   train-error:0.000000 
[184]   train-error:0.000000 
[185]   train-error:0.000000 
[186]   train-error:0.000675 
[187]   train-error:0.000675 
[188]   train-error:0.000675 
[189]   train-error:0.000675 
[190]   train-error:0.000675 
[191]   train-error:0.000000 
[192]   train-error:0.000000 
[193]   train-error:0.000000 
[194]   train-error:0.000000 
[195]   train-error:0.000000 
[196]   train-error:0.000000 
[197]   train-error:0.000000 
[198]   train-error:0.000000 
[199]   train-error:0.000000 
[200]   train-error:0.000000 
pred_smote <- predict(modelo_XGBoot_smote, newdata = as.matrix(Testing[,-1]))
pred_under <- predict(modelo_XGBoot_over, newdata = as.matrix(Testing[,-1]))
pred_over <- predict(modelo_XGBoot_under, newdata = as.matrix(Testing[,-1]))

pred_smote = ifelse(pred_smote > 0.5, 2, 1) %>% as.factor()
pred_under = ifelse(pred_under > 0.5, 2, 1) %>% as.factor()
pred_over = ifelse(pred_over > 0.5, 2, 1) %>% as.factor()

levels(pred_smote) <- c("NO","SI")
levels(pred_under) <- c("NO","SI")
levels(pred_over) <- c("NO","SI")

cm_XGBoot_smote <- caret::confusionMatrix(table(pred_smote,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_XGBoot_smote
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 3411  167
      SI 1722  207
                                          
               Accuracy : 0.657           
                 95% CI : (0.6443, 0.6695)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.0745          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.55348         
            Specificity : 0.66452         
         Pos Pred Value : 0.10731         
         Neg Pred Value : 0.95333         
             Prevalence : 0.06791         
         Detection Rate : 0.03759         
   Detection Prevalence : 0.35028         
      Balanced Accuracy : 0.60900         
                                          
       'Positive' Class : SI              
                                          
cm_XGBoot_under <- caret::confusionMatrix(table(pred_under,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_XGBoot_under
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 4919  268
      SI  214  106
                                          
               Accuracy : 0.9125          
                 95% CI : (0.9047, 0.9198)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1.00000         
                                          
                  Kappa : 0.2591          
                                          
 Mcnemar's Test P-Value : 0.01577         
                                          
            Sensitivity : 0.28342         
            Specificity : 0.95831         
         Pos Pred Value : 0.33125         
         Neg Pred Value : 0.94833         
             Prevalence : 0.06791         
         Detection Rate : 0.01925         
   Detection Prevalence : 0.05811         
      Balanced Accuracy : 0.62087         
                                          
       'Positive' Class : SI              
                                          
cm_XGBoot_over <- caret::confusionMatrix(table(pred_over,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_XGBoot_over
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 3782  127
      SI 1351  247
                                          
               Accuracy : 0.7316          
                 95% CI : (0.7197, 0.7433)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.1578          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.66043         
            Specificity : 0.73680         
         Pos Pred Value : 0.15457         
         Neg Pred Value : 0.96751         
             Prevalence : 0.06791         
         Detection Rate : 0.04485         
   Detection Prevalence : 0.29018         
      Balanced Accuracy : 0.69861         
                                          
       'Positive' Class : SI              
                                          
######### CROSS VALIDATIONSSS #####
# library(caret)
# training_set<- over_train
# folds = createFolds(over_train$DESERTOR, k = 10)
# cv = lapply(folds, function(x) { 
#   training_fold = training_set[-x, ]
#   test_fold = training_set[x, ]
#   classifier = xgboost(data = as.matrix(training_set[, -85]),
#                        label = ifelse(as.numeric(training_set$DESERTOR) == 2, 1, 0), objective = "binary:logistic",
#                        nrounds = 5)
#   y_pred = predict(classifier, newdata = as.matrix(test_fold[,-85]))
#   y_pred = ifelse(y_pred > 0.5, 2, 1) %>% as.factor()
#   levels(y_pred) <- c("NO","SI")
#   
#   cm = table(test_fold[, 85], y_pred)
#   print(cm)
#   accuracy = (cm[1,1]+cm[2,2])/(cm[1,1]+cm[1,2]+cm[2,1]+cm[2,2])
#   sensibilidad = (cm[2,2])/(cm[2,1]+cm[2,2])
#   print(accuracy)
#   print(sensibilidad)
#   return(sensibilidad)  
# })
# accuracy = mean(as.numeric(cv))
# accuracy_sd = sd(as.numeric(cv))


#####################################################################################################

MODELO SVM

modelo_SVM_smote <- svm(DESERTOR ~ ., data = smote_train, 
           #class.weights = c("0"=0.3, "1"=0.7),
           cost=100)# es coste es para disminur el error mientras mas grande el algoritmo tratara de ob tener una menor error posible
modelo_SVM_under <- svm(DESERTOR ~ ., data = under_train,cost=10)
modelo_SVM_over  <- svm(DESERTOR ~ ., data = over_train,cost=100)
modelo_SVM_weigths <- svm(DESERTOR ~ ., data =  Training, class.weights = c("NO"=0.1, "SI"=0.9),cost=10)

############################################################
###### REALIZAMOS LAS EVALUACIONES EN BASE A LA DATA DE TESTING

cm_SVM_smote <- caret::confusionMatrix(table(predict(modelo_SVM_smote,Testing)
                                             ,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_SVM_smote
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 5081  358
      SI   52   16
                                          
               Accuracy : 0.9255          
                 95% CI : (0.9183, 0.9323)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 0.9735          
                                          
                  Kappa : 0.0526          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.042781        
            Specificity : 0.989869        
         Pos Pred Value : 0.235294        
         Neg Pred Value : 0.934179        
             Prevalence : 0.067914        
         Detection Rate : 0.002905        
   Detection Prevalence : 0.012348        
      Balanced Accuracy : 0.516325        
                                          
       'Positive' Class : SI              
                                          
cm_SVM_under <- caret::confusionMatrix(table(predict(modelo_SVM_under,Testing)
                                             ,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_SVM_under
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 3231  114
      SI 1902  260
                                         
               Accuracy : 0.6339         
                 95% CI : (0.621, 0.6467)
    No Information Rate : 0.9321         
    P-Value [Acc > NIR] : 1              
                                         
                  Kappa : 0.1009         
                                         
 Mcnemar's Test P-Value : <2e-16         
                                         
            Sensitivity : 0.69519        
            Specificity : 0.62946        
         Pos Pred Value : 0.12026        
         Neg Pred Value : 0.96592        
             Prevalence : 0.06791        
         Detection Rate : 0.04721        
   Detection Prevalence : 0.39259        
      Balanced Accuracy : 0.66232        
                                         
       'Positive' Class : SI             
                                         
cm_SVM_over  <- caret::confusionMatrix(table(predict(modelo_SVM_over,Testing)
                                             ,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_SVM_over
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 3936  185
      SI 1197  189
                                          
               Accuracy : 0.749           
                 95% CI : (0.7374, 0.7605)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.1207          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.50535         
            Specificity : 0.76680         
         Pos Pred Value : 0.13636         
         Neg Pred Value : 0.95511         
             Prevalence : 0.06791         
         Detection Rate : 0.03432         
   Detection Prevalence : 0.25168         
      Balanced Accuracy : 0.63608         
                                          
       'Positive' Class : SI              
                                          
cm_SVM_weigths  <- caret::confusionMatrix(table(predict(modelo_SVM_weigths,Testing)
                                             ,Testing[,1],dnn = c("Predicho", "Actual")),positive="SI")
cm_SVM_weigths
Confusion Matrix and Statistics

        Actual
Predicho   NO   SI
      NO 4174  188
      SI  959  186
                                          
               Accuracy : 0.7917          
                 95% CI : (0.7808, 0.8024)
    No Information Rate : 0.9321          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.1588          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.49733         
            Specificity : 0.81317         
         Pos Pred Value : 0.16245         
         Neg Pred Value : 0.95690         
             Prevalence : 0.06791         
         Detection Rate : 0.03378         
   Detection Prevalence : 0.20792         
      Balanced Accuracy : 0.65525         
                                          
       'Positive' Class : SI              
                                          
#table(smote_train$DESERTOR, fitted(modelo_SVM_smote), dnn = c("Actual", "Predicho"))

RESUMEN DE RESULTADOS

#################################################################################################################
################################### RESUMEN DE RESULTADOS #######################################################
# #################################################################################################################
        # RF_MDL <- caret::train(x = x_trainRF, y = y_trainRF ,verbose = FALSE    
        #                   , method = "rf", metric = "Acurracy", tuneGrid = tunegrid
        #                   , trControl = ctrl)
        # mc_PredictOrigTuneGrid<- table(predict(RF_MDL,x_testRF),y_testRF)
        # mc_PredictOrigTuneGrid
        # cm_RF <- confusionMatrix(predict(RF_MDL,x_testRF), y_testRF,positive="SI")
        # cm_RF$byClass

models <- list( 
                  rf_smote          = modelo_rf_smote,
                  rf_under          = modelo_rf_under,
                  rf_over           = modelo_rf_over,
                  RF_own_smote      = modelo_RF_own_smote,
                  RF_own_under      = modelo_RF_own_under,
                  RF_own_over       = modelo_RF_own_over,
                  Nb_smote          = modelo_Nb_smote,
                  Nb_under          = modelo_Nb_under,
                  Nb_over           = modelo_Nb_over,
                  TreeBagg_smote    = modelo_TreeBagg_smote,
                  TreeBagg_under    = modelo_TreeBagg_under,
                  TreeBagg_over     = modelo_TreeBagg_over,
                  cart_smote        = modelo_cart_smote,
                  cart_under        = modelo_cart_under,
                  cart_over         = modelo_cart_over,
                  XGBoot_smote      = modelo_XGBoot_smote,
                  XGBoot_under      = modelo_XGBoot_under,
                  XGBoot_over       = modelo_XGBoot_over,
                  SVM_smote         = modelo_SVM_smote,
                  SVM_under         = modelo_SVM_under,
                  SVM_over          = modelo_SVM_over,
                  SVM_weigths       = modelo_SVM_weigths
) 



# resampling <- resamples(models)
# bwplot(resampling)

library(dplyr)
comparison <- data.frame(model = names(models),                         Sensitivity = rep(NA, length(models)),
                         Specificity = rep(NA, length(models)),         Precision = rep(NA, length(models)),
                         Recall = rep(NA, length(models)),              F1 = rep(NA, length(models)))

for (name in names(models)) {
  switch(name,
        rf_smote        ={rowModel<- 1 },           rf_under        ={rowModel<- 2 },           rf_over         ={rowModel<- 3 },
            RF_own_smote    ={rowModel<- 4 },           RF_own_under    ={rowModel<- 5 },           RF_own_over     ={rowModel<- 6 },
            Nb_smote        ={rowModel<- 7 },           Nb_under        ={rowModel<- 8 },           Nb_over         ={rowModel<- 9 },
            TreeBagg_smote  ={rowModel<- 10},           TreeBagg_under  ={rowModel<- 11},           TreeBagg_over   ={rowModel<- 12},
            cart_smote      ={rowModel<- 13},           cart_under      ={rowModel<- 14},           cart_over       ={rowModel<- 15},
            XGBoot_smote    ={rowModel<- 16},           XGBoot_under    ={rowModel<- 17},           XGBoot_over     ={rowModel<- 18},
            SVM_smote       ={rowModel<- 19},           SVM_under       ={rowModel<- 20},           SVM_over        ={rowModel<- 21},
            SVM_weigths     ={rowModel<- 22}
  )
  model <- get(paste0("cm_", name))
  comparison[rowModel,'Precision' ] <-model$byClass["Precision"]
  comparison[rowModel,'Sensitivity' ] <-model$byClass["Sensitivity"]
  comparison[rowModel,'Specificity' ] <-model$byClass["Specificity"] ## IMPORTANTE
  comparison[rowModel,'Recall' ] <-model$byClass["Recall"]
  comparison[rowModel,'F1' ] <-model$byClass["F1"]
}
comparison
colnames(comparison) <- c("            model","Sensitivity","Specificity"," Precision","    Recall","        F1");
write.csv(comparison[,1:6],file="UPUPLICA_ModeloGeneral.csv", sep=",",row.names = FALSE)