# Configurações globais do relatório
knitr::opts_chunk$set(
echo = TRUE,
fig.align = "center",
fig.height = 6,
fig.width = 10,
message = TRUE,
warning = TRUE
)
library(tidyverse)## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.1.6
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## Anexando pacote: 'arrow'
##
## O seguinte objeto é mascarado por 'package:lubridate':
##
## duration
##
## O seguinte objeto é mascarado por 'package:utils':
##
## timestamp
##
## Anexando pacote: 'flextable'
##
## O seguinte objeto é mascarado por 'package:purrr':
##
## compose
##
## Anexando pacote: 'janitor'
##
## Os seguintes objetos são mascarados por 'package:stats':
##
## chisq.test, fisher.test
library(skimr)
# Se DataExplorer não estiver instalado, execute: install.packages("DataExplorer")
if (requireNamespace("DataExplorer", quietly = TRUE)) {
library(DataExplorer)
}
# Caminho base do projeto
BASE_PATH <- "c:/Users/gardi/OneDrive/Documentos/Work/Rproj/dados RS"Este documento apresenta a sistematização do processo de análise exploratória de dados (EDA) referente à frequência escolar na rede pública e privada do Rio Grande do Sul. O absenteísmo escolar é um fenômeno multidimensional que reflete desigualdades socioeconômicas e impacta diretamente o acúmulo de capital humano.
O objetivo deste estágio inicial é a estruturação do workspace, a unificação das bases de dados e a identificação de padrões preliminares de frequência estratificados por variáveis sociodemográficas.
A organização segue o protocolo de pesquisa aplicada, segregando scripts de processamento e análise.
# Tabela de estrutura de arquivos simplificada
tribble(
~Pasta, ~Conteúdo, ~Finalidade,
"/data", "Parquet, XLSX, TXT", "Armazenamento de fontes",
"/scripts", "Arquivos .R", "Processamento e Merge",
"/outputs", "PNG, CSV, RDS", "Resultados e bases tratadas",
"/R", "Funções .R", "Modularização e Reuso"
) %>%
flextable() %>%
autofit() %>%
set_caption("Tabela 1: Arquitetura do Workspace")Pasta | Conteúdo | Finalidade |
|---|---|---|
/data | Parquet, XLSX, TXT | Armazenamento de fontes |
/scripts | Arquivos .R | Processamento e Merge |
/outputs | PNG, CSV, RDS | Resultados e bases tratadas |
/R | Funções .R | Modularização e Reuso |
O modelo de dados é construído sobre a chave primária da escola
(CO_ENTIDADE / INEP Escola) e a dimensão
temporal (Ano).
# Exemplo de leitura da estrutura de escola
# setwd(BASE_PATH)
df_est <- read_excel(file.path(BASE_PATH, "estrutura_2010_2025.xlsx"), n_max = 5)
colnames(df_est)[1:5]## [1] "NU_ANO_CENSO" "UF"
## [3] "Município" "Dependência Administrativa"
## [5] "Código da escola"
A transformação converge dados de alunos individuais (microdados) com
atributos escolares e de docência. O script principal para esta etapa é
o 01_data_merge.R.
Parquet via
arrow.Nesta etapa, utilizamos o pacote DataExplorer para obter
uma visão geral da estrutura do dataset, identificando tipos de dados e
volume de informações faltantes.
# Carregamento e Amostragem Estratificada (1 milhão p/ agilidade)
df_arrow <- open_dataset(file.path(BASE_PATH, "base_alunos_info_19_12_25.parquet"))
df_sample <- df_arrow %>%# head(1000000) %>%
collect()
# Perfil dos dados com skimr
skim(df_sample)| Name | df_sample |
| Number of rows | 18732383 |
| Number of columns | 26 |
| _______________________ | |
| Column type frequency: | |
| character | 19 |
| numeric | 7 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| CRE | 0 | 1.00 | 13 | 30 | 0 | 30 | 0 |
| Município | 0 | 1.00 | 3 | 26 | 0 | 497 | 0 |
| Escola | 0 | 1.00 | 15 | 62 | 0 | 2464 | 0 |
| Coord Escola | 0 | 1.00 | 26 | 26 | 0 | 2594 | 0 |
| Tipo de Ensino | 0 | 1.00 | 12 | 38 | 0 | 12 | 0 |
| Turno | 0 | 1.00 | 5 | 10 | 0 | 28 | 0 |
| Resultado Final | 4957854 | 0.74 | 1 | 1 | 0 | 18 | 80 |
| Situação Final/Atual | 0 | 1.00 | 7 | 11 | 0 | 8 | 0 |
| Sexo | 0 | 1.00 | 1 | 1 | 0 | 2 | 0 |
| Raça | 0 | 1.00 | 5 | 13 | 0 | 6 | 0 |
| Data de nascimento | 0 | 1.00 | 10 | 10 | 0 | 27786 | 0 |
| Bolsa Família? | 22514 | 1.00 | 1 | 1 | 0 | 2 | 0 |
| Vou a Escola? | 4903590 | 0.74 | 1 | 1 | 0 | 2 | 0 |
| PROTEGE RS? | 15 | 1.00 | 1 | 1 | 0 | 2 | 0 |
| Todo Jovem na Escola? | 17819411 | 0.05 | 1 | 1 | 0 | 1 | 0 |
| Endereço Aluno | 118080 | 0.99 | 1 | 90 | 0 | 2879240 | 0 |
| Tá no CAD? | 0 | 1.00 | 3 | 3 | 0 | 2 | 0 |
| Grau Instrução Resp Familiar | 13582729 | 0.27 | 13 | 22 | 0 | 6 | 0 |
| Matrícula_Masc | 0 | 1.00 | 10 | 10 | 0 | 3696966 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| Ano | 0 | 1.00 | 2016.78 | 4.63 | 2010 | 2013 | 2016 | 2021 | 2026 | ▇▅▅▃▅ |
| INEP Escola | 565 | 1.00 | 43101057.77 | 50357.23 | 43000037 | 43060650 | 43106021 | 43138403 | 43387063 | ▅▇▂▁▁ |
| CEP Escola | 0 | 1.00 | 95517553.12 | 2661523.37 | 90010282 | 93534010 | 95870000 | 97560000 | 99990000 | ▅▃▇▇▆ |
| Série | 0 | 1.00 | 3.97 | 3.73 | 0 | 1 | 3 | 6 | 90 | ▇▁▁▁▁ |
| Frequência Média Anual | 2689873 | 0.86 | 86.88 | 19.32 | -1100 | 86 | 94 | 98 | 151 | ▁▁▁▁▇ |
| CEP Aluno | 295298 | 0.98 | 95547898.04 | 3483659.17 | 0 | 93890000 | 95860000 | 97547582 | 99999999 | ▁▁▁▁▇ |
| Renda Média | 13580269 | 0.28 | 628.17 | 725.89 | 0 | 100 | 416 | 926 | 53690 | ▇▁▁▁▁ |
# Visualização da estrutura se DataExplorer disponível
if (exists("plot_intro")) {
plot_intro(df_sample)
}Identificamos inconsistências na variável
Frequência Média Anual, como valores negativos, superiores
a 100% ou ausentes.
# Auditoria de Qualidade
df_sample %>%
mutate(status_frequencia = case_when(
`Frequência Média Anual` < 0 ~ "Inconsistente (< 0)",
`Frequência Média Anual` > 100 ~ "Inconsistente (> 100)",
is.na(`Frequência Média Anual`) ~ "Ausente (NA)",
TRUE ~ "Válido"
)) %>%
tabyl(status_frequencia) %>%
adorn_pct_formatting() %>%
flextable() %>%
set_caption("Tabela 2: Auditoria de Qualidade da Variável de Frequência")status_frequencia | n | percent |
|---|---|---|
Ausente (NA) | 2,689,873 | 14.4% |
Inconsistente (< 0) | 447 | 0.0% |
Inconsistente (> 100) | 75 | 0.0% |
Válido | 16,041,988 | 85.6% |
if (exists("plot_histogram")) {
plot_histogram(df_clean %>% select(where(is.numeric)))
} else {
# Fallback ggplot
ggplot(df_clean, aes(x = `Frequência Média Anual`)) +
geom_histogram(bins = 40, fill = "#2C3E50", color = "white") +
labs(title = "Distribuição da Frequência Escolar (Dados Limpos)",
x = "Frequência (%)", y = "Alunos") +
theme_minimal()
}Os dados revelam um gradiente de frequência associado à raça, evidenciando vulnerabilidades em estudantes pretos e indígenas.
df_raca <- df_clean %>%
group_by(Raça) %>%
summarise(
Média = mean(`Frequência Média Anual`, na.rm = TRUE),
Mediana = median(`Frequência Média Anual`, na.rm = TRUE),
n = n()
) %>%
arrange(desc(Média))
ggplot(df_raca, aes(x = reorder(Raça, Média), y = Média, fill = Raça)) +
geom_col(alpha = 0.8) +
geom_text(aes(label = round(Média, 1)), hjust = 1.2, color = "white", fontface = "bold") +
coord_flip() +
labs(title = "Frequência Média por Autodeclaração de Raça",
subtitle = "Indicador de disparidade no engajamento escolar",
x = "Raça/Cor", y = "Média de Frequência (%)") +
theme_minimal() +
scale_fill_brewer(palette = "Set1") +
theme(legend.position = "none")Para fundamentação deste estudo, recomenda-se a seguinte referência baseada no fluxo escolar brasileiro:
INEP (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira). (2025). Censo da Educação Básica: Notas Estatísticas. Brasília, DF: Ministério da Educação. Disponível em: https://www.gov.br/inep
Relatório gerado automaticamente para suporte à decisão técnica.