EVASÃO DE ALUNOS NA UNIVERSIDADE FEDERAL DE CAMPINA GRANDE (UFCG) - PERÍODO 5

Este problema dá continuação a uma análise iniciada aqui, com o foco na predição de alunos do quinto período. O dataset utilizado é o mesmo do problema anterior e segue a mesma estrutura. Por se tratar de um novo conjunto de teste, com suas peculiaridades, a análise considera outros fatores para o treino, com a intenção de ajustar o modelo para o novo problema.

## [1] "en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8"
training_evasao <- read.csv("~/Documents/ad1/problema5/training_evasao.csv")
training_evasao$CREDITOS <- as.numeric(as.character(training_evasao$CREDITOS))
training_evasao$MEDIA <- as.numeric(as.character(training_evasao$MEDIA))

test_second_round_kaggle <- read.csv("~/Documents/ad1/problema5/round2/test_second_round_kaggle.csv")

Dados de Treino e Teste

O dataset utilizado para o treinamento do modelo é composto por uma amostra com 18956 observações e 14 variáveis. Uma observação representa uma disciplina em que um aluno está matriculado. Como um aluno normalmente está matriculado em mais de uma disciplina, as matrículas se repetem ao longo das linhas. Para simplificação do modelo, o dataset é composto apenas por dados referentes aos cursos de Engenharia Elétrica e Enfermagem - D. O dataset utilizado para teste é composto por 582 observações e 13 variáveis, onde estas são as mesmas encontradas no dataset de treino, com exceção da variável referente ao status de evasão que será explicada a seguir. Todos os alunos encontrados neste dataset são do quinto período dos cursos de Engenharia Elétrica e Enfermagem - D.

Descrição das variáveis

  1. ID: identificador de uma linha no dataset.
  2. MATRICULA: identificador do aluno.
  3. COD_CURSO: identificador do curso.
  4. CURSO: nome do curso. Cada curso tem seu COD_CURSO.
  5. PERIODO: identificador do período letivo da universidade (ano.semestre)
  6. CODIGO: identificador da disciplina que o aluno cursou no período.
  7. DISCIPLINA: nome da disciplina referente que o aluno cursou no período. Cada disciplina tem seu CODIGO.
  8. CREDITOS: número de créditos referente a disciplina.
  9. DEPARTAMENTO: departamento que ofertou a disciplina.
  10. MEDIA: média do aluno na disciplina (0 a 10). Alunos reprovados por falta em uma disciplina recebem 0 e alunos que trancaram a disciplina recebem NA.
  11. SITUACAO: Aprovado, Reprovado Por Falta, Trancado ou Reprovado. Se refere ao estado final do aluno na disciplina.
  12. PERIODO_INGRESSO: período letivo da universidade em que o aluno ingressou no curso.
  13. PERIODO_RELATIVO: número de períodos que o aluno está matriculado na universidade. “1” refere-se ao aluno em seu primeiro período, “5” refere-se ao aluno no quinto período.
  14. COD_EVASAO: identificador de evasao do aluno. “0” significa que o aluno continuou ativo na universidade no período seguinte e “1” significa que o aluno desistiu do curso nesse período e não voltou a se matricular no seguinte.

Análise

Inicialmente, os dados de treino foram analisados afim de encontrar algum padrão referente aos grupos que envolvem evasão ou não-evasão. Como a predição será para alunos do quinto período, mais adiante só serão considerados os alunos que cursaram o quinto período, pois estes possuirão perfis mais próximos do que se deseja para a o treino e predição.

alunos_periodos_1_e_5 <- training_evasao %>% group_by(MATRICULA, COD_CURSO, CURSO, PERIODO_INGRESSO,PERIODO, PERIODO_RELATIVO) %>% 
  summarise(
    NUM_DISCIP_PERIODO_1=ifelse(unique(PERIODO_RELATIVO) == 1, n(), NA),
    NUM_DISCIP_PERIODO_5=ifelse(unique(PERIODO_RELATIVO) == 5, n(), NA),
    TOTAL_CREDITOS=sum(CREDITOS), 
    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),
    TRANCAMENTO=ifelse(is.na(MEDIA),TRUE, FALSE),
    TRANCAMENTO_PERIODO_5=ifelse(unique(PERIODO_RELATIVO) == 5,
                                 ifelse(is.na(MEDIA),TRUE, FALSE),NA),
    POS_REUNI=ifelse(unique(PERIODO_INGRESSO) > "2008.2", TRUE, FALSE),
    MEDIA_PERIODO_1= ifelse(unique(PERIODO_RELATIVO) == 1, MEDIA, NaN),
    MEDIA_PERIODO_5= ifelse(unique(PERIODO_RELATIVO) == 5,MEDIA, NaN),
    COD_EVASAO=max(COD_EVASAO)
  )

alunos_periodos_1_e_5 <- alunos_periodos_1_e_5[c(2,3,4,5,6,7,8,9,10,11,12,1,13,14,15,16, 17,18,19)] 
alunos_summarised <- alunos_periodos_1_e_5 %>% group_by(MATRICULA) %>%
                    summarise(
                      CURSO = unique(CURSO),
                      CURSOU_PERIODO_5= (n() > 1),
                      NUM_DISCIP_PERIODO_1=max(NUM_DISCIP_PERIODO_1, na.rm=TRUE),
                      NUM_DISCIP_PERIODO_5=max(NUM_DISCIP_PERIODO_5, na.rm=TRUE),
                      TOTAL_CREDITOS=sum(TOTAL_CREDITOS), 
                      MEDIA_PERIODO_1 = max(MEDIA_PERIODO_1, na.rm=TRUE),
                      MEDIA_PERIODO_5 = max(MEDIA_PERIODO_5, na.rm = TRUE),
                      DELTA_MEDIA = MEDIA_PERIODO_5 - MEDIA_PERIODO_1,
                      DELTA_MEDIA_DE_EVASAO = ifelse(is.na(DELTA_MEDIA) | (DELTA_MEDIA < -5.1),TRUE,FALSE),
                      CRA=(MEDIA_PERIODO_1 + MEDIA_PERIODO_5)/2,
                      TEM_APROVACAO=(sum(TRUE %in% TEM_APROVACAO) > 0),
                      TEM_REPROV_POR_NOTA=(sum(TRUE %in% TEM_REPROV_POR_NOTA) > 0),
                      TEM_REPROV_POR_FALTA=(sum(TRUE %in% TEM_REPROV_POR_FALTA) > 0),
                      TRANCAMENTO_PERIODO_5=(sum(TRUE %in% TRANCAMENTO_PERIODO_5) > 0),
                      POS_REUNI=unique(POS_REUNI),
                      COD_EVASAO=max(COD_EVASAO)
                      )

alunos_quinto_periodo <- alunos_summarised %>% filter(CURSOU_PERIODO_5)

EVASÃO DE ALUNOS - PERÍODO 5.

ggplot(data=alunos_quinto_periodo, aes(x=factor(COD_EVASAO))) + geom_bar() + theme_bw()

prop.table(table(alunos_quinto_periodo$COD_EVASAO))
## 
##        0        1 
## 0.930131 0.069869

Através do histograma acima, é possível observar que o número de evasores do quinto período é bem menor que os de não evasores, e se comparado com a evasão no primeiro período, vemos que a evasão é ainda menor.

ggplot(data=alunos_periodos_1_e_5, aes(x=factor(COD_EVASAO))) + facet_wrap(~ PERIODO_RELATIVO) +geom_bar() + theme_bw()

prop.table(table(alunos_periodos_1_e_5$COD_EVASAO[alunos_periodos_1_e_5$PERIODO_RELATIVO == 1]))
## 
##         0         1 
## 0.8915019 0.1084981
prop.table(table(alunos_periodos_1_e_5$COD_EVASAO[alunos_periodos_1_e_5$PERIODO_RELATIVO == 5]))
## 
##          0          1 
## 0.92864865 0.07135135

NÚMERO DE DISCIPLINAS CURSADAS NOS PERÍODOS 1 E 5.

ggplot(data=alunos_quinto_periodo, aes(x=factor(NUM_DISCIP_PERIODO_5), fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()

t_num_discip_periodo_1 <- t.test(alunos_quinto_periodo$NUM_DISCIP_PERIODO_1, alternative="two.sided", conf.int=TRUE)
t_num_discip_periodo_5 <- t.test(alunos_quinto_periodo$NUM_DISCIP_PERIODO_5, alternative="two.sided", conf.int=TRUE)

ic_per_1 <- c(t_num_discip_periodo_1$conf.int[1], t_num_discip_periodo_1$conf.int[2])
ic_per_5 <- c(t_num_discip_periodo_5$conf.int[1], t_num_discip_periodo_5$conf.int[2])

periodo_1 <- select(alunos_quinto_periodo, value = NUM_DISCIP_PERIODO_1)
periodo_1$PERIODO <- "Primeiro Período"
periodo_5 <- select(alunos_quinto_periodo, value = NUM_DISCIP_PERIODO_5)
periodo_5$PERIODO <- "Quinto Período"
periodos <- rbind(periodo_1, periodo_5)

toPlot = summarise(group_by(periodos, PERIODO), mean = mean(value, na.rm=TRUE))
toPlot = mutate(toPlot, lower = ifelse(toPlot$PERIODO == "Primeiro Período",ic_per_1[1],ic_per_5[1]))
toPlot = mutate(toPlot, upper = ifelse(toPlot$PERIODO == "Primeiro Período",ic_per_1[2],ic_per_5[2]))
ggplot(toPlot, aes(x = PERIODO, y=mean, colour = PERIODO)) + 
  geom_point() +
  geom_errorbar(aes(ymin=lower, ymax=upper), width=.1) + theme_bw()

Os intervalos de confiança acima mostram que o número de disciplinas cursadas no primeiro e quinto período são significativamente diferentes sugerindo que, caso exista algum aluno cursando um número de disciplinas fora do intervalo encontrado, este pode apresentar um rendimento diferenciado, tanto pra melhor quanto pra pior.

TOTAL DE CRÉDITOS

A partir do gráfico acima, podemos observar que no grupo de alunos que evadem, não existem observações com um total de créditos acima de 56, enquanto que no grupo de alunos que não evade, existe um pico para este número de créditos.

MÉDIA DAS NOTAS NOS PERÍODOS 1 E 5

teste_media_1 <- t.test(alunos_quinto_periodo$MEDIA_PERIODO_1, alternative="two.sided", conf.int=TRUE)
teste_media_5 <- t.test(alunos_quinto_periodo$MEDIA_PERIODO_5, alternative="two.sided", conf.int=TRUE)

ic_media_1 <- c(teste_media_1$conf.int[1], teste_media_1$conf.int[2])
ic_media_5 <- c(teste_media_5$conf.int[1], teste_media_5$conf.int[2])

library(ggplot2, quietly=TRUE)
periodo_1 <- select(alunos_quinto_periodo, value = MEDIA_PERIODO_1)
periodo_1$PERIODO <- "Primeiro Período"
periodo_5 <- select(alunos_quinto_periodo, value = MEDIA_PERIODO_5)
periodo_5$PERIODO <- "Quinto Período"
periodos <- rbind(periodo_1, periodo_5)

toPlot = summarise(group_by(periodos, PERIODO), mean = mean(value, na.rm=TRUE))
toPlot = mutate(toPlot, lower = ifelse(toPlot$PERIODO == "Primeiro Período",ic_media_1[1],ic_media_5[1]))
toPlot = mutate(toPlot, upper = ifelse(toPlot$PERIODO == "Primeiro Período",ic_media_1[2],ic_media_5[2]))
ggplot(toPlot, aes(x = PERIODO, y=mean, colour = PERIODO)) + 
  geom_point() +
  geom_errorbar(aes(ymin=lower, ymax=upper), width=.1) + theme_bw()

Os intervalos de confiança acima mostram que existe uma queda de rendimento dos alunos no decorrer dos períodos. Essa queda de rendimento foi considerada significativa, tendo em vista que os intervalos de confiança não se sobrepuseram.

t_delta_media <- t.test(alunos_quinto_periodo$DELTA_MEDIA, alternative="two.sided", int.conf=TRUE)
t_delta_media_mean <- mean(alunos_quinto_periodo$DELTA_MEDIA, na.rm=TRUE)
ic_delta_media <- c(t_delta_media$conf.int[1],t_delta_media$conf.int[2])
ic_delta_media <- data.frame(mean=t_delta_media_mean, lower=ic_delta_media[1], upper=ic_delta_media[2],
                             periodo="QUINTO PERIODO")

ggplot(data=ic_delta_media,aes(x=periodo, y=mean)) + 
  geom_point() +
  geom_errorbar(aes(ymin=lower, ymax=upper), width=.1) + theme_bw()

A variação do rendimento está representada pelo intervalo de confiança acima. É possível observar que, como todo o intervalo está compreendido entre valores negativos, a variação é sempre negativa. Caso alguma observação tenha uma variação de rendimento fora desse intervalo (especialmente abaixo do limite inferior), este pode ser um valor suspeito a ser considerado.

CRA

ggplot(data=alunos_quinto_periodo, aes(x=CRA, fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.

Através do histograma acima é possível observar que a variável CRA não se mostra tão expressiva neste problema, onde os CRAS com evasão estão bem distribuídos ao longo dos valores possíveis.

TEM_APROVAÇÃO

ggplot(data=alunos_quinto_periodo, aes(x=factor(TEM_APROVACAO), fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()

A variável TEM_APROVAÇÃO se mostra pouco representativa pois todos os alunos que chegam ao quinto período possuem aprovações. As observações encontradas

Aqui é possível observar que quase todas as observações possuem aprovação. Entre os que não possuem, ainda temos evasão e não-evasão. Para este grupo, a suspeita é de que os alunos que não tiveram aprovação e não evadiram, realizaram trancamento de matrícula por alguma causa ainda desconhecida.

TEM_REPROV_POR_NOTA

ggplot(data=alunos_quinto_periodo, aes(x=factor(TEM_REPROV_POR_NOTA), fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()

O grupo que possui reprovações por nota é mais de um terço maior que o grupo que não possui, indicando ser um evento comum entre os alunos que se encontram no quinto período. Entretando, é notória a diferença em relação a evasão, indicando que alunos que evadem, geralmente possuem reprovações por nota.

TEM_REPROV_POR_FALTA

ggplot(data=alunos_quinto_periodo, aes(x=factor(TEM_REPROV_POR_FALTA), fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()

A reprovação por falta já é menos comum entre os alunos do quinto período. Também podemos observar que a evasão é um pouco mais comum no grupo de alunos que possuem reprovações por falta.

TRANCAMENTO_PERIODO_5

ggplot(data=alunos_quinto_periodo, aes(x=factor(TRANCAMENTO_PERIODO_5), fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()

O gráfico a seguir busca destacar os alunos que realizaram trancamento no quinto período. Como se pode observar, são muito raros os casos de trancamento. Ainda que sejam poucas observações, é possível observar um certo equilíbrio no número de evasores e não evasores que realizaram trancamento.

POS_REUNI

ggplot(data=alunos_quinto_periodo, aes(x=factor(POS_REUNI), fill=factor(COD_EVASAO))) + geom_bar() + theme_bw()

prop.table(table(alunos_quinto_periodo$COD_EVASAO[alunos_quinto_periodo$POS_REUNI == TRUE]))
## 
##          0          1 
## 0.94425676 0.05574324
prop.table(table(alunos_quinto_periodo$COD_EVASAO[alunos_quinto_periodo$POS_REUNI == FALSE]))
## 
##          0          1 
## 0.90432099 0.09567901

Como já era esperado, a variável POS_REUNI indica se um aluno ingressou na universidade a partir do período 2009.1 em diante, período este que foi realizado o aumento gradativo do número de vagas nos cursos da UFCG. É possível observar que a evasão era proporcionalmente maior antes do REUNI, para alunos do quinto período.

Treino e Teste

Nesta etapa foi dividido o arquivo de treino em treino e teste, afim de testar o modelo treinado antes de realizar a submissão para a competição no Kaggle.

alunos_quinto_periodo$CURSO <- factor(alunos_quinto_periodo$CURSO)
alunos_quinto_periodo$NUM_DISCIP_PERIODO_5 <- as.numeric(alunos_quinto_periodo$NUM_DISCIP_PERIODO_5)
alunos_quinto_periodo$TOTAL_CREDITOS <- as.numeric(alunos_quinto_periodo$TOTAL_CREDITOS)
alunos_quinto_periodo$MEDIA_PERIODO_5 <- as.numeric(alunos_quinto_periodo$MEDIA_PERIODO_5)
alunos_quinto_periodo$TEM_APROVACAO <- factor(alunos_quinto_periodo$TEM_APROVACAO)
alunos_quinto_periodo$TEM_REPROV_POR_NOTA <- factor(alunos_quinto_periodo$TEM_REPROV_POR_NOTA)
alunos_quinto_periodo$TEM_REPROV_POR_FALTA <- factor(alunos_quinto_periodo$TEM_REPROV_POR_FALTA)
alunos_quinto_periodo$TRANCAMENTO_PERIODO_5 <- factor(alunos_quinto_periodo$TRANCAMENTO_PERIODO_5)
alunos_quinto_periodo$POS_REUNI <- factor(alunos_quinto_periodo$POS_REUNI)
alunos_quinto_periodo$COD_EVASAO <- factor(alunos_quinto_periodo$COD_EVASAO)
library(C50)
## Warning: package 'C50' was built under R version 3.1.3
data_rand <- alunos_quinto_periodo[order(runif(916)), ]
data_train <- data_rand[1:824, ]
data_test <- data_rand[825:916, ]

prop.table(table(data_train$COD_EVASAO))
## 
##          0          1 
## 0.93567961 0.06432039
prop.table(table(data_test$COD_EVASAO))
## 
##         0         1 
## 0.8804348 0.1195652
df_train_modelo <- data_train[c("MATRICULA","CURSO",
                                     "NUM_DISCIP_PERIODO_5","TOTAL_CREDITOS","MEDIA_PERIODO_5",
                                     "TEM_APROVACAO","TEM_REPROV_POR_NOTA","TEM_REPROV_POR_FALTA",
                                     "TRANCAMENTO_PERIODO_5","POS_REUNI","COD_EVASAO")]

df_test_modelo <- data_test[c("MATRICULA","CURSO",
                                     "NUM_DISCIP_PERIODO_5","TOTAL_CREDITOS","MEDIA_PERIODO_5",
                                     "TEM_APROVACAO","TEM_REPROV_POR_NOTA","TEM_REPROV_POR_FALTA",
                                     "TRANCAMENTO_PERIODO_5","POS_REUNI")]

df_train_modelo <- data.frame(df_train_modelo)
df_test_modelo <- data.frame(df_test_modelo)

Sys.setlocale(locale = "C")
## [1] "C/C/C/C/C/en_IE.UTF-8"
test_modelo <- C5.0(df_train_modelo[-11],df_train_modelo$COD_EVASAO)
test_modelo
## 
## Call:
## C5.0.default(x = df_train_modelo[-11], y = df_train_modelo$COD_EVASAO)
## 
## Classification Tree
## Number of samples: 824 
## Number of predictors: 10 
## 
## Tree size: 3 
## 
## Non-standard options: attempt to group attributes
summary(test_modelo)
## 
## Call:
## C5.0.default(x = df_train_modelo[-11], y = df_train_modelo$COD_EVASAO)
## 
## 
## C5.0 [Release 2.07 GPL Edition]      Tue Jul 28 16:14:52 2015
## -------------------------------
## 
## Class specified by attribute `outcome'
## 
## Read 824 cases (11 attributes) from undefined.data
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 > 0.68: 0 (780.3/32.7)
## MEDIA_PERIODO_5 <= 0.68:
## :...POS_REUNI = FALSE: 0 (30.3/10.2)
##     POS_REUNI = TRUE: 1 (13.4/3.3)
## 
## 
## Evaluation on training data (824 cases):
## 
##      Decision Tree   
##    ----------------  
##    Size      Errors  
## 
##       3   46( 5.6%)   <<
## 
## 
##     (a)   (b)    <-classified as
##    ----  ----
##     768     3    (a): class 0
##      43    10    (b): class 1
## 
## 
##  Attribute usage:
## 
##   98.30% MEDIA_PERIODO_5
##    6.92% POS_REUNI
## 
## 
## Time: 0.0 secs
prediction_test <- predict(test_modelo, df_test_modelo)
Sys.setlocale(locale = "en_IE.UTF-8")
## [1] "en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8"
summary(prediction_test)
##  0  1 
## 90  2
summary(data_test$COD_EVASAO)
##  0  1 
## 81 11
num_acertos <- sum(prediction_test == data_test$COD_EVASAO)
num_acertos/length(data_test$COD_EVASAO)
## [1] 0.8804348

Calculando o F-Measure

A tabela a seguir mostra a contagem de acertos e erros que a predição realizou.

df_resp <- data.frame(prediction_test, COD_EVASAO=data_test$COD_EVASAO, row.names=NULL)
df_resp_table <- table(df_resp)
df_resp_table
##                COD_EVASAO
## prediction_test  0  1
##               0 80 10
##               1  1  1

Através da matriz de confusão acima, é possível observar que, dentre os alunos que não evade, a predição acertou 83 observações de 87. Já em relação aos alunos que evade, a predição acertou apenas um aluno que evade e errou quatro. Para o problema e para os dados que foram oferecidos, o resultado pareceu satifatório, pois para obter um resultado mais preciso, seria necessário mais informações na amostra, como o histórico completo dos alunos que foram oferecidos, e não dados do primeiro e quinto período.

Precision e Recall

Essas medidas foram calculadas para o cálculo da métrica F-measure, sendo esta utilizada para medir o quão bom o modelo se saiu neste problema.

precision <- df_resp_table[4]/(df_resp_table[4] + df_resp_table[2])
recall <- df_resp_table[4] / (df_resp_table[4] + df_resp_table[3])
F_measure <- 2 * (precision * recall) / (precision + recall)
F_measure
## [1] 0.1538462

O F-measure encontrado encontrado foi baixo pois o modelo só acertou um aluno (de cinco) que evadiram. Para esta métrica, o resultado não foi satisfatório, por não identificar com precisão quais alunos evadiram. Outro problema (indicado mais claramente na matriz de confusão) é em relação aos falso positivos, onde o modelo erra quatro predições indicando que os alunos evadiram, quando na verdade estes não evadiram. Este erro pode ser considerado o mais grave do modelo, pois dizer que um aluno evade sem evadir é, neste caso, mais grave que o contrário.

Erro e Acurácia

Essas métricas foram calculadas apenas para verificar a porcentagem de acerto e erro do modelo, onde a soma dos dois valores deve ser igual a 1.

acuracia <- (df_resp_table[1] + df_resp_table[4]) / sum(df_resp_table)
acuracia
## [1] 0.8804348
erro <- (df_resp_table[2] + df_resp_table[3]) / sum(df_resp_table)
erro
## [1] 0.1195652
erro + acuracia 
## [1] 1

Treinando o modelo para submissão

Para o modelo da submissão, foram utilizados todo o conjunto dos dados de treino, pois foi considerado que, com uma amostra maior, o classificador trabalharia de forma mais eficiente.

library("C50")
df_modelo <- alunos_quinto_periodo[c("MATRICULA","CURSO",
                                     "NUM_DISCIP_PERIODO_5","TOTAL_CREDITOS","MEDIA_PERIODO_5",
                                     "TEM_APROVACAO","TEM_REPROV_POR_NOTA","TEM_REPROV_POR_FALTA",
                                     "TRANCAMENTO_PERIODO_5","POS_REUNI","COD_EVASAO")]

df_modelo <- data.frame(df_modelo)
str(df_modelo)
## 'data.frame':    916 obs. of  11 variables:
##  $ MATRICULA            : int  2714857 2791762 3521919 5608990 6147697 6420105 6683856 7621720 9915515 10792315 ...
##  $ CURSO                : Factor w/ 2 levels "ENFERMAGEM - D",..: 2 2 1 2 1 1 1 2 2 2 ...
##  $ NUM_DISCIP_PERIODO_5 : num  6 6 2 1 7 4 4 4 6 6 ...
##  $ TOTAL_CREDITOS       : num  48 47 38 22 64 56 56 42 43 51 ...
##  $ MEDIA_PERIODO_5      : 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 2 2 2 2 2 2 2 ...
##  $ TEM_REPROV_POR_NOTA  : Factor w/ 2 levels "FALSE","TRUE": 2 2 1 2 2 1 1 1 2 2 ...
##  $ TEM_REPROV_POR_FALTA : Factor w/ 2 levels "FALSE","TRUE": 1 2 1 2 1 1 1 2 1 1 ...
##  $ TRANCAMENTO_PERIODO_5: Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 1 1 1 1 1 ...
##  $ POS_REUNI            : Factor w/ 2 levels "FALSE","TRUE": 2 1 2 1 2 2 2 1 2 1 ...
##  $ COD_EVASAO           : Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 2 1 1 ...
Sys.setlocale(locale = "C") #Ajuste para o C5.0
## [1] "C/C/C/C/C/en_IE.UTF-8"
modelo_boost12 <- C5.0(df_modelo[-11], df_modelo$COD_EVASAO, trials = 12)
Sys.setlocale(locale = "en_IE.UTF-8")
## [1] "en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8"
modelo_boost12
## 
## Call:
## C5.0.default(x = df_modelo[-11], y = df_modelo$COD_EVASAO, trials = 12)
## 
## Classification Tree
## Number of samples: 916 
## Number of predictors: 10 
## 
## Number of boosting iterations: 12 
## Average tree size: 6 
## 
## Non-standard options: attempt to group attributes
summary(modelo_boost12)
## 
## Call:
## C5.0.default(x = df_modelo[-11], y = df_modelo$COD_EVASAO, trials = 12)
## 
## 
## C5.0 [Release 2.07 GPL Edition]      Tue Jul 28 16:14:53 2015
## -------------------------------
## 
## Class specified by attribute `outcome'
## 
## Read 916 cases (11 attributes) from undefined.data
## 
## -----  Trial 0:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 > 0.68: 0 (866.1/40.6)
## MEDIA_PERIODO_5 <= 0.68:
## :...CURSO = ENFERMAGEM - D: 1 (2.3/0.1)
##     CURSO = ENGENHARIA ELÉTRICA:
##     :...POS_REUNI = FALSE:
##         :...NUM_DISCIP_PERIODO_5 <= 1: 1 (3)
##         :   NUM_DISCIP_PERIODO_5 > 1: 0 (31.4/9.2)
##         POS_REUNI = TRUE:
##         :...TEM_REPROV_POR_FALTA = FALSE: 0 (2.2)
##             TEM_REPROV_POR_FALTA = TRUE: 1 (11/2)
## 
## -----  Trial 1:  -----
## 
## Decision tree:
## 
## TRANCAMENTO_PERIODO_5 = TRUE: 1 (41.2/6.9)
## TRANCAMENTO_PERIODO_5 = FALSE:
## :...MEDIA_PERIODO_5 <= 2.5: 1 (152.5/63.4)
##     MEDIA_PERIODO_5 > 2.5: 0 (722.3/132.4)
## 
## -----  Trial 2:  -----
## 
## Decision tree:
## 
## TRANCAMENTO_PERIODO_5 = TRUE: 1 (45.7/17.5)
## TRANCAMENTO_PERIODO_5 = FALSE:
## :...CURSO = ENFERMAGEM - D: 0 (124.9/7.3)
##     CURSO = ENGENHARIA ELÉTRICA:
##     :...TOTAL_CREDITOS <= 33: 1 (40.5/8.3)
##         TOTAL_CREDITOS > 33:
##         :...NUM_DISCIP_PERIODO_5 > 6: 0 (249.9/41.8)
##             NUM_DISCIP_PERIODO_5 <= 6:
##             :...TEM_APROVACAO = FALSE: 0 (3.9)
##                 TEM_APROVACAO = TRUE:
##                 :...MEDIA_PERIODO_5 <= 0.06: 1 (45.5/17.5)
##                     MEDIA_PERIODO_5 > 0.06:
##                     :...TOTAL_CREDITOS <= 38: 0 (22.3)
##                         TOTAL_CREDITOS > 38:
##                         :...TOTAL_CREDITOS <= 40: 1 (36.6/14.3)
##                             TOTAL_CREDITOS > 40: 0 (346.7/106)
## 
## -----  Trial 3:  -----
## 
## Decision tree:
## 
## TEM_REPROV_POR_NOTA = FALSE:
## :...TOTAL_CREDITOS > 53: 0 (53.5)
## :   TOTAL_CREDITOS <= 53:
## :   :...TOTAL_CREDITOS <= 52: 0 (207.1/42.1)
## :       TOTAL_CREDITOS > 52: 1 (17.7/2.1)
## TEM_REPROV_POR_NOTA = TRUE:
## :...NUM_DISCIP_PERIODO_5 <= 2: 1 (28.3/8.9)
##     NUM_DISCIP_PERIODO_5 > 2:
##     :...TOTAL_CREDITOS > 49: 0 (153.8/34.1)
##         TOTAL_CREDITOS <= 49:
##         :...MATRICULA > 8.973187e+08: 1 (67.4/24.1)
##             MATRICULA <= 8.973187e+08:
##             :...MEDIA_PERIODO_5 > 7.05: 0 (22/0.6)
##                 MEDIA_PERIODO_5 <= 7.05:
##                 :...MATRICULA > 7.886107e+08: 0 (18.5)
##                     MATRICULA <= 7.886107e+08:
##                     :...TOTAL_CREDITOS <= 39: 0 (38.5/6.6)
##                         TOTAL_CREDITOS > 39:
##                         :...CURSO = ENFERMAGEM - D: 1 (11/3.2)
##                             CURSO = ENGENHARIA ELÉTRICA:
##                             :...TEM_REPROV_POR_FALTA = FALSE: 1 (149/66.4)
##                                 TEM_REPROV_POR_FALTA = TRUE: 0 (149.2/49.4)
## 
## -----  Trial 4:  -----
## 
## Decision tree:
## 
## TEM_REPROV_POR_FALTA = FALSE:
## :...CURSO = ENFERMAGEM - D: 0 (86.2/7.8)
## :   CURSO = ENGENHARIA ELÉTRICA:
## :   :...NUM_DISCIP_PERIODO_5 <= 4: 1 (75.7/35.4)
## :       NUM_DISCIP_PERIODO_5 > 4: 0 (380.8/93.6)
## TEM_REPROV_POR_FALTA = TRUE:
## :...TOTAL_CREDITOS <= 42: 0 (117.5/32.5)
##     TOTAL_CREDITOS > 42:
##     :...MATRICULA <= 3.139469e+08: 1 (93.7/29.5)
##         MATRICULA > 3.139469e+08: 0 (162.2/56.5)
## 
## -----  Trial 5:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 <= 0.43: 1 (118.4/47.6)
## MEDIA_PERIODO_5 > 0.43:
## :...CURSO = ENFERMAGEM - D: 0 (105.6/22)
##     CURSO = ENGENHARIA ELÉTRICA:
##     :...MEDIA_PERIODO_5 <= 7.93: 0 (617.9/181.4)
##         MEDIA_PERIODO_5 > 7.93: 1 (74.1/28.1)
## 
## -----  Trial 6:  -----
## 
## Decision tree:
## 
## TRANCAMENTO_PERIODO_5 = TRUE: 1 (60.2/25.9)
## TRANCAMENTO_PERIODO_5 = FALSE:
## :...TEM_REPROV_POR_FALTA = FALSE:
##     :...CURSO = ENFERMAGEM - D: 0 (54.7)
##     :   CURSO = ENGENHARIA ELÉTRICA:
##     :   :...NUM_DISCIP_PERIODO_5 > 6: 0 (174.4/30.8)
##     :       NUM_DISCIP_PERIODO_5 <= 6:
##     :       :...NUM_DISCIP_PERIODO_5 <= 2: 1 (14.8)
##     :           NUM_DISCIP_PERIODO_5 > 2: 0 (238.4/87.2)
##     TEM_REPROV_POR_FALTA = TRUE:
##     :...TOTAL_CREDITOS > 52: 1 (27.5/7.2)
##         TOTAL_CREDITOS <= 52:
##         :...TOTAL_CREDITOS > 50: 0 (31.1/3.3)
##             TOTAL_CREDITOS <= 50:
##             :...TEM_APROVACAO = FALSE: 0 (12.4/4.9)
##                 TEM_APROVACAO = TRUE:
##                 :...NUM_DISCIP_PERIODO_5 <= 2: 0 (13.9/2.3)
##                     NUM_DISCIP_PERIODO_5 > 2:
##                     :...MEDIA_PERIODO_5 <= 0.06: 1 (56/17.7)
##                         MEDIA_PERIODO_5 > 0.06: 0 (232.7/95.7)
## 
## -----  Trial 7:  -----
## 
## Decision tree:
## 
## TEM_REPROV_POR_NOTA = FALSE:
## :...MATRICULA <= 2.185759e+07: 1 (14.4/1.1)
## :   MATRICULA > 2.185759e+07: 0 (248.1/49.6)
## TEM_REPROV_POR_NOTA = TRUE:
## :...TRANCAMENTO_PERIODO_5 = TRUE: 1 (25.4/10.2)
##     TRANCAMENTO_PERIODO_5 = FALSE:
##     :...TOTAL_CREDITOS <= 46:
##         :...POS_REUNI = FALSE: 0 (174.9/75.8)
##         :   POS_REUNI = TRUE: 1 (195.3/82.9)
##         TOTAL_CREDITOS > 46:
##         :...MATRICULA > 9.382314e+08: 1 (35.4/7.4)
##             MATRICULA <= 9.382314e+08:
##             :...MEDIA_PERIODO_5 <= 1.47: 1 (59/24.9)
##                 MEDIA_PERIODO_5 > 1.47: 0 (161.5/29.8)
## 
## -----  Trial 8:  -----
## 
## Decision tree:
## 
## NUM_DISCIP_PERIODO_5 <= 1: 1 (25.2/3.5)
## NUM_DISCIP_PERIODO_5 > 1: 0 (882.8/274.7)
## 
## -----  Trial 9:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 <= 2.5: 1 (364.3/144)
## MEDIA_PERIODO_5 > 2.5: 0 (532.7/117)
## 
## -----  Trial 10:  -----
## 
## Decision tree:
## 
## NUM_DISCIP_PERIODO_5 <= 1: 1 (31.5/6.4)
## NUM_DISCIP_PERIODO_5 > 1:
## :...MEDIA_PERIODO_5 > 2.5: 0 (384.6/12.2)
##     MEDIA_PERIODO_5 <= 2.5:
##     :...MATRICULA <= 4.767644e+07: 1 (36.1/9.1)
##         MATRICULA > 4.767644e+07:
##         :...MATRICULA <= 1.370762e+08: 0 (25.8)
##             MATRICULA > 1.370762e+08:
##             :...POS_REUNI = FALSE: 0 (237.5/62.5)
##                 POS_REUNI = TRUE: 1 (170.4/73.7)
## 
## -----  Trial 11:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 > 0.43: 0 (649/34.4)
## MEDIA_PERIODO_5 <= 0.43:
## :...TEM_REPROV_POR_FALTA = FALSE: 0 (19.1/3.7)
##     TEM_REPROV_POR_FALTA = TRUE: 1 (207.9/80.2)
## 
## 
## Evaluation on training data (916 cases):
## 
## Trial        Decision Tree   
## -----      ----------------  
##    Size      Errors  
## 
##    0      6   52( 5.7%)
##    1      3  108(11.8%)
##    2      9   71( 7.8%)
##    3     12  187(20.4%)
##    4      6  110(12.0%)
##    5      4  122(13.3%)
##    6     11   61( 6.7%)
##    7      8  180(19.7%)
##    8      2   59( 6.4%)
##    9      2  106(11.6%)
##   10      6   64( 7.0%)
##   11      3   61( 6.7%)
## boost             46( 5.0%)   <<
## 
## 
##     (a)   (b)    <-classified as
##    ----  ----
##     850     2    (a): class 0
##      44    20    (b): class 1
## 
## 
##  Attribute usage:
## 
##  100.00% CURSO
##  100.00% NUM_DISCIP_PERIODO_5
##  100.00% TOTAL_CREDITOS
##  100.00% TEM_REPROV_POR_NOTA
##  100.00% TEM_REPROV_POR_FALTA
##  100.00% TRANCAMENTO_PERIODO_5
##   99.13% MATRICULA
##   98.25% MEDIA_PERIODO_5
##   48.25% TEM_APROVACAO
##   34.83% POS_REUNI
## 
## 
## Time: 0.0 secs

Sumarização dos dados de teste

alunos_test <- test_second_round_kaggle %>% group_by(MATRICULA, COD_CURSO, CURSO, PERIODO_INGRESSO,PERIODO,PERIODO_RELATIVO) %>% 
  summarise(
    NUM_DISCIP_PERIODO_1=ifelse(unique(PERIODO_RELATIVO) == 1, n(), NA),
    NUM_DISCIP_PERIODO_5=ifelse(unique(PERIODO_RELATIVO) == 5, n(), NA),
    TOTAL_CREDITOS=sum(CREDITOS), 
    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),
    TRANCAMENTO=ifelse(is.na(MEDIA),TRUE, FALSE),
    TRANCAMENTO_PERIODO_5=ifelse(unique(PERIODO_RELATIVO) == 5,
                                 ifelse(is.na(MEDIA),TRUE, FALSE),NA),
    POS_REUNI=ifelse(as.factor(PERIODO_INGRESSO) > "2008.2", TRUE, FALSE),
    MEDIA_PERIODO_1= ifelse(unique(PERIODO_RELATIVO) == 1, MEDIA, NaN),
    MEDIA_PERIODO_5= ifelse(unique(PERIODO_RELATIVO) == 5,MEDIA, NaN)
  )
alunos_test_summarised <- alunos_test %>% group_by(MATRICULA) %>%
  summarise(
    CURSO = CURSO,
    NUM_DISCIP_PERIODO_5=max(NUM_DISCIP_PERIODO_5, na.rm=TRUE),
    TOTAL_CREDITOS=sum(TOTAL_CREDITOS), 
    MEDIA_PERIODO_5 = max(MEDIA_PERIODO_5, na.rm = TRUE),
    MEDIA_ABAIXO_IC= (MEDIA_PERIODO_5 < 5.75 | is.na(MEDIA_PERIODO_5)),
    TEM_APROVACAO=(sum(TRUE %in% TEM_APROVACAO) > 0),
    TEM_REPROV_POR_NOTA=(sum(TRUE %in% TEM_REPROV_POR_NOTA) > 0),
    TEM_REPROV_POR_FALTA=(sum(TRUE %in% TEM_REPROV_POR_FALTA) > 0),
    TRANCAMENTO_PERIODO_5=(sum(TRUE %in% TRANCAMENTO_PERIODO_5) > 0),
    POS_REUNI=unique(POS_REUNI)
  )
df_test <- alunos_test_summarised[c("MATRICULA","CURSO",
                                     "NUM_DISCIP_PERIODO_5","TOTAL_CREDITOS","MEDIA_PERIODO_5",
                                     "TEM_APROVACAO","TEM_REPROV_POR_NOTA","TEM_REPROV_POR_FALTA",
                                     "TRANCAMENTO_PERIODO_5","POS_REUNI")]
df_test$CURSO <- factor(df_test$CURSO)
df_test$NUM_DISCIP_PERIODO_5 <- as.numeric(df_test$NUM_DISCIP_PERIODO_5)
df_test$TOTAL_CREDITOS <- as.numeric(df_test$TOTAL_CREDITOS)
df_test$MEDIA_PERIODO_5 <- as.numeric(df_test$MEDIA_PERIODO_5)
df_test$TEM_APROVACAO <- factor(df_test$TEM_APROVACAO)
df_test$TEM_REPROV_POR_NOTA <- factor(df_test$TEM_REPROV_POR_NOTA)
df_test$TEM_REPROV_POR_FALTA <- factor(df_test$TEM_REPROV_POR_FALTA)
df_test$TRANCAMENTO_PERIODO_5 <- factor(df_test$TRANCAMENTO_PERIODO_5)
df_test$POS_REUNI <- factor(df_test$POS_REUNI)

str(df_test)
## Classes 'tbl_df' and '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 ...
##  $ NUM_DISCIP_PERIODO_5 : num  5 7 6 8 8 7 8 5 4 7 ...
##  $ TOTAL_CREDITOS       : num  21 22 22 26 26 22 26 21 16 24 ...
##  $ MEDIA_PERIODO_5      : 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 ...
##  $ TRANCAMENTO_PERIODO_5: Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 1 1 1 1 1 ...
##  $ POS_REUNI            : Factor w/ 0 levels: NA NA NA NA NA NA NA NA NA NA ...

Treinando o modelo e realizando a predição

df_modelo <- data.frame(df_modelo)
str(df_modelo)
## 'data.frame':    916 obs. of  11 variables:
##  $ MATRICULA            : int  2714857 2791762 3521919 5608990 6147697 6420105 6683856 7621720 9915515 10792315 ...
##  $ CURSO                : Factor w/ 2 levels "ENFERMAGEM - D",..: 2 2 1 2 1 1 1 2 2 2 ...
##  $ NUM_DISCIP_PERIODO_5 : num  6 6 2 1 7 4 4 4 6 6 ...
##  $ TOTAL_CREDITOS       : num  48 47 38 22 64 56 56 42 43 51 ...
##  $ MEDIA_PERIODO_5      : 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 2 2 2 2 2 2 2 ...
##  $ TEM_REPROV_POR_NOTA  : Factor w/ 2 levels "FALSE","TRUE": 2 2 1 2 2 1 1 1 2 2 ...
##  $ TEM_REPROV_POR_FALTA : Factor w/ 2 levels "FALSE","TRUE": 1 2 1 2 1 1 1 2 1 1 ...
##  $ TRANCAMENTO_PERIODO_5: Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 1 1 1 1 1 ...
##  $ POS_REUNI            : Factor w/ 2 levels "FALSE","TRUE": 2 1 2 1 2 2 2 1 2 1 ...
##  $ COD_EVASAO           : Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 2 1 1 ...
library(C50, quietly=TRUE)
Sys.setlocale(locale = "C") #Ajuste para o C5.0
## [1] "C/C/C/C/C/en_IE.UTF-8"
modelo_boost10 <- C5.0(df_modelo[-11], df_modelo$COD_EVASAO, trials=10)
summary(modelo_boost10)
## 
## Call:
## C5.0.default(x = df_modelo[-11], y = df_modelo$COD_EVASAO, trials = 10)
## 
## 
## C5.0 [Release 2.07 GPL Edition]      Tue Jul 28 16:14:53 2015
## -------------------------------
## 
## Class specified by attribute `outcome'
## 
## Read 916 cases (11 attributes) from undefined.data
## 
## -----  Trial 0:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 > 0.68: 0 (866.1/40.6)
## MEDIA_PERIODO_5 <= 0.68:
## :...CURSO = ENFERMAGEM - D: 1 (2.3/0.1)
##     CURSO = ENGENHARIA ELÉTRICA:
##     :...POS_REUNI = FALSE:
##         :...NUM_DISCIP_PERIODO_5 <= 1: 1 (3)
##         :   NUM_DISCIP_PERIODO_5 > 1: 0 (31.4/9.2)
##         POS_REUNI = TRUE:
##         :...TEM_REPROV_POR_FALTA = FALSE: 0 (2.2)
##             TEM_REPROV_POR_FALTA = TRUE: 1 (11/2)
## 
## -----  Trial 1:  -----
## 
## Decision tree:
## 
## TRANCAMENTO_PERIODO_5 = TRUE: 1 (41.2/6.9)
## TRANCAMENTO_PERIODO_5 = FALSE:
## :...MEDIA_PERIODO_5 <= 2.5: 1 (152.5/63.4)
##     MEDIA_PERIODO_5 > 2.5: 0 (722.3/132.4)
## 
## -----  Trial 2:  -----
## 
## Decision tree:
## 
## TRANCAMENTO_PERIODO_5 = TRUE: 1 (45.7/17.5)
## TRANCAMENTO_PERIODO_5 = FALSE:
## :...CURSO = ENFERMAGEM - D: 0 (124.9/7.3)
##     CURSO = ENGENHARIA ELÉTRICA:
##     :...TOTAL_CREDITOS <= 33: 1 (40.5/8.3)
##         TOTAL_CREDITOS > 33:
##         :...NUM_DISCIP_PERIODO_5 > 6: 0 (249.9/41.8)
##             NUM_DISCIP_PERIODO_5 <= 6:
##             :...TEM_APROVACAO = FALSE: 0 (3.9)
##                 TEM_APROVACAO = TRUE:
##                 :...MEDIA_PERIODO_5 <= 0.06: 1 (45.5/17.5)
##                     MEDIA_PERIODO_5 > 0.06:
##                     :...TOTAL_CREDITOS <= 38: 0 (22.3)
##                         TOTAL_CREDITOS > 38:
##                         :...TOTAL_CREDITOS <= 40: 1 (36.6/14.3)
##                             TOTAL_CREDITOS > 40: 0 (346.7/106)
## 
## -----  Trial 3:  -----
## 
## Decision tree:
## 
## TEM_REPROV_POR_NOTA = FALSE:
## :...TOTAL_CREDITOS > 53: 0 (53.5)
## :   TOTAL_CREDITOS <= 53:
## :   :...TOTAL_CREDITOS <= 52: 0 (207.1/42.1)
## :       TOTAL_CREDITOS > 52: 1 (17.7/2.1)
## TEM_REPROV_POR_NOTA = TRUE:
## :...NUM_DISCIP_PERIODO_5 <= 2: 1 (28.3/8.9)
##     NUM_DISCIP_PERIODO_5 > 2:
##     :...TOTAL_CREDITOS > 49: 0 (153.8/34.1)
##         TOTAL_CREDITOS <= 49:
##         :...MATRICULA > 8.973187e+08: 1 (67.4/24.1)
##             MATRICULA <= 8.973187e+08:
##             :...MEDIA_PERIODO_5 > 7.05: 0 (22/0.6)
##                 MEDIA_PERIODO_5 <= 7.05:
##                 :...MATRICULA > 7.886107e+08: 0 (18.5)
##                     MATRICULA <= 7.886107e+08:
##                     :...TOTAL_CREDITOS <= 39: 0 (38.5/6.6)
##                         TOTAL_CREDITOS > 39:
##                         :...CURSO = ENFERMAGEM - D: 1 (11/3.2)
##                             CURSO = ENGENHARIA ELÉTRICA:
##                             :...TEM_REPROV_POR_FALTA = FALSE: 1 (149/66.4)
##                                 TEM_REPROV_POR_FALTA = TRUE: 0 (149.2/49.4)
## 
## -----  Trial 4:  -----
## 
## Decision tree:
## 
## TEM_REPROV_POR_FALTA = FALSE:
## :...CURSO = ENFERMAGEM - D: 0 (86.2/7.8)
## :   CURSO = ENGENHARIA ELÉTRICA:
## :   :...NUM_DISCIP_PERIODO_5 <= 4: 1 (75.7/35.4)
## :       NUM_DISCIP_PERIODO_5 > 4: 0 (380.8/93.6)
## TEM_REPROV_POR_FALTA = TRUE:
## :...TOTAL_CREDITOS <= 42: 0 (117.5/32.5)
##     TOTAL_CREDITOS > 42:
##     :...MATRICULA <= 3.139469e+08: 1 (93.7/29.5)
##         MATRICULA > 3.139469e+08: 0 (162.2/56.5)
## 
## -----  Trial 5:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 <= 0.43: 1 (118.4/47.6)
## MEDIA_PERIODO_5 > 0.43:
## :...CURSO = ENFERMAGEM - D: 0 (105.6/22)
##     CURSO = ENGENHARIA ELÉTRICA:
##     :...MEDIA_PERIODO_5 <= 7.93: 0 (617.9/181.4)
##         MEDIA_PERIODO_5 > 7.93: 1 (74.1/28.1)
## 
## -----  Trial 6:  -----
## 
## Decision tree:
## 
## TRANCAMENTO_PERIODO_5 = TRUE: 1 (61.5/26.2)
## TRANCAMENTO_PERIODO_5 = FALSE:
## :...TEM_REPROV_POR_NOTA = FALSE:
##     :...MATRICULA <= 3.239428e+07: 1 (16.5/2.5)
##     :   MATRICULA > 3.239428e+07: 0 (214.6/30.5)
##     TEM_REPROV_POR_NOTA = TRUE:
##     :...NUM_DISCIP_PERIODO_5 <= 5:
##         :...NUM_DISCIP_PERIODO_5 <= 1: 1 (14.3)
##         :   NUM_DISCIP_PERIODO_5 > 1: 0 (264.8/111)
##         NUM_DISCIP_PERIODO_5 > 5:
##         :...MATRICULA <= 9.382314e+08: 0 (300/83.7)
##             MATRICULA > 9.382314e+08: 1 (42.4/12.8)
## 
## -----  Trial 7:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 <= 2.5: 1 (307.6/135.2)
## MEDIA_PERIODO_5 > 2.5: 0 (596.4/127.4)
## 
## -----  Trial 8:  -----
## 
## Decision tree:
## 
## TOTAL_CREDITOS <= 32: 1 (59.3/21.3)
## TOTAL_CREDITOS > 32:
## :...MEDIA_PERIODO_5 > 2.5: 0 (426.6/20)
##     MEDIA_PERIODO_5 <= 2.5:
##     :...CURSO = ENFERMAGEM - D: 1 (28.1/9.6)
##         CURSO = ENGENHARIA ELÉTRICA:
##         :...TOTAL_CREDITOS > 51: 0 (29.6)
##             TOTAL_CREDITOS <= 51:
##             :...MATRICULA <= 5.688441e+07: 1 (21.4/5.5)
##                 MATRICULA > 5.688441e+07: 0 (326/109.4)
## 
## -----  Trial 9:  -----
## 
## Decision tree:
## 
## MEDIA_PERIODO_5 <= 0.25:
## :...NUM_DISCIP_PERIODO_5 <= 6: 1 (200.5/68.6)
## :   NUM_DISCIP_PERIODO_5 > 6: 0 (14.3)
## MEDIA_PERIODO_5 > 0.25:
## :...NUM_DISCIP_PERIODO_5 > 4: 0 (443.3)
##     NUM_DISCIP_PERIODO_5 <= 4:
##     :...NUM_DISCIP_PERIODO_5 <= 1: 1 (17.1/2.6)
##         NUM_DISCIP_PERIODO_5 > 1: 0 (198.8/34.4)
## 
## 
## Evaluation on training data (916 cases):
## 
## Trial        Decision Tree   
## -----      ----------------  
##    Size      Errors  
## 
##    0      6   52( 5.7%)
##    1      3  108(11.8%)
##    2      9   71( 7.8%)
##    3     12  187(20.4%)
##    4      6  110(12.0%)
##    5      4  122(13.3%)
##    6      7   80( 8.7%)
##    7      2  106(11.6%)
##    8      6   64( 7.0%)
##    9      5   58( 6.3%)
## boost             50( 5.5%)   <<
## 
## 
##     (a)   (b)    <-classified as
##    ----  ----
##     848     4    (a): class 0
##      46    18    (b): class 1
## 
## 
##  Attribute usage:
## 
##  100.00% CURSO
##  100.00% NUM_DISCIP_PERIODO_5
##  100.00% TOTAL_CREDITOS
##  100.00% TEM_REPROV_POR_NOTA
##  100.00% TEM_REPROV_POR_FALTA
##  100.00% TRANCAMENTO_PERIODO_5
##   98.25% MEDIA_PERIODO_5
##   97.27% MATRICULA
##   41.81% TEM_APROVACAO
##    6.33% POS_REUNI
## 
## 
## Time: 0.0 secs
df_test <- data.frame(df_test)
str(df_test)
## '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 ...
##  $ NUM_DISCIP_PERIODO_5 : num  5 7 6 8 8 7 8 5 4 7 ...
##  $ TOTAL_CREDITOS       : num  21 22 22 26 26 22 26 21 16 24 ...
##  $ MEDIA_PERIODO_5      : 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 ...
##  $ TRANCAMENTO_PERIODO_5: Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 1 1 1 1 1 ...
##  $ POS_REUNI            : Factor w/ 0 levels: NA NA NA NA NA NA NA NA NA NA ...
Sys.setlocale(locale = "C") #Ajuste para o C5.0
## [1] "C/C/C/C/C/en_IE.UTF-8"
prediction <- predict(modelo_boost10,df_test)
Sys.setlocale(locale = "en_IE.UTF-8")
## [1] "en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8"
summary(prediction)
##  0  1 
## 98  0

Submissão - Kaggle - Round 2

pred <- cbind(alunos_test_summarised["MATRICULA"], COD_EVASAO=prediction)
ids <- test_second_round_kaggle[c("ID","MATRICULA")]
#ids$MATRICULA <- factor(ids$MATRICULA)
submissao <- left_join(x=ids, y=pred, by="MATRICULA")
submissao <- submissao[c("ID", "COD_EVASAO")]
summary(submissao)
##        ID        COD_EVASAO
##  Min.   :15023   0:582     
##  1st Qu.:15376   1:  0     
##  Median :15880             
##  Mean   :15860             
##  3rd Qu.:16330             
##  Max.   :16730
#write.table(submissao, file="submissao-round2-v15.csv", row.names=FALSE, sep=",")