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  
## 

Seleção das Variáveis

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 ...

Sumarização dos Dados

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 ...

Particionando os Dados

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

Teste de Predição

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

Cálculo do F-Measure

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

Modelo Final

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=",")