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.
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).
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’)?
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)
}
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.
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
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
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.