library(readr)
library(tidyverse)
library(janitor)
library(openxlsx)
library(xtable)
library(ggpubr)
library(dplyr)
library(plyr)
library(igraph) # social network analysis
library(visNetwork)
library(networkD3) # load package for sankey network
# Abrindo os dados --------------------------------------------------------
setwd("C:/Users/geisa.vasconcelos/workspace/trabalho/PROGRAD/reitoresRn/")
dados_ingressantes <- read_delim("data/dados_ingressantes.csv",
";", escape_double = FALSE,
col_types = cols(cpf_cnpj = col_character(),
matricula = col_character()),
locale = locale(encoding = "WINDOWS-1252"),
trim_ws = TRUE)
dados_ingressantes %>% drop_na(matricula) -> dados_ingressantes
dados_ingressantes %>% nrow ## [1] 22221
dados_ingressantes$sigla %>% table %>% prop.table %>% data.frame -> frequencia
data.frame(Categoria = frequencia$., Percentual = paste0(as.character(round(frequencia$Freq,4)*100), "%")) %>%
ggtexttable(rows=NULL, theme = ttheme("mBlue")) -> q
q + theme_void() + labs(title = "Percentual de Alunos por Tipo de Ação Afirmativa",
caption = "Universidade Federal Rural do Semi-Árido - PROGRAD")dados_ingressantes %>%
tabyl(sigla, campus) %>%
adorn_totals("row") %>%
adorn_percentages("row") %>%
adorn_pct_formatting() %>%
adorn_ns() %>%
adorn_title("combined") %>% ggtexttable(rows=NULL, theme = ttheme("mBlue")) -> q
q + theme_void() + labs(title = "Quantitativo de Alunos por Campus e Ação Afirmativa",
caption = "Universidade Federal Rural do Semi-Árido - PROGRAD")Apresentamos algumas estatísticas descritivas por cota e o box-plot do IRA por cota e campus.
# Testes de hipoteses -----------------------------------------------------
dados_teste = data.frame(Cota = dados_ingressantes$sigla, ira = dados_ingressantes$ira, campus=dados_ingressantes$campus)
# remover os zeros (ira = 0 significa que a pessoa nao frequentou ou nao
# foi submetido a alguma avaliacao):
dados_teste <- dados_teste[!(dados_teste$ira==0),]
# summary dos dados
dados_teste %>%
group_by(Cota) %>%
dplyr::summarize(Minimo = round(min(ira, na.rm = TRUE), 2),
Media = round(mean(ira), 2),
Desvio = round(sd(ira), 2),
Mediana = round(median(ira), 2),
Maximo = round(max(ira, na.rm = TRUE), 2)) %>% ggtexttable(rows=NULL, theme = ttheme("mBlue")) -> p
p + theme_void() + labs(title = "Medidas do IRA por Ação Afirmativa",
subtitle = "Removidos os alunos com IRA igual a zero",
caption = "Universidade Federal Rural do Semi-Árido - PROGRAD")# boxplot das notas
p2 <- ggplot(dados_teste, aes(y=ira, x=Cota, color=Cota)) +
geom_boxplot(outlier.color="black", fill="white") +
facet_wrap(~campus) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
p2Testaremos a hipótese de que diferença entre o IRA médio de cotistas e não cotistas é estatisticamente nula. O teste t para duas amostras (cada uma com 500 observações obtidas por amostragem aleatória simples) apresenta um valor-p próximo de zero, o que nos leva a rejeitar a hipótese de igualdade das médias.
# Testes de hipoteses para media do ira Cotistas x Ampla concorrencia
dados_teste %>% filter(dados_teste$Cota != "Não Aplicável") -> dados_teste #%>% table
dados_teste$Cota = ifelse(dados_teste$Cota == "AC", "AC", "COTA")
# ira dos cotistas e nao cotistas
cotistas = dados_teste[dados_teste$Cota == "COTA", "ira"]
n_cotistas = dados_teste[dados_teste$Cota == "AC", "ira"]
set.seed(1234)
cotistas_boot = sample(cotistas, 300, replace=FALSE)
n_cotistas_boot = sample(n_cotistas, 300, replace=FALSE)
# teste t
t.test(n_cotistas_boot, cotistas_boot)##
## Welch Two Sample t-test
##
## data: n_cotistas_boot and cotistas_boot
## t = 3.5868, df = 596.69, p-value = 0.0003622
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 3.394531 11.610586
## sample estimates:
## mean of x mean of y
## 57.94739 50.44483
Para testar a hipótese de igualdade das médias, utilizaremos o seguinte procedimento bootstrap:
considere duas amostras independentes
O procedimento consiste em
A vantagem deste procedimento é que ele não parte de nenhum pressuposto de normalidade das amostras, como faz o teste t. O teste bootstrap forneceu um valor-p de \(0.002\), o que também fornece pouca evidência a favor da hipótese de igualdade de médias entre as duas amostras:
# Utilizando bootstrap
t_obs = mean(n_cotistas_boot) - mean(cotistas_boot)
# step 0
merge_boot = c(cotistas_boot, n_cotistas_boot)
# step 1
pvalue = rep(0, 1000)
for(i in 1:1000){
nova_amostra = sample(merge_boot, replace=TRUE)
x_bar_star = mean(nova_amostra[1:(length(nova_amostra)/2)])
y_bar_star = mean(nova_amostra[(length(nova_amostra)/2 + 1):(length(nova_amostra))])
t_star = x_bar_star - y_bar_star
if(t_star > t_obs){
pvalue[i] = 1
} else {
pvalue[i] = 0
}
}
pvalue = mean(pvalue)
pvalue## [1] 0.002
Filtrando os dados para obter os cpf’s ligados a mais de uma matrícula, podemos obter a movimentação dos reingressantes entre os cursos de graduação. No total, existem 3130 cpf’s nesta situação. Cabe observar que os alunos formados em BCT são considerados ingressantes nos cursos de engenharia, portanto os seus cpf’s estão ligados a duas matrículas na Universidade. É possível contruir uma matriz de adjacência dos cursos, cujas primeiras linhas são apresentadas abaixo:
# Movimentacao dos reingressantes -----------------------------------------
dados_ingressantes$cpf_cnpj %>% duplicated -> index_duplicados
dados_ingressantes$cpf_cnpj[index_duplicados] %>% unique -> cpf_duplicados
length(cpf_duplicados)## [1] 3130
dados_ingressantes %>% filter(., cpf_cnpj %in% cpf_duplicados) -> reingressantes
reingressantes %>% mutate(ano_ingresso = substr(matricula, start=1, stop=4)) %>% arrange(., cpf_cnpj) -> reingressantes
# criar matriz de movimentacao de cursos
reingressantes$curso %>% unique -> cursos_reing
mat_cursos = matrix(0,length(cursos_reing), length(cursos_reing))
colnames(mat_cursos) = rownames(mat_cursos) = cursos_reing
# percorrer os cpfs e imprimir os cursos em que os reingressantes se movimentaram
for(cpf in unique(reingressantes$cpf_cnpj)){
reingressantes %>% filter(cpf_cnpj == cpf) -> filtrado
cursos_filtrado = data.frame(cpf = as.character(filtrado$cpf_cnpj),
curso = as.character(filtrado$curso), ano = filtrado$ano_ingresso) %>% arrange(., ano)
#print(cursos_filtrado)
for(i in 1:(nrow(cursos_filtrado)-1)){
mat_cursos[as.character(cursos_filtrado$curso[i]), as.character(cursos_filtrado$curso[i+1])] =
mat_cursos[as.character(cursos_filtrado$curso[i]), as.character(cursos_filtrado$curso[i+1])] + 1
}
}
# exportar para o excel:
#View(mat_cursos)
mat_cursos = mat_cursos[order(row.names(mat_cursos)),order(row.names(mat_cursos))]
DT::datatable(head(mat_cursos),
options = list(dom = 't',
scrollX = TRUE,
scrollCollapse = TRUE)
) Podemos representar a matriz de adjacência como um grafo interativo que mostra os fluxos de reingressantes entre os cursos:
# Fluxo de reingressantes -------------------------------------------------
matrix <- mat_cursos
label = colnames(matrix)
colnames(matrix)<-c(0:37)
Nodes <- as.data.frame(label)
colnames(Nodes)<- as.factor(colnames(Nodes))
#Setting column names
network1=graph_from_adjacency_matrix(matrix,mode="directed",weighted=T,diag=T)
Links1 <- get.data.frame(network1)
Links1$logweight <- log(Links1$weight)
#Creating a transformed variable using log weight
Links1$from<-as.numeric(Links1$from)
#Converting to numeric
Links1$to<-as.numeric(Links1$to)
#Converting to numeric
network2=graph_from_adjacency_matrix(matrix,mode="undirected",weighted=T,diag=F)
Links2 <- get.data.frame(network2)
Links2$logweight <- log(Links2$weight)
#Creating a transformed variable using log weight
Links2$from<-as.numeric(Links2$from)
#Converting to numeric
Links2$to<-as.numeric(Links2$to)
#Converting to numeric
#Generating sankey plot object
# sankeyNetwork(Links= Links2, Nodes = Nodes, Source = 'from', Target = 'to',
# Value = 'weight', NodeID ="label", fontSize=12, nodeWidth=5)
test.gr <- graph_from_adjacency_matrix(mat_cursos, mode="directed", weighted=T)
## convert to VisNetwork-list
test.visn <- toVisNetworkData(test.gr)
## copy column "weight" to new column "value" in list "edges"
test.visn$edges$value <- test.visn$edges$weight
visNetwork(test.visn$nodes, test.visn$edges) %>%
visIgraphLayout(layout = "layout_in_circle") %>%
visEdges(arrows = "middle")Desenvolvido por Kássio Camelo
kassio.silva@ufersa.edu.br