Cargamos las librerias a utilizar
#############################################library(dplyr) # for data manipulation
library(caret) # for model-building
library(DMwR) # for smote implementation
library(purrr) # for functional programming (map)
library(pROC)
library(knitr)
library(qgraph)
library(nortest)
library(magrittr)
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)
library(klaR)
#CARGAS DATOS PARA TRABAJAR MODELO PREDICTIVO
############################################
ruta <- 'C:'
setwd('C:')
# ruta <- 'C:/Users/Jhampier/Google Drive/Maestria/TESIS DE MAESTRIA/Proyecto'
# setwd( 'C:/Users/Jhampier/Google Drive/Maestria/TESIS DE MAESTRIA/Proyecto')
#Leer el conjunto de datos del archivo CSV
DataSetUpublica <- read.table(paste(ruta, "/DataSetUnsaBinarizadaSinRuidoFuturo.csv",sep=""),header=TRUE,sep=";",stringsAsFactors = FALSE) ## dec="." es separador decimal
##########################################################
########## 2 COMPRESION DE DATOS Y 3 PREPARACIÓN DE DATOS#####
##########################################################
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 ...
#DATASET INICILA
DataSetUpublica
########################################################
## DIMENSIONES - CANTIDAD DE FILAS Y VARIABLES(COLUMNAS)
nrow(DataSetUpublica)#[1] 17509
[1] 17509
ncol(DataSetUpublica)#[1] 18
[1] 20
colnames(DataSetUpublica)#Nombres de Variables
[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"
##NOMBRES Y TIPOS DE DATOS DE LAS COLUMNAS
#sapply(DataSetUpublica, mode)
#summary(DataSetUpublica)#PODEMOS OBSERVAR EN EL POWER
########################################################
########### PREPARACIÓN DE DATA POR VARIABLES ########
########################################################
###Converision para tipo de dato correcto
###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),
DESERTOR = as.factor(as.character(categoriaBinarizada))
)
#Retiramos el campo Categoría
DataSetUpublicaFRMTO$categoria <- NULL
#Convertimos a Factor a la varaible Objetivo
levels(DataSetUpublicaFRMTO$DESERTOR) <- 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
##############################################
# Resultado DESPUES
DataSetUpublicaFRMTO #### EL NUEVO DATA SET SE ENCUENTRA ORDENADO CRONOLOGICAMENTE
ncol(DataSetUpublicaFRMTO) ### CANTIDAD DE VARIABLES
[1] 18
glimpse(DataSetUpublicaFRMTO)
Observations: 17,018
Variables: 18
$ CUI <chr> "19890258", "19930161", "19932057", "19940844", …
$ Anio_Ingreso <int> 1989, 1993, 1993, 1994, 1995, 1995, 1996, 1996, …
$ periodo_matricula <int> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, …
$ Edad <int> 38, 33, 35, 36, 33, 37, 31, 31, 30, 30, 28, 30, …
$ CREDS__APROBADOS <int> 78, 65, 216, 103, 156, 208, 162, 72, 78, 208, 94…
$ ASIGS__APROBADAS <int> 19, 16, 55, 25, 38, 51, 41, 18, 21, 47, 23, 22, …
$ ASIGS__DESAPROBADAS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ ANO_EGRESO_COLEGIO <int> 23, 18, 19, 11, 15, 21, 15, 10, 11, 15, 13, 14, …
$ PRDO_HASTA_MATRICULA <dbl> 7.82, 9.54, 10.98, 11.03, 11.92, 11.54, 11.22, 8…
$ ProbabDesercion <dbl> 4.98, 4.98, 4.98, 4.98, 4.98, 4.98, 4.98, 4.98, …
$ ESCUELA <fct> INGENIERIA INDUSTRIAL , INGENIERIA …
$ SEXO <fct> M, M, M, M, M, M, M, F, M, M, M, F, F, M, M, F, …
$ LUGAR_NACIMIENTO <fct> Arequipa-Arequipa, Arequipa-Arequipa, Arequipa-A…
$ LUGAR_RESIDENCIA <fct> Arequipa-Arequipa-Yura, Arequipa-Arequipa-Queque…
$ TIPO_COLEGIO <fct> Nacional, Parroquial, Nacional, Nacional, Partic…
$ LUGAR_COLEGIO <fct> Arequipa-Arequipa-Jacobo Hunter, Arequipa-Arequi…
$ MODALIDAD_INGRESO <fct> Ordinario, Ordinario, Ordinario, Profesionales, …
$ DESERTOR <fct> NO, NO, SI, NO, NO, NO, NO, NO, NO, SI, NO, NO, …
## OBSERVAMOS LAS ESCUELAS PROFESIONALES
summary(DataSetUpublicaFRMTO$ESCUELA)
CIENCIA DE LA COMPUTACION INGENIERIA DE SISTEMAS
810 2431
INGENIERIA ELECTRICA INGENIERIA ELECTRONICA
2537 2976
INGENIERIA EN TELECOMUNICACIONES INGENIERIA INDUSTRIAL
802 4163
INGENIERIA MECANICA
3299
##Filtraremos la carreara profesional
DataSetUpublicaFRMTO.RF <-DataSetUpublicaFRMTO[,Var.TodasUprivada] %>% filter(gsub("^\\s+|\\s+$", "",ESCUELA) =="INGENIERIA MECANICA" ) %>% droplevels
####################################################
##ANALISIS DE CANTIDAD DE REGISTROS POR AÑO
#Solo se trabaja con datos hasta el primer semestre del 2017
DataSetUpublicaFRMTO.tmp <- DataSetUpublicaFRMTO[,c( "CUI",Var.TodasUprivada)] %>% filter(gsub("^\\s+|\\s+$", "",ESCUELA) =="INGENIERIA MECANICA" ) %>% droplevels
X <-table(as.factor(DataSetUpublicaFRMTO.tmp$periodo_matricula)) %>% as.data.frame()
colnames(X) <- c("Anio","Cant")
X$ACUMULADO<- cumsum(X$Cant)
X$PorcetAcum = round(100 *X$ACUMULADO / sum(X$Cant))
#Tabla de Frecuencias absolutas y relativas acumuladas por Semestre
X ###
#Para que las variables se visualicen correctamente
for (variable in ListVar.Categ) { levels(DataSetUpublicaFRMTO.RF[,variable]) }
nrow(DataSetUpublicaFRMTO.RF)
[1] 3299
summary(DataSetUpublicaFRMTO.RF$ESCUELA)
INGENIERIA MECANICA
3299
DataSetUpublicaFRMTO.RF$ESCUELA <- NULL
####################################################
####PODEMOS OBSERVAR EL DESBALANCEO DE LAS CLASES
100*prop.table(table(DataSetUpublicaFRMTO.RF$DESERTOR))
NO SI
93.998181 6.001819
summary(DataSetUpublicaFRMTO.RF$DESERTOR)
NO SI
3101 198
DataSetUpublicaFRMTO.RF %>% dplyr::select(DESERTOR) %>%
gather(metric,value) %>%
ggplot(aes(value, fill = metric)) +
geom_bar(show.legend = FALSE) +
facet_wrap(~ metric, scales = "free")
##calculamos las filas para el entrenamiento
TotalFilas <- nrow(DataSetUpublicaFRMTO.RF)
#OBservamos el acumulado y la cantidad de alumnos por semestre
X
#####Se tomara el 68% de las de la data para entremiento y el resto para TEST
TrainFilas <- 2239
#VARIABLES CATEGORICAS
library(dummies)
#Dicotomizacion de variables categoricas
Datos_Dico_cat <- dplyr::select(DataSetUpublicaFRMTO.RF,
SEXO,LUGAR_NACIMIENTO,LUGAR_RESIDENCIA,TIPO_COLEGIO,LUGAR_COLEGIO,MODALIDAD_INGRESO)
Datos_Dico_cat <- dummy.data.frame(Datos_Dico_cat,names=c(
"SEXO","LUGAR_NACIMIENTO","LUGAR_RESIDENCIA","TIPO_COLEGIO","LUGAR_COLEGIO","MODALIDAD_INGRESO"))
colnames(Datos_Dico_cat) <- c("SEXOF" ,"SEXOM" ,
"LUGAR_NACIMIENTOÁncash-Mariscal Luzuriaga" ,"LUGAR_NACIMIENTOApurímac-Abancay" ,
"LUGAR_NACIMIENTOApurímac-Aymaraes" ,"LUGAR_NACIMIENTOApurímac-Chincheros" ,
"LUGAR_NACIMIENTOApurímac-Cotabambas" ,"LUGAR_NACIMIENTOArequipa-Arequipa" ,
"LUGAR_NACIMIENTOArequipa-Camaná" ,"LUGAR_NACIMIENTOArequipa-Caravelí" ,
"LUGAR_NACIMIENTOArequipa-Castilla" ,"LUGAR_NACIMIENTOArequipa-Caylloma" ,
"LUGAR_NACIMIENTOArequipa-Condesuyos" ,"LUGAR_NACIMIENTOArequipa-Islay" ,
"LUGAR_NACIMIENTOArequipa-La Unión" ,"LUGAR_NACIMIENTOAyacucho-Huamanga" ,
"LUGAR_NACIMIENTOAyacucho-Lucanas" ,"LUGAR_NACIMIENTOAyacucho-Parinacochas" ,
"LUGAR_NACIMIENTOCajamarca-Jaén" ,"LUGAR_NACIMIENTOCallao-Callao" ,
"LUGAR_NACIMIENTOCusco-Anta" ,"LUGAR_NACIMIENTOHuancavelica-Huaytará" ,
"LUGAR_NACIMIENTOHuánuco-Dos de Mayo" ,"LUGAR_NACIMIENTOHuánuco-Huánuco" ,
"LUGAR_NACIMIENTOIca-Pisco" ,"LUGAR_NACIMIENTOJunín-Huancayo" ,
"LUGAR_NACIMIENTOJunín-Satipo" ,"LUGAR_NACIMIENTOLambayeque-Chiclayo" ,
"LUGAR_NACIMIENTOMadre de Dios-Manu" ,"LUGAR_NACIMIENTOMadre de Dios-Tahuamanu" ,
"LUGAR_NACIMIENTOMadre de Dios-Tambopata" ,"LUGAR_NACIMIENTOPiura-Ayabaca" ,
"LUGAR_NACIMIENTOPiura-Huancabamba" ,"LUGAR_NACIMIENTOPiura-Morropón" ,
"LUGAR_NACIMIENTOPiura-Paita" ,"LUGAR_NACIMIENTOPiura-Piura" ,
"LUGAR_NACIMIENTOPiura-Sechura" ,"LUGAR_NACIMIENTOPiura-Talara" ,
"LUGAR_NACIMIENTOSan Martín-El Dorado" ,"LUGAR_NACIMIENTOSan Martín-Moyobamba" ,
"LUGAR_NACIMIENTOTumbes-Tumbes" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Alto Selva Alegre" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Arequipa" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Cayma" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Cerro Colorado" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Characato" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Chiguata" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Jacobo Hunter" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-José Luis Bustamante y Rivero","LUGAR_RESIDENCIAArequipa-Arequipa-La Joya" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Mariano Melgar" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Miraflores" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Pocsi" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Polobaya" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Quequeña" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Sabandia" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-San Juan de Tarucani" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Santa Isabel de Siguas" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Santa Rita de Siguas" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Socabaya" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Tiabaya" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Vítor" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Yanahuara" ,"LUGAR_RESIDENCIAArequipa-Arequipa-Yarabamba" ,
"LUGAR_RESIDENCIAArequipa-Arequipa-Yura" ,"TIPO_COLEGIONacional" ,
"TIPO_COLEGIOParroquial" ,"TIPO_COLEGIOParticular" ,
"LUGAR_COLEGIOApurímac-Abancay-Abancay" ,"LUGAR_COLEGIOApurímac-Aymaraes-Chalhuanca" ,
"LUGAR_COLEGIOApurímac-Cotabambas-Haquira" ,"LUGAR_COLEGIOArequipa-Arequipa-Alto Selva Alegre" ,
"LUGAR_COLEGIOArequipa-Arequipa-Arequipa" ,"LUGAR_COLEGIOArequipa-Arequipa-Cayma" ,
"LUGAR_COLEGIOArequipa-Arequipa-Cerro Colorado" ,"LUGAR_COLEGIOArequipa-Arequipa-Characato" ,
"LUGAR_COLEGIOArequipa-Arequipa-Chiguata" ,"LUGAR_COLEGIOArequipa-Arequipa-Jacobo Hunter" ,
"LUGAR_COLEGIOArequipa-Arequipa-José Luis Bustamante y Rivero" ,"LUGAR_COLEGIOArequipa-Arequipa-Mariano Melgar" ,
"LUGAR_COLEGIOArequipa-Arequipa-Polobaya" ,"LUGAR_COLEGIOArequipa-Arequipa-Sabandia" ,
"LUGAR_COLEGIOArequipa-Arequipa-San Juan de Tarucani" ,"LUGAR_COLEGIOArequipa-Arequipa-Santa Isabel de Siguas" ,
"LUGAR_COLEGIOArequipa-Arequipa-Santa Rita de Siguas" ,"LUGAR_COLEGIOArequipa-Arequipa-Tiabaya" ,
"LUGAR_COLEGIOArequipa-Arequipa-Vítor" ,"LUGAR_COLEGIOArequipa-Arequipa-Yanahuara" ,
"LUGAR_COLEGIOArequipa-Arequipa-Yarabamba" ,"LUGAR_COLEGIOArequipa-Arequipa-Yura" ,
"LUGAR_COLEGIOArequipa-Camaná-Camaná" ,"LUGAR_COLEGIOArequipa-Camaná-José María Quimper" ,
"LUGAR_COLEGIOArequipa-Camaná-Mariano Nicolás Valcárcel" ,"LUGAR_COLEGIOArequipa-Camaná-Mariscal Cáceres" ,
"LUGAR_COLEGIOArequipa-Camaná-Nicolás de Piérola" ,"LUGAR_COLEGIOArequipa-Camaná-Quilca" ,
"LUGAR_COLEGIOArequipa-Caravelí-Acarí" ,"LUGAR_COLEGIOArequipa-Caravelí-Caravelí" ,
"LUGAR_COLEGIOArequipa-Caravelí-Cháparra" ,"LUGAR_COLEGIOArequipa-Castilla-Andagua" ,
"LUGAR_COLEGIOArequipa-Castilla-Aplao" ,"LUGAR_COLEGIOArequipa-Castilla-Ayo" ,
"LUGAR_COLEGIOArequipa-Castilla-Huancarqui" ,"LUGAR_COLEGIOArequipa-Castilla-Machaguay" ,
"LUGAR_COLEGIOArequipa-Castilla-Orcopampa" ,"LUGAR_COLEGIOArequipa-Caylloma-Callalli" ,
"LUGAR_COLEGIOArequipa-Caylloma-Chivay" ,"LUGAR_COLEGIOArequipa-Caylloma-Huambo" ,
"LUGAR_COLEGIOArequipa-Caylloma-Ichupampa" ,"LUGAR_COLEGIOArequipa-Caylloma-Lari" ,
"LUGAR_COLEGIOArequipa-Caylloma-Lluta" ,"LUGAR_COLEGIOArequipa-Caylloma-Maca" ,
"LUGAR_COLEGIOArequipa-Caylloma-San Antonio de Chuca" ,"LUGAR_COLEGIOArequipa-Condesuyos-Chuquibamba" ,
"LUGAR_COLEGIOArequipa-Condesuyos-Salamanca" ,"LUGAR_COLEGIOArequipa-Condesuyos-Yanaquihua" ,
"LUGAR_COLEGIOArequipa-Islay-Cocachacra" ,"LUGAR_COLEGIOArequipa-Islay-Deán Valdivia" ,
"LUGAR_COLEGIOArequipa-Islay-Mejía" ,"LUGAR_COLEGIOArequipa-Islay-Mollendo" ,
"LUGAR_COLEGIOArequipa-Islay-Punta de Bombón" ,"LUGAR_COLEGIOArequipa-La Unión-Alca" ,
"LUGAR_COLEGIOArequipa-La Unión-Cotahuasi" ,"LUGAR_COLEGIOArequipa-La Unión-Toro" ,
"LUGAR_COLEGIOAyacucho-Huamanga-Ayacucho" ,"LUGAR_COLEGIOAyacucho-Lucanas-Puquio" ,
"LUGAR_COLEGIOCallao-Callao-Callao" ,"LUGAR_COLEGIOCallao-Callao-La Punta" ,
"LUGAR_COLEGIOHuancavelica-Huancavelica-Huancavelica" ,"LUGAR_COLEGIOHuánuco-Dos de Mayo-La Unión" ,
"LUGAR_COLEGIOHuánuco-Huacaybamba-Huacaybamba" ,"LUGAR_COLEGIOJunín-Chanchamayo-Chanchamayo" ,
"LUGAR_COLEGIOJunín-Yauli-Marcapomacocha" ,"LUGAR_COLEGIOLambayeque-Chiclayo-Eten Puerto" ,
"LUGAR_COLEGIOLambayeque-Chiclayo-La Victoria" ,"LUGAR_COLEGIOLambayeque-Chiclayo-Pucalá" ,
"LUGAR_COLEGIOMadre de Dios-Tahuamanu-Iñapari" ,"LUGAR_COLEGIOMadre de Dios-Tahuamanu-Tahuamanu" ,
"LUGAR_COLEGIOMadre de Dios-Tambopata-Tambopata" ,"LUGAR_COLEGIOPiura-Ayabaca-Ayabaca" ,
"LUGAR_COLEGIOPiura-Huancabamba-San Miguel de El Faique" ,"LUGAR_COLEGIOPiura-Morropón-Buenos Aires" ,
"LUGAR_COLEGIOPiura-Morropón-Chulucanas" ,"LUGAR_COLEGIOPiura-Morropón-San Juan de Bigote" ,
"LUGAR_COLEGIOPiura-Piura-Piura" ,"LUGAR_COLEGIOPiura-Talara-Los Órganos" ,
"LUGAR_COLEGIOPiura-Talara-Máncora" ,"LUGAR_COLEGIOPiura-Talara-Pariñas" ,
"LUGAR_COLEGIOSan Martín-El Dorado-San Martín" ,"LUGAR_COLEGIOSan Martín-Moyobamba-Moyobamba" ,
"MODALIDAD_INGRESOConvenios y Otros" ,"MODALIDAD_INGRESOCPU" ,
"MODALIDAD_INGRESODeportistas Calificados" ,"MODALIDAD_INGRESOOrdinario" ,
"MODALIDAD_INGRESOPrimeros Puestos" ,"MODALIDAD_INGRESOProfesionales" ,
"MODALIDAD_INGRESOTraslados Externos Nacionales" ,"MODALIDAD_INGRESOTraslados Internos" )
#str(DataSetUpublicaFRMTO.RF)
data<- cbind(
DataSetUpublicaFRMTO.RF[,ListVar.Continuas]
,Datos_Dico_cat
,DESERTOR =DataSetUpublicaFRMTO.RF[,"DESERTOR"]
)
##RENOMBRAMOS LAS VARIABLES para que puedan ser mas explicativas Datos_Dico_cat.names
#colnames(data) <- Datos_Dico_cat.names
####### VERIFICAMOS NUEVAMENTE LA DISTRIBUCIÓN DE LA DATA
summary(data[,"DESERTOR"])
NO SI
3101 198
##DENIFIMOS LOS NODOS DE ENTRENAMIENTO
x_trainRF <- data[ (1:TrainFilas),!(names(data) %in% c("DESERTOR"))]#DataSetUpublicaFRMTO.RF[ (1:TrainFilas),]
y_trainRF <- data[ (1:TrainFilas),'DESERTOR']
summary(y_trainRF) ### DATOS PARA ENTRENAMIENTO
NO SI
2128 111
##### DATOS PARA EVALUACION
x_testRF <- data[ ((TrainFilas+1):TotalFilas),!(names(data) %in% c("DESERTOR"))]
y_testRF <- data[ ((TrainFilas+1):TotalFilas),'DESERTOR']
summary(y_testRF)##### DATOS PARA TESTING
NO SI
973 87
No muestra buenos resultados para sensibilidad debido al parecer a que la variable objetivo es imbalanceada
# configurar función de Evaluación del modelos control para Training para el caso REPEAT CROSS VALIDATION
ctrl <- trainControl(method = "cv", number = 10, repeats = 1, summaryFunction = twoClassSummary, classProbs = TRUE)
## configuramos un parametro de RamdomForest para Tunear el modelo.
tunegrid <- expand.grid(.mtry = c(sqrt(ncol(data))))# Opcional
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
y_testRF
NO SI
NO 971 86
SI 2 1
cm_RF <- confusionMatrix(predict(RF_MDL,x_testRF), y_testRF,positive="SI")
cm_RF$byClass
Sensitivity Specificity Pos Pred Value
0.0114942529 0.9979445015 0.3333333333
Neg Pred Value Precision Recall
0.9186376537 0.3333333333 0.0114942529
F1 Prevalence Detection Rate
0.0222222222 0.0820754717 0.0009433962
Detection Prevalence Balanced Accuracy
0.0028301887 0.5047193772
#########################################################
#########################################################
# Create model weights (they sum to one)
model_weights <- ifelse(y_trainRF == "NO",
(1/table(y_trainRF)[1]) * 0.1,
(1/table(y_trainRF)[2]) * 0.9
)
summary(model_weights)
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.699e-05 4.699e-05 4.699e-05 4.466e-04 4.699e-05 8.108e-03
# Use the same seed to ensure same cross-validation splits
ctrl$seeds <- RF_MDL$control$seeds
# Build weighted model
RF_Weight_MDL <- train(x = x_trainRF, y = y_trainRF,
method = "rf",
verbose = FALSE,
weights = model_weights,
metric = "Acurracy",
tuneGrid = tunegrid,
trControl = ctrl)
mc_PredictWeightTuneGrid<- table(predict(RF_Weight_MDL,x_testRF),y_testRF)
mc_PredictWeightTuneGrid
y_testRF
NO SI
NO 971 86
SI 2 1
cm_RF_Weight <- confusionMatrix(predict(RF_Weight_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Weight$byClass
Sensitivity Specificity Pos Pred Value
0.0114942529 0.9979445015 0.3333333333
Neg Pred Value Precision Recall
0.9186376537 0.3333333333 0.0114942529
F1 Prevalence Detection Rate
0.0222222222 0.0820754717 0.0009433962
Detection Prevalence Balanced Accuracy
0.0028301887 0.5047193772
76% para sensitividad
# Build down-sampled model
ctrl$sampling <- "down"
RF_Under_MDL <- train(x = x_trainRF, y = y_trainRF,
method = "rf",
verbose = FALSE,
tuneGrid = tunegrid,
metric = "Acurracy",
trControl = ctrl)
mc_PredictDownTuneGrid<- table(predict(RF_Under_MDL,x_testRF),y_testRF)
mc_PredictDownTuneGrid
y_testRF
NO SI
NO 847 43
SI 126 44
cm_RF_Under <- confusionMatrix(predict(RF_Under_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Under$byClass
Sensitivity Specificity Pos Pred Value
0.50574713 0.87050360 0.25882353
Neg Pred Value Precision Recall
0.95168539 0.25882353 0.50574713
F1 Prevalence Detection Rate
0.34241245 0.08207547 0.04150943
Detection Prevalence Balanced Accuracy
0.16037736 0.68812536
#
ctrl$sampling <- "up"
RF_Over_MDL <- train(x = x_trainRF, y = y_trainRF,
method = "rf",
verbose = FALSE,
metric = "Acurracy",
tuneGrid = tunegrid,
trControl = ctrl)
mc_PredictUpTuneGrid<- table(predict(RF_Over_MDL,x_testRF),y_testRF)
mc_PredictUpTuneGrid
y_testRF
NO SI
NO 950 79
SI 23 8
cm_RF_Over <- confusionMatrix(predict(RF_Over_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Over$byClass
Sensitivity Specificity Pos Pred Value
0.09195402 0.97636177 0.25806452
Neg Pred Value Precision Recall
0.92322643 0.25806452 0.09195402
F1 Prevalence Detection Rate
0.13559322 0.08207547 0.00754717
Detection Prevalence Balanced Accuracy
0.02924528 0.53415790
# Build smote model
ctrl$sampling <- "smote"
RF_Smote_MDL <- train(x = x_trainRF, y = y_trainRF,
method = "rf",
verbose = FALSE,
metric = "Acurracy",
tuneGrid = tunegrid,
trControl = ctrl)
mc_PredictSmoteTuneGrid<- table(predict(RF_Smote_MDL,x_testRF),y_testRF)
mc_PredictSmoteTuneGrid
y_testRF
NO SI
NO 913 62
SI 60 25
cm_RF_Smote <- confusionMatrix(predict(RF_Smote_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Smote$byClass
Sensitivity Specificity Pos Pred Value
0.27586207 0.93833505 0.28571429
Neg Pred Value Precision Recall
0.93545082 0.28571429 0.27586207
F1 Prevalence Detection Rate
0.28070175 0.08207547 0.02264151
Detection Prevalence Balanced Accuracy
0.07924528 0.60709856
#################### #################### ####################
#################### NUEVOS
ctrl <- trainControl(method = "cv", number = 10, repeats = 1, verboseIter = FALSE)
# summary( DataSetUpublicaFRMTO.RF$DESERTOR)
# summary(x_trainRF$DESERTOR)
# summary(x_testRF$DESERTOR)
set.seed(696)
RF_Scale_MDL <- caret::train(x = x_trainRF, y = y_trainRF,
method = "rf", preProcess = c("scale", "center"),
trControl = ctrl)
mc_original<- table(predict(RF_Scale_MDL,x_testRF), y_testRF)
mc_original
y_testRF
NO SI
NO 973 87
SI 0 0
cm_RF_Scale <- confusionMatrix(predict(RF_Scale_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Scale
Confusion Matrix and Statistics
Reference
Prediction NO SI
NO 973 87
SI 0 0
Accuracy : 0.9179
95% CI : (0.8997, 0.9337)
No Information Rate : 0.9179
P-Value [Acc > NIR] : 0.5285
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.00000
Specificity : 1.00000
Pos Pred Value : NaN
Neg Pred Value : 0.91792
Prevalence : 0.08208
Detection Rate : 0.00000
Detection Prevalence : 0.00000
Balanced Accuracy : 0.50000
'Positive' Class : SI
ctrl$sampling <- "down"
set.seed(696)
RF_Under_Scale_MDL <- caret::train(x = x_trainRF, y = y_trainRF,
method = "rf", preProcess = c("scale", "center"),
trControl = ctrl)
mc_originalUnder<- table(predict(RF_Under_Scale_MDL,x_testRF), y_testRF)
mc_originalUnder
y_testRF
NO SI
NO 751 39
SI 222 48
cm_RF_Under_Scale <- confusionMatrix(predict(RF_Under_Scale_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Under_Scale
Confusion Matrix and Statistics
Reference
Prediction NO SI
NO 752 39
SI 221 48
Accuracy : 0.7547
95% CI : (0.7277, 0.7804)
No Information Rate : 0.9179
P-Value [Acc > NIR] : 1
Kappa : 0.1662
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.55172
Specificity : 0.77287
Pos Pred Value : 0.17844
Neg Pred Value : 0.95070
Prevalence : 0.08208
Detection Rate : 0.04528
Detection Prevalence : 0.25377
Balanced Accuracy : 0.66230
'Positive' Class : SI
ctrl$sampling <- "up"
set.seed(696)
RF_Over_Scale_MDL <- caret::train(x = x_trainRF, y = y_trainRF,
method = "rf", preProcess = c("scale", "center"),
trControl = ctrl)
mc_originalOver<- table(predict(RF_Over_Scale_MDL,x_testRF), y_testRF)
mc_originalOver
y_testRF
NO SI
NO 968 81
SI 5 6
cm_RF_Over_Scale <- confusionMatrix(predict(RF_Over_Scale_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Over_Scale
Confusion Matrix and Statistics
Reference
Prediction NO SI
NO 968 81
SI 5 6
Accuracy : 0.9189
95% CI : (0.9008, 0.9346)
No Information Rate : 0.9179
P-Value [Acc > NIR] : 0.4839
Kappa : 0.106
Mcnemar's Test P-Value : 6.092e-16
Sensitivity : 0.06897
Specificity : 0.99486
Pos Pred Value : 0.54545
Neg Pred Value : 0.92278
Prevalence : 0.08208
Detection Rate : 0.00566
Detection Prevalence : 0.01038
Balanced Accuracy : 0.53191
'Positive' Class : SI
ctrl$sampling <- "smote"
set.seed(696)
RF_Smote_Scale_MDL <- caret::train(x = x_trainRF, y = y_trainRF,
method = "rf", preProcess = c("scale", "center"),
trControl = ctrl)
mc_originalSmote<- table(predict(RF_Smote_Scale_MDL,x_testRF), y_testRF)
mc_originalSmote
y_testRF
NO SI
NO 973 87
SI 0 0
cm_RF_Smote_Scale <- confusionMatrix(predict(RF_Smote_Scale_MDL,x_testRF), y_testRF,positive="SI")
cm_RF_Smote_Scale
Confusion Matrix and Statistics
Reference
Prediction NO SI
NO 973 87
SI 0 0
Accuracy : 0.9179
95% CI : (0.8997, 0.9337)
No Information Rate : 0.9179
P-Value [Acc > NIR] : 0.5285
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.00000
Specificity : 1.00000
Pos Pred Value : NaN
Neg Pred Value : 0.91792
Prevalence : 0.08208
Detection Rate : 0.00000
Detection Prevalence : 0.00000
Balanced Accuracy : 0.50000
'Positive' Class : SI
library("RWeka")
set.seed(696)
ADj48_Lcaret_MDL <- train(x = x_trainRF,y = y_trainRF,
method = "J48"#,preProcess = c("scale", "center"),
#tuneGrid = hiperparametros,
#metric = "Accuracy",
#trControl = ctrl
)
mc_ADj48_Lcaret<- table(predict(ADj48_Lcaret_MDL,x_testRF), y_testRF)
mc_ADj48_Lcaret
y_testRF
NO SI
NO 973 87
SI 0 0
cm_ADj48_Lcaret <- confusionMatrix(predict(ADj48_Lcaret_MDL,x_testRF), y_testRF,positive="SI")
cm_ADj48_Lcaret$byClass
Sensitivity Specificity Pos Pred Value
0.00000000 1.00000000 NaN
Neg Pred Value Precision Recall
0.91792453 NA 0.00000000
F1 Prevalence Detection Rate
NA 0.08207547 0.00000000
Detection Prevalence Balanced Accuracy
0.00000000 0.50000000
###CON CARET
ctrl$sampling <- "down"
ADj48_Lcaret_scale_down_MDL <- caret::train(x_trainRF,y_trainRF,method ='J48',preProcess = c("scale", "center"),trControl = ctrl)
mc_ADj48_Lcaret_scale_down<- table(predict(ADj48_Lcaret_scale_down_MDL,x_testRF), y_testRF)
mc_ADj48_Lcaret_scale_down
y_testRF
NO SI
NO 811 45
SI 162 42
cm_ADj48_Lcaret_scale_down <- confusionMatrix(predict(ADj48_Lcaret_scale_down_MDL,x_testRF), y_testRF,positive="SI")
cm_ADj48_Lcaret_scale_down$byClass
Sensitivity Specificity Pos Pred Value
0.48275862 0.83350462 0.20588235
Neg Pred Value Precision Recall
0.94742991 0.20588235 0.48275862
F1 Prevalence Detection Rate
0.28865979 0.08207547 0.03962264
Detection Prevalence Balanced Accuracy
0.19245283 0.65813162
NaiveBayes_MDL <- naiveBayes(x_trainRF,y_trainRF)
mc_originalBayesiano<- table(predict(NaiveBayes_MDL,x_testRF), y_testRF)
mc_originalBayesiano
y_testRF
NO SI
NO 0 0
SI 973 87
cm_NaiveBayes <- confusionMatrix(predict(NaiveBayes_MDL,x_testRF), y_testRF,positive="SI")
cm_NaiveBayes
Confusion Matrix and Statistics
Reference
Prediction NO SI
NO 0 0
SI 973 87
Accuracy : 0.0821
95% CI : (0.0663, 0.1003)
No Information Rate : 0.9179
P-Value [Acc > NIR] : 1
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 1.00000
Specificity : 0.00000
Pos Pred Value : 0.08208
Neg Pred Value : NaN
Prevalence : 0.08208
Detection Rate : 0.08208
Detection Prevalence : 1.00000
Balanced Accuracy : 0.50000
'Positive' Class : SI
#################################################################################################################
################################### RESUMEN DE RESULTADOS #######################################################
# #################################################################################################################
models <- list( RF = RF_MDL,
RF_Weight = RF_Weight_MDL,
RF_Under = RF_Under_MDL,
RF_Over = RF_Over_MDL,
RF_Smote = RF_Smote_MDL,
RF_Scale = RF_Scale_MDL,
RF_Under_Scale = RF_Under_Scale_MDL,
RF_Over_Scale = RF_Over_Scale_MDL,
RF_Smote_Scale = RF_Smote_Scale_MDL,
ADj48_Lcaret = ADj48_Lcaret_MDL,
ADj48_Lcaret_scale_down = ADj48_Lcaret_scale_down_MDL,
NaiveBayes = NaiveBayes_MDL
)
# 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 ={rowModel<- 1},
RF_Weight ={rowModel<- 2},
RF_Under ={rowModel<- 3},
RF_Over ={rowModel<- 4}, #smote
RF_Smote ={rowModel<- 5}, #Bayesiano
RF_Scale ={rowModel<- 6},
RF_Under_Scale ={rowModel<- 7},
RF_Under_Over ={rowModel<- 8},
RF_Under_Smote ={rowModel<- 9},
ADj48_Lcaret ={rowModel<- 10},
ADj48_Lcaret_scale_down ={rowModel<- 11},
NaiveBayes = {rowModel<- 12}
)
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="UPUBLICA_IngMecanica2020.csv", sep=",",row.names = FALSE)