A Universidade Federal de Campina Grande (UFCG), assim como muitas universidades brasileiras, sofre com o problema da evasão de alunos. Tendo como motivação o problema que deixa um número relevante de vagas ociosas no ensino público, neste relatório será feito um modelo de predição na intenção de descobrir, antecipadamente, quando um aluno irá ou não abandonar o seu curso, considerando que ele está cursando o quinto período. Ao final da análise, será gerado um arquido com os dados da predição do modelo promovido, que será submetido em uma competição no Kaggle disponível neste link.
Os dados utilizados fazem parte de uma amostra disciplinas cursadas por alunos da Universidade Federal de Campina Grande, dos cursos de Engenharia Elétrica e Enfermagem, e a predição será feita através de um modelo construído a partir dos dados fornecidos na amostra.
Segue abaixo um sumário da amostra.
library(dplyr, quietly = TRUE)
library(ggplot2, quietly = TRUE)
library(caret)
library(C50)
training_evasao <- read.csv(file = "training_evasao.csv", header=TRUE, sep=",")
summary(training_evasao)
## ID MATRICULA COD_CURSO
## Min. : 1 Min. : 2636462 Min. :12204100
## 1st Qu.: 4739 1st Qu.:249727234 1st Qu.:14123100
## Median : 9478 Median :508993893 Median :14123100
## Mean : 9581 Mean :501522998 Mean :13677419
## 3rd Qu.:14216 3rd Qu.:745324313 3rd Qu.:14123100
## Max. :19536 Max. :999280527 Max. :14123100
##
## CURSO PERIODO CODIGO
## ENFERMAGEM - D : 4402 Min. :2002 Min. :1105013
## ENGENHARIA ELÉTRICA:14552 1st Qu.:2009 1st Qu.:1109103
## Median :2011 Median :1201136
## Mean :2010 Mean :1246218
## 3rd Qu.:2012 3rd Qu.:1404139
## Max. :2013 Max. :1503072
##
## DISCIPLINA CREDITOS
## INTRODUCAO A PROGRAMACAO : 1436 Min. :0.000
## INTRODUCAO A ENGENHARIA ELETRICA : 1392 1st Qu.:3.000
## CIÊNCIAS DO AMBIENTE : 1377 Median :4.000
## EXPRESSAO GRAFICA : 1355 Mean :3.536
## ÁLGEBRA VETORIAL E GEOMETRIA ANALÍTICA: 1341 3rd Qu.:4.000
## CALCULO DIFERENCIAL E INTEGRAL I : 1334 Max. :8.000
## (Other) :10719
## DEPARTAMENTO MEDIA
## UNID. ACAD. DE CIÊNCIAS DA SAÚDE (UACS):4402 Min. : 0.000
## UNID. ACAD. DE ENGENHARIA ELÉTRICA :3494 1st Qu.: 4.000
## UNID. ACAD. DE MATEMÁTICA :3374 Median : 7.000
## UNID. ACAD. DE FÍSICA :2102 Mean : 5.904
## UNID. ACAD. DE SISTEMAS E COMPUTAÇÃO :1695 3rd Qu.: 8.200
## UNID. ACAD. DE ENGENHARIA CIVIL :1420 Max. :10.000
## (Other) :2467 NA's :529
## SITUACAO PERIODO_INGRESSO PERIODO_RELATIVO
## Aprovado :13438 Min. :2002 Min. :1.000
## Reprovado : 2906 1st Qu.:2008 1st Qu.:1.000
## Reprovado por Falta: 2049 Median :2010 Median :1.000
## Trancado : 561 Mean :2009 Mean :2.141
## 3rd Qu.:2011 3rd Qu.:5.000
## Max. :2013 Max. :5.000
##
## COD_EVASAO
## Min. :0.00000
## 1st Qu.:0.00000
## Median :0.00000
## Mean :0.09291
## 3rd Qu.:0.00000
## Max. :1.00000
##
Para o processo de predição, foram consideradas relevantes as variáveis “CURSO”, “MEDIA”, e “SITUACAO”, devido a sua importância para a identificação dos perfis dos universitários, e “CREDITOS” e “PERIODO_INGRESSO” para criação de novas variáveis.
alunos_quinto_periodo <- training_evasao %>% filter(PERIODO_RELATIVO == 5)
alunos_quinto_periodo <- alunos_quinto_periodo %>% select(ID,MATRICULA,CURSO,PERIODO_INGRESSO,CREDITOS, MEDIA, SITUACAO, COD_EVASAO)
alunos_quinto_periodo$COD_EVASAO <- as.factor(alunos_quinto_periodo$COD_EVASAO)
alunos_quinto_periodo$MATRICULA <- as.factor(alunos_quinto_periodo$MATRICULA)
str(alunos_quinto_periodo)
## 'data.frame': 5408 obs. of 8 variables:
## $ ID : int 1 3 7 8 9 10 12 14 25 26 ...
## $ MATRICULA : Factor w/ 925 levels "2714857","2791762",..: 677 677 677 677 677 677 677 677 717 717 ...
## $ CURSO : Factor w/ 2 levels "ENFERMAGEM - D",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ PERIODO_INGRESSO: num 2002 2002 2002 2002 2002 ...
## $ CREDITOS : int 4 4 4 1 4 4 4 1 2 4 ...
## $ MEDIA : num 7 7.6 7.9 2.7 NA 6.8 7.1 8 NA 0 ...
## $ SITUACAO : Factor w/ 4 levels "Aprovado","Reprovado",..: 1 1 1 2 4 1 1 1 4 3 ...
## $ COD_EVASAO : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
Além das variáveis escolhidas, também é necessária a utilização de outras informações, ainda não disponibilizadas diretamente pelo dataset, para o treinamento do modelo de predição. Para tanto, foram geradas novas variáveis através do processo de sumarização. Segue abaixo a listagem e descrição de cada variável criada e o codigo utilizado.
df <- alunos_quinto_periodo %>% group_by(MATRICULA, CURSO, COD_EVASAO) %>% summarise(
MEDIA = round(sum(MEDIA, na.rm = TRUE)/(n() -(ifelse(NA %in% MEDIA, count_NAs(MEDIA) ,0))),digits=2),
TEM_APROVACAO=ifelse("Aprovado" %in% SITUACAO, TRUE, FALSE),
TEM_REPROV_POR_NOTA=ifelse("Reprovado" %in% SITUACAO, TRUE, FALSE),
TEM_REPROV_POR_FALTA=ifelse("Reprovado por Falta" %in% SITUACAO,TRUE,FALSE),
MEDIA_ZERO=ifelse(MEDIA == 0, TRUE, FALSE),
REP_POR_FALTA_E_MEDIA_ZERO = ( TEM_REPROV_POR_FALTA && MEDIA_ZERO),
POS_REUNI = ifelse(head(PERIODO_INGRESSO, n =1) > "2008.2", TRUE, FALSE),
TOTAL_CREDITOS=sum(CREDITOS))
summary(df)
## MATRICULA CURSO COD_EVASAO MEDIA
## 2714857: 1 ENFERMAGEM - D :191 0:859 Min. :0.000
## 2791762: 1 ENGENHARIA ELÉTRICA:734 1: 66 1st Qu.:4.540
## 3521919: 1 Median :6.490
## 5608990: 1 Mean :5.887
## 6147697: 1 3rd Qu.:7.780
## 6420105: 1 Max. :9.470
## (Other):919 NA's :16
## TEM_APROVACAO TEM_REPROV_POR_NOTA TEM_REPROV_POR_FALTA MEDIA_ZERO
## Mode :logical Mode :logical Mode :logical Mode :logical
## FALSE:91 FALSE:495 FALSE:706 FALSE:873
## TRUE :834 TRUE :430 TRUE :219 TRUE :36
## NA's :0 NA's :0 NA's :0 NA's :16
##
##
##
## REP_POR_FALTA_E_MEDIA_ZERO POS_REUNI TOTAL_CREDITOS
## Mode :logical Mode :logical Min. : 3.00
## FALSE:891 FALSE:332 1st Qu.:20.00
## TRUE :34 TRUE :593 Median :23.00
## NA's :0 NA's :0 Mean :22.64
## 3rd Qu.:26.00
## Max. :36.00
##
df <- df[c(2,4,5,6,7,8,9,10,11,3)] #Reordenando as colunas
df$TEM_APROVACAO <- as.factor(df$TEM_APROVACAO)
df$TEM_REPROV_POR_NOTA <- as.factor(df$TEM_REPROV_POR_NOTA)
df$TEM_REPROV_POR_FALTA <- as.factor(df$TEM_REPROV_POR_FALTA)
df$MEDIA_ZERO <- as.factor(df$MEDIA_ZERO)
df$REP_POR_FALTA_E_MEDIA_ZERO <- as.factor(df$REP_POR_FALTA_E_MEDIA_ZERO)
df$POS_REUNI <- as.factor(df$POS_REUNI)
df <- data.frame(df)
str(df)
## 'data.frame': 925 obs. of 10 variables:
## $ CURSO : Factor w/ 2 levels "ENFERMAGEM - D",..: 2 2 1 2 1 1 1 2 2 2 ...
## $ MEDIA : num 7.12 1.78 7.1 0 8.36 7.95 8.47 0 6 6.98 ...
## $ TEM_APROVACAO : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 1 2 2 2 1 2 2 ...
## $ TEM_REPROV_POR_NOTA : Factor w/ 2 levels "FALSE","TRUE": 1 2 1 1 1 1 1 1 2 1 ...
## $ TEM_REPROV_POR_FALTA : Factor w/ 2 levels "FALSE","TRUE": 1 2 1 2 1 1 1 2 1 1 ...
## $ MEDIA_ZERO : Factor w/ 2 levels "FALSE","TRUE": 1 1 1 2 1 1 1 2 1 1 ...
## $ REP_POR_FALTA_E_MEDIA_ZERO: Factor w/ 2 levels "FALSE","TRUE": 1 1 1 2 1 1 1 2 1 1 ...
## $ POS_REUNI : Factor w/ 2 levels "FALSE","TRUE": 2 1 2 1 2 2 2 1 2 1 ...
## $ TOTAL_CREDITOS : int 23 22 10 5 36 28 28 17 18 26 ...
## $ COD_EVASAO : Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 2 1 1 ...
Agora que temos um dataframe com todas as variáveis consideradas interessantes para analisar o modelo, dividiremos o conjunto de dados em conjuntos de treino e teste. Será feito, então, um treinamento do modelo com uma parte dos dados da amostra e, em seguida, este será testado com a outra parte da amostra, afim de verificar o nível de acerto das suas predições.
trainIndex <- createDataPartition(df$COD_EVASAO, p = .90, list = FALSE, times = 1)
dfTrain <- df[trainIndex,]
dfTest <- df[-trainIndex,]
O modelo será treinado através da técnica de floresta de árvores aleatórias.
Sys.setlocale(locale = "C")
## [1] "C/C/C/C/C/en_IE.UTF-8"
modelo_de_teste <- C5.0(dfTrain[-10],dfTrain$COD_EVASAO, trials = 10)
modelo_de_teste
##
## Call:
## C5.0.default(x = dfTrain[-10], y = dfTrain$COD_EVASAO, trials = 10)
##
## Classification Tree
## Number of samples: 834
## Number of predictors: 9
##
## Number of boosting iterations: 10 requested; 1 used due to early stopping
##
## Non-standard options: attempt to group attributes
summary(modelo_de_teste)
##
## Call:
## C5.0.default(x = dfTrain[-10], y = dfTrain$COD_EVASAO, trials = 10)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Jul 29 20:34:03 2015
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 834 cases (10 attributes) from undefined.data
##
## ----- Trial 0: -----
##
## Decision tree:
## 0 (834/60)
##
## ----- Trial 1: -----
##
## Decision tree:
## 0 (834/238.5)
##
## *** boosting reduced to 1 trial since last classifier is very inaccurate
##
## *** boosting abandoned (too few classifiers)
##
##
## Evaluation on training data (834 cases):
##
## Decision Tree
## ----------------
## Size Errors
##
## 1 60( 7.2%) <<
##
##
## (a) (b) <-classified as
## ---- ----
## 774 (a): class 0
## 60 (b): class 1
##
##
## Time: 0.0 secs
Façamos agora o teste de predição através da função predict. Seguem abaixo os resultados obtidos.
teste_predicao <- predict(modelo_de_teste, dfTest)
summary(teste_predicao)
## 0 1
## 91 0
summary(dfTest$COD_EVASAO)
## 0 1
## 85 6
Percentual de acerto:
num_acertos <- sum(teste_predicao == dfTest$COD_EVASAO)
num_acertos/length(dfTest$COD_EVASAO)
## [1] 0.9340659
Para avaliar a precisão da predição, será utilizado como métrica o F-mesure, que consiste em uma média ponderada de precisao e recall. Seguem abaixo a matriz de confusão utilizada para o cálculo e o F-measure.
df_resp <- data.frame(teste_predicao, COD_EVASAO=dfTest$COD_EVASAO, row.names=NULL)
matriz_de_confusao <- table(df_resp)
matriz_de_confusao
## COD_EVASAO
## teste_predicao 0 1
## 0 85 6
## 1 0 0
df_resp$teste_predicao <- as.numeric(df_resp$teste_predicao) - 1
df_resp$COD_EVASAO <- as.numeric(df_resp$COD_EVASAO) - 1
str(df_resp)
## 'data.frame': 91 obs. of 2 variables:
## $ teste_predicao: num 0 0 0 0 0 0 0 0 0 0 ...
## $ COD_EVASAO : num 0 0 0 0 0 0 0 0 0 0 ...
summary(df_resp)
## teste_predicao COD_EVASAO
## Min. :0 Min. :0.00000
## 1st Qu.:0 1st Qu.:0.00000
## Median :0 Median :0.00000
## Mean :0 Mean :0.06593
## 3rd Qu.:0 3rd Qu.:0.00000
## Max. :0 Max. :1.00000
retrieved <- sum(df_resp$teste_predicao)
precision <- matriz_de_confusao[4]/(matriz_de_confusao[4] + matriz_de_confusao[2])
recall <- matriz_de_confusao[4] / (matriz_de_confusao[4] + matriz_de_confusao[3])
F_measure <- 2 * (precision * recall) / (precision + recall)
F_measure
## [1] NaN
Agora, os dados que anteriormente foram divididos em grupos de treino e teste serão utilizados inteiramente para teste e será feita a predição em um segundo dataset. Desta forma, será criado um nomo modelo, que será utilizado para os dados deste novo dataset.
modelo_de_submissao <- C5.0(df[-10],df$COD_EVASAO, trials = 10)
modelo_de_submissao
##
## Call:
## C5.0.default(x = df[-10], y = df$COD_EVASAO, trials = 10)
##
## Classification Tree
## Number of samples: 925
## Number of predictors: 9
##
## Number of boosting iterations: 10
## Average tree size: 9.5
##
## Non-standard options: attempt to group attributes
summary(modelo_de_submissao)
##
## Call:
## C5.0.default(x = df[-10], y = df$COD_EVASAO, trials = 10)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Jul 29 20:34:03 2015
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 925 cases (10 attributes) from undefined.data
##
## ----- Trial 0: -----
##
## Decision tree:
##
## REP_POR_FALTA_E_MEDIA_ZERO = TRUE:
## :...POS_REUNI = TRUE: 1 (7)
## : POS_REUNI = FALSE:
## : :...TOTAL_CREDITOS <= 5: 1 (4)
## : TOTAL_CREDITOS > 5: 0 (23/7)
## REP_POR_FALTA_E_MEDIA_ZERO = FALSE:
## :...TEM_APROVACAO = TRUE: 0 (834/30)
## TEM_APROVACAO = FALSE:
## :...CURSO = ENFERMAGEM - D: 1 (6/2)
## CURSO = ENGENHARIA ELÉTRICA:
## :...TOTAL_CREDITOS <= 9: 1 (4/1)
## TOTAL_CREDITOS > 9:
## :...TOTAL_CREDITOS <= 16: 0 (9)
## TOTAL_CREDITOS > 16:
## :...TEM_REPROV_POR_FALTA = TRUE: 0 (26/6)
## TEM_REPROV_POR_FALTA = FALSE:
## :...POS_REUNI = FALSE: 1 (8/3)
## POS_REUNI = TRUE: 0 (4)
##
## ----- Trial 1: -----
##
## Decision tree:
##
## REP_POR_FALTA_E_MEDIA_ZERO = TRUE: 1 (57.2/12.2)
## REP_POR_FALTA_E_MEDIA_ZERO = FALSE:
## :...TEM_REPROV_POR_FALTA = FALSE: 0 (646.3/101.6)
## TEM_REPROV_POR_FALTA = TRUE:
## :...MEDIA > 6.5: 1 (22.4/1.5)
## MEDIA <= 6.5:
## :...TEM_REPROV_POR_NOTA = FALSE: 0 (26)
## TEM_REPROV_POR_NOTA = TRUE:
## :...MEDIA <= 1.62: 1 (61.6/18.3)
## MEDIA > 1.62: 0 (111.5/31.3)
##
## ----- Trial 2: -----
##
## Decision tree:
##
## TOTAL_CREDITOS > 24: 0 (329.3/49.4)
## TOTAL_CREDITOS <= 24:
## :...CURSO = ENFERMAGEM - D: 0 (51.8/12.6)
## CURSO = ENGENHARIA ELÉTRICA:
## :...TOTAL_CREDITOS > 17: 0 (370.5/130.3)
## TOTAL_CREDITOS <= 17:
## :...TEM_REPROV_POR_FALTA = FALSE: 1 (81.5/27.5)
## TEM_REPROV_POR_FALTA = TRUE: 0 (91.9/40.9)
##
## ----- Trial 3: -----
##
## Decision tree:
##
## TOTAL_CREDITOS > 24: 0 (298.5/61.1)
## TOTAL_CREDITOS <= 24:
## :...REP_POR_FALTA_E_MEDIA_ZERO = TRUE: 1 (79/25.4)
## REP_POR_FALTA_E_MEDIA_ZERO = FALSE:
## :...TEM_REPROV_POR_NOTA = FALSE: 0 (204/65.7)
## TEM_REPROV_POR_NOTA = TRUE:
## :...POS_REUNI = FALSE:
## :...TOTAL_CREDITOS <= 23: 0 (125.8/36.2)
## : TOTAL_CREDITOS > 23: 1 (20.1/3.6)
## POS_REUNI = TRUE:
## :...MEDIA > 6.26: 0 (15.1)
## MEDIA <= 6.26:
## :...CURSO = ENFERMAGEM - D: 1 (9.8/1.6)
## CURSO = ENGENHARIA ELÉTRICA:
## :...TEM_APROVACAO = FALSE: 0 (25.4/9.9)
## TEM_APROVACAO = TRUE:
## :...TOTAL_CREDITOS <= 15: 1 (20.9/0.5)
## TOTAL_CREDITOS > 15:
## :...MEDIA <= 2.45: 1 (24.9/3.1)
## MEDIA > 2.45: 0 (101.4/45.1)
##
## ----- Trial 4: -----
##
## Decision tree:
##
## CURSO = ENFERMAGEM - D: 0 (120.7/29.4)
## CURSO = ENGENHARIA ELÉTRICA:
## :...TOTAL_CREDITOS <= 5: 1 (25.4/4.4)
## TOTAL_CREDITOS > 5:
## :...TOTAL_CREDITOS > 24:
## :...MEDIA <= 8.28: 0 (181.2/46.8)
## : MEDIA > 8.28: 1 (27.1/7.5)
## TOTAL_CREDITOS <= 24:
## :...TEM_APROVACAO = FALSE:
## :...TOTAL_CREDITOS <= 16: 0 (60.9/22.4)
## : TOTAL_CREDITOS > 16: 1 (115.2/43.9)
## TEM_APROVACAO = TRUE:
## :...TEM_REPROV_POR_NOTA = FALSE: 0 (130.4/47.6)
## TEM_REPROV_POR_NOTA = TRUE:
## :...TOTAL_CREDITOS <= 15: 1 (22.1/4.9)
## TOTAL_CREDITOS > 15:
## :...POS_REUNI = FALSE: 0 (97.9/33.5)
## POS_REUNI = TRUE:
## :...MEDIA <= 6.26: 1 (132.6/59.9)
## MEDIA > 6.26: 0 (11.4)
##
## ----- Trial 5: -----
##
## Decision tree:
##
## TEM_APROVACAO = FALSE:
## :...POS_REUNI = TRUE: 1 (84.2/24)
## : POS_REUNI = FALSE:
## : :...TOTAL_CREDITOS > 24: 0 (24.6)
## : TOTAL_CREDITOS <= 24:
## : :...TEM_REPROV_POR_FALTA = FALSE: 1 (31.3/10.7)
## : TEM_REPROV_POR_FALTA = TRUE: 0 (121.9/57.7)
## TEM_APROVACAO = TRUE:
## :...CURSO = ENFERMAGEM - D: 0 (81.7/7.4)
## CURSO = ENGENHARIA ELÉTRICA:
## :...POS_REUNI = TRUE:
## :...TOTAL_CREDITOS <= 15: 1 (17.9/2.9)
## : TOTAL_CREDITOS > 15: 0 (321/96.3)
## POS_REUNI = FALSE:
## :...MEDIA > 8.16: 1 (35.1/1.1)
## MEDIA <= 8.16:
## :...MEDIA > 6.98: 0 (23.2)
## MEDIA <= 6.98:
## :...TOTAL_CREDITOS <= 20: 0 (40.6/7.3)
## TOTAL_CREDITOS > 20:
## :...TOTAL_CREDITOS <= 24: 1 (89.1/36)
## TOTAL_CREDITOS > 24: 0 (54.4/17.6)
##
## ----- Trial 6: -----
##
## Decision tree:
##
## TEM_APROVACAO = FALSE:
## :...CURSO = ENFERMAGEM - D: 1 (28.4/7)
## : CURSO = ENGENHARIA ELÉTRICA:
## : :...MEDIA <= 0.43: 1 (151.1/64)
## : MEDIA > 0.43: 0 (89.4/32.6)
## TEM_APROVACAO = TRUE:
## :...CURSO = ENFERMAGEM - D: 0 (72.1/8.5)
## CURSO = ENGENHARIA ELÉTRICA:
## :...TOTAL_CREDITOS > 26: 1 (51.3/20.1)
## TOTAL_CREDITOS <= 26:
## :...TOTAL_CREDITOS > 24: 0 (71.9)
## TOTAL_CREDITOS <= 24:
## :...MEDIA > 7.93: 1 (44.2/12.3)
## MEDIA <= 7.93:
## :...MEDIA > 6.98: 0 (30.8)
## MEDIA <= 6.98:
## :...MEDIA > 6.73: 1 (38.4/12.4)
## MEDIA <= 6.73:
## :...POS_REUNI = FALSE: 0 (145.2/27.9)
## POS_REUNI = TRUE:
## :...TEM_REPROV_POR_NOTA = FALSE: 0 (13.2)
## TEM_REPROV_POR_NOTA = TRUE:
## :...TEM_REPROV_POR_FALTA = TRUE: 0 (51.5/17)
## TEM_REPROV_POR_FALTA = FALSE:
## :...TOTAL_CREDITOS <= 15: 1 (7.7)
## TOTAL_CREDITOS > 15: 0 (127.6/60.5)
##
## ----- Trial 7: -----
##
## Decision tree:
##
## TEM_APROVACAO = FALSE:
## :...CURSO = ENFERMAGEM - D: 1 (27.9/9.2)
## : CURSO = ENGENHARIA ELÉTRICA:
## : :...TOTAL_CREDITOS <= 6: 1 (30.1/9.1)
## : TOTAL_CREDITOS > 6: 0 (225.8/100.1)
## TEM_APROVACAO = TRUE:
## :...TEM_REPROV_POR_FALTA = TRUE:
## :...MEDIA <= 6.5: 0 (140.5/35.5)
## : MEDIA > 6.5: 1 (33/3.7)
## TEM_REPROV_POR_FALTA = FALSE:
## :...POS_REUNI = FALSE:
## :...MEDIA <= 8.16: 0 (146.2/23.1)
## : MEDIA > 8.16: 1 (32.1/6.6)
## POS_REUNI = TRUE:
## :...MEDIA <= 2.52: 1 (14.5/2.8)
## MEDIA > 2.52: 0 (267/29.2)
##
## ----- Trial 8: -----
##
## Decision tree:
##
## TEM_APROVACAO = TRUE:
## :...TOTAL_CREDITOS <= 15: 1 (47.1/20.6)
## : TOTAL_CREDITOS > 15:
## : :...TEM_REPROV_POR_FALTA = FALSE: 0 (354.4/25.1)
## : TEM_REPROV_POR_FALTA = TRUE:
## : :...MEDIA <= 6.75: 0 (117.9/17.3)
## : MEDIA > 6.75: 1 (19)
## TEM_APROVACAO = FALSE:
## :...TOTAL_CREDITOS <= 10: 0 (53/18.3)
## TOTAL_CREDITOS > 10:
## :...MEDIA > 0.43: 0 (58.6/20.2)
## MEDIA <= 0.43:
## :...POS_REUNI = TRUE: 1 (89.6/15.7)
## POS_REUNI = FALSE:
## :...TOTAL_CREDITOS <= 24: 1 (150.4/42)
## TOTAL_CREDITOS > 24: 0 (16.1)
##
## ----- Trial 9: -----
##
## Decision tree:
##
## TEM_APROVACAO = TRUE: 0 (508.4/37.6)
## TEM_APROVACAO = FALSE:
## :...TOTAL_CREDITOS <= 5: 1 (41/8.2)
## TOTAL_CREDITOS > 5:
## :...TOTAL_CREDITOS <= 10: 0 (20.4)
## TOTAL_CREDITOS > 10:
## :...REP_POR_FALTA_E_MEDIA_ZERO = TRUE: 1 (135.2/51.6)
## REP_POR_FALTA_E_MEDIA_ZERO = FALSE:
## :...TOTAL_CREDITOS <= 16: 0 (25.7/3.1)
## TOTAL_CREDITOS > 16:
## :...TOTAL_CREDITOS <= 17: 1 (20.6/1.3)
## TOTAL_CREDITOS > 17:
## :...TOTAL_CREDITOS <= 27: 0 (136.8/61.1)
## TOTAL_CREDITOS > 27: 1 (8.9)
##
##
## Evaluation on training data (925 cases):
##
## Trial Decision Tree
## ----- ----------------
## Size Errors
##
## 0 10 49( 5.3%)
## 1 6 76( 8.2%)
## 2 5 95(10.3%)
## 3 11 68( 7.4%)
## 4 11 164(17.7%)
## 5 12 128(13.8%)
## 6 14 146(15.8%)
## 7 9 55( 5.9%)
## 8 9 83( 9.0%)
## 9 8 56( 6.1%)
## boost 47( 5.1%) <<
##
##
## (a) (b) <-classified as
## ---- ----
## 850 9 (a): class 0
## 38 28 (b): class 1
##
##
## Attribute usage:
##
## 100.00% CURSO
## 100.00% TEM_APROVACAO
## 100.00% REP_POR_FALTA_E_MEDIA_ZERO
## 100.00% TOTAL_CREDITOS
## 99.68% POS_REUNI
## 98.92% TEM_REPROV_POR_FALTA
## 98.27% MEDIA
## 59.57% TEM_REPROV_POR_NOTA
##
##
## Time: 0.0 secs
A seguir, é feita a sumarização novamente, desta vez para os novos dados de teste necessários para realizar a prediçao.
test_second_round_kaggle <- read.csv(file = "test_second_round_kaggle.csv", header=TRUE, sep=",")
df_teste <- test_second_round_kaggle %>% group_by(MATRICULA, CURSO) %>% summarise(
MEDIA = round(sum(MEDIA, na.rm = TRUE)/(n() -(ifelse(NA %in% MEDIA, count_NAs(MEDIA) ,0))),digits=2),
TEM_APROVACAO=ifelse("Aprovado" %in% SITUACAO, TRUE, FALSE),
TEM_REPROV_POR_NOTA=ifelse("Reprovado" %in% SITUACAO, TRUE, FALSE),
TEM_REPROV_POR_FALTA=ifelse("Reprovado por Falta" %in% SITUACAO,TRUE,FALSE),
MEDIA_ZERO=ifelse(MEDIA == 0, TRUE, FALSE),
REP_POR_FALTA_E_MEDIA_ZERO = ( TEM_REPROV_POR_FALTA && MEDIA_ZERO),
POS_REUNI = ifelse(head(PERIODO_INGRESSO, n =1) > "2008.2", TRUE, FALSE),
TOTAL_CREDITOS=sum(CREDITOS))
df_teste$TEM_APROVACAO <- as.factor(df_teste$TEM_APROVACAO)
df_teste$TEM_REPROV_POR_NOTA <- as.factor(df_teste$TEM_REPROV_POR_NOTA)
df_teste$TEM_REPROV_POR_FALTA <- as.factor(df_teste$TEM_REPROV_POR_FALTA)
df_teste$MEDIA_ZERO <- as.factor(df_teste$MEDIA_ZERO)
df_teste$REP_POR_FALTA_E_MEDIA_ZERO <- as.factor(df_teste$REP_POR_FALTA_E_MEDIA_ZERO)
df_teste <- data.frame(df_teste)
df_teste$POS_REUNI <- as.factor(df_teste$POS_REUNI)
str(df_teste)
## 'data.frame': 98 obs. of 10 variables:
## $ MATRICULA : int 5604386 6292983 19553750 28686165 29227733 42488515 52851095 55207714 55415809 56437894 ...
## $ CURSO : Factor w/ 2 levels "ENFERMAGEM - D",..: 2 2 2 2 2 2 2 2 1 2 ...
## $ MEDIA : num 8.66 6.5 7.68 8.14 6.85 6.51 7.34 3.5 7.97 6.6 ...
## $ TEM_APROVACAO : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 2 2 2 2 2 2 2 ...
## $ TEM_REPROV_POR_NOTA : Factor w/ 2 levels "FALSE","TRUE": 1 2 1 1 2 2 1 2 1 1 ...
## $ TEM_REPROV_POR_FALTA : Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 1 1 1 1 1 ...
## $ MEDIA_ZERO : Factor w/ 1 level "FALSE": 1 1 1 1 1 1 1 1 1 1 ...
## $ REP_POR_FALTA_E_MEDIA_ZERO: Factor w/ 1 level "FALSE": 1 1 1 1 1 1 1 1 1 1 ...
## $ POS_REUNI : Factor w/ 1 level "TRUE": 1 1 1 1 1 1 1 1 1 1 ...
## $ TOTAL_CREDITOS : int 21 22 22 26 26 22 26 21 16 24 ...
Em seguida, é feito o teste de predição através da função predict, como exposto abaixo.
predicao <- predict(modelo_de_submissao, df_teste)
summary(predicao)
## 0 1
## 95 3
Por último, podemos gerar o arquivo que será submetido à competição aberta no Kaggle.
pred <- cbind(df_teste["MATRICULA"], COD_EVASAO=predicao)
ids <- test_second_round_kaggle[c("ID","MATRICULA")]
submissao <- left_join(x=ids, y=pred, by="MATRICULA")
submissao <- submissao[c("ID", "COD_EVASAO")]
write.table(submissao, file="arquivo_submissao-round2.csv", row.names=FALSE, sep=",")