Skip to content

Instantly share code, notes, and snippets.

  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save sillasgonzaga/b134367d166208edda24682b5cad5cfb to your computer and use it in GitHub Desktop.
Post reprodutível e consertado do post sobre o Censo da Educação Superior
library(data.table)
library(readxl)
library(tidyverse)
library(stringi)
library(magrittr)
library(sf)
library(geosphere)
#### Importacao dos dados ####
# arquivos originais extraidos do endereco abaixo
# http://dados.gov.br/dataset/microdados-do-censo-da-educacao-superior/resource/572ea703-014a-47eb-8fd6-cdc1d0e2d60c
arq_aluno <- "/home/sillas/R/data/DM_ALUNO.CSV"
arq_ies <- "/home/sillas/R/data/DM_IES.CSV"
df_aluno <- fread(arq_aluno,
select = c("CO_IES", "CO_UF_NASCIMENTO",
"CO_MUNICIPIO_NASCIMENTO", "ANO_INGRESSO"))
df_ies <- fread(arq_ies) %>%
select(CO_IES, NO_IES, SGL_IES, DS_CATEGORIA_ADMINISTRATIVA, CO_MUNICIPIO_IES,
NO_MUNICIPIO_IES, CO_UF_IES, SGL_UF_IES, NO_REGIAO_IES)
# tabela de municipios
# url <- "ftp://geoftp.ibge.gov.br/organizacao_do_territorio/redes_e_fluxos_geograficos/gestao_do_territorio/bases_de_dados/xls/Base_de_dados_dos_municipios.xls"
# download.file(url,
# destfile = "municipios.xls",
# method = "curl")
#
# df_cidades <- read_excel("municipios.xls") %>%
# select(CodUF, Codmundv, NomeMunic) %>%
# purrr::set_names(c("CO_UF", "CO_MUNICIPIO", "NO_MUNICIPIO")) %>%
# mutate(CO_UF = as.integer(CO_UF))
df_coord <- read_csv("https://raw.githubusercontent.com/kelvins/Municipios-Brasileiros/master/Municipios_Brasileiros.csv") %>%
select(-Estado) %>%
set_names(c("CO_MUNICIPIO", "NO_MUNICIPIO", "CO_UF", "SGL_UF", "LATITUDE",
"LONGITUDE"))
# criar tabela de regioes
df_uf_regiao <- df_ies %>%
distinct(SGL_UF_IES, NO_REGIAO_IES) %>%
rename(SGL_UF = SGL_UF_IES, REGIAO = NO_REGIAO_IES)
# df_cidades <- df_coord %>%
# select(CO_UF, CO_MUNICIPIO, NO_MUNICIPIO)
#
# df_uf <- df_ies %>%
# distinct(CO_UF_IES, SGL_UF_IES) %>%
# purrr::set_names(c("CO_UF", "SGL_UF"))
# Importar o shapefile
link <- "ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2016/Brasil/BR/"
dir.create("data/base_mapa")
arquivo <- "data/base_mapa/shp_uf.zip"
link_estados = paste0(link, "br_unidades_da_federacao.zip")
download.file(link_estados, arquivo)
unzip(arquivo, exdir = "data/base_mapa")
# 02 - Importar arquivos de shapefile com a funcao sf::st_read()
estados <- sf::read_sf("data/base_mapa/BRUFE250GC_SIR.shp")
#### Juntar bases ####
df_principal <- inner_join(df_aluno, df_ies, by = "CO_IES") %>%
inner_join(df_coord,
by = c("CO_MUNICIPIO_NASCIMENTO" = "CO_MUNICIPIO")) %>%
# renomear colunas referentes aos alunos
rename(SGL_UF_NASCIMENTO = SGL_UF,
NO_MUNICIPIO_NASCIMENTO = NO_MUNICIPIO) %>%
select(-CO_UF_IES) %>%
# concatenar colunas de municipio e UF
mutate(MUNICIPIO_ALUNO = paste0(NO_MUNICIPIO_NASCIMENTO, " (", SGL_UF_NASCIMENTO, ")"),
MUNICIPIO_IES = paste0(NO_MUNICIPIO_IES, " (", SGL_UF_IES, ")")) %>%
# filtrar casos onde o municipio do aluno eh diferente da ies
filter(MUNICIPIO_ALUNO != MUNICIPIO_IES) %>%
# corrigir encoding da coluna municipio ies
mutate(MUNICIPIO_IES = iconv(MUNICIPIO_IES, "ISO-8859-1", "UTF-8"))
# padronizar nome das colunas de municipio
limpar_nome_cidade <- . %>%
# remover acentos
stri_trans_general("Latin-ASCII") %>%
# converter para maiusculo
str_to_upper()
df_principal <- df_principal %>%
mutate_at(vars(MUNICIPIO_ALUNO, MUNICIPIO_IES), limpar_nome_cidade)
# bkp <- df_principal
# acrescentar colunas de regiao do aluno
df_principal <- df_principal %>%
left_join(df_uf_regiao, by = c("SGL_UF_NASCIMENTO" = "SGL_UF")) %>%
rename(NO_REGIAO_ALUNO = REGIAO)
# agregar dados para contar fluxos mais comuns
df_agg <- df_principal %>%
select(cod_mun_aluno = CO_MUNICIPIO_NASCIMENTO, nome_mun_aluno = MUNICIPIO_ALUNO,
cod_mun_ies = CO_MUNICIPIO_IES, nome_mun_ies = MUNICIPIO_IES) %>%
group_by_all() %>%
summarise(qtd = n()) %>%
ungroup() %>%
arrange(desc(qtd))
write_rds(df_principal, "/home/sillas/R/data/df_principal_censo_educ_superior.rds")
#### Criacao do mapa ####
# Criar dataframes separados para os municipios do aluno (origem ou org) e da IES (destino ou dest)
df_org <- select(df_agg, org = cod_mun_aluno)
df_dest <- select(df_agg, dest = cod_mun_ies)
# criar variáveis para a quantidade de cada fluxo
qtd <- df_agg$qtd
maxqtd <- max(qtd)
# acrescentar latitude e longitude para cada cidade dois dataframes
df_org %<>% left_join(df_cidades_completo, by = c('org' = 'CO_MUNICIPIO'))
df_dest %<>% left_join(df_cidades_completo, by = c('dest' = 'CO_MUNICIPIO'))
# para ver quanto tempo levou para gerar o mapa
t1 <- proc.time()
# Para salvar em um PNG de alta resolução, desmarque as duas linhas abaixo, além da dev.off()
#myPng <- function(..., width=13, height=13, res=300) {png(..., width=width*res, height=height*res, res=res)}
#myPng("mapa.png")
# Para deixar o gráfico bonito, usaremos um fundo preto
#maps::map(estados, col="#191919", fill=TRUE, bg="#000000")
#plot(st_geometry(estados), col="#191919", bg="#000000")
# Encapsular codigo do mapa numa funcao
myPng <- function(..., width=13, height=13, res=300) {png(..., width=width*res, height=height*res, res=res)}
myPng("mapa.png")
par(bg = "#000000")
plot(st_geometry(estados), col="#191919")
# além de um escala que vai de preto (valores menores) a azul (valores maiores)
pal <- colorRampPalette(c("#333333", "white", "#1292db"))
colors <- pal(100)
# título
title("Mapeamento do movimento migratório \nuniversitário no Brasil", col.main = "white", cex.main = 1)
# referencia abaixo do mapa
mtext("Fonte: Censo do Ensino Superior 2014 \n Autor: Sillas Gonzaga (sillasgonzaga.github.io)",
col = "white", side = 1, line = 1, cex = 1)
# Para gerar as linhas, a função gcIntermediate é necessária,
# porém dois dos argumentos dela, p1 e p2, só podem ser vetores de tamanho 2
# portanto, preciamos fazer um for loop para plotar cada linha de df_org e df_dest individualmente
# ao final do loop, todas as linhas estarão plotadas no mapa
n <- nrow(df_agg)
#n <- 100
for (i in 1:n) {
p1 = c(df_org[i, ]$lon, df_org[i, ]$lat)
p2 = c(df_dest[i, ]$lon, df_dest[i, ]$lat)
inter <- geosphere::gcIntermediate(p1, p2, n = 100, addStartEnd = TRUE)
# determinar cor de cada fluxo
colindex <- ((qtd[i]/maxqtd)*length(colors)) %>% round
mycol = colors[colindex]
lines(inter, col = mycol, lwd = 0.8)
}
dev.off()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment