Primeiramente, vamos carregar os dados produzidos anteriormente por escola.
load('../dados/escolas.RData')
Para cruzar essas informações com outros valores (como por exemplo localização, proporção de alunos PPI e IPVS), será necessário obter o código INEP de cada escola. Em teoria, segundo o manual do SIOPE, esse dado deveria estar disponível na coluna de ‘código do local do exercício’. Ocorre que, por algum motivo desconhecido, os valores ali presentes não são os mesmos da base do INEP. Por esse motivo, vamos ter que fazer um join da base de escolas com o arquivo ‘Local de Exercicio - Escolas.CSV’, obtido diretamente da página do FNDE (https://www.fnde.gov.br/index.php/fnde_sistemas/siope/relatorios/arquivos-dados-analiticos). Caso o link saia do ar eventualmente, é possível encontrar essa informação no Achados e Pedidos (https://www.achadosepedidos.org.br/pedidos/codigo-da-escola-no-censo-escolar-para-os-dados-do-siope).
Esse arquivo não contém o cruzamento do código misterioso com o código do INEP, mas o nome registrado das escolas parece ser o mesmo obtido nos arquivos do SIOPE, então um cruzamento por nome deveria possibilitar obter essa informação. Vamos primeiro abrir o arquivo:
cod_inep <- data.table::fread('../dados/Local de Exercicio - Escolas.CSV', quote = "\'") %>%
janitor::clean_names()
## Warning in data.table::fread("../dados/Local de Exercicio - Escolas.CSV", :
## Found and resolved improper quoting out-of-sample. First healed line 172982:
## <<'22';'PI';'220950';'SANTO INACIO DO PIAUI';22132929;'ESCOL;'Municipal'>>.
## If the fields are not quoted (e.g. field separator does not appear within any
## field), try quote="" to avoid this warning.
Agora verificar se há escolas homônimas:
escolas %>%
distinct(local_de_exercicio) %>%
nrow()
## [1] 1490
O número bate com o número de observações, então podemos prosseguir:
# Filtrando pelas escolas paulistanas
cod_inep <- cod_inep %>%
filter(cod_muni == 355030) %>%
select(cod_escola, nom_escola) %>%
mutate(nom_escola = gsub("\\'","", nom_escola))
escolas_com_cod <- escolas %>%
left_join(cod_inep, by = c('local_de_exercicio' = 'nom_escola'))
Agora vamos verificar se alguma escola ficou de fora:
escolas_com_cod %>%
filter(is.na(cod_escola)) %>%
nrow()
## [1] 11
Temos 11 escolas. Olhando as duas bases, é possível notar que nem sempre os nomes batem. Ainda assim, por ser um número desprezível perto do total analisado, vamos prosseguir sem essas unidades.
A prefeitura de São Paulo disponibiliza um completo arquivo com dados de endereço e localização de todas as escolas (http://dados.prefeitura.sp.gov.br/dataset/cadastro-de-escolas-municipais-conveniadas-e-privadas). Enquanto isso limita o método utilizado aqui para expansão em outras cidades, torna a análise presente mais completa, motivo pelo qual será adotado.
Abrindo o arquivo:
localiz <- read.csv2('../dados/escolas122019.csv') %>%
mutate(cod_escola = as.numeric(codinep))
É possível notar que a coluna do código INEP está exportada incorretamente com “.0” no final de cada um, por isso o mutate na importação.
Nós queremos apenas 5 informações: código, latitude, longitude, distrito e o código do distrito:
localiz <- localiz %>%
select(cod_escola, latitude, longitude, distrito, coddist)
O arquivo exportado pela prefeitura possui erros na pontuação das coordenadas, por isso vamos corrigir:
localiz <- localiz %>%
mutate(latitude = gsub("(\\.)", "", latitude)) %>%
mutate(latitude = paste0(stringr::str_sub(latitude, 1, 3),".", stringr::str_sub(latitude, 4, -1))) %>%
mutate(longitude = gsub("(\\.)", "", longitude)) %>%
mutate(longitude = paste0(stringr::str_sub(longitude, 1, 3),".", stringr::str_sub(longitude, 4, -1)))
Agora o join:
escolas_com_cod <- escolas_com_cod %>%
left_join(localiz)
## Joining, by = "cod_escola"
Agora que temos o distrito, vamos obter o IPVS. O arquivo pode ser obtido em http://ipvs.seade.gov.br/view/index.php
ipvs <- data.table::fread("../dados/BaseIPVS2010.csv") %>%
filter(v1 == 3550308)
## Warning in require_bit64_if_needed(ans): Some columns are type 'integer64'
## but package bit64 is not installed. Those columns will print as strange
## looking floating point data. There is no need to reload the data. Simply
## install.packages('bit64') to obtain the integer64 print method and print the
## data again.
Os valores estão por setor censitário, por isso vamos criar uma coluna com o IPVS médio de cada distrito:
ipvs <- ipvs %>%
group_by(v61) %>%
summarise(media = mean(v10))
Vamos extrair o código dos distritos agora:
ipvs <- ipvs %>%
mutate(v61 = as.character(v61)) %>%
mutate(coddist = as.numeric(substr(v61, 8, 9))) %>%
select(-v61)
E dar join:
escolas_com_cod <- escolas_com_cod %>%
left_join(ipvs)
## Joining, by = "coddist"
Por fim, vamos incluir os dados dos estudantes. Para isso, será necessário baixar os microdados do censo escolar do INEP e filtrar o arquivo pelos dados paulistanos antes de importar. Assim como feito no arquivo 1, isso pode ser feito no shell do linux com código:
awk -F "|" '{if ($87 == 3550308 || NR == 1) {print}}' MATRICULA_SUDESTE.CSV > matriculas_capital.csv
Agora vamos fazer a proporção dos alunos:
matri_sp <- readr::read_delim("../dados/matriculas_capital.csv", delim="|") %>%
janitor::clean_names()
##
## -- Column specification --------------------------------------------------------
## cols(
## .default = col_double(),
## ID_ALUNO = col_character(),
## TP_RESPONSAVEL_TRANSPORTE = col_logical(),
## IN_TRANSP_BICICLETA = col_logical(),
## IN_TRANSP_MICRO_ONIBUS = col_logical(),
## IN_TRANSP_ONIBUS = col_logical(),
## IN_TRANSP_TR_ANIMAL = col_logical(),
## IN_TRANSP_VANS_KOMBI = col_logical(),
## IN_TRANSP_OUTRO_VEICULO = col_logical(),
## IN_TRANSP_EMBAR_ATE5 = col_logical(),
## IN_TRANSP_EMBAR_5A15 = col_logical(),
## IN_TRANSP_EMBAR_15A35 = col_logical(),
## IN_TRANSP_EMBAR_35 = col_logical()
## )
## i Use `spec()` for the full column specifications.
## Warning: 126659 parsing failures.
## row col expected actual file
## 1870788 TP_RESPONSAVEL_TRANSPORTE 1/0/T/F/TRUE/FALSE 2 '../dados/matriculas_capital.csv'
## 1870789 TP_RESPONSAVEL_TRANSPORTE 1/0/T/F/TRUE/FALSE 2 '../dados/matriculas_capital.csv'
## 1870792 TP_RESPONSAVEL_TRANSPORTE 1/0/T/F/TRUE/FALSE 2 '../dados/matriculas_capital.csv'
## 1870793 TP_RESPONSAVEL_TRANSPORTE 1/0/T/F/TRUE/FALSE 2 '../dados/matriculas_capital.csv'
## 1870796 TP_RESPONSAVEL_TRANSPORTE 1/0/T/F/TRUE/FALSE 2 '../dados/matriculas_capital.csv'
## ....... ......................... .................. ...... .................................
## See problems(...) for more details.
A coluna “tp_cor_raca” possui a seguinte distinção:
Código | Significado |
---|---|
0 | Não declarada |
1 | Branca |
2 | Preta |
3 | Parda |
4 | Amarela |
5 | Indígena |
Agora vamos criar a tabela com os valores totais. Observe que vamos excluir aquelas escolas com menos de 40 matrículas:
racas <- matri_sp %>%
janitor::tabyl(co_entidade, tp_cor_raca)
oldnames = c("0","1","2","3","4","5")
newnames = c("nd","bra","pre","par","ama","ind")
racas <- racas %>% rename_at(vars(oldnames), ~ newnames)
## Note: Using an external vector in selections is ambiguous.
## i Use `all_of(oldnames)` instead of `oldnames` to silence this message.
## i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This message is displayed once per session.
racas <- racas %>%
mutate(total = nd+bra+pre+par+ama+ind) %>%
mutate(ppi_prop = (1-((bra+ama)/total))*100) %>%
mutate(ppi_prop_declarados = (1-((bra+ama)/(bra+pre+par+ama+ind)))*100) %>%
filter(total>40)
Por fim, vamos gerar a tabela final:
escolas_com_cod <- escolas_com_cod %>%
left_join(racas, by = c('cod_escola' = 'co_entidade')) %>%
unique() %>%
filter(!is.na(cod_escola))
Concluído isso, vamos salvar o arquivo para usos futuros:
write.csv(escolas_com_cod, "../dados/escolas_com_dados.csv")
save(escolas_com_cod, file="../dados/escolas_com_dados.RData")