Sinopse

Descobrir problemas e propor soluções pontuais na academia não é muito difícil. A dificuldade está quando não sabemos quando há um problema, e resolver tal problema de forma efetiva torna-se praticamente impossível sem uma análise precisa dos dados.

O índice de evasão dos alunos e o tempo necessário que um aluno precisa para se formar são problemas pertinentes em qualquer universidade pública brasileira. A fim de propor soluções se faz necessário entender os motivos para estes problemas. Neste tentarei apresentar alguns motivos que corroporam para a existência destes problemas.

Sobre os dados

No universo acadêmico temos alunos que estudam em um campus. Cada campus administra centros que por sua vez abriga cursos. Em todo curso há disciplinas que por sua vez é cursada por um ou vários alunos. Todo aluno está em um período corrente e este período é relativo ao período de ingresso.

TE = 0
NTE = 0
TNE = 0
NTNE = 0
registros <- read.csv("/Users/diegopedro/Dropbox/UFCG/AD2/MT 01/alunosUFCGAnon.csv")

Bibliotecas

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.2.3

A base de de dados consiste de 920529 registros

length(registros$Matricula)
## [1] 920529

Um sumario revisado dos dados pode ser visualizado abaixo

Numero de Matriculas

length(unique(registros$Matricula))
## [1] 32342

Os 10 cursos com o maior número de alunos

cursos_matriculas <- aggregate(list('Matriculas'=registros$Matricula),by=list('Curso'=registros$Nome_Curso),FUN=length)
cursos_matriculas[order(-cursos_matriculas$Matriculas),][1:10,]
##                        Curso Matriculas
## 63  MEDICINA VETERINÁRIA - D      60372
## 62              MEDICINA - D      56689
## 24            ENFERMAGEM - D      53611
## 28      ENGENHARIA CIVIL - D      42458
## 35       ENGENHARIA ELÉTRICA      41408
## 6  CIÊNCIA DA COMPUTAÇÃO - D      38246
## 37   ENGENHARIA MECÂNICA - D      26883
## 21               DIREITO - N      23847
## 20               DIREITO - M      23413
## 1          ADMINISTRAÇÃO - D      21983

Matrículas por período

ggplot(registros, aes(Periodo)) + geom_bar()

Distribuição de Notas

ggplot(registros, aes(Media_Disciplina)) + geom_density()
## Warning: Removed 26042 rows containing non-finite values (stat_density).

Problema 1: Evasão de alunos

Além das notas baixas, é possível explicar outros motivos para a evasão, considerando apenas os alunos que já concluíram o segundo período (uma vez que nos dois primeiros períodos os motivos de evasão é bastante óbvio e dificilmente explicado pelos dados: ‘não era o que eu pensava’,‘eu passei para o curso X na universidade Y’)?

Funções utilizadas neste problema

Seleciona Amostra A quantidade de dados e muito grande para ser processado em tempo hábil, então foi necessário pegar uma parte menor destes dados de forma randômica.

selecionaAmostra <- function(matriculas,tamanhoAmostra){
  amostra_indices <- floor(runif(tamanhoAmostra, min=0, max=length(matriculas)))
  
  amostra <- c(as.character(matriculas[amostra_indices[1]]))
  for(i in 2:length(amostra_indices)){
    amostra <- c(amostra,as.character(matriculas[amostra_indices[i]]))
  }
  
  return (amostra)  
}

Calcula CRE (a media de todas as notas dos alunos)

calculaCRE <- function(aluno){
  
  cre <- 0
  for(i in 1:length(aluno$Nome_Disciplina)){
    result <- (aluno$Creditos[i]*aluno$Media_Disciplina[i])
    cre <- cre + result
  }
  return (cre/sum(aluno$Creditos))
}

Processa Desempenho dos Alunos Esta função processa o desempenho dos alunos nos 5 primeiros períodos E feita uma média aritmética das médias das disciplinas em cada período

processaDesempenhoAlunos <- function(data,matriculas){
    desempenho <- data.frame('p1'=c(0),'p2'=c(0),'p3'=c(0),'p4'=c(0),'p5'=c(0))
    
    for(i in 1:length(matriculas)){
      aluno <- data[data$Matricula==matriculas[i],]
      desempenho_aluno <- c(calculaCRE(aluno[aluno$Periodo_Relativo==1,]))
   
      for(j in 2:5){
        desempenho_aluno <- c(desempenho_aluno,calculaCRE(aluno[aluno$Periodo_Relativo==j,]))
      }
      desempenho <- rbind(desempenho,desempenho_aluno)
      
    }
    return (desempenho)
}
A primeira hipótese levantada é que o desempenho dos alunos que evadem caem com o decorrer
Dos períodos diferentemente dos alunos que não evadem

Primeiramente é feita uma seleção dos dados dos alunos que evadiram o curso, mas que cursaram exatamente 5 períodos (sendo o último o qual o aluno evadiu)

alunos5periodos <- unique(registros[registros$Periodo_Relativo==1,]$Matricula)  
for (i in 2:5){
  alunosperiodo <- unique(registros[registros$Periodo_Relativo==i,]$Matricula)
  alunos5periodos <- intersect(alunosperiodo,alunos5periodos)
}
matriculas_evasao <- unique(registros[registros$Cod_Evasao==1,]$Matricula)
matriculas_evasao <- intersect(matriculas_evasao,alunos5periodos)

E em seguida é feita a mesma filtragem para os alunos que não evadiram

matriculas_nao_evasao <- unique(registros[registros$Cod_Evasao==0,]$Matricula)
matriculas_nao_evasao <- intersect(matriculas_nao_evasao,alunos5periodos)

Então é feita uma amostra de tamanho 150 de ambas bases de dados

amostra_evasao_matricula <- selecionaAmostra(matriculas_evasao,150)
amostra_nao_evasao_matricula <- selecionaAmostra(matriculas_nao_evasao,150)

E calculado o Desempenho dos alunos

desempenho_evasao <- na.omit(processaDesempenhoAlunos(registros,amostra_evasao_matricula))
desempenho_nao_evasao <- na.omit(processaDesempenhoAlunos(registros,amostra_nao_evasao_matricula))

E por fim os dados sao plotados

par(mfrow=c(1,2))

plot(main='Alunos que Evadiram',as.numeric(desempenho_evasao[2,]),type="o",ylim=c(0, 10))
for(i in 3:length(desempenho_evasao$p1)){
  lines(as.numeric(desempenho_evasao[i,]))
}

plot(main='Alunos que Evadiram',as.numeric(desempenho_nao_evasao[2,]),type="o",ylim=c(0, 10))
for(i in 3:length(desempenho_nao_evasao$p1)){
  lines(as.numeric(desempenho_nao_evasao[i,]))
}

O plot apresentado acima mostra um comportamento bem consideravelmente diferente entre os alunos que evadiram e não evadiram. Os alunos que evadiram mostra uma razoável queda ao longo dos 5 primeiros períodos, enquanto os alunos que não evadiram apresentam um desempenho constante.

A segunda hipótese levantada refere-se ao número de trancamentos, uma aluno que tranca mais é mais suseptível a deixar o curso.

Legenda TE : Número de disciplinas trancadas por alunos que evadiram NTE : Número de disciplinas cursadas por alunos que evadiram TNE : Número de disciplinas trancadas por alunos que não evadiram NTNE : Número de disciplinas cursadas por alunos que não evadiram

Para efeito de simplicidade consideraremos apenas o 5 periodo

periodo5 <- registros[registros$Periodo_Relativo==5,]
TE =   length(periodo5[periodo5$Cod_Evasao==1 &periodo5$Situacao=="Trancado",]$Nome_Disciplina)
NTE =  length(periodo5[periodo5$Cod_Evasao==1 &periodo5$Situacao!="Trancado",]$Nome_Disciplina)
TNE =  length(periodo5[periodo5$Cod_Evasao==0 &periodo5$Situacao=="Trancado",]$Nome_Disciplina)
NTNE = length(periodo5[periodo5$Cod_Evasao==0 &periodo5$Situacao!="Trancado",]$Nome_Disciplina)

Proporção dos alunos que evadiram no 5 periodo

TE/(TE+NTE)
## [1] 0.180453

Proporção dos alunos que nao evadiram no 5 periodo

TNE/(NTNE)
## [1] 0.03128472

Comparação

(TE/(TE+NTE))/(TNE/(NTNE))
## [1] 5.768089

O resultado apresentado acima mostra claramente que o número de trancamentos do período em que o aluno evadiu é consideravelmente bem maior comparado com os alunos que não evadiram

Problema 2: Tempo de Formação

Quais motivos contribuem para a média de formação em determinados cursos ser maiores do que de outros cursos, levando em consideração a carga horária? Sim, há cursos que tem disciplinas que travam a formação do aluno, como por exemplo cálculo 1?

Por motivos de simplicidade consideremos apenas os alunos de computação

Seleciona as disciplinas cursadas por alunos de computação que não evadiram

alunos_computacao <- registros[registros$Cod_Evasao==0 & registros$Nome_Curso=='CIÊNCIA DA COMPUTAÇÃO - D',]

Separando os alunos atrasados e não atrasados apesar de nesta seleção ser verdade que alunos que cursaram disciplinas em períodos superiores a 12 podem estar também em períodos inferiores a 12, a quantidade de dados é grande o suficiente (2949 e 34754 para atrasados e não atrasados respectivamente) para a interferência não ser prejudicial para a análise final

atrasados <- alunos_computacao[alunos_computacao$Periodo_Relativo>=12,]
nao_atrasados <- alunos_computacao[alunos_computacao$Periodo_Relativo < 12,]

A hipótese levantada é que a quantidade de créditos em média por período no caso dos atrasados é superior que a dos não atrasados

Calcula a média de atrasados e não atrasados

atrasadosc <- aggregate(list('Media'=atrasados$Creditos),by=list('creditos'=atrasados$Periodo),FUN=mean)
naoatrasadosc <- aggregate(list('Media'=nao_atrasados$Creditos),by=list('creditos'=nao_atrasados$Periodo),FUN=mean)

Mostra a Média

mean(atrasadosc$Media)
## [1] 3.742959
mean(naoatrasadosc$Media)
## [1] 3.787848

Concluímos que a diferença é muito pequena para afirmar algo

Conclusão

Alunos que evadem tendem a trancar disciplinas no período que deixa o curso Alunos que evadem têm comportamento de desempenho diferente dos alunos que não evadem A quantidade de créditos não é fator que influencia um aluno demorar para se formar.