library(tidyverse)
library(here)
library(dplyr)
library(tidyquery)
library(plotly)
library(factoextra)
library(NbClust)
library(klustR)
theme_set(theme_light())
#install.packages("extrafont")
#library(extrafont)
#font_import()
#loadfonts(device="win") #Register fonts for Windows bitmap output
#fonts()
windowsFonts(A = windowsFont("Times New Roman"))
# SEMPRE read_csv NUNCA read.csv
alunos = read_csv(
here("Dados-UFCG-jul2021/alunos.csv"),
col_types = cols(
),
)
## Warning: 567184 parsing failures.
## row col expected actual file
## 2589 APV_NOTA_1 a double COMUNICACAO E EXPRESSAO 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/alunos.csv'
## 2589 APV_NOTA_2 a double LINGUA ESTRANGEIRA 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/alunos.csv'
## 2589 APV_NOTA_3 a double HISTORIA 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/alunos.csv'
## 2589 APV_NOTA_4 a double GEOGRAFIA 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/alunos.csv'
## 2589 APV_NOTA_5 a double MATEMATICA 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/alunos.csv'
## .... .......... ........ ....................... ..............................................................
## See problems(...) for more details.
historico = read_csv(
here("Dados-UFCG-jul2021/historico.csv"),
col_types = cols(
MAT_TUR_PERIODO = col_character(),
MAT_TUR_ANO = col_character()
)
)
## Warning: 5572026 parsing failures.
## row col expected actual file
## 1 -- 8 columns 9 columns 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/historico.csv'
## 2 -- 8 columns 9 columns 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/historico.csv'
## 3 -- 8 columns 9 columns 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/historico.csv'
## 5 -- 8 columns 9 columns 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/historico.csv'
## 6 -- 8 columns 9 columns 'C:/Users/perei/Desktop/eda-tcc/Dados-UFCG-jul2021/historico.csv'
## ... ... ......... ......... .................................................................
## See problems(...) for more details.
disciplinas = read_csv(
here("Dados-UFCG-jul2021/disciplinas-geral.csv")
)
##
## -- Column specification --------------------------------------------------------
## cols(
## DIS_DISCIPLINA = col_double(),
## DIS_DESCRICAO = col_character(),
## DIS_QTD_CR = col_double(),
## DIS_QTD_CH = col_double(),
## DIS_SET_COD_SETOR = col_double(),
## DIS_TDI_COD_TIPO = col_double()
## )
nomes_reserva = read_csv2(
here("Dados-UFCG-jul2021/nomes_reserva.csv"))
## i Using '\',\'' as decimal and '\'.\'' as grouping mark. Use `read_delim()` for more control.
##
## -- Column specification --------------------------------------------------------
## cols(
## matricula = col_double(),
## cota = col_character(),
## nome = col_character()
## )
# Filtrando alunos n evadidos
# Filtrando alunos evadidos de 2009 a 2019
alunos_evadidos = alunos %>% filter(ALU_ANO_EVASA > 2008, ALU_ANO_EVASA < 2020, ALU_CCU_CUR_COD_CURSO==14102100,!is.na(ALU_ANO_EVASA))%>% filter(ALU_FORMA_EVASAO != 1)
alunos_no_curso = alunos %>% filter(ALU_CCU_CUR_COD_CURSO==14102100,is.na(ALU_ANO_EVASA))
formados = alunos %>% filter(ALU_CCU_CUR_COD_CURSO==14102100,ALU_FORMA_EVASAO == 1)
options(repr.plot.width = 16, repr.plot.height = 7)
Estatísticas Gerais
grafico1 <- alunos_evadidos %>%
group_by(ALU_ANO_EVASA) %>%
summarise(
contagem = n(), .groups = 'drop') %>%
ggplot(aes(x = as.factor(ALU_ANO_EVASA), y=contagem,label=contagem,fill=as.factor(ALU_ANO_EVASA))) +
geom_bar(stat="identity",width = 0.9,alpha=0.5) +
geom_text(size= 3.5, vjust = -0.3) +
labs(
x="Ano de evasão",
y="Número de alunos"
) +
scale_fill_discrete(guide="none") + theme(text=element_text(family="A"))
ggsave("grafico1.png",grafico1,width = 5,
height = 4)
grafico1

grafico2 <- alunos_evadidos %>%
group_by(ALU_FORMA_EVASAO) %>%
summarise(
contagem = n(), .groups = 'drop') %>%
ggplot(aes(x = reorder(ALU_FORMA_EVASAO,(-contagem)), y=contagem,label=contagem,fill=as.factor(ALU_FORMA_EVASAO))) +
geom_bar(stat="identity",width = 0.9,alpha=0.5) +
geom_text(size= 3.5, vjust = -0.3) +
labs(
x="Código de evasão",
y="Número de alunos"
) +
scale_fill_discrete(name="Forma de evasão",
breaks=c("0","001", "002", "003","004","005","006","007","008","009","010","011","012","013","014","015","016","017","018","019","020","021","022","023","050"),
labels=c("Aluno regularmente matriculado", "Graduado", "Transferência para outra Instituição de Ensino Superior","Falecimento","Abandono de curso","Cancelamento de matrícula","Cancelamento para mudança de curso","Cancelamento por decisão judicial","Cancelamento por solicitação do aluno","Suspensão temporária","Curso concluído - não colou grau","Cancelamento por não cumprimento da PEC","Reentrada no curso (novo vestibular)","Cumprimento convênio","Novo regimento","Não comparecimento a cadastro", "Remanejado de curso","Não compareceu ao remanejamento","Não compareceu à matrícula - Alunos ingressantes","Término de intercâmbio","Graduando por decisão judicial","Matrícula cancelada por reprovação por falta","Matrícula cancelada por reprovações na mesma disciplina","Matrícula suspensa - Débito na biblioteca","Aguardando cadastramento
"),guide="none") + theme(text=element_text(family="A"))
ggsave("grafico2.png",grafico2,width = 5,
height = 4)
grafico2

Filtragem e preparação dos dados (Construção do perfil)
# Remover alunos que se formaram posteriormente ou ainda estão no curso (nova matricula)
cpfs_formados = formados[['ALU_CPF']]
cpfs_no_curso = alunos_no_curso[['ALU_CPF']]
alunos_evadidos = alunos_evadidos %>% filter(!ALU_CPF %in% cpfs_formados)
alunos_evadidos = alunos_evadidos %>% filter(!ALU_CPF %in% cpfs_no_curso)
#Remove disciplinas ainda em curso e filtra apenas matriculas normais (excluindo despensa, extracurricular....)
historico = historico %>% filter(MAT_SITUACAO != 1) %>% filter(MAT_TIPO_MATRICULA==1)
historico_cc <- query(
"SELECT a.ALU_MATRICULA,a.ALU_CPF, a.ALU_FORMA_EVASAO, a.ALU_TIPO_RESERVA_VAGAS, a.ALU_SEXO, a.ALU_ANO_NASCIMENTO,a.ALU_PERIODO_EVASAO, h.MAT_TUR_DIS_DISCIPLINA, h.MAT_SITUACAO,h.MAT_TIPO_MATRICULA, a.ALU_ANO_EVASA, h.MAT_TUR_ANO,h.MAT_TUR_PERIODO,a.ALU_ANO_INGRESSO, a.ALU_PERIODO_INGRESSO
FROM alunos_evadidos a LEFT JOIN historico h ON a.ALU_MATRICULA = h.MAT_ALU_MATRICULA;"
)
result <- query(
"SELECT p.ALU_MATRICULA,p.ALU_CPF, p.ALU_FORMA_EVASAO,p.ALU_TIPO_RESERVA_VAGAS, p.ALU_SEXO, p.ALU_ANO_NASCIMENTO, p.MAT_TUR_DIS_DISCIPLINA, d.DIS_QTD_CR, d.DIS_DESCRICAO, p.ALU_ANO_EVASA,p.ALU_PERIODO_EVASAO, p.MAT_SITUACAO, p.MAT_TIPO_MATRICULA,p.ALU_ANO_INGRESSO, p.ALU_PERIODO_INGRESSO
FROM historico_cc p LEFT JOIN disciplinas d ON p.MAT_TUR_DIS_DISCIPLINA = d.DIS_DISCIPLINA;"
)
a = result %>% filter(ALU_MATRICULA=="113110899")
a
## # A tibble: 17 x 15
## ALU_MATRICULA ALU_CPF ALU_FORMA_EVASAO ALU_TIPO_RESERVA_VAGAS ALU_SEXO
## <dbl> <chr> <dbl> <lgl> <dbl>
## 1 113110899 00377056103 22 NA 1
## 2 113110899 00377056103 22 NA 1
## 3 113110899 00377056103 22 NA 1
## 4 113110899 00377056103 22 NA 1
## 5 113110899 00377056103 22 NA 1
## 6 113110899 00377056103 22 NA 1
## 7 113110899 00377056103 22 NA 1
## 8 113110899 00377056103 22 NA 1
## 9 113110899 00377056103 22 NA 1
## 10 113110899 00377056103 22 NA 1
## 11 113110899 00377056103 22 NA 1
## 12 113110899 00377056103 22 NA 1
## 13 113110899 00377056103 22 NA 1
## 14 113110899 00377056103 22 NA 1
## 15 113110899 00377056103 22 NA 1
## 16 113110899 00377056103 22 NA 1
## 17 113110899 00377056103 22 NA 1
## # ... with 10 more variables: ALU_ANO_NASCIMENTO <dbl>,
## # MAT_TUR_DIS_DISCIPLINA <dbl>, DIS_QTD_CR <dbl>, DIS_DESCRICAO <chr>,
## # ALU_ANO_EVASA <dbl>, ALU_PERIODO_EVASAO <dbl>, MAT_SITUACAO <dbl>,
## # MAT_TIPO_MATRICULA <dbl>, ALU_ANO_INGRESSO <dbl>,
## # ALU_PERIODO_INGRESSO <dbl>
#colocando semestre no formato ano.semestre
historico_cc <- historico_cc %>% mutate(SEMESTRE = paste(MAT_TUR_ANO,MAT_TUR_PERIODO, sep="."))
semestres <- query(
"SELECT p.ALU_MATRICULA as matricula, COUNT(DISTINCT(SEMESTRE)) as n_semestres
FROM historico_cc p
GROUP BY p.ALU_MATRICULA"
)
perfis = query(
"SELECT r.ALU_MATRICULA as matricula, r.ALU_CPF as cpf, r.ALU_FORMA_EVASAO as forma_evasao, r.ALU_ANO_EVASA as ano_evasao, r.ALU_PERIODO_EVASAO as periodo_evasao, r.ALU_SEXO as sexo, r.ALU_ANO_NASCIMENTO as ano_nascimento, SUM(r.DIS_QTD_CR) as creditos_matriculados, r.ALU_ANO_INGRESSO as ano_ingresso, r.ALU_PERIODO_INGRESSO as periodo_ingresso
FROM result r
GROUP BY r.ALU_MATRICULA, r.ALU_FORMA_EVASAO, r.ALU_ANO_EVASA,r.ALU_SEXO,r.ALU_ANO_NASCIMENTO,r.ALU_CPF,r.ALU_PERIODO_EVASAO,r.ALU_ANO_INGRESSO, r.ALU_PERIODO_INGRESSO
;"
)
#SELECIONA AS DISCIPLINAS APROVEITADAS, CONTAM SÓ AS APROVADAS(CÓDIGO 3) E TIPO DE MTRICULA (1 - NORMAL):
historico2 <- historico %>% filter(MAT_SITUACAO==3) %>% filter(MAT_TIPO_MATRICULA==1)
historico_cc2 <- query(
"SELECT a.ALU_MATRICULA, h.MAT_TUR_DIS_DISCIPLINA
FROM alunos a LEFT JOIN historico2 h ON a.ALU_MATRICULA = h.MAT_ALU_MATRICULA;"
)
result2 <- query(
"SELECT p.ALU_MATRICULA, d.DIS_QTD_CR
FROM historico_cc2 p LEFT JOIN disciplinas d ON p.MAT_TUR_DIS_DISCIPLINA = d.DIS_DISCIPLINA;"
)
alunos_aprovados = query(
"SELECT r.ALU_MATRICULA as matricula, SUM(r.DIS_QTD_CR) as creditos_integralizados
FROM result2 r
GROUP BY r.ALU_MATRICULA;"
)
# Trocar aproveitados -> integralizados /acumulados -> matriculados
# Calculando Taxa de sucesso
perfis <- merge(perfis,alunos_aprovados)
# Calculando Carga Média (Créditos por semestre)
perfis <- merge(perfis,semestres)
# Adicionando idade do aluno no ano de evasão
perfis <- perfis %>% mutate(idade_evasao=ano_evasao - ano_nascimento)
#Adicionando os nomes dos alunos no perfil
#perfis <- merge(perfis,nomes_reserva)
#linkedin <- read_csv(here("Dados-UFCG-jul2021/linkedin.csv")) %>% select("nome","url")
#Adicionado dados do linkedin
#perfis <- left_join(perfis,linkedin)
#alunos_ficha %>% count(nome)
# Parte_1 = Filtrar alunos com um matrícula só -> Filtrar apenas com código 8,4,21,22
# dataframe auxiliar
aux = perfis %>% count(cpf)
aux = aux %>% filter(n < 2)
aux = aux[['cpf']] #cpfs de alunos com apenas uma matricula
# filtrar perfis no qual o aluno possui uma mátricula só
perfis_1 = perfis %>% filter(cpf %in% aux)
#filtrar as matriculas de interesse
perfis_1 = perfis_1 %>% filter(forma_evasao == 22 | forma_evasao == 4| forma_evasao == 21 | forma_evasao == 8| forma_evasao == 14| forma_evasao == 5|forma_evasao == 6)
#Replace na coluna de evasão
altera = function(x){
if(x == 4 | x == 5){
return (4)
}else if(x == 14 | x == 6){
return (6)
}else{
return (x);
}
}
altera_V <- Vectorize(altera)
perfis_1 <- perfis_1 %>% mutate(forma_evasao = altera_V(forma_evasao))
perfis_1 <- perfis_1 %>% select(cpf,forma_evasao,sexo,ano_nascimento,ano_evasao,creditos_matriculados,creditos_integralizados,n_semestres,idade_evasao)
# Parte 2
perfis_2 = perfis %>% filter(!cpf %in% aux)
aux2 = perfis_2 %>% filter(forma_evasao %in% c(22,4,21,8,6,5,14)) #7,2,10
aux2 = aux2[['cpf']]
#Removendo duplicações
aux2 = unique(aux2)
#Removendo alunos que não tem nenhuma matricula com as formas de evasão desejadas
perfis_2 = perfis_2 %>% filter(cpf %in% aux2)
# Variáveis que precisam ser somadas: creditos matriculados, integralizados e semestres
p1 = query(
"SELECT p.cpf, sum(creditos_matriculados) as creditos_matriculados, sum(creditos_integralizados) as creditos_integralizados, sum(n_semestres) as n_semestres
FROM perfis_2 p
GROUP BY p.cpf
;"
)
# Varíaveis que se repetem
p2 = query(
"SELECT DISTINCT p.cpf, p.sexo, p.ano_nascimento
FROM perfis_2 p
;"
)
#Varíaveis que ficará o registro mais recente
perfis_2 <- perfis_2 %>% select(cpf,forma_evasao,ano_evasao,periodo_evasao,idade_evasao,ano_ingresso,periodo_ingresso)
ss <- query("SELECT p.cpf, max(p.ano_evasao) as ano_evasao_u
FROM perfis_2 p
GROUP BY p.cpf
;")
perfis_2 = merge(ss,perfis_2) %>% filter(ano_evasao == ano_evasao_u)
dd <- query("SELECT p.cpf, max(p.periodo_evasao) as periodo_evasao_u
FROM perfis_2 p
GROUP BY p.cpf;")
perfis_2 = merge(dd,perfis_2) %>% filter(periodo_evasao == periodo_evasao_u)
nn <- query("SELECT p.cpf, max(p.ano_ingresso) as ano_ingresso_u
FROM perfis_2 p
GROUP BY p.cpf;")
perfis_2 = merge(nn,perfis_2) %>% filter(ano_ingresso == ano_ingresso_u)
perfis_2 = perfis_2 %>% select(cpf, forma_evasao,idade_evasao,ano_evasao)
perfis_2 = perfis_2 %>% mutate(forma_evasao= altera_V(forma_evasao))
perfis_2 = merge(perfis_2,p1)
perfis_2 = merge(perfis_2,p2)
#Juntando os perfis
perfis <- bind_rows(perfis_1,perfis_2)
perfis <- perfis %>% mutate(taxa_sucesso= creditos_integralizados / creditos_matriculados)
perfis <- perfis %>% mutate(carga_media = creditos_matriculados/ n_semestres)
perfis <- perfis %>% filter(!is.na(taxa_sucesso))
g <- perfis %>%
group_by(forma_evasao) %>%
summarise(
contagem = n(), .groups = 'drop') %>%
ggplot(aes(x = reorder(forma_evasao,(-contagem)), y=contagem,label=contagem,fill=as.factor(forma_evasao))) +
geom_bar(stat="identity",width = 0.9,alpha=0.5) +
geom_text(size= 3.5, vjust = -0.3) +
labs(
x="Código de evasão",
y="Número de alunos"
) +
scale_fill_discrete(name="Forma de evasão",
breaks=c("0","001", "002", "003","004","005","006","007","008","009","010","011","012","013","014","015","016","017","018","019","020","021","022","023","050"),
labels=c("Aluno regularmente matriculado", "Graduado", "Transferência para outra Instituição de Ensino Superior","Falecimento","Abandono de curso","Cancelamento de matrícula","Cancelamento para mudança de curso","Cancelamento por decisão judicial","Cancelamento por solicitação do aluno","Suspensão temporária","Curso concluído - não colou grau","Cancelamento por não cumprimento da PEC","Reentrada no curso (novo vestibular)","Cumprimento convênio","Novo regimento","Não comparecimento a cadastro", "Remanejado de curso","Não compareceu ao remanejamento","Não compareceu à matrícula - Alunos ingressantes","Término de intercâmbio","Graduando por decisão judicial","Matrícula cancelada por reprovação por falta","Matrícula cancelada por reprovações na mesma disciplina","Matrícula suspensa - Débito na biblioteca","Aguardando cadastramento
"),guide="none") + theme(text=element_text(family="A"))
g

grafico3 <- semestres %>%
group_by(n_semestres) %>%
summarise(
contagem = n(), .groups = 'drop') %>%
ggplot(aes(x = n_semestres, y=contagem,label=contagem, fill="#fff")) +
geom_bar(stat="identity",width = 0.9,alpha=0.5) +
geom_text(size= 3.5, vjust = -0.3) +
labs(
x="Números de semestres",
y="Número de alunos"
) +
scale_fill_discrete(guide="none") + theme(text=element_text(family="A"))
ggsave("grafico3.png",grafico3,width = 5,
height = 4)
grafico3

#Replace na coluna de evasão
altera = function(x){
if(x == 4){
return ("Abandono de Curso")
}else if(x == 6){
return ("Mudança de curso")
}else if (x == 8){
return ("Cancelamento por solicitação do aluno");
} else if( x== 22){
return("Reprovação por três vezes na mesma disciplina")
}else{
#21
return("Reprovação por falta em todas as disciplinas de um período")
}
}
altera_V <- Vectorize(altera)
perfis = perfis %>% mutate(forma_evasao_s = altera_V(forma_evasao)) %>% mutate(forma_evasao_s = as.factor(forma_evasao_s))
grafico4 <- perfis %>% ggplot(aes(x=creditos_matriculados,fill=forma_evasao_s)) +
facet_wrap(~forma_evasao_s,ncol=1) +
geom_histogram(binwidth = 8) + labs(
title="", x="Créditos Matriculados", y="Número de alunos"
) + theme(text=element_text(family="A"),strip.background = element_rect(fill = "grey"),strip.text.x = element_text(colour = 'black')
) + scale_fill_discrete(guide="none") + scale_x_continuous(breaks=c(0,50,100,150,200,250,300,350,400))
ggsave("grafico4.png",grafico4,width = 5,height = 5)
grafico4

grafico4

Agrupamento
#separando os grupos
grupo_1 = perfis %>% filter(creditos_matriculados <= 40, creditos_integralizados <= 24)
grupo_2 = anti_join(perfis,grupo_1)
## Joining, by = c("cpf", "forma_evasao", "sexo", "ano_nascimento", "ano_evasao", "creditos_matriculados", "creditos_integralizados", "n_semestres", "idade_evasao", "taxa_sucesso", "carga_media", "forma_evasao_s")
grafico5 <- grupo_1 %>% ggplot(aes(x=creditos_matriculados,fill=forma_evasao_s)) +
facet_wrap(~forma_evasao_s,ncol=1) +
geom_histogram(binwidth = 8) + labs(
title="", x="Créditos Matriculados", y="Número de alunos"
) + theme(text=element_text(family="A"),strip.background = element_rect(fill = "grey"),strip.text.x = element_text(colour = 'black')
) + scale_fill_discrete(guide="none") + scale_x_continuous(breaks=c(0,10,20,30,40,50))
ggsave("grafico5.png",grafico5,width = 5,
height = 5)
grafico5

grafico6 <- grupo_2 %>% ggplot(aes(x=creditos_matriculados,fill=forma_evasao_s)) +
facet_wrap(~forma_evasao_s,ncol=1) +
geom_histogram(binwidth = 8) + labs(
title="", x="Créditos Matriculados", y="Número de alunos"
) + theme(text=element_text(family="A"),strip.background = element_rect(fill = "grey"),strip.text.x = element_text(colour = 'black')
) + scale_fill_discrete(guide="none") + scale_x_continuous(breaks=c(0,50,100,150,200,250,350,400))
ggsave("grafico6.png",grafico6,width =5 ,
height = 5)
grafico6
