1 Sobre este documento

Este relatório implementa um pipeline reproduzível de análise da relação entre clima escolar e desigualdade racial de proficiência em escolas públicas de Manaus (AM) e Belém (PA), usando os microdados do SAEB 2023 e do Censo Escolar 2023.

Pergunta central: clima escolar reduz a brecha de proficiência entre alunos brancos e não-brancos?

O documento segue a sequência dos scripts originais do projeto:

Seção Script de origem
1. Configuração do ambiente 00_setup.R
2. Download dos microdados 01_download_microdados.R
3. Diagnóstico inicial 02_diagnostico.R
4. Índice de clima (AFE) 02_clima_escolar.R
5. Tratamento e integração 03_tratamento_integracao.R
6. Análise descritiva e modelos multinível (aluno) 03_analise_descritiva_multinivel.R
7. Análise descritiva e modelos multinível (escola) 04_analise_descritiva_modelagem_multinivel.R
8. Probabilidade predita — modelos probit 05_probabilidade_predita_probit.R

2 Configuração do Ambiente

Execute esta seção uma única vez, antes de rodar o restante do documento. Ela instala os pacotes necessários e inicializa o renv para controle de versões. Em outras máquinas, substitua por renv::restore().

pkgs <- c(
  "renv", "here", "tidyverse", "psych", "ggplot2",
  "data.table", "lme4", "lmerTest", "patchwork",
  "gt", "broom.mixed", "labelled", "emmeans",
  "ggpubr", "cowplot", "scales", "performance",
  "readxl", "writexl"
)

installed <- rownames(installed.packages())
to_install <- pkgs[!pkgs %in% installed]

if (length(to_install) > 0) {
  message("Instalando: ", paste(to_install, collapse = ", "))
  install.packages(to_install)
} else {
  message("Todos os pacotes já estão instalados.")
}

if (!file.exists("renv.lock")) {
  renv::init()
} else {
  message("renv já inicializado. Use renv::restore() se necessário.")
}

dirs <- c("data/raw", "data/clean", "scripts", "outputs/figuras",
          "outputs/tabelas", "docs")

for (d in dirs) {
  path <- here::here(d)
  if (!dir.exists(path)) {
    dir.create(path, recursive = TRUE)
    message("Criado: ", d)
  }
}

3 Download dos Microdados

Execute esta seção uma única vez (ou quando dados novos estiverem disponíveis). Os ZIPs do SAEB e do Censo Escolar são grandes (~500 MB); o download pode levar de 10 a 30 minutos. Os arquivos ficam em data/raw/.

library(data.table)
library(here)
library(readxl)
library(writexl)

ano_saeb  <- 2023
ano_censo <- 2023
dir_data  <- here("data")
dir_raw   <- here("data", "raw")

options(timeout = 600)

if (!dir.exists(dir_raw)) dir.create(dir_raw, recursive = TRUE)

# Função auxiliar: extrair arquivos de um ZIP por padrão de nome
extrair_do_zip <- function(zip_path, destdir, patterns) {
  conteudo <- unzip(zip_path, list = TRUE)$Name
  lapply(patterns, function(p) {
    alvo <- conteudo[grepl(p, conteudo, ignore.case = TRUE)]
    if (length(alvo) == 0) {
      message("Arquivos disponíveis no ZIP:\n", paste(conteudo, collapse = "\n"))
      stop("Nenhum arquivo encontrado com o padrão: '", p, "'")
    }
    alvo <- alvo[1]
    unzip(zip_path, files = alvo, exdir = destdir, junkpaths = TRUE)
    file.path(destdir, basename(alvo))
  })
}

# ── SAEB ──────────────────────────────────────────────────────────────────────
zip_saeb <- file.path(dir_data, paste0("saeb_", ano_saeb, ".zip"))

if (!file.exists(zip_saeb)) {
  url_saeb <- paste0(
    "https://download.inep.gov.br/microdados/microdados_saeb_", ano_saeb, ".zip"
  )
  message("Baixando microdados SAEB ", ano_saeb, " ...")
  download.file(url_saeb, destfile = zip_saeb, mode = "wb")
}

caminho_aluno_5ef <- file.path(dir_raw, "TS_ALUNO_5EF.csv")
caminho_aluno_9ef <- file.path(dir_raw, "TS_ALUNO_9EF.csv")

if (!file.exists(caminho_aluno_5ef) || !file.exists(caminho_aluno_9ef)) {
  extrair_do_zip(
    zip_path = zip_saeb,
    destdir  = dir_raw,
    patterns = c("TS_ALUNO_5EF\\.csv$", "TS_ALUNO_9EF\\.csv$")
  )
}

# ── Censo Escolar ─────────────────────────────────────────────────────────────
zip_censo <- file.path(dir_data, paste0("censo_", ano_censo, ".zip"))

if (!file.exists(zip_censo)) {
  url_censo <- paste0(
    "https://download.inep.gov.br/dados_abertos/microdados_censo_escolar_",
    ano_censo, ".zip"
  )
  message("Baixando microdados Censo Escolar ", ano_censo, " ...")
  download.file(url_censo, destfile = zip_censo, mode = "wb")
}

caminho_censo <- file.path(dir_raw, "microdados_ed_basica_2023.csv")

if (!file.exists(caminho_censo)) {
  extrair_do_zip(
    zip_path = zip_censo,
    destdir  = dir_raw,
    patterns = c("microdados_ed_basica.*\\.csv$")
  )
}

# ── Filtros ───────────────────────────────────────────────────────────────────
# Código IBGE: Manaus = 1302603 | Belém = 1501402
municipios   <- c(Manaus = 1302603L, Belem = 1501402L)
REDES_PUBLICAS <- c(2L, 3L)  # Estadual + Municipal
ufs_alvo     <- c(13L, 15L)  # AM e PA

aluno_5ef <- fread(caminho_aluno_5ef, sep = ";", encoding = "Latin-1")
aluno_9ef <- fread(caminho_aluno_9ef, sep = ";", encoding = "Latin-1")
censo     <- fread(caminho_censo,     sep = ";", encoding = "Latin-1")

aluno_5ef <- aluno_5ef[ID_UF %in% ufs_alvo]
aluno_9ef <- aluno_9ef[ID_UF %in% ufs_alvo]
censo     <- censo[CO_MUNICIPIO %in% municipios & TP_DEPENDENCIA %in% REDES_PUBLICAS]

dir_clean <- here("data", "clean")
if (!dir.exists(dir_clean)) dir.create(dir_clean, recursive = TRUE)

fwrite(aluno_9ef, file.path(dir_clean, "aluno_9ef_filtrado.csv"), sep = ";", bom = TRUE)

# ── IDEB por escola ───────────────────────────────────────────────────────────
ideb_ai <- as.data.table(read_xlsx(
  here("data", "raw", "divulgacao_anos_iniciais_escolas_2023.xlsx"), skip = 9
))
ideb_af <- as.data.table(read_xlsx(
  here("data", "raw", "divulgacao_anos_finais_escolas_2023.xlsx"), skip = 9
))

ideb_ai <- ideb_ai[CO_MUNICIPIO %in% municipios]
ideb_af <- ideb_af[CO_MUNICIPIO %in% municipios]

write_xlsx(ideb_ai, file.path(dir_clean, "ideb_anos_iniciais_2023.xlsx"))
write_xlsx(ideb_af, file.path(dir_clean, "ideb_anos_finais_2023.xlsx"))
fwrite(ideb_ai, file.path(dir_clean, "ideb_anos_iniciais_2023.csv"), sep = ";", bom = TRUE)
fwrite(ideb_af, file.path(dir_clean, "ideb_anos_finais_2023.csv"),   sep = ";", bom = TRUE)

message("Download e extração concluídos. Arquivos em data/raw/ e data/clean/")

4 Diagnóstico Inicial

Antes de qualquer transformação, exploramos os dados brutos para verificar dimensões, tipos, taxas de missing e distribuições das variáveis de interesse.

library(data.table)
library(tidyverse)
library(here)
aluno_5ef <- fread(here("data", "raw", "TS_ALUNO_5EF.csv"),
                   sep = ";", encoding = "Latin-1")
aluno_9ef <- fread(here("data", "raw", "TS_ALUNO_9EF.csv"),
                   sep = ";", encoding = "Latin-1")
censo     <- fread(here("data", "raw", "microdados_ed_basica_2023.csv"),
                   sep = ";", encoding = "Latin-1")

# Filtros do projeto
aluno_5ef <- aluno_5ef[ID_UF %in% c(13L, 15L)]
aluno_9ef <- aluno_9ef[ID_UF %in% c(13L, 15L)]
censo     <- censo[CO_MUNICIPIO %in% c(1302603L, 1501402L) &
                     TP_DEPENDENCIA %in% c(2L, 3L)]

4.1 Dimensões e tipos

glimpse(aluno_9ef)
## Rows: 193,097
## Columns: 153
## $ ID_SAEB                       <int> 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2…
## $ ID_REGIAO                     <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ ID_UF                         <int> 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1…
## $ ID_MUNICIPIO                  <int> 6322244, 6322244, 6322244, 6322244, 6322244, 6322244, 6322244…
## $ ID_AREA                       <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ ID_ESCOLA                     <int> 61417592, 61417592, 61417592, 61417592, 61417592, 61417592, 6…
## $ IN_PUBLICA                    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ ID_LOCALIZACAO                <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ ID_TURMA                      <int> 1680768, 1680768, 1680768, 1680768, 1680768, 1680768, 1680768…
## $ ID_SERIE                      <int> 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9…
## $ ID_ALUNO                      <int> 49584102, 49584103, 49584104, 49584421, 49584422, 49584426, 4…
## $ IN_SITUACAO_CENSO             <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ IN_PREENCHIMENTO_LP           <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_PREENCHIMENTO_MT           <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_PREENCHIMENTO_CH           <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ IN_PREENCHIMENTO_CN           <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ IN_PRESENCA_LP                <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_PRESENCA_MT                <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_PRESENCA_CH                <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ IN_PRESENCA_CN                <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_CADERNO_LP                 <int> 21, 6, 4, 12, 18, 10, 16, 11, 3, 8, 5, 14, 2, 13, 15, 19, 9, …
## $ ID_BLOCO_1_LP                 <int> 7, 6, 4, 5, 4, 3, 2, 4, 3, 1, 5, 7, 2, 6, 1, 5, 2, 6, 1, 3, 7…
## $ ID_BLOCO_2_LP                 <int> 3, 7, 5, 7, 7, 5, 5, 6, 4, 3, 6, 2, 3, 1, 4, 1, 4, 2, 2, 6, 1…
## $ ID_CADERNO_MT                 <int> 21, 6, 4, 12, 18, 10, 16, 11, 3, 8, 5, 14, 2, 13, 15, 19, 9, …
## $ ID_BLOCO_1_MT                 <int> 7, 6, 4, 5, 4, 3, 2, 4, 3, 1, 5, 7, 2, 6, 1, 5, 2, 6, 1, 3, 7…
## $ ID_BLOCO_2_MT                 <int> 3, 7, 5, 7, 7, 5, 5, 6, 4, 3, 6, 2, 3, 1, 4, 1, 4, 2, 2, 6, 1…
## $ ID_CADERNO_CH                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_BLOCO_1_CH                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_BLOCO_2_CH                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ NU_BLOCO_1_ABERTA_CH          <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ NU_BLOCO_2_ABERTA_CH          <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_CADERNO_CN                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_BLOCO_1_CN                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_BLOCO_2_CN                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ID_BLOCO_3_CN                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ NU_BLOCO_1_ABERTA_CN          <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ NU_BLOCO_2_ABERTA_CN          <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ TX_RESP_BLOCO1_LP             <chr> "CBDADCDDAABAB", "ACCCCDDDAAABD", "DBDCABCBABBCB", ".........…
## $ TX_RESP_BLOCO2_LP             <chr> "DBDBACCBDDAAC", "CBABBADDBBADD", "ABBCCCADADDCA", ".........…
## $ TX_RESP_BLOCO1_MT             <chr> "BDABDCADBACDC", "DBAADACDCCACC", "ACCBDDCDBDCAB", ".........…
## $ TX_RESP_BLOCO2_MT             <chr> "CACBADCCCABAB", "CDABBDBDBCBBA", "DCADDDCCCACAD", ".........…
## $ TX_RESP_BLOCO1_CH             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ TX_RESP_BLOCO2_CH             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ CO_CONCEITO_Q1_CH             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ CO_CONCEITO_Q2_CH             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ TX_RESP_BLOCO1_CN             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ TX_RESP_BLOCO2_CN             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ TX_RESP_BLOCO3_CN             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ CO_CONCEITO_Q1_CN             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ CO_CONCEITO_Q2_CN             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
## $ IN_PROFICIENCIA_LP            <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_PROFICIENCIA_MT            <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_PROFICIENCIA_CH            <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ IN_PROFICIENCIA_CN            <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ IN_AMOSTRA                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ ESTRATO                       <int> 632224431, 632224431, 632224431, 632224431, 632224431, 632224…
## $ ESTRATO_CIENCIAS              <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PESO_ALUNO_LP                 <dbl> 1.117647, 1.117647, 1.117647, NA, 1.117647, 1.117647, 1.11764…
## $ PROFICIENCIA_LP               <dbl> 0.664078, -0.345934, 0.268573, NA, -0.342888, -0.380394, -0.2…
## $ ERRO_PADRAO_LP                <dbl> 0.344047, 0.350199, 0.303507, NA, 0.367067, 0.352434, 0.33168…
## $ PROFICIENCIA_LP_SAEB          <dbl> 286.5713, 230.9263, 264.7816, NA, 231.0941, 229.0278, 237.565…
## $ ERRO_PADRAO_LP_SAEB           <dbl> 18.95471, 19.29364, 16.72122, NA, 20.22295, 19.41677, 18.2736…
## $ PESO_ALUNO_MT                 <dbl> 1.117647, 1.117647, 1.117647, NA, 1.117647, 1.117647, 1.11764…
## $ PROFICIENCIA_MT               <dbl> 0.551429, 0.860011, -0.515347, NA, -0.227114, -0.236465, -0.0…
## $ ERRO_PADRAO_MT                <dbl> 0.341722, 0.327249, 0.536262, NA, 0.575194, 0.441098, 0.51522…
## $ PROFICIENCIA_MT_SAEB          <dbl> 280.7850, 298.0324, 221.1604, NA, 237.2705, 236.7478, 246.930…
## $ ERRO_PADRAO_MT_SAEB           <dbl> 19.09964, 18.29071, 29.97293, NA, 32.14893, 24.65399, 28.7968…
## $ PESO_ALUNO_CH                 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PROFICIENCIA_CH               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ERRO_PADRAO_CH                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PROFICIENCIA_CH_SAEB          <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ERRO_PADRAO_CH_SAEB           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PESO_ALUNO_CN                 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PROFICIENCIA_CN               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ERRO_PADRAO_CN                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PROFICIENCIA_CN_SAEB          <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ ERRO_PADRAO_CN_SAEB           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ IN_PREENCHIMENTO_QUESTIONARIO <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ IN_INSE                       <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0…
## $ INSE_ALUNO                    <dbl> 3.41, 4.20, 2.50, NA, 3.38, 3.61, 3.73, 4.56, 3.46, NA, 3.48,…
## $ NU_TIPO_NIVEL_INSE            <int> 2, 3, 1, 1, 2, 2, 2, 4, 2, 1, 2, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1…
## $ PESO_ALUNO_INSE               <dbl> 1.117647, 1.117647, 1.117647, NA, 1.117647, 1.117647, 1.11764…
## $ TX_RESP_Q01                   <chr> "B", "A", "B", ".", "B", "B", "A", "A", "A", ".", "B", "A", "…
## $ TX_RESP_Q02                   <chr> "F", "D", "F", ".", "F", "E", "D", "E", "C", ".", "B", "B", "…
## $ TX_RESP_Q03                   <chr> "A", "A", "A", ".", "A", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q04                   <chr> "C", "C", "A", ".", "A", "C", "C", "B", "C", ".", "C", "C", "…
## $ TX_RESP_Q05a                  <chr> "B", "A", "A", ".", "B", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q05b                  <chr> ".", "A", "A", ".", ".", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q05c                  <chr> ".", "A", "A", ".", ".", "A", "A", "A", "A", ".", "A", "B", "…
## $ TX_RESP_Q06                   <chr> "C", "E", "E", ".", "E", "E", "B", "E", "D", ".", "D", "E", "…
## $ TX_RESP_Q07a                  <chr> "B", "B", "B", ".", "B", "A", "B", "A", "B", ".", "B", "B", "…
## $ TX_RESP_Q07b                  <chr> ".", "A", "B", ".", "B", "B", "B", "A", "B", ".", "B", "B", "…
## $ TX_RESP_Q07c                  <chr> ".", "A", "A", ".", ".", "A", "A", "B", "A", ".", "A", "A", "…
## $ TX_RESP_Q07d                  <chr> ".", "B", "A", ".", ".", "A", "A", "B", "A", ".", "A", "A", "…
## $ TX_RESP_Q07e                  <chr> "B", "B", "B", ".", "B", "B", "A", "A", "B", ".", "A", "B", "…
## $ TX_RESP_Q08                   <chr> "B", "C", "B", ".", "B", "B", "D", "A", "B", ".", "C", "A", "…
## $ TX_RESP_Q09                   <chr> ".", "B", "B", ".", "B", "C", "D", "A", "A", ".", "F", "F", "…
## $ TX_RESP_Q10a                  <chr> "C", "B", "A", ".", "B", "B", "B", "B", "B", ".", "B", "B", "…
## $ TX_RESP_Q10b                  <chr> "C", "B", "C", ".", "B", "C", "C", "C", "B", ".", "C", "C", "…
## $ TX_RESP_Q10c                  <chr> "C", "C", "C", ".", "C", "C", "C", "C", "B", ".", "C", "C", "…
## $ TX_RESP_Q10d                  <chr> "C", "B", "A", ".", "C", "C", "C", "C", "B", ".", "C", "C", "…
## $ TX_RESP_Q10e                  <chr> "C", "C", "C", ".", "C", "C", "C", "C", "B", ".", "C", "C", "…
## $ TX_RESP_Q10f                  <chr> "C", "C", "B", ".", "C", "B", "C", "C", "B", ".", "C", "B", "…
## $ TX_RESP_Q11a                  <chr> "B", "B", "A", ".", "B", "B", "B", "B", "A", ".", "B", "B", "…
## $ TX_RESP_Q11b                  <chr> "B", "B", "A", ".", "B", "B", "B", "B", "B", ".", "B", "B", "…
## $ TX_RESP_Q11c                  <chr> "B", "B", "B", ".", "B", "B", "B", "B", "B", ".", "B", "B", "…
## $ TX_RESP_Q12a                  <chr> "B", "B", "B", ".", "B", "B", "B", "B", "B", ".", "B", "B", "…
## $ TX_RESP_Q12b                  <chr> "A", "D", "A", ".", ".", "A", "*", "C", "A", ".", "A", "A", "…
## $ TX_RESP_Q12c                  <chr> "D", "D", "A", ".", "D", "D", "B", "C", "D", ".", "C", "C", "…
## $ TX_RESP_Q12d                  <chr> "B", "C", "B", ".", "B", "B", "B", "B", "C", ".", "B", "B", "…
## $ TX_RESP_Q12e                  <chr> "B", "B", "B", ".", "B", "B", "A", "C", "B", ".", "C", "C", "…
## $ TX_RESP_Q12f                  <chr> "A", "A", "A", ".", "A", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q12g                  <chr> "B", "D", "A", ".", "B", "B", "C", "D", "C", ".", "B", "B", "…
## $ TX_RESP_Q13a                  <chr> "A", "A", "A", ".", "A", "B", "A", "B", "A", ".", "A", "A", "…
## $ TX_RESP_Q13b                  <chr> "B", "A", "A", ".", "A", "A", "A", "B", "A", ".", "A", "A", "…
## $ TX_RESP_Q13c                  <chr> "B", "A", "A", ".", "B", "A", "B", "A", "B", ".", "B", "B", "…
## $ TX_RESP_Q13d                  <chr> "A", "A", "A", ".", "A", "B", "B", "B", "A", ".", "B", "B", "…
## $ TX_RESP_Q13e                  <chr> "A", "A", "A", ".", "A", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q13f                  <chr> "A", "A", "A", ".", "A", "A", "A", "A", "A", ".", "A", "B", "…
## $ TX_RESP_Q13g                  <chr> "B", "B", "A", ".", "B", "B", "B", "B", "B", ".", "B", "A", "…
## $ TX_RESP_Q13h                  <chr> "A", "B", "A", ".", "B", "A", "B", "B", "A", ".", "A", "B", "…
## $ TX_RESP_Q13i                  <chr> "A", "A", "A", ".", "A", "A", "A", "A", "A", ".", "A", "B", "…
## $ TX_RESP_Q14                   <chr> "A", "A", "C", ".", "A", "C", "A", "A", "A", ".", "B", "A", "…
## $ TX_RESP_Q15a                  <chr> "A", "A", "A", ".", "A", "A", ".", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q15b                  <chr> "A", "B", "A", ".", "A", "A", "B", "A", "B", ".", "A", "B", "…
## $ TX_RESP_Q16                   <chr> "H", "A", "A", ".", "A", "H", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q17                   <chr> "C", "A", "B", ".", "A", "A", "B", "C", "B", ".", "B", "A", "…
## $ TX_RESP_Q18                   <chr> "A", "A", "A", ".", "A", "A", "A", "A", "A", ".", "A", "B", "…
## $ TX_RESP_Q19                   <chr> "A", "A", "B", ".", "A", "C", "C", "C", "B", ".", "A", "A", "…
## $ TX_RESP_Q20                   <chr> "A", "B", "B", ".", "A", "B", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q21a                  <chr> "B", "B", "A", ".", "B", "B", "B", "C", "D", ".", "B", "C", "…
## $ TX_RESP_Q21b                  <chr> "B", "A", "A", ".", "B", "A", "B", "B", "D", ".", "B", "A", "…
## $ TX_RESP_Q21c                  <chr> "C", "A", "D", ".", "D", "B", "B", "D", "D", ".", "A", "B", "…
## $ TX_RESP_Q21d                  <chr> "D", "A", "A", ".", "A", "A", "A", "B", "D", ".", "C", "A", "…
## $ TX_RESP_Q21e                  <chr> "D", "C", "A", ".", "D", "A", "B", "D", "D", ".", "A", "B", "…
## $ TX_RESP_Q22a                  <chr> "C", "B", "A", ".", "B", "A", "B", "B", "C", ".", "B", "A", "…
## $ TX_RESP_Q22b                  <chr> "C", "B", "B", ".", "B", "C", "B", "B", "C", ".", "A", "B", "…
## $ TX_RESP_Q22c                  <chr> "C", "B", "B", ".", "C", "A", "C", "B", "C", ".", "D", "A", "…
## $ TX_RESP_Q22d                  <chr> "C", "B", "A", ".", "B", "A", "B", "B", "C", ".", "D", "A", "…
## $ TX_RESP_Q22e                  <chr> "C", "B", "A", ".", "C", "A", "B", "B", "C", ".", "A", "B", "…
## $ TX_RESP_Q22f                  <chr> "C", "D", "A", ".", "B", "A", "A", "C", "C", ".", "D", "A", "…
## $ TX_RESP_Q22g                  <chr> "C", "B", "A", ".", "A", "A", "A", "C", "A", ".", "A", "B", "…
## $ TX_RESP_Q22h                  <chr> "C", "B", "A", ".", "A", "A", "A", "A", "A", ".", "A", "C", "…
## $ TX_RESP_Q23a                  <chr> "B", "A", "B", ".", "B", "A", "A", "A", "A", ".", "B", "C", "…
## $ TX_RESP_Q23b                  <chr> "B", "A", "B", ".", "B", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q23c                  <chr> "B", "A", "A", ".", "B", "A", "B", "A", "B", ".", "B", "B", "…
## $ TX_RESP_Q23d                  <chr> "B", "A", "B", ".", "B", "A", "A", "A", "B", ".", "A", "A", "…
## $ TX_RESP_Q23e                  <chr> "B", "A", "C", ".", "B", "A", "C", "D", "B", ".", "C", "B", "…
## $ TX_RESP_Q23f                  <chr> "B", "A", "C", ".", "B", "A", "B", "B", "B", ".", "B", "A", "…
## $ TX_RESP_Q23g                  <chr> "B", "A", "B", ".", "B", "A", "A", "B", "A", ".", "B", "A", "…
## $ TX_RESP_Q23h                  <chr> ".", "A", "A", ".", "B", "A", "A", "A", "A", ".", "A", "C", "…
## $ TX_RESP_Q23i                  <chr> "B", "A", "A", ".", "B", "A", "A", "A", "A", ".", "A", "A", "…
## $ TX_RESP_Q24                   <chr> "C", "C", "D", ".", "C", "A", "C", "A", "A", ".", ".", "D", "…
glimpse(censo)
## Rows: 1,149
## Columns: 408
## $ NU_ANO_CENSO                   <int> 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, …
## $ NO_REGIAO                      <chr> "Norte", "Norte", "Norte", "Norte", "Norte", "Norte", "Norte…
## $ CO_REGIAO                      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ NO_UF                          <chr> "Amazonas", "Amazonas", "Amazonas", "Amazonas", "Amazonas", …
## $ SG_UF                          <chr> "AM", "AM", "AM", "AM", "AM", "AM", "AM", "AM", "AM", "AM", …
## $ CO_UF                          <int> 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, …
## $ NO_MUNICIPIO                   <chr> "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", …
## $ CO_MUNICIPIO                   <int> 1302603, 1302603, 1302603, 1302603, 1302603, 1302603, 130260…
## $ NO_REGIAO_GEOG_INTERM          <chr> "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", …
## $ CO_REGIAO_GEOG_INTERM          <int> 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, …
## $ NO_REGIAO_GEOG_IMED            <chr> "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", …
## $ CO_REGIAO_GEOG_IMED            <int> 130001, 130001, 130001, 130001, 130001, 130001, 130001, 1300…
## $ NO_MESORREGIAO                 <chr> "Centro Amazonense", "Centro Amazonense", "Centro Amazonense…
## $ CO_MESORREGIAO                 <int> 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, …
## $ NO_MICRORREGIAO                <chr> "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", "Manaus", …
## $ CO_MICRORREGIAO                <int> 13007, 13007, 13007, 13007, 13007, 13007, 13007, 13007, 1300…
## $ CO_DISTRITO                    <int> 130260305, 130260305, 130260305, 130260305, 130260305, 13026…
## $ NO_ENTIDADE                    <chr> "CEJA PROF AGENOR FERREIRA LIMA", "CMEI HUMBERTO DE ALENCAR …
## $ CO_ENTIDADE                    <int> 13025104, 13025120, 13025180, 13025562, 13025570, 13025767, …
## $ TP_DEPENDENCIA                 <int> 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, …
## $ TP_CATEGORIA_ESCOLA_PRIVADA    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ TP_LOCALIZACAO                 <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ TP_LOCALIZACAO_DIFERENCIADA    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ DS_ENDERECO                    <chr> "AV ANDRE ARAUJO", "R. 22", "R. BELO HORIZONTE", "R. A-10", …
## $ NU_ENDERECO                    <chr> "99", "S/N", "S/N", "S/N", "S/N", "69", "575", "S/N", "S/N",…
## $ DS_COMPLEMENTO                 <chr> "", "CONJUNTO CASTELO BRA", "", "CONJ. AJURICABA", "N S DAS …
## $ NO_BAIRRO                      <chr> "ALEIXO", "PARQUE 10 DE NOVEMBRO", "COMPENSA", "ALVORADA", "…
## $ CO_CEP                         <int> 69060000, 69055400, 69035100, 69046120, 69053035, 69059420, …
## $ NU_DDD                         <int> 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, NA, 92, 92, 92, 92, …
## $ NU_TELEFONE                    <int> 32169619, 32364787, 36252639, 32147044, 35846404, 993463259,…
## $ TP_SITUACAO_FUNCIONAMENTO      <int> 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, …
## $ CO_ORGAO_REGIONAL              <chr> "00004", "00004", "00002", "00005", "00004", "00003", "00002…
## $ DT_ANO_LETIVO_INICIO           <chr> "06FEB23:00:00:00", "06FEB23:00:00:00", "06FEB23:00:00:00", …
## $ DT_ANO_LETIVO_TERMINO          <chr> "20DEC23:00:00:00", "21DEC23:00:00:00", "19DEC23:00:00:00", …
## $ IN_VINCULO_SECRETARIA_EDUCACAO <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_VINCULO_SEGURANCA_PUBLICA   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_VINCULO_SECRETARIA_SAUDE    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_VINCULO_OUTRO_ORGAO         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PODER_PUBLICO_PARCERIA      <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ TP_PODER_PUBLICO_PARCERIA      <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_TERMO_COLABORA   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_TERMO_FOMENTO    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ACORDO_COOP      <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_PRESTACAO_SERV   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_COOP_TEC_FIN     <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_CONSORCIO_PUB    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_MU_TERMO_COLAB   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_MU_TERMO_FOMENTO <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_MU_ACORDO_COOP   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_MU_PREST_SERV    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_MU_COOP_TEC_FIN  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_MU_CONSORCIO_PUB <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ES_TERMO_COLAB   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ES_TERMO_FOMENTO <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ES_ACORDO_COOP   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ES_PREST_SERV    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ES_COOP_TEC_FIN  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_FORMA_CONT_ES_CONSORCIO_PUB <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIVADA_EMP     <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIVADA_ONG     <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIVADA_OSCIP   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIV_ONG_OSCIP  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIVADA_SIND    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIVADA_SIST_S  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_MANT_ESCOLA_PRIVADA_S_FINS  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ NU_CNPJ_ESCOLA_PRIVADA         <int64> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ NU_CNPJ_MANTENEDORA            <int64> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ TP_REGULAMENTACAO              <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ TP_RESPONSAVEL_REGULAMENTACAO  <int> 2, 3, 3, 3, 3, 2, 3, NA, 3, 3, 2, 2, 2, 3, 3, 3, 3, NA, 3, 3…
## $ CO_ESCOLA_SEDE_VINCULADA       <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ CO_IES_OFERTANTE               <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_LOCAL_FUNC_PREDIO_ESCOLAR   <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ TP_OCUPACAO_PREDIO_ESCOLAR     <int> 2, 1, 1, 3, 1, 1, 2, NA, 1, 1, 1, 1, 2, 3, 1, 1, 1, NA, 1, 1…
## $ IN_LOCAL_FUNC_SOCIOEDUCATIVO   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LOCAL_FUNC_UNID_PRISIONAL   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LOCAL_FUNC_PRISIONAL_SOCIO  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LOCAL_FUNC_GALPAO           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ TP_OCUPACAO_GALPAO             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_LOCAL_FUNC_SALAS_OUTRA_ESC  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LOCAL_FUNC_OUTROS           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PREDIO_COMPARTILHADO        <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_AGUA_POTAVEL                <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_AGUA_REDE_PUBLICA           <int> 1, 1, 1, 0, 0, 1, 1, NA, 1, 0, 1, 0, 1, 1, 1, 0, 1, NA, 0, 0…
## $ IN_AGUA_POCO_ARTESIANO         <int> 1, 0, 0, 1, 1, 1, 0, NA, 1, 1, 1, 1, 1, 1, 1, 1, 0, NA, 1, 1…
## $ IN_AGUA_CACIMBA                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_AGUA_FONTE_RIO              <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_AGUA_INEXISTENTE            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ENERGIA_REDE_PUBLICA        <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_ENERGIA_GERADOR_FOSSIL      <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ENERGIA_RENOVAVEL           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ENERGIA_INEXISTENTE         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ESGOTO_REDE_PUBLICA         <int> 1, 1, 0, 0, 0, 0, 1, NA, 0, 0, 0, 1, 0, 0, 0, 0, 0, NA, 0, 1…
## $ IN_ESGOTO_FOSSA_SEPTICA        <int> 0, 0, 1, 1, 1, 1, 0, NA, 1, 1, 1, 0, 1, 1, 1, 1, 1, NA, 1, 0…
## $ IN_ESGOTO_FOSSA_COMUM          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ESGOTO_FOSSA                <int> 0, 0, 1, 1, 1, 1, 0, NA, 1, 1, 1, 0, 1, 1, 1, 1, 1, NA, 1, 0…
## $ IN_ESGOTO_INEXISTENTE          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LIXO_SERVICO_COLETA         <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_LIXO_QUEIMA                 <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LIXO_ENTERRA                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LIXO_DESTINO_FINAL_PUBLICO  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LIXO_DESCARTA_OUTRA_AREA    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_TRATAMENTO_LIXO_SEPARACAO   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_TRATAMENTO_LIXO_REUTILIZA   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_TRATAMENTO_LIXO_RECICLAGEM  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_TRATAMENTO_LIXO_INEXISTENTE <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_ALMOXARIFADO                <int> 0, 1, 1, 1, 1, 0, 1, NA, 1, 1, 0, 0, 1, 1, 1, 0, 0, NA, 1, 1…
## $ IN_AREA_VERDE                  <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 1, 0, NA, 1, 1…
## $ IN_AUDITORIO                   <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 1, 0, 0, 0, 0, 0, NA, 0, 1…
## $ IN_BANHEIRO                    <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_BANHEIRO_EI                 <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 1, 0, 0, 0, 0, 1, 1, 1, NA, 1, 1…
## $ IN_BANHEIRO_PNE                <int> 0, 0, 0, 0, 1, 1, 0, NA, 1, 1, 0, 0, 1, 0, 1, 1, 0, NA, 0, 1…
## $ IN_BANHEIRO_FUNCIONARIOS       <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_BANHEIRO_CHUVEIRO           <int> 0, 0, 0, 0, 1, 0, 0, NA, 0, 0, 0, 0, 1, 1, 1, 1, 0, NA, 0, 1…
## $ IN_BIBLIOTECA                  <int> 0, 1, 1, 1, 1, 1, 0, NA, 0, 1, 0, 1, 1, 0, 0, 0, 0, NA, 0, 1…
## $ IN_BIBLIOTECA_SALA_LEITURA     <int> 0, 1, 1, 1, 1, 1, 1, NA, 1, 1, 0, 1, 1, 1, 0, 0, 0, NA, 0, 1…
## $ IN_COZINHA                     <int> 0, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_DESPENSA                    <int> 0, 1, 1, 0, 1, 0, 1, NA, 1, 1, 0, 0, 1, 1, 1, 1, 0, NA, 1, 0…
## $ IN_DORMITORIO_ALUNO            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_DORMITORIO_PROFESSOR        <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LABORATORIO_CIENCIAS        <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 1, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_LABORATORIO_INFORMATICA     <int> 0, 0, 1, 1, 1, 0, 0, NA, 1, 1, 1, 0, 1, 0, 0, 0, 1, NA, 0, 1…
## $ IN_LABORATORIO_EDUC_PROF       <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PATIO_COBERTO               <int> 0, 0, 0, 1, 1, 0, 1, NA, 0, 1, 0, 0, 1, 1, 1, 0, 0, NA, 1, 0…
## $ IN_PATIO_DESCOBERTO            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 1…
## $ IN_PARQUE_INFANTIL             <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 1, 0, 0, 0, 0, 1, 0, 1, NA, 1, 0…
## $ IN_PISCINA                     <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_QUADRA_ESPORTES             <int> 0, 0, 1, 0, 0, 1, 0, NA, 0, 0, 0, 1, 1, 0, 0, 0, 0, NA, 0, 1…
## $ IN_QUADRA_ESPORTES_COBERTA     <int> 0, 0, 1, 0, 0, 1, 0, NA, 0, 0, 0, 1, 1, 0, 0, 0, 0, NA, 0, 1…
## $ IN_QUADRA_ESPORTES_DESCOBERTA  <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_REFEITORIO                  <int> 0, 1, 1, 1, 1, 0, 0, NA, 1, 1, 1, 0, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_SALA_ATELIE_ARTES           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_MUSICA_CORAL           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_ESTUDIO_DANCA          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_MULTIUSO               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_ESTUDIO_GRAVACAO       <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_OFICINAS_EDUC_PROF     <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_DIRETORIA              <int> 1, 1, 1, 1, 0, 1, 1, NA, 1, 0, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_SALA_LEITURA                <int> 0, 0, 0, 0, 0, 0, 1, NA, 1, 0, 0, 0, 1, 1, 0, 0, 0, NA, 0, 0…
## $ IN_SALA_PROFESSOR              <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 0, 1, 1, 1, 1, 1, 0, 0, NA, 1, 1…
## $ IN_SALA_REPOUSO_ALUNO          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_SECRETARIA                  <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_SALA_ATENDIMENTO_ESPECIAL   <int> 1, 1, 1, 1, 0, 0, 1, NA, 0, 1, 1, 1, 0, 0, 0, 1, 0, NA, 0, 1…
## $ IN_TERREIRAO                   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_VIVEIRO                     <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_DEPENDENCIAS_OUTRAS         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_CORRIMAO     <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 1, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_ELEVADOR     <int> 1, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_PISOS_TATEIS <int> 0, 0, 0, 0, 1, 0, 1, NA, 0, 0, 0, 1, 0, 0, 0, 0, 0, NA, 0, 1…
## $ IN_ACESSIBILIDADE_VAO_LIVRE    <int> 0, 0, 0, 0, 1, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_RAMPAS       <int> 0, 1, 0, 0, 0, 1, 0, NA, 1, 1, 0, 0, 1, 0, 1, 1, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_SINAL_SONORO <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 1, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_SINAL_TATIL  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 1, 0, NA, 0, 0…
## $ IN_ACESSIBILIDADE_SINAL_VISUAL <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 1, NA, 0, 0…
## $ IN_ACESSIBILIDADE_INEXISTENTE  <int> 0, 0, 1, 1, 0, 0, 0, NA, 0, 0, 1, 0, 0, 1, 0, 0, 0, NA, 1, 0…
## $ QT_SALAS_UTILIZADAS_DENTRO     <int> 20, 9, 10, 9, 9, 16, 10, NA, 10, 12, 15, 20, 47, 10, 7, 10, …
## $ QT_SALAS_UTILIZADAS_FORA       <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_SALAS_UTILIZADAS            <int> 20, 9, 10, 9, 9, 16, 10, NA, 10, 12, 15, 20, 47, 10, 7, 10, …
## $ QT_SALAS_UTILIZA_CLIMATIZADAS  <int> 20, 9, 10, 9, 9, 16, 10, NA, 10, 12, 15, 20, 47, 10, 7, 10, …
## $ QT_SALAS_UTILIZADAS_ACESSIVEIS <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EQUIP_PARABOLICA            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_COMPUTADOR                  <int> 0, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 0, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_EQUIP_COPIADORA             <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 0, 1, 0, 1, 0, 1, 0, 0, NA, 0, 0…
## $ IN_EQUIP_IMPRESSORA            <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_EQUIP_IMPRESSORA_MULT       <int> 0, 1, 0, 0, 1, 1, 0, NA, 1, 0, 0, 0, 1, 1, 1, 1, 0, NA, 0, 0…
## $ IN_EQUIP_SCANNER               <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EQUIP_NENHUM                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EQUIP_DVD                   <int> 0, 1, 0, 1, 1, 1, 0, NA, 1, 0, 0, 1, 1, 0, 1, 0, 1, NA, 0, 0…
## $ QT_EQUIP_DVD                   <int> 0, 1, 0, 2, 2, 1, 0, NA, 3, 0, 0, 2, 1, 0, 1, 0, 1, NA, 0, 0…
## $ IN_EQUIP_SOM                   <int> 0, 0, 0, 1, 1, 1, 0, NA, 1, 0, 1, 1, 1, 1, 1, 0, 1, NA, 1, 1…
## $ QT_EQUIP_SOM                   <int> 0, 0, 0, 3, 4, 1, 0, NA, 1, 0, 1, 2, 3, 2, 5, 0, 1, NA, 3, 1…
## $ IN_EQUIP_TV                    <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ QT_EQUIP_TV                    <int> 2, 1, 2, 7, 2, 3, 4, NA, 6, 14, 1, 2, 4, 2, 1, 6, 3, NA, 5, …
## $ IN_EQUIP_LOUSA_DIGITAL         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ QT_EQUIP_LOUSA_DIGITAL         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EQUIP_MULTIMIDIA            <int> 0, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ QT_EQUIP_MULTIMIDIA            <int> 0, 1, 1, 2, 2, 3, 4, NA, 5, 3, 5, 4, 19, 1, 1, 1, 1, NA, 2, …
## $ IN_DESKTOP_ALUNO               <int> 0, 0, 1, 1, 1, 1, 0, NA, 1, 1, 1, 0, 1, 0, 0, 0, 1, NA, 0, 1…
## $ QT_DESKTOP_ALUNO               <int> 0, 0, 11, 3, 4, 2, 0, NA, 11, 5, 6, 0, 2, 0, 0, 0, 1, NA, 0,…
## $ IN_COMP_PORTATIL_ALUNO         <int> 0, 0, 0, 1, 1, 1, 0, NA, 0, 1, 0, 0, 0, 0, 0, 0, 1, NA, 0, 1…
## $ QT_COMP_PORTATIL_ALUNO         <int> 0, 0, 0, 14, 16, 2, 0, NA, 0, 3, 0, 0, 0, 0, 0, 0, 1, NA, 0,…
## $ IN_TABLET_ALUNO                <int> 0, 1, 0, 1, 0, 1, 1, NA, 1, 1, 1, 0, 0, 1, 1, 1, 1, NA, 1, 1…
## $ QT_TABLET_ALUNO                <int> 0, 48, 0, 11, 0, 100, 60, NA, 34, 30, 15, 0, 0, 30, 30, 30, …
## $ IN_INTERNET                    <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_INTERNET_ALUNOS             <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 0, 0, 1, 1, 0, 1, NA, 1, 0…
## $ IN_INTERNET_ADMINISTRATIVO     <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_INTERNET_APRENDIZAGEM       <int> 0, 1, 0, 0, 1, 1, 1, NA, 1, 1, 1, 1, 0, 1, 1, 1, 1, NA, 1, 0…
## $ IN_INTERNET_COMUNIDADE         <int> 0, 0, 0, 0, 0, 0, 0, NA, 1, 0, 0, 0, 0, 0, 0, 0, 1, NA, 0, 0…
## $ IN_ACESSO_INTERNET_COMPUTADOR  <int> 9, 1, 1, 1, 1, 0, 1, NA, 1, 1, 1, 0, 0, 1, 1, 0, 1, NA, 1, 0…
## $ IN_ACES_INTERNET_DISP_PESSOAIS <int> 9, 0, 0, 0, 0, 1, 0, NA, 0, 0, 1, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ TP_REDE_LOCAL                  <int> 0, 1, 3, 3, 3, 3, 1, NA, 3, 1, 3, 9, 1, 3, 1, 1, 1, NA, 1, 3…
## $ IN_BANDA_LARGA                 <int> 1, 1, 1, 1, 1, 0, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_PROF_ADMINISTRATIVOS        <int> 1, 1, 1, 1, 0, 1, 0, NA, 1, 1, 1, 1, 1, 0, 0, 1, 1, NA, 1, 1…
## $ QT_PROF_ADMINISTRATIVOS        <int> 5, 1, 1, 1, 0, 1, 0, NA, 1, 4, 5, 3, 7, 0, 0, 3, 2, NA, 2, 4…
## $ IN_PROF_SERVICOS_GERAIS        <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 0, NA, 1, 0…
## $ QT_PROF_SERVICOS_GERAIS        <int> 5, 3, 1, 1, 2, 12, 3, NA, 4, 4, 2, 3, 16, 5, 2, 5, 0, NA, 2,…
## $ IN_PROF_BIBLIOTECARIO          <int> 1, 1, 0, 1, 1, 1, 1, NA, 0, 1, 1, 1, 1, 0, 0, 0, 0, NA, 0, 1…
## $ QT_PROF_BIBLIOTECARIO          <int> 2, 2, 0, 1, 1, 4, 2, NA, 0, 2, 2, 2, 3, 0, 0, 0, 0, NA, 0, 1…
## $ IN_PROF_SAUDE                  <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 1, 0, 0, 0, 0, 0, 1, 0, NA, 0, 0…
## $ QT_PROF_SAUDE                  <int> 0, 2, 0, 0, 0, 0, 0, NA, 0, 1, 0, 0, 0, 0, 0, 1, 0, NA, 0, 0…
## $ IN_PROF_COORDENADOR            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 1, 0, 0, NA, 0, 0…
## $ QT_PROF_COORDENADOR            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 1, 0, 0, NA, 0, 0…
## $ IN_PROF_FONAUDIOLOGO           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_PROF_FONAUDIOLOGO           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF_NUTRICIONISTA          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_PROF_NUTRICIONISTA          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF_PSICOLOGO              <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_PROF_PSICOLOGO              <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF_ALIMENTACAO            <int> 0, 1, 0, 0, 1, 1, 1, NA, 1, 0, 0, 1, 1, 1, 1, 1, 0, NA, 1, 0…
## $ QT_PROF_ALIMENTACAO            <int> 0, 2, 0, 0, 1, 9, 2, NA, 2, 0, 0, 6, 13, 2, 2, 2, 0, NA, 1, …
## $ IN_PROF_PEDAGOGIA              <int> 0, 1, 1, 1, 1, 1, 1, NA, 1, 1, 0, 0, 1, 0, 1, 1, 0, NA, 1, 0…
## $ QT_PROF_PEDAGOGIA              <int> 0, 2, 2, 1, 1, 2, 1, NA, 2, 2, 0, 0, 5, 0, 1, 2, 0, NA, 1, 0…
## $ IN_PROF_SECRETARIO             <int> 1, 1, 1, 0, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 0, NA, 0, 1…
## $ QT_PROF_SECRETARIO             <int> 1, 1, 1, 0, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 0, NA, 0, 1…
## $ IN_PROF_SEGURANCA              <int> 1, 0, 0, 0, 0, 1, 1, NA, 0, 0, 1, 1, 1, 0, 1, 0, 0, NA, 1, 0…
## $ QT_PROF_SEGURANCA              <int> 1, 0, 0, 0, 0, 2, 1, NA, 0, 0, 1, 2, 2, 0, 1, 0, 0, NA, 1, 0…
## $ IN_PROF_MONITORES              <int> 0, 0, 0, 1, 1, 0, 0, NA, 1, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_PROF_MONITORES              <int> 0, 0, 0, 1, 1, 0, 0, NA, 1, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF_GESTAO                 <int> 1, 1, 1, 1, 1, 1, 1, NA, 0, 1, 1, 1, 1, 0, 0, 1, 1, NA, 1, 1…
## $ QT_PROF_GESTAO                 <int> 1, 1, 1, 1, 1, 1, 1, NA, 0, 1, 1, 2, 1, 0, 0, 1, 1, NA, 1, 1…
## $ IN_PROF_ASSIST_SOCIAL          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_PROF_ASSIST_SOCIAL          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF_TRAD_LIBRAS            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_PROF_TRAD_LIBRAS            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ALIMENTACAO                 <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_MATERIAL_PED_MULTIMIDIA     <int> 0, 0, 1, 0, 1, 1, 0, NA, 1, 0, 1, 0, 0, 0, 0, 0, 0, NA, 1, 1…
## $ IN_MATERIAL_PED_INFANTIL       <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 1, 0, 0, 0, 0, 1, 1, 1, NA, 1, 0…
## $ IN_MATERIAL_PED_CIENTIFICO     <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 0, 0, 0, 1, 1, 0, NA, 1, 0…
## $ IN_MATERIAL_PED_DIFUSAO        <int> 0, 0, 1, 1, 1, 1, 0, NA, 1, 0, 0, 0, 1, 1, 1, 1, 0, NA, 1, 0…
## $ IN_MATERIAL_PED_MUSICAL        <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 1, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MATERIAL_PED_JOGOS          <int> 0, 0, 0, 0, 1, 1, 1, NA, 1, 0, 0, 1, 0, 1, 1, 1, 0, NA, 1, 1…
## $ IN_MATERIAL_PED_ARTISTICAS     <int> 1, 0, 0, 0, 0, 0, 0, NA, 0, 0, 1, 0, 0, 0, 0, 1, 0, NA, 0, 0…
## $ IN_MATERIAL_PED_PROFISSIONAL   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MATERIAL_PED_DESPORTIVA     <int> 0, 0, 0, 0, 1, 1, 1, NA, 1, 0, 1, 0, 1, 1, 0, 0, 0, NA, 1, 1…
## $ IN_MATERIAL_PED_INDIGENA       <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MATERIAL_PED_ETNICO         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 1, 0…
## $ IN_MATERIAL_PED_CAMPO          <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MATERIAL_PED_BIL_SURDOS     <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MATERIAL_PED_NENHUM         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EDUCACAO_INDIGENA           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ TP_INDIGENA_LINGUA             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ CO_LINGUA_INDIGENA_1           <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ CO_LINGUA_INDIGENA_2           <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ CO_LINGUA_INDIGENA_3           <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_EXAME_SELECAO               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_RESERVA_PPI                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_RESERVA_RENDA               <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_RESERVA_PUBLICA             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_RESERVA_PCD                 <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_RESERVA_OUTROS              <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_RESERVA_NENHUMA             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ IN_REDES_SOCIAIS               <int> 0, 1, 0, 0, 0, 1, 0, NA, 0, 0, 0, 1, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ESPACO_ATIVIDADE            <int> 0, 0, 1, 0, 0, 0, 0, NA, 0, 0, 0, 1, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ESPACO_EQUIPAMENTO          <int> 0, 0, 0, 0, 1, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ORGAO_ASS_PAIS              <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ORGAO_ASS_PAIS_MESTRES      <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 1, 1, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ORGAO_CONSELHO_ESCOLAR      <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 0, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_ORGAO_GREMIO_ESTUDANTIL     <int> 0, 0, 0, 0, 1, 1, 0, NA, 1, 0, 1, 1, 0, 1, 0, 0, 0, NA, 0, 0…
## $ IN_ORGAO_OUTROS                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ORGAO_NENHUM                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ TP_PROPOSTA_PEDAGOGICA         <int> 1, 1, 1, 0, 1, 2, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 0, 1…
## $ TP_AEE                         <int> 0, 1, 0, 1, 0, 0, 1, NA, 0, 1, 1, 1, 0, 0, 0, 1, 0, NA, 0, 1…
## $ TP_ATIVIDADE_COMPLEMENTAR      <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MEDIACAO_PRESENCIAL         <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_MEDIACAO_SEMIPRESENCIAL     <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MEDIACAO_EAD                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_REGULAR                     <int> 0, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_DIURNO                      <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_NOTURNO                     <int> 1, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EAD                         <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ESCOLARIZACAO               <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_INF                         <int> 0, 1, 0, 0, 1, 0, 0, NA, 0, 1, 0, 0, 0, 1, 1, 1, 1, NA, 1, 0…
## $ IN_INF_CRE                     <int> 0, 1, 0, 0, 0, 0, 0, NA, 0, 1, 0, 0, 0, 0, 1, 0, 1, NA, 0, 0…
## $ IN_INF_PRE                     <int> 0, 1, 0, 0, 1, 0, 0, NA, 0, 1, 0, 0, 0, 1, 1, 1, 1, NA, 1, 0…
## $ IN_FUND                        <int> 0, 0, 1, 1, 1, 0, 1, NA, 1, 0, 0, 1, 1, 1, 0, 0, 0, NA, 0, 1…
## $ IN_FUND_AI                     <int> 0, 0, 1, 1, 1, 0, 1, NA, 1, 0, 0, 0, 1, 1, 0, 0, 0, NA, 0, 1…
## $ IN_FUND_AF                     <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 1, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_MED                         <int> 0, 0, 0, 0, 0, 1, 0, NA, 0, 0, 1, 1, 1, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF                        <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_PROF_TEC                    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EJA                         <int> 1, 0, 0, 1, 0, 1, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EJA_FUND                    <int> 1, 0, 0, 1, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_EJA_MED                     <int> 1, 0, 0, 0, 0, 1, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ IN_ESP                         <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_ESP_CC                      <int> 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1…
## $ IN_ESP_CE                      <int> 0, 0, 0, 1, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_BAS                     <int> 1083, 344, 477, 328, 377, 1034, 392, NA, 399, 396, 1239, 131…
## $ QT_MAT_INF                     <int> 0, 344, 0, 0, 107, 0, 0, NA, 0, 396, 0, 0, 0, 84, 183, 447, …
## $ QT_MAT_INF_CRE                 <int> 0, 103, 0, 0, 0, 0, 0, NA, 0, 118, 0, 0, 0, 0, 44, 0, 36, NA…
## $ QT_MAT_INF_PRE                 <int> 0, 241, 0, 0, 107, 0, 0, NA, 0, 278, 0, 0, 0, 84, 139, 447, …
## $ QT_MAT_FUND                    <int> 0, 0, 477, 312, 270, 0, 392, NA, 399, 0, 0, 698, 1930, 373, …
## $ QT_MAT_FUND_AI                 <int> 0, 0, 477, 312, 270, 0, 392, NA, 399, 0, 0, 0, 621, 373, 0, …
## $ QT_MAT_FUND_AI_1               <int> 0, 0, 93, 59, 67, 0, 85, NA, 111, 0, 0, 0, 0, 95, 0, 0, 0, N…
## $ QT_MAT_FUND_AI_2               <int> 0, 0, 95, 79, 61, 0, 103, NA, 70, 0, 0, 0, 84, 96, 0, 0, 0, …
## $ QT_MAT_FUND_AI_3               <int> 0, 0, 118, 66, 41, 0, 69, NA, 76, 0, 0, 0, 133, 47, 0, 0, 0,…
## $ QT_MAT_FUND_AI_4               <int> 0, 0, 111, 58, 55, 0, 66, NA, 59, 0, 0, 0, 204, 73, 0, 0, 0,…
## $ QT_MAT_FUND_AI_5               <int> 0, 0, 60, 50, 46, 0, 69, NA, 83, 0, 0, 0, 200, 62, 0, 0, 0, …
## $ QT_MAT_FUND_AF                 <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 698, 1309, 0, 0, 0, 0, NA,…
## $ QT_MAT_FUND_AF_6               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 143, 290, 0, 0, 0, 0, NA, …
## $ QT_MAT_FUND_AF_7               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 174, 298, 0, 0, 0, 0, NA, …
## $ QT_MAT_FUND_AF_8               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 195, 342, 0, 0, 0, 0, NA, …
## $ QT_MAT_FUND_AF_9               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 186, 379, 0, 0, 0, 0, NA, …
## $ QT_MAT_MED                     <int> 0, 0, 0, 0, 0, 840, 0, NA, 0, 0, 1239, 617, 807, 0, 0, 0, 0,…
## $ QT_MAT_MED_PROP                <int> 0, 0, 0, 0, 0, 840, 0, NA, 0, 0, 1239, 617, 807, 0, 0, 0, 0,…
## $ QT_MAT_MED_PROP_1              <int> 0, 0, 0, 0, 0, 381, 0, NA, 0, 0, 399, 196, 339, 0, 0, 0, 0, …
## $ QT_MAT_MED_PROP_2              <int> 0, 0, 0, 0, 0, 181, 0, NA, 0, 0, 425, 231, 229, 0, 0, 0, 0, …
## $ QT_MAT_MED_PROP_3              <int> 0, 0, 0, 0, 0, 278, 0, NA, 0, 0, 415, 190, 239, 0, 0, 0, 0, …
## $ QT_MAT_MED_PROP_4              <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_PROP_NS             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_CT                  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_CT_1                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_CT_2                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_CT_3                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_CT_4                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_CT_NS               <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_NM                  <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_NM_1                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_NM_2                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_NM_3                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_NM_4                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_PROF                    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_PROF_TEC                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_PROF_TEC_CONC           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_PROF_TEC_SUBS           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_PROF_FIC_CONC           <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_EJA                     <int> 1083, 0, 0, 16, 0, 194, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA…
## $ QT_MAT_EJA_FUND                <int> 354, 0, 0, 16, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0…
## $ QT_MAT_EJA_FUND_AI             <int> 0, 0, 0, 16, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_MAT_EJA_FUND_AF             <int> 354, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0,…
## $ QT_MAT_EJA_FUND_FIC            <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_EJA_MED                 <int> 729, 0, 0, 0, 0, 194, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, …
## $ QT_MAT_EJA_MED_NPROF           <int> 729, 0, 0, 0, 0, 194, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, …
## $ QT_MAT_EJA_MED_FIC             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_EJA_MED_TEC             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_ESP                     <int> 28, 18, 11, 42, 13, 21, 14, NA, 8, 33, 16, 29, 42, 13, 6, 27…
## $ QT_MAT_ESP_CC                  <int> 28, 18, 11, 10, 13, 21, 14, NA, 8, 33, 16, 29, 42, 13, 6, 27…
## $ QT_MAT_ESP_CE                  <int> 0, 0, 0, 32, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_MAT_BAS_FEM                 <int> 556, 166, 228, 134, 172, 499, 189, NA, 204, 207, 693, 702, 1…
## $ QT_MAT_BAS_MASC                <int> 527, 178, 249, 194, 205, 535, 203, NA, 195, 189, 546, 613, 1…
## $ QT_MAT_BAS_ND                  <int> 17, 178, 80, 36, 248, 129, 44, NA, 32, 5, 92, 78, 209, 186, …
## $ QT_MAT_BAS_BRANCA              <int> 102, 29, 37, 46, 10, 85, 10, NA, 44, 70, 227, 295, 310, 19, …
## $ QT_MAT_BAS_PRETA               <int> 14, 1, 2, 1, 1, 10, 1, NA, 1, 7, 12, 8, 21, 7, 1, 37, 0, NA,…
## $ QT_MAT_BAS_PARDA               <int> 948, 136, 356, 245, 117, 809, 337, NA, 322, 313, 904, 926, 2…
## $ QT_MAT_BAS_AMARELA             <int> 0, 0, 0, 0, 1, 1, 0, NA, 0, 1, 2, 1, 3, 2, 0, 0, 0, NA, 0, 2…
## $ QT_MAT_BAS_INDIGENA            <int> 2, 0, 2, 0, 0, 0, 0, NA, 0, 0, 2, 7, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_BAS_0_3                 <int> 0, 83, 0, 0, 0, 0, 0, NA, 0, 87, 0, 0, 0, 0, 35, 0, 29, NA, …
## $ QT_MAT_BAS_4_5                 <int> 0, 234, 0, 0, 98, 0, 0, NA, 0, 290, 0, 0, 0, 63, 141, 396, 1…
## $ QT_MAT_BAS_6_10                <int> 0, 27, 454, 282, 264, 0, 351, NA, 381, 19, 0, 3, 607, 380, 7…
## $ QT_MAT_BAS_11_14               <int> 0, 0, 23, 26, 15, 4, 39, NA, 18, 0, 9, 626, 1217, 14, 0, 0, …
## $ QT_MAT_BAS_15_17               <int> 106, 0, 0, 6, 0, 640, 2, NA, 0, 0, 1136, 614, 863, 0, 0, 0, …
## $ QT_MAT_BAS_18_MAIS             <int> 977, 0, 0, 14, 0, 390, 0, NA, 0, 0, 94, 72, 50, 0, 0, 0, 0, …
## $ QT_MAT_BAS_D                   <int> 598, 344, 477, 328, 377, 453, 392, NA, 399, 396, 1239, 1315,…
## $ QT_MAT_BAS_N                   <int> 485, 0, 0, 0, 0, 581, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, …
## $ QT_MAT_BAS_EAD                 <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_INF_INT                 <int> 0, 0, 0, 0, 1, 0, 0, NA, 0, 14, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_MAT_INF_CRE_INT             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 5, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_INF_PRE_INT             <int> 0, 0, 0, 0, 1, 0, 0, NA, 0, 9, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_FUND_INT                <int> 0, 0, 2, 4, 1, 0, 8, NA, 3, 0, 0, 5, 0, 1, 0, 0, 0, NA, 0, 1…
## $ QT_MAT_FUND_AI_INT             <int> 0, 0, 2, 4, 1, 0, 8, NA, 3, 0, 0, 0, 0, 1, 0, 0, 0, NA, 0, 1…
## $ QT_MAT_FUND_AF_INT             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 5, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_MAT_MED_INT                 <int> 0, 0, 0, 0, 0, 453, 0, NA, 0, 0, 11, 12, 0, 0, 0, 0, 0, NA, …
## $ QT_MAT_ZR_URB                  <int> 1079, 343, 475, 328, 376, 1016, 392, NA, 397, 396, 1236, 131…
## $ QT_MAT_ZR_RUR                  <int> 4, 1, 2, 0, 1, 18, 0, NA, 2, 0, 3, 1, 3, 0, 0, 0, 0, NA, 0, …
## $ QT_MAT_ZR_NA                   <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TRANSP_PUBLICO              <int> 1, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TRANSP_RESP_EST             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TRANSP_RESP_MUN             <int> 1, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 0, 0…
## $ QT_DOC_BAS                     <int> 73, 14, 19, 14, 15, 41, 15, NA, 23, 20, 48, 72, 123, 17, 10,…
## $ QT_DOC_INF                     <int> 0, 14, 0, 0, 6, 0, 0, NA, 0, 20, 0, 0, 0, 2, 10, 14, 10, NA,…
## $ QT_DOC_INF_CRE                 <int> 0, 6, 0, 0, 0, 0, 0, NA, 0, 8, 0, 0, 0, 0, 2, 0, 2, NA, 0, 0…
## $ QT_DOC_INF_PRE                 <int> 0, 8, 0, 0, 6, 0, 0, NA, 0, 12, 0, 0, 0, 2, 9, 14, 8, NA, 8,…
## $ QT_DOC_FUND                    <int> 0, 0, 19, 13, 11, 0, 15, NA, 23, 0, 0, 36, 95, 15, 0, 0, 0, …
## $ QT_DOC_FUND_AI                 <int> 0, 0, 19, 13, 11, 0, 14, NA, 23, 0, 0, 0, 30, 15, 0, 0, 0, N…
## $ QT_DOC_FUND_AF                 <int> 0, 0, 0, 0, 0, 0, 1, NA, 0, 0, 0, 36, 70, 0, 0, 0, 0, NA, 0,…
## $ QT_DOC_MED                     <int> 0, 0, 0, 0, 0, 36, 0, NA, 0, 0, 48, 43, 47, 0, 0, 0, 0, NA, …
## $ QT_DOC_PROF                    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_DOC_PROF_TEC                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_DOC_EJA                     <int> 73, 0, 0, 2, 0, 13, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0,…
## $ QT_DOC_EJA_FUND                <int> 32, 0, 0, 2, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_DOC_EJA_MED                 <int> 59, 0, 0, 0, 0, 13, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0,…
## $ QT_DOC_ESP                     <int> 67, 13, 8, 11, 11, 35, 11, NA, 16, 19, 44, 67, 106, 13, 5, 1…
## $ QT_DOC_ESP_CC                  <int> 67, 13, 8, 10, 11, 35, 11, NA, 16, 19, 44, 67, 106, 13, 5, 1…
## $ QT_DOC_ESP_CE                  <int> 0, 0, 0, 3, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_BAS                     <int> 53, 18, 20, 17, 18, 28, 20, NA, 20, 24, 30, 40, 78, 20, 14, …
## $ QT_TUR_INF                     <int> 0, 18, 0, 0, 6, 0, 0, NA, 0, 24, 0, 0, 0, 4, 14, 20, 12, NA,…
## $ QT_TUR_INF_CRE                 <int> 0, 6, 0, 0, 0, 0, 0, NA, 0, 8, 0, 0, 0, 0, 3, 0, 2, NA, 0, 0…
## $ QT_TUR_INF_PRE                 <int> 0, 12, 0, 0, 6, 0, 0, NA, 0, 16, 0, 0, 0, 4, 11, 20, 10, NA,…
## $ QT_TUR_FUND                    <int> 0, 0, 20, 16, 12, 0, 20, NA, 20, 0, 0, 20, 52, 16, 0, 0, 0, …
## $ QT_TUR_FUND_AI                 <int> 0, 0, 20, 16, 12, 0, 18, NA, 20, 0, 0, 0, 16, 16, 0, 0, 0, N…
## $ QT_TUR_FUND_AF                 <int> 0, 0, 0, 0, 0, 0, 2, NA, 0, 0, 0, 20, 36, 0, 0, 0, 0, NA, 0,…
## $ QT_TUR_MED                     <int> 0, 0, 0, 0, 0, 22, 0, NA, 0, 0, 30, 20, 26, 0, 0, 0, 0, NA, …
## $ QT_TUR_PROF                    <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_PROF_TEC                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_EJA                     <int> 53, 0, 0, 1, 0, 6, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_TUR_EJA_FUND                <int> 17, 0, 0, 1, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_TUR_EJA_MED                 <int> 36, 0, 0, 0, 0, 6, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …
## $ QT_TUR_ESP                     <int> 20, 14, 7, 11, 10, 14, 10, NA, 8, 22, 14, 17, 34, 12, 6, 17,…
## $ QT_TUR_ESP_CC                  <int> 20, 14, 7, 9, 10, 14, 10, NA, 8, 22, 14, 17, 34, 12, 6, 17, …
## $ QT_TUR_ESP_CE                  <int> 0, 0, 0, 2, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_BAS_D                   <int> 33, 18, 20, 17, 18, 12, 20, NA, 20, 24, 30, 40, 78, 20, 14, …
## $ QT_TUR_BAS_N                   <int> 20, 0, 0, 0, 0, 16, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0,…
## $ QT_TUR_BAS_EAD                 <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_INF_INT                 <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_INF_CRE_INT             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_INF_PRE_INT             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_FUND_INT                <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_FUND_AI_INT             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_FUND_AF_INT             <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0…
## $ QT_TUR_MED_INT                 <int> 0, 0, 0, 0, 0, 12, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, …

4.2 Missings nas variáveis-chave

cols_saeb <- c("TX_RESP_Q04", "PROFICIENCIA_LP_SAEB", "PROFICIENCIA_MT_SAEB",
               "IN_PREENCHIMENTO_QUESTIONARIO", "ID_UF")

aluno_9ef |>
  summarise(across(all_of(cols_saeb),
                   ~ mean(is.na(.)) * 100,
                   .names = "miss_pct_{.col}"))
cols_censo <- c("QT_MAT_BAS_BRANCA", "QT_MAT_BAS_PRETA",
                "QT_MAT_BAS_PARDA",  "QT_MAT_BAS_AMARELA", "QT_MAT_BAS_INDIGENA")

censo |>
  summarise(across(all_of(cols_censo),
                   ~ mean(is.na(.)) * 100,
                   .names = "miss_pct_{.col}"))

4.3 Distribuição de raça/cor no SAEB (TX_RESP_Q04)

Categorias do questionário: A = Branca, B = Preta, C = Parda, D = Amarela, E = Indígena, F = Não declarar, . = Branco (não respondeu).

aluno_9ef |>
  count(TX_RESP_Q04) |>
  mutate(pct = round(n / sum(n) * 100, 1)) |>
  arrange(desc(n))

4.4 Distribuição de raça no Censo (contagens agregadas por escola)

censo |>
  as_tibble() |>
  select(all_of(cols_censo)) |>
  summarise(across(everything(), sum, na.rm = TRUE)) |>
  pivot_longer(everything(), names_to = "grupo", values_to = "total") |>
  mutate(
    grupo = str_remove(grupo, "QT_MAT_BAS_"),
    pct   = round(total / sum(total) * 100, 1)
  ) |>
  arrange(desc(total))

4.5 Distribuição por UF

aluno_9ef |>
  count(ID_UF) |>
  mutate(pct = round(n / sum(n) * 100, 1))
# Salvar arquivos filtrados para uso nas próximas etapas
dir_clean <- here("data", "clean")
if (!dir.exists(dir_clean)) dir.create(dir_clean, recursive = TRUE)

fwrite(aluno_5ef, here("data", "clean", "aluno_5ef_filtrado.csv"), sep = ";", bom = TRUE)
fwrite(aluno_9ef, here("data", "clean", "aluno_9ef_filtrado.csv"), sep = ";", bom = TRUE)
fwrite(censo,     here("data", "clean", "censo_filtrado.csv"),     sep = ";", bom = TRUE)

5 Índice de Clima Escolar (AFE)

O clima escolar é construído via Análise Fatorial Exploratória (AFE) sobre 9 itens do questionário Q23 do SAEB (bloco “Sobre sua escola, indique o quanto você concorda ou discorda”). AFE é preferida à média simples porque pondera automaticamente cada item pela sua correlação com o fator latente subjacente.

library(tidyverse)
library(psych)
library(data.table)
library(here)

5.1 Carregamento e seleção dos itens

aluno <- fread(here("data", "clean", "aluno_9ef_filtrado.csv"))

cat("N escolas:", uniqueN(aluno$ID_ESCOLA), "\n")
## N escolas: 3116
cat("N alunos:", nrow(aluno), "\n")
## N alunos: 193097
itens_clima <- aluno |>
  select(
    ID_ESCOLA,
    TX_RESP_Q23a,  # Interesse no que foi ensinado
    TX_RESP_Q23b,  # Motivação para usar o conhecimento
    TX_RESP_Q23c,  # Espaço para diferentes opiniões
    TX_RESP_Q23d,  # Segurança na escola
    TX_RESP_Q23e,  # À vontade para discordar dos professores
    TX_RESP_Q23f,  # Capacidade de argumentar sobre conteúdos difíceis
    TX_RESP_Q23g,  # Avaliações representam o aprendizado
    TX_RESP_Q23h,  # Professores acreditam na capacidade do aluno
    TX_RESP_Q23i   # Professores motivam a continuar os estudos
  ) |>
  mutate(across(-ID_ESCOLA, ~ as.integer(factor(.))))

5.2 Dados faltantes

missing_summary <- itens_clima |>
  select(-ID_ESCOLA) |>
  summarise(across(everything(), ~ mean(is.na(.)) * 100))

print(missing_summary)
##   TX_RESP_Q23a TX_RESP_Q23b TX_RESP_Q23c TX_RESP_Q23d TX_RESP_Q23e TX_RESP_Q23f TX_RESP_Q23g
## 1            0            0            0            0            0            0            0
##   TX_RESP_Q23h TX_RESP_Q23i
## 1            0            0
if (any(missing_summary > 5)) {
  message("Atenção: alguns itens têm > 5% de missing. Considerar imputação.")
}

dados_afe <- itens_clima |>
  select(-ID_ESCOLA) |>
  na.omit()

cat("N para AFE =", nrow(dados_afe), "\n")
## N para AFE = 193097

5.3 Adequação da amostra

5.3.1 Teste de Esfericidade de Bartlett

Verifica se as correlações entre os itens são suficientemente diferentes de zero para justificar a aplicação da AFE.

bartlett <- cortest.bartlett(dados_afe)
cat("Chi-square =", round(bartlett$chisq, 2), "\n")
## Chi-square = 1966730
cat("df =", bartlett$df, "\n")
## df = 36
cat("p-valor =", bartlett$p.value, "\n")
## p-valor = 0

5.3.2 Índice KMO (Kaiser-Meyer-Olkin)

Mede a proporção de variância compartilhada entre os itens. Valores ≥ 0,70 indicam adequação boa ou meritória.

kmo <- KMO(cor(dados_afe, use = "pairwise"))
cat("KMO overall =", round(kmo$MSA, 3), "\n")
## KMO overall = 0.967
if (kmo$MSA >= 0.80) {
  cat("→ Adequação: MERITÓRIA\n")
} else if (kmo$MSA >= 0.70) {
  cat("→ Adequação: BOA\n")
} else if (kmo$MSA >= 0.60) {
  cat("→ Adequação: MEDÍOCRE\n")
} else if (kmo$MSA >= 0.50) {
  cat("→ Adequação: RUIM (mas aceitável)\n")
} else {
  cat("→ Adequação: INACEITÁVEL — revisar itens\n")
}
## → Adequação: MERITÓRIA

5.3.3 Matriz de correlações

round(cor(dados_afe, use = "pairwise"), 3)
##              TX_RESP_Q23a TX_RESP_Q23b TX_RESP_Q23c TX_RESP_Q23d TX_RESP_Q23e TX_RESP_Q23f
## TX_RESP_Q23a        1.000        0.845        0.774        0.775        0.749        0.780
## TX_RESP_Q23b        0.845        1.000        0.786        0.793        0.759        0.791
## TX_RESP_Q23c        0.774        0.786        1.000        0.773        0.755        0.764
## TX_RESP_Q23d        0.775        0.793        0.773        1.000        0.748        0.764
## TX_RESP_Q23e        0.749        0.759        0.755        0.748        1.000        0.784
## TX_RESP_Q23f        0.780        0.791        0.764        0.764        0.784        1.000
## TX_RESP_Q23g        0.785        0.794        0.753        0.752        0.731        0.764
## TX_RESP_Q23h        0.787        0.790        0.766        0.771        0.734        0.774
## TX_RESP_Q23i        0.787        0.797        0.761        0.769        0.728        0.761
##              TX_RESP_Q23g TX_RESP_Q23h TX_RESP_Q23i
## TX_RESP_Q23a        0.785        0.787        0.787
## TX_RESP_Q23b        0.794        0.790        0.797
## TX_RESP_Q23c        0.753        0.766        0.761
## TX_RESP_Q23d        0.752        0.771        0.769
## TX_RESP_Q23e        0.731        0.734        0.728
## TX_RESP_Q23f        0.764        0.774        0.761
## TX_RESP_Q23g        1.000        0.787        0.779
## TX_RESP_Q23h        0.787        1.000        0.852
## TX_RESP_Q23i        0.779        0.852        1.000

5.4 Número de fatores

5.4.1 Scree Plot e Análise Paralela

scree(dados_afe, main = "Scree Plot — Clima Escolar")

fa.parallel(dados_afe, fa = "both", n.iter = 100)

5.5 AFE — 1 fator (índice unidimensional)

efa_1fator <- fa(dados_afe, nfactors = 1, rotate = "none", fm = "ml")

print(efa_1fator$loadings)
## 
## Loadings:
##              ML1  
## TX_RESP_Q23a 0.896
## TX_RESP_Q23b 0.907
## TX_RESP_Q23c 0.869
## TX_RESP_Q23d 0.872
## TX_RESP_Q23e 0.845
## TX_RESP_Q23f 0.876
## TX_RESP_Q23g 0.873
## TX_RESP_Q23h 0.892
## TX_RESP_Q23i 0.888
## 
##                  ML1
## SS loadings    6.967
## Proportion Var 0.774
cat("\nVariância explicada pelo fator 1:",
    round(efa_1fator$e.values[1] / sum(efa_1fator$e.values) * 100, 2), "%\n")
## 
## Variância explicada pelo fator 1: 79.92 %

5.6 AFE exploratória (4 fatores)

efa_exploratoria <- tryCatch({
  fa(dados_afe, nfactors = 4, rotate = "oblimin", fm = "ml")
}, error = function(e) {
  message("Convergência não alcançada com 4 fatores. Usar 1 fator.")
  NULL
})

if (!is.null(efa_exploratoria)) print(efa_exploratoria)
## Factor Analysis using method =  ml
## Call: fa(r = dados_afe, nfactors = 4, rotate = "oblimin", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
##               ML1   ML3   ML4   ML2   h2   u2 com
## TX_RESP_Q23a 0.91 -0.08 -0.02 -0.12 0.83 0.17 1.1
## TX_RESP_Q23b 0.93 -0.10  0.00 -0.15 0.87 0.13 1.1
## TX_RESP_Q23c 0.88 -0.01  0.15  0.07 0.78 0.22 1.1
## TX_RESP_Q23d 0.88 -0.02  0.10  0.05 0.77 0.23 1.0
## TX_RESP_Q23e 0.83  0.14  0.12  0.00 0.76 0.24 1.1
## TX_RESP_Q23f 0.85  0.24 -0.02 -0.08 0.84 0.16 1.2
## TX_RESP_Q23g 0.87 -0.01 -0.04 -0.01 0.76 0.24 1.0
## TX_RESP_Q23h 0.88  0.01 -0.17  0.16 0.88 0.12 1.2
## TX_RESP_Q23i 0.88 -0.04 -0.12  0.12 0.83 0.17 1.1
## 
##                        ML1  ML3  ML4  ML2
## SS loadings           6.99 0.11 0.10 0.10
## Proportion Var        0.78 0.01 0.01 0.01
## Cumulative Var        0.78 0.79 0.80 0.81
## Proportion Explained  0.96 0.02 0.01 0.01
## Cumulative Proportion 0.96 0.97 0.99 1.00
## 
##  With factor correlations of 
##       ML1  ML3   ML4   ML2
## ML1  1.00 0.15 -0.07  0.03
## ML3  0.15 1.00  0.14  0.03
## ML4 -0.07 0.14  1.00 -0.25
## ML2  0.03 0.03 -0.25  1.00
## 
## Mean item complexity =  1.1
## Test of the hypothesis that 4 factors are sufficient.
## 
## df null model =  36  with the objective function =  10.19 with Chi Square =  1966730
## df of  the model are 6  and the objective function was  0 
## 
## The root mean square of the residuals (RMSR) is  0 
## The df corrected root mean square of the residuals is  0 
## 
## The harmonic n.obs is  193097 with the empirical chi square  6.37  with prob <  0.38 
## The total n.obs was  193097  with Likelihood Chi Square =  171.93  with prob <  1.7e-34 
## 
## Tucker Lewis Index of factoring reliability =  0.999
## RMSEA index =  0.012  and the 90 % confidence intervals are  0.01 0.014
## BIC =  98.91
## Fit based upon off diagonal values = 1
## Measures of factor score adequacy             
##                                                    ML1   ML3   ML4   ML2
## Correlation of (regression) scores with factors   0.98  0.58  0.58  0.62
## Multiple R square of scores with factors          0.96  0.33  0.33  0.39
## Minimum correlation of possible factor scores     0.92 -0.33 -0.33 -0.23

5.7 Confiabilidade — Alpha de Cronbach

alpha_result <- psych::alpha(dados_afe)

cat("Alpha bruto:", round(alpha_result$total$raw_alpha, 4), "\n")
## Alpha bruto: 0.9669
std_alpha <- alpha_result$total$std_alpha
if (!is.null(std_alpha) && !is.na(std_alpha)) {
  cat("Alpha padronizado:", round(std_alpha, 4), "\n")
} else {
  cat("Alpha padronizado: NA (variâncias dos itens são homogêneas)\n")
}
## Alpha padronizado: NA (variâncias dos itens são homogêneas)
cat("\n=== Alpha se Item Deletado ===\n")
## 
## === Alpha se Item Deletado ===
print(round(alpha_result$alpha.drop, 4))
##              raw_alpha std.alpha G6(smc) average_r     S/N alpha se var.r  med.r
## TX_RESP_Q23a    0.9625    0.9642  0.9610    0.7707 26.8942    1e-04 6e-04 0.7678
## TX_RESP_Q23b    0.9615    0.9636  0.9603    0.7681 26.4984    1e-04 5e-04 0.7678
## TX_RESP_Q23c    0.9630    0.9652  0.9624    0.7761 27.7260    1e-04 8e-04 0.7772
## TX_RESP_Q23d    0.9631    0.9651  0.9624    0.7756 27.6453    1e-04 8e-04 0.7768
## TX_RESP_Q23e    0.9650    0.9662  0.9630    0.7812 28.5661    1e-04 5e-04 0.7772
## TX_RESP_Q23f    0.9628    0.9648  0.9618    0.7743 27.4432    1e-04 8e-04 0.7736
## TX_RESP_Q23g    0.9630    0.9651  0.9624    0.7756 27.6469    1e-04 7e-04 0.7736
## TX_RESP_Q23h    0.9626    0.9643  0.9604    0.7714 26.9983    1e-04 5e-04 0.7712
## TX_RESP_Q23i    0.9628    0.9645  0.9606    0.7724 27.1509    1e-04 5e-04 0.7736
if (any(alpha_result$alpha.drop$raw_alpha > alpha_result$total$raw_alpha)) {
  message("Alguns itens podem estar reduzindo a confiabilidade.")
}

5.8 Validação e seleção de itens

alpha_valido <- alpha_result$total$raw_alpha >= 0.70

cat("Alpha de Cronbach:", round(alpha_result$total$raw_alpha, 4), "\n")
## Alpha de Cronbach: 0.9669
cat("Meta: >= 0.70\n")
## Meta: >= 0.70
cat("Status:", ifelse(alpha_valido, "VÁLIDO", "NÃO VÁLIDO"), "\n")
## Status: VÁLIDO
cargas <- efa_1fator$loadings[, 1]
itens_mantidos <- names(cargas[abs(cargas) >= 0.30])

documentacao_itens <- tibble(
  Item           = names(cargas),
  Carga_Fatorial = round(cargas, 4),
  Mantido        = abs(cargas) >= 0.30
)

print(documentacao_itens)
## # A tibble: 9 × 3
##   Item         Carga_Fatorial Mantido
##   <chr>                 <dbl> <lgl>  
## 1 TX_RESP_Q23a          0.896 TRUE   
## 2 TX_RESP_Q23b          0.907 TRUE   
## 3 TX_RESP_Q23c          0.869 TRUE   
## 4 TX_RESP_Q23d          0.872 TRUE   
## 5 TX_RESP_Q23e          0.845 TRUE   
## 6 TX_RESP_Q23f          0.876 TRUE   
## 7 TX_RESP_Q23g          0.873 TRUE   
## 8 TX_RESP_Q23h          0.892 TRUE   
## 9 TX_RESP_Q23i          0.888 TRUE
cat("\nTotal de itens mantidos:", sum(documentacao_itens$Mantido), "de", length(cargas), "\n")
## 
## Total de itens mantidos: 9 de 9

5.9 Score do índice e agregação por escola

itens_clima_score <- itens_clima |>
  mutate(score_clima = rowMeans(across(all_of(itens_mantidos)), na.rm = TRUE))

escola_clima <- itens_clima_score |>
  group_by(ID_ESCOLA) |>
  summarise(
    clima_medio = mean(score_clima, na.rm = TRUE),
    clima_sd    = sd(score_clima, na.rm = TRUE),
    n_alunos    = n(),
    .groups     = "drop"
  )

cat("\nResumo do índice por escola:\n")
## 
## Resumo do índice por escola:
print(summary(escola_clima$clima_medio))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.071   3.360   3.235   3.561   4.288

5.10 Exportação

dir.create(here("outputs"), showWarnings = FALSE)

write_csv(escola_clima, here("outputs", "02_indice_clima_escolar_por_escola.csv"))
write_csv(documentacao_itens, here("outputs", "02_documentacao_itens_clima.csv"))

std_alpha_val <- alpha_result$total$std_alpha
if (is.null(std_alpha_val) || length(std_alpha_val) == 0 || is.na(std_alpha_val)) {
  std_alpha_val <- alpha_result$total$raw_alpha
}

alpha_df <- tibble(
  metrica = c("Alpha_Bruto", "Alpha_Padronizado", "N_Itens", "N_Amostra"),
  valor   = c(as.numeric(alpha_result$total$raw_alpha),
              as.numeric(std_alpha_val),
              as.numeric(ncol(dados_afe)),
              as.numeric(nrow(dados_afe)))
)

write_csv(alpha_df, here("outputs", "02_resultados_confiabilidade.csv"))

6 Tratamento e Integração

Nesta etapa são realizadas: (1) recodificação de raça para dicotomia Branco/Não-branco; (2) construção do NSE via PCA; (3) cálculo do índice de clima individual; (4) agregação ao nível da escola; (5) merge com TS_ESCOLA.

library(data.table)
library(tidyverse)
library(psych)
library(here)

6.1 Carga e filtros

aluno <- fread(here("data", "raw", "TS_ALUNO_9EF.csv"),
               sep = ";", encoding = "Latin-1")
censo <- fread(here("data", "raw", "microdados_ed_basica_2023.csv"),
               sep = ";", encoding = "Latin-1")

aluno <- aluno[ID_UF %in% c(13L, 15L)]
censo <- censo[CO_MUNICIPIO %in% c(1302603L, 1501402L) &
                 TP_DEPENDENCIA %in% c(2L, 3L)]

6.2 Recodificação de raça

A dicotomia Branco/Não-branco é o padrão adotado para análise de brecha racial. Amarelos são excluídos da dicotomia pelo baixo n; podem ser analisados separadamente em etapas futuras.

aluno <- aluno |>
  mutate(
    raca_cat = case_when(
      TX_RESP_Q04 == "A"                 ~ "Branca",
      TX_RESP_Q04 %in% c("B", "C", "E") ~ "Nao_branca",
      TX_RESP_Q04 == "D"                 ~ "Amarela",
      TRUE                               ~ NA_character_
    ),
    branco = case_when(
      raca_cat == "Branca"     ~ 1L,
      raca_cat == "Nao_branca" ~ 0L,
      TRUE                     ~ NA_integer_
    )
  )

6.3 NSE via PCA

O nível socioeconômico individual é construído pelo 1º componente principal de 9 variáveis: escolaridade dos pais (Q08, Q09) e bens no domicílio (Q12a–Q12g).

niveis_escol <- c("A", "B", "C", "D", "E")
niveis_bens  <- c("A", "B", "C", "D")

cod_likert4 <- function(x, levels) {
  x[x %in% c(".", "*", "F")] <- NA
  as.integer(factor(x, levels = levels, ordered = TRUE))
}

itens_nse <- aluno |>
  transmute(
    escol_mae      = cod_likert4(TX_RESP_Q08, niveis_escol),
    escol_pai      = cod_likert4(TX_RESP_Q09, niveis_escol),
    bem_geladeira  = cod_likert4(TX_RESP_Q12a, niveis_bens),
    bem_computador = cod_likert4(TX_RESP_Q12b, niveis_bens),
    bem_carro      = cod_likert4(TX_RESP_Q12c, niveis_bens),
    bem_banheiro   = cod_likert4(TX_RESP_Q12d, niveis_bens),
    bem_quartos    = cod_likert4(TX_RESP_Q12e, niveis_bens),
    bem_empregada  = cod_likert4(TX_RESP_Q12f, niveis_bens),
    bem_moto       = cod_likert4(TX_RESP_Q12g, niveis_bens)
  )

nse_pca  <- principal(itens_nse, nfactors = 1, rotate = "none", missing = TRUE)
aluno$nse <- as.numeric(nse_pca$scores[, 1])

6.4 Índice de clima por aluno

Seis itens principais; válido para o aluno se ao menos 3 foram respondidos.

niveis_concord <- c("D", "C", "B", "A")
niveis_propor  <- c("D", "C", "B", "A")

cod_clima <- function(x, levels) {
  x[x %in% c(".", "*")] <- NA
  as.integer(factor(x, levels = levels, ordered = TRUE))
}

aluno <- aluno |>
  mutate(
    clim_seguranca     = cod_clima(TX_RESP_Q23d, niveis_concord),
    clim_prof_crenca   = cod_clima(TX_RESP_Q23h, niveis_concord),
    clim_prof_motiv    = cod_clima(TX_RESP_Q23i, niveis_concord),
    clim_interesse     = cod_clima(TX_RESP_Q23a, niveis_concord),
    clim_opiniao       = cod_clima(TX_RESP_Q23c, niveis_concord),
    clim_anti_bullying = cod_clima(TX_RESP_Q22f, niveis_propor),
    n_clim_validos = rowSums(!is.na(cbind(
      clim_seguranca, clim_prof_crenca, clim_prof_motiv,
      clim_interesse, clim_opiniao, clim_anti_bullying
    ))),
    clima_aluno = rowMeans(cbind(
      clim_seguranca, clim_prof_crenca, clim_prof_motiv,
      clim_interesse, clim_opiniao, clim_anti_bullying
    ), na.rm = TRUE),
    clima_aluno = if_else(n_clim_validos < 3L, NA_real_, clima_aluno)
  )

6.5 Agregação ao nível da escola

escola_df <- aluno |>
  group_by(ID_ESCOLA) |>
  summarise(
    n_alunos        = n(),
    pct_nao_branco  = sum(branco == 0L, na.rm = TRUE) / sum(!is.na(branco)),
    nse_medio       = mean(nse, na.rm = TRUE),
    media_lp_branco = mean(PROFICIENCIA_LP_SAEB[branco == 1L], na.rm = TRUE),
    media_lp_nb     = mean(PROFICIENCIA_LP_SAEB[branco == 0L], na.rm = TRUE),
    media_mt_branco = mean(PROFICIENCIA_MT_SAEB[branco == 1L], na.rm = TRUE),
    media_mt_nb     = mean(PROFICIENCIA_MT_SAEB[branco == 0L], na.rm = TRUE),
    clima_idx       = mean(clima_aluno, na.rm = TRUE),
    n_clima_validos = sum(!is.na(clima_aluno)),
    .groups = "drop"
  ) |>
  mutate(
    brecha_lp = media_lp_branco - media_lp_nb,
    brecha_mt = media_mt_branco - media_mt_nb,
    clima_idx = if_else(n_clima_validos < 10L, NA_real_, clima_idx)
  )

6.6 Merge com TS_ESCOLA

ts_escola <- fread(
  here("data", "raw", "MICRODADOS_SAEB_2023", "DADOS", "TS_ESCOLA.csv"),
  sep = ";", encoding = "Latin-1"
)

ts_escola_f <- ts_escola[ID_UF %in% c(13L, 15L)] |>
  select(ID_ESCOLA, IN_PUBLICA, ID_LOCALIZACAO,
         NIVEL_SOCIO_ECONOMICO,
         PC_FORMACAO_DOCENTE_INICIAL,
         PC_FORMACAO_DOCENTE_MEDIO,
         PC_FORMACAO_DOCENTE_FINAL,
         NU_MATRICULADOS_CENSO_9EF,
         TAXA_PARTICIPACAO_9EF)

escola_df <- escola_df |>
  left_join(ts_escola_f, by = "ID_ESCOLA")

n_escolas  <- nrow(escola_df)
n_merged   <- sum(!is.na(escola_df$NIVEL_SOCIO_ECONOMICO))

cat(sprintf(
  "Escolas no SAEB: %d | Com match em TS_ESCOLA: %d | Taxa de merge: %.1f%%\n",
  n_escolas, n_merged, n_merged / n_escolas * 100
))
## Escolas no SAEB: 3116 | Com match em TS_ESCOLA: 2962 | Taxa de merge: 95.1%

6.7 Salvar

fwrite(escola_df, here("data", "clean", "escola_integrado.csv"),
       sep = ";", bom = TRUE)

7 Análise Descritiva e Modelos Multinível (nível aluno)

Esta seção explora a relação entre clima escolar e proficiência a partir dos microdados individuais, usando modelos mistos (random intercept por escola).

library(tidyverse)
library(data.table)
library(here)
library(lme4)
library(lmerTest)
library(broom.mixed)
library(emmeans)
library(scales)
theme_set(theme_minimal(base_size = 12))

7.1 Carga e preparação

dir.create(here("outputs", "figuras"), recursive = TRUE, showWarnings = FALSE)
dir.create(here("outputs", "tabelas"), recursive = TRUE, showWarnings = FALSE)

aluno <- fread(here("data", "clean", "aluno_9ef_filtrado.csv"))

if (file.exists(here("outputs", "02_indice_clima_escolar_por_escola.csv"))) {
  clima_escola <- fread(here("outputs", "02_indice_clima_escolar_por_escola.csv"))
} else {
  clima_escola <- aluno |>
    group_by(ID_ESCOLA) |>
    summarise(clima_medio = NA_real_, clima_sd = NA_real_,
              n_alunos = n(), .groups = "drop") |>
    as.data.frame()
}

aluno <- aluno |>
  mutate(
    raca = case_when(
      TX_RESP_Q04 == "A" ~ "Branca",
      TX_RESP_Q04 == "B" ~ "Preta",
      TX_RESP_Q04 == "C" ~ "Parda",
      TX_RESP_Q04 == "D" ~ "Amarela",
      TX_RESP_Q04 == "E" ~ "Indígena",
      TRUE ~ NA_character_
    ),
    raca_grupo = case_when(
      TX_RESP_Q04 == "A"              ~ "Branca",
      TX_RESP_Q04 %in% c("B", "C")   ~ "Preta/Parda",
      TRUE                            ~ NA_character_
    ),
    raca_grupo = factor(raca_grupo, levels = c("Branca", "Preta/Parda")),
    UF = case_when(
      ID_UF == 13 ~ "AM (Manaus)",
      ID_UF == 15 ~ "PA (Belém)",
      TRUE ~ NA_character_
    )
  )

7.2 Brecha racial por escola

proficiencia_escola_raca <- aluno |>
  filter(!is.na(PROFICIENCIA_LP) & !is.na(raca_grupo)) |>
  group_by(ID_ESCOLA, raca_grupo) |>
  summarise(proficiencia_media = mean(PROFICIENCIA_LP, na.rm = TRUE),
            .groups = "drop")

brecha_racial <- proficiencia_escola_raca |>
  pivot_wider(names_from = raca_grupo,
              values_from = proficiencia_media,
              names_prefix = "prof_") |>
  mutate(brecha_racial = prof_Branca - `prof_Preta/Parda`, .keep = "unused")

dados_escola <- clima_escola |>
  select(ID_ESCOLA, clima_medio, clima_sd, n_alunos) |>
  left_join(brecha_racial, by = "ID_ESCOLA")

cat("Escolas na base analítica:", nrow(dados_escola), "\n")
## Escolas na base analítica: 3116

7.3 Estatísticas descritivas

cat("--- Clima Escolar ---\n")
## --- Clima Escolar ---
print(summary(dados_escola$clima_medio))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.071   3.360   3.235   3.561   4.288
cat("DP:", round(sd(dados_escola$clima_medio, na.rm = TRUE), 3), "\n")
## DP: 0.529
cat("\n--- Brecha Racial ---\n")
## 
## --- Brecha Racial ---
print(summary(dados_escola$brecha_racial))
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
## -1.91780 -0.15745  0.09520  0.07233  0.32294  2.09094      427
cat("DP:", round(sd(dados_escola$brecha_racial, na.rm = TRUE), 3), "\n")
## DP: 0.444
cat("\n--- Distribuição de alunos por raça ---\n")
## 
## --- Distribuição de alunos por raça ---
aluno |>
  filter(!is.na(raca)) |>
  count(raca) |>
  mutate(pct = round(n / sum(n) * 100, 1)) |>
  print()
##        raca      n   pct
##      <char>  <int> <num>
## 1:  Amarela   5379   3.4
## 2:   Branca  27664  17.7
## 3: Indígena   4768   3.0
## 4:    Parda 100484  64.3
## 5:    Preta  18059  11.6

7.4 Visualizações

7.4.1 Figura 1 — Distribuição do índice de clima escolar

fig1 <- ggplot(dados_escola, aes(x = clima_medio)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 50, fill = "#2E86AB", alpha = 0.7, color = "white") +
  geom_density(color = "#A23B72", linewidth = 1.2) +
  geom_vline(aes(xintercept = mean(clima_medio, na.rm = TRUE)),
             color = "#F18F01", linewidth = 1.2, linetype = "dashed") +
  annotate("text",
           x = mean(dados_escola$clima_medio, na.rm = TRUE) + 0.1, y = 0.8,
           label = paste("Média =", round(mean(dados_escola$clima_medio, na.rm = TRUE), 2)),
           color = "#F18F01", fontface = "bold") +
  labs(title = "Distribuição do Índice de Clima Escolar",
       subtitle = "Média por escola (9º ano EF) — Manaus e Belém, 2023",
       x = "Índice de Clima Escolar (escala 1–4)", y = "Densidade") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
        panel.grid.minor = element_blank())

fig1

ggsave(here("outputs", "figuras", "01_distribuicao_clima_escolar.png"),
       fig1, width = 10, height = 6, dpi = 300)

7.4.2 Figura 2 — Distribuição da brecha racial

fig2 <- ggplot(dados_escola, aes(x = brecha_racial)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 50, fill = "#C73E1D", alpha = 0.7, color = "white") +
  geom_density(color = "#6A0572", linewidth = 1.2) +
  geom_vline(aes(xintercept = mean(brecha_racial, na.rm = TRUE)),
             color = "#1B998B", linewidth = 1.2, linetype = "dashed") +
  annotate("text",
           x = mean(dados_escola$brecha_racial, na.rm = TRUE) + 0.5, y = 0.12,
           label = paste("Média =", round(mean(dados_escola$brecha_racial, na.rm = TRUE), 2)),
           color = "#1B998B", fontface = "bold") +
  labs(title = "Distribuição da Brecha Racial de Proficiência",
       subtitle = "Diferença (Branca − Preta/Parda) por escola — Manaus e Belém, 2023",
       x = "Brecha Racial (pontos na escala SAEB)", y = "Densidade") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
        panel.grid.minor = element_blank())

fig2

ggsave(here("outputs", "figuras", "02_distribuicao_brecha_racial.png"),
       fig2, width = 10, height = 6, dpi = 300)

7.4.3 Figura 3 — Clima vs. brecha racial (scatter)

fig3 <- ggplot(dados_escola, aes(x = clima_medio, y = brecha_racial)) +
  geom_point(alpha = 0.4, size = 2, color = "#2E86AB") +
  geom_smooth(method = "lm", se = TRUE, color = "#C73E1D", linewidth = 1) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
  labs(title = "Clima Escolar e Brecha Racial de Proficiência",
       subtitle = "Cada ponto = uma escola. Linha = tendência linear (IC 95%)",
       x = "Índice de Clima Escolar",
       y = "Brecha Racial (Branca − Preta/Parda)") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
        panel.grid.minor = element_blank())

fig3

ggsave(here("outputs", "figuras", "03_clima_vs_brecha_racial.png"),
       fig3, width = 10, height = 7, dpi = 300)

7.4.4 Figura 4 — Proficiência por raça (boxplot)

set.seed(42)
prof_por_raca <- aluno |>
  filter(!is.na(PROFICIENCIA_LP) & !is.na(raca_grupo))
prof_por_raca <- slice_sample(prof_por_raca, n = min(50000, nrow(prof_por_raca)))

fig4 <- ggplot(prof_por_raca, aes(x = raca_grupo, y = PROFICIENCIA_LP, fill = raca_grupo)) +
  geom_boxplot(alpha = 0.6, outlier.alpha = 0.1) +
  stat_summary(fun = "mean", geom = "point", shape = 23, size = 4, color = "black") +
  scale_fill_manual(values = c("Branca" = "#A8DADC", "Preta/Parda" = "#457B9D")) +
  labs(title = "Proficiência em Língua Portuguesa por Raça/Cor",
       subtitle = "Alunos do 9º ano EF — Manaus e Belém, 2023",
       x = "Raça/Cor", y = "Proficiência (escala SAEB)") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
        legend.position = "none", panel.grid.minor = element_blank())

fig4

ggsave(here("outputs", "figuras", "04_proficiencia_por_raca.png"),
       fig4, width = 8, height = 6, dpi = 300)

7.4.5 Figura 5 — Indicadores por UF

resumo_uf <- dados_escola |>
  mutate(UF = case_when(
    ID_ESCOLA %in% aluno$ID_ESCOLA[aluno$ID_UF == 13] ~ "AM",
    ID_ESCOLA %in% aluno$ID_ESCOLA[aluno$ID_UF == 15] ~ "PA",
    TRUE ~ NA_character_
  )) |>
  group_by(UF) |>
  summarise(
    clima_medio  = mean(clima_medio, na.rm = TRUE),
    brecha_media = mean(brecha_racial, na.rm = TRUE),
    n_escolas    = n(), .groups = "drop"
  )

fig5 <- resumo_uf |>
  pivot_longer(c(clima_medio, brecha_media),
               names_to = "variavel", values_to = "valor") |>
  mutate(variavel = recode(variavel,
    "clima_medio"  = "Clima Escolar",
    "brecha_media" = "Brecha Racial"
  )) |>
  ggplot(aes(x = UF, y = valor, fill = UF)) +
  geom_col(alpha = 0.8) +
  geom_text(aes(label = round(valor, 2)), vjust = -0.5, fontface = "bold") +
  facet_wrap(~variavel, scales = "free_y") +
  scale_fill_manual(values = c("AM" = "#06A77D", "PA" = "#F18F01")) +
  labs(title = "Indicadores por Unidade Federativa",
       x = "UF", y = "Valor") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        legend.position = "none", panel.grid.minor = element_blank(),
        strip.text = element_text(face = "bold"))

fig5

ggsave(here("outputs", "figuras", "05_indicadores_por_uf.png"),
       fig5, width = 10, height = 5, dpi = 300)

7.4.6 Figura 6 — Gráfico de bolhas

fig6 <- ggplot(dados_escola,
               aes(x = n_alunos, y = clima_medio,
                   size = brecha_racial, color = brecha_racial)) +
  geom_point(alpha = 0.6) +
  scale_size_continuous(range = c(1, 8), name = "Brecha Racial") +
  scale_color_gradient2(low = "#2E86AB", mid = "#F18F01", high = "#C73E1D",
                        midpoint = 0, name = "Brecha") +
  labs(title = "Tamanho da Escola, Clima e Brecha Racial",
       x = "Número de Alunos (9º ano)", y = "Índice de Clima Escolar") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        panel.grid.minor = element_blank())

fig6

ggsave(here("outputs", "figuras", "06_bolhas_escola_clima_brecha.png"),
       fig6, width = 10, height = 7, dpi = 300)

7.5 Modelagem multinível

Os modelos mistos respeitam a estrutura hierárquica dos dados (alunos aninhados em escolas), com intercepto aleatório por escola.

7.5.1 Modelo 1 — Clima + raça (efeitos principais)

dados_modelagem <- aluno |>
  filter(!is.na(PROFICIENCIA_LP) & !is.na(raca_grupo)) |>
  left_join(clima_escola |> select(ID_ESCOLA, clima_medio), by = "ID_ESCOLA") |>
  filter(!is.na(clima_medio))

cat("Alunos na modelagem:", nrow(dados_modelagem), "\n")
## Alunos na modelagem: 145583
cat("Escolas:", n_distinct(dados_modelagem$ID_ESCOLA), "\n")
## Escolas: 3035
modelo1 <- lmer(PROFICIENCIA_LP ~ clima_medio + raca_grupo + (1 | ID_ESCOLA),
                data = dados_modelagem, REML = TRUE)

print(summary(modelo1)$coefficients)
##                         Estimate  Std. Error         df   t value      Pr(>|t|)
## (Intercept)           -1.8985734 0.058592690   3982.539 -32.40291 1.212402e-204
## clima_medio            0.5406634 0.017378118   3739.489  31.11174 3.446028e-189
## raca_grupoPreta/Parda -0.1212511 0.005341003 144175.963 -22.70193 6.800866e-114
var_escola  <- as.data.frame(VarCorr(modelo1))$vcov[1]
var_residuo <- attr(VarCorr(modelo1), "sc")^2
icc <- var_escola / (var_escola + var_residuo)
cat(sprintf("\nICC = %.4f (%.1f%% da variância está entre escolas)\n",
            icc, icc * 100))
## 
## ICC = 0.1430 (14.3% da variância está entre escolas)

7.5.2 Modelo 2 — Interação clima × raça

modelo2 <- lmer(PROFICIENCIA_LP ~ clima_medio * raca_grupo + (1 | ID_ESCOLA),
                data = dados_modelagem, REML = TRUE)

print(summary(modelo2)$coefficients)
##                                     Estimate Std. Error        df    t value      Pr(>|t|)
## (Intercept)                       -2.1972820 0.08306261  14818.37 -26.453322 1.029853e-150
## clima_medio                        0.6259220 0.02417380  13073.02  25.892582 3.371978e-144
## raca_grupoPreta/Parda              0.2320177 0.06984647 145565.42   3.321825  8.945279e-04
## clima_medio:raca_grupoPreta/Parda -0.1010582 0.01992213 145551.69  -5.072662  3.927688e-07
cat("\nComparação de modelos:\n")
## 
## Comparação de modelos:
print(anova(modelo1, modelo2))
## Data: dados_modelagem
## Models:
## modelo1: PROFICIENCIA_LP ~ clima_medio + raca_grupo + (1 | ID_ESCOLA)
## modelo2: PROFICIENCIA_LP ~ clima_medio * raca_grupo + (1 | ID_ESCOLA)
##         npar    AIC    BIC  logLik -2*log(L)  Chisq Df Pr(>Chisq)    
## modelo1    5 346779 346828 -173385    346769                         
## modelo2    6 346755 346815 -173372    346743 25.731  1  3.926e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

7.5.3 Modelo 3 — Clima predizendo brecha (nível escola, OLS)

modelo3 <- lm(brecha_racial ~ clima_medio, data = dados_escola)
print(summary(modelo3))
## 
## Call:
## lm(formula = brecha_racial ~ clima_medio, data = dados_escola)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.94981 -0.23318  0.01397  0.24378  2.29301 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.37069    0.07616  -4.867  1.2e-06 ***
## clima_medio  0.13292    0.02271   5.854  5.4e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4411 on 2687 degrees of freedom
##   (427 observations deleted due to missingness)
## Multiple R-squared:  0.01259,    Adjusted R-squared:  0.01222 
## F-statistic: 34.26 on 1 and 2687 DF,  p-value: 5.395e-09

7.5.4 Figura 7 — Efeito marginal do clima por raça

newdata <- expand.grid(
  clima_medio = seq(min(dados_modelagem$clima_medio),
                    max(dados_modelagem$clima_medio), length.out = 100),
  raca_grupo  = levels(dados_modelagem$raca_grupo)
)

fixef_vals <- fixef(modelo2)
newdata$predicao <- fixef_vals["(Intercept)"] +
  fixef_vals["clima_medio"] * newdata$clima_medio +
  fixef_vals["raca_grupoPreta/Parda"] * (newdata$raca_grupo == "Preta/Parda") +
  fixef_vals["clima_medio:raca_grupoPreta/Parda"] *
  (newdata$clima_medio * (newdata$raca_grupo == "Preta/Parda"))

fig7 <- ggplot(newdata, aes(x = clima_medio, y = predicao, color = raca_grupo)) +
  geom_line(linewidth = 1.2) +
  geom_ribbon(aes(ymin = predicao - 10, ymax = predicao + 10, fill = raca_grupo),
              alpha = 0.15, color = NA) +
  scale_color_manual(values = c("Branca" = "#1D3557", "Preta/Parda" = "#E63946")) +
  scale_fill_manual(values  = c("Branca" = "#1D3557", "Preta/Parda" = "#E63946")) +
  labs(title = "Efeito do Clima Escolar na Proficiência por Raça",
       subtitle = "Predições do modelo multinível com interação",
       x = "Índice de Clima Escolar", y = "Proficiência Preditiva (LP)",
       color = "Raça/Cor", fill = "Raça/Cor") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        panel.grid.minor = element_blank())

fig7

ggsave(here("outputs", "figuras", "07_efeito_clima_por_raca.png"),
       fig7, width = 10, height = 7, dpi = 300)

7.5.5 Figura 8 — Forest plot dos efeitos fixos

efeitos_fixos <- broom.mixed::tidy(modelo2, effects = "fixed") |>
  filter(term != "(Intercept)") |>
  mutate(
    termo = case_when(
      term == "clima_medio"                             ~ "Clima Escolar",
      term == "raca_grupoPreta/Parda"                   ~ "Raça (Preta/Parda)",
      term == "clima_medio:raca_grupoPreta/Parda"       ~ "Interação Clima × Raça"
    ),
    termo = factor(termo, levels = rev(c("Clima Escolar", "Raça (Preta/Parda)",
                                         "Interação Clima × Raça")))
  )

fig8 <- ggplot(efeitos_fixos, aes(x = estimate, y = termo)) +
  geom_point(size = 4, color = "#2E86AB") +
  geom_errorbarh(aes(xmin = estimate - 1.96 * std.error,
                     xmax = estimate + 1.96 * std.error),
                 height = 0.2, color = "#A23B72") +
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") +
  labs(title = "Efeitos Fixos do Modelo Multinível",
       subtitle = "Intervalos de confiança de 95%",
       x = "Coeficiente (β)", y = "") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        panel.grid.minor = element_blank())

fig8

ggsave(here("outputs", "figuras", "08_forest_plot_efeitos.png"),
       fig8, width = 9, height = 6, dpi = 300)

7.6 Exportação de tabelas

tabela_descritiva <- tibble(
  Variavel = c("Clima Escolar (média)", "Clima Escolar (DP)",
               "Brecha Racial (média)", "Brecha Racial (DP)",
               "N Escolas", "N Alunos"),
  Valor = c(
    round(mean(dados_escola$clima_medio, na.rm = TRUE), 3),
    round(sd(dados_escola$clima_medio,   na.rm = TRUE), 3),
    round(mean(dados_escola$brecha_racial, na.rm = TRUE), 3),
    round(sd(dados_escola$brecha_racial,   na.rm = TRUE), 3),
    nrow(dados_escola),
    nrow(dados_modelagem)
  )
)
write_csv(tabela_descritiva,
          here("outputs", "tabelas", "01_estatisticas_descritivas.csv"))

tabela_modelos <- broom.mixed::tidy(modelo2, effects = "fixed") |>
  mutate(across(where(is.numeric), ~ round(., 4)))
write_csv(tabela_modelos,
          here("outputs", "tabelas", "02_resultados_modelo_multinivel.csv"))

tabela_comparacao <- tibble(
  Modelo  = c("Modelo 1", "Modelo 2"),
  AIC     = c(AIC(modelo1), AIC(modelo2)),
  BIC     = c(BIC(modelo1), BIC(modelo2)),
  LogLik  = c(as.numeric(logLik(modelo1)), as.numeric(logLik(modelo2))),
  Deviance = c(deviance(modelo1), deviance(modelo2))
)
write_csv(tabela_comparacao,
          here("outputs", "tabelas", "03_comparacao_modelos.csv"))

8 Análise Descritiva e Modelos Multinível (nível escola)

Esta seção utiliza o arquivo escola_integrado.csv (um registro por escola) para ajustar quatro modelos progressivos da brecha racial em LP e MT como função do clima escolar, NSE e composição racial da escola.

library(tidyverse)
library(data.table)
library(here)
library(lme4)
library(lmerTest)
library(broom.mixed)
library(patchwork)

8.1 Carga e preparação

escola_df <- fread(here("data", "clean", "escola_integrado.csv")) |>
  as_tibble()

cat("N escolas:", nrow(escola_df), "\n")
## N escolas: 3116
if ("ID_UF" %in% names(escola_df)) {
  escola_df <- escola_df |>
    mutate(estado = case_when(
      ID_UF == 13 ~ "Amazonas",
      ID_UF == 15 ~ "Pará",
      TRUE        ~ "Outro"
    ))
} else {
  escola_df <- escola_df |> mutate(estado = "Geral")
}

8.2 Estatísticas descritivas

cat("--- Brecha Racial em LP ---\n")
## --- Brecha Racial em LP ---
cat(sprintf("Média: %.2f | Mediana: %.2f | DP: %.2f | Mín: %.2f | Máx: %.2f\n",
            mean(escola_df$brecha_lp, na.rm = TRUE),
            median(escola_df$brecha_lp, na.rm = TRUE),
            sd(escola_df$brecha_lp, na.rm = TRUE),
            min(escola_df$brecha_lp, na.rm = TRUE),
            max(escola_df$brecha_lp, na.rm = TRUE)))
## Média: 4.16 | Mediana: 5.23 | DP: 24.36 | Mín: -105.66 | Máx: 115.20
cat("\n--- Clima Escolar (índice) ---\n")
## 
## --- Clima Escolar (índice) ---
cat(sprintf("Média: %.2f | Mediana: %.2f | DP: %.2f\n",
            mean(escola_df$clima_idx, na.rm = TRUE),
            median(escola_df$clima_idx, na.rm = TRUE),
            sd(escola_df$clima_idx, na.rm = TRUE)))
## Média: 3.15 | Mediana: 3.15 | DP: 0.16

8.3 Visualizações

8.3.1 Histograma da brecha racial (LP e MT)

fig_blp <- escola_df |>
  filter(!is.na(brecha_lp)) |>
  ggplot(aes(x = brecha_lp)) +
  geom_histogram(bins = 25, fill = "#E63946", alpha = 0.7, color = "white") +
  geom_vline(aes(xintercept = mean(brecha_lp, na.rm = TRUE)),
             color = "#F77F00", linewidth = 1.2, linetype = "dashed") +
  labs(title = "Brecha Racial — Leitura",
       x = "Brecha Racial (pontos SAEB)", y = "Frequência") +
  theme(plot.title = element_text(face = "bold"))

fig_bmt <- escola_df |>
  filter(!is.na(brecha_mt)) |>
  ggplot(aes(x = brecha_mt)) +
  geom_histogram(bins = 25, fill = "#457B9D", alpha = 0.7, color = "white") +
  geom_vline(aes(xintercept = mean(brecha_mt, na.rm = TRUE)),
             color = "#F77F00", linewidth = 1.2, linetype = "dashed") +
  labs(title = "Brecha Racial — Matemática",
       x = "Brecha Racial (pontos SAEB)", y = "Frequência") +
  theme(plot.title = element_text(face = "bold"))

fig_blp + fig_bmt

ggsave(here("outputs", "figuras", "04_01_histograma_brecha_lp.png"),
       fig_blp, width = 10, height = 6, dpi = 300)
ggsave(here("outputs", "figuras", "04_02_histograma_brecha_mt.png"),
       fig_bmt, width = 10, height = 6, dpi = 300)

8.3.2 Scatter — Clima × Brecha (LP e MT)

scatter_plot <- function(data, y_var, titulo) {
  data |>
    filter(!is.na(clima_idx) & !is.na(.data[[y_var]])) |>
    ggplot(aes(x = clima_idx, y = .data[[y_var]], color = estado)) +
    geom_point(size = 3, alpha = 0.6) +
    geom_smooth(aes(color = NULL), method = "lm", se = TRUE,
                color = "#1D3557", fill = "#457B9D", alpha = 0.15, linewidth = 1.2) +
    geom_hline(yintercept = 0, linetype = "dashed", color = "gray50", alpha = 0.5) +
    scale_color_manual(values = c("Amazonas" = "#E63946", "Pará" = "#457B9D"),
                       name = "Estado") +
    labs(title = titulo, x = "Índice de Clima Escolar",
         y = "Brecha Racial (pontos SAEB)") +
    theme(plot.title = element_text(face = "bold"),
          panel.grid.minor = element_blank(), legend.position = "bottom")
}

fig3 <- scatter_plot(escola_df, "brecha_lp",
                     "Associação Clima × Brecha Racial (Leitura)")
fig4 <- scatter_plot(escola_df, "brecha_mt",
                     "Associação Clima × Brecha Racial (Matemática)")

fig3

fig4

ggsave(here("outputs", "figuras", "04_03_scatter_clima_brecha_lp.png"),
       fig3, width = 10, height = 6.5, dpi = 300)
ggsave(here("outputs", "figuras", "04_04_scatter_clima_brecha_mt.png"),
       fig4, width = 10, height = 6.5, dpi = 300)

8.3.3 Brecha por estado (boxplot)

fig5 <- escola_df |>
  filter(!is.na(brecha_lp) & estado != "Outro") |>
  ggplot(aes(x = estado, y = brecha_lp, fill = estado)) +
  geom_boxplot(alpha = 0.7, color = "white", linewidth = 1) +
  geom_jitter(width = 0.2, alpha = 0.3, size = 2, color = "gray40") +
  scale_fill_manual(values = c("Amazonas" = "#E63946", "Pará" = "#457B9D"),
                    guide = "none") +
  labs(title = "Brecha Racial por Estado",
       x = "Estado", y = "Brecha Racial em LP (pontos SAEB)") +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.minor = element_blank(), panel.grid.major.x = element_blank())

fig5

ggsave(here("outputs", "figuras", "04_05_brecha_por_municipio.png"),
       fig5, width = 9, height = 6, dpi = 300)

8.4 Modelagem multinível (nível escola)

Os modelos estimam a brecha racial em LP em função do clima escolar, com controles progressivos para NSE médio e composição racial.

data_model <- escola_df |>
  filter(!is.na(brecha_lp) & !is.na(clima_idx) & !is.na(nse_medio)) |>
  as.data.frame()

cat("Escolas na modelagem:", nrow(data_model), "\n")
## Escolas na modelagem: 2552
grupo_col <- if ("ID_UF" %in% names(data_model)) "ID_UF" else NULL
cat("--- MODELO 0: NULO ---\n")
## --- MODELO 0: NULO ---
if (!is.null(grupo_col)) {
  m0 <- lmer(as.formula(paste("brecha_lp ~ 1 + (1 |", grupo_col, ")")),
             data = data_model, REML = FALSE)
  vc <- as.data.frame(VarCorr(m0))
  icc_val <- vc$vcov[1] / sum(vc$vcov)
  cat("ICC:", round(icc_val, 4), "\n")
  print(VarCorr(m0))
} else {
  m0 <- NULL
  cat("Sem coluna de agrupamento — modelo nulo omitido.\n")
}
## Sem coluna de agrupamento — modelo nulo omitido.
ajustar <- function(formula_str) {
  if (!is.null(grupo_col)) {
    lmer(as.formula(formula_str), data = data_model, REML = FALSE)
  } else {
    lm(as.formula(sub("\\s*\\+\\s*\\(1 \\| .*?\\)", "", formula_str)),
       data = data_model)
  }
}

m1 <- ajustar(paste("brecha_lp ~ clima_idx + (1 |", grupo_col, ")"))
m2 <- ajustar(paste("brecha_lp ~ clima_idx + nse_medio + (1 |", grupo_col, ")"))
m3 <- ajustar(paste("brecha_lp ~ clima_idx + nse_medio + pct_nao_branco + (1 |", grupo_col, ")"))
m4 <- ajustar(paste("brecha_lp ~ clima_idx * pct_nao_branco + nse_medio + (1 |", grupo_col, ")"))

cat("\n--- Coeficientes Modelo 1 ---\n"); print(summary(m1)$coefficients)
## 
## --- Coeficientes Modelo 1 ---
##              Estimate Std. Error   t value     Pr(>|t|)
## (Intercept)  54.48872   9.287954  5.866601 5.023948e-09
## clima_idx   -15.91519   2.950250 -5.394522 7.502595e-08
cat("\n--- Coeficientes Modelo 2 ---\n"); print(summary(m2)$coefficients)
## 
## --- Coeficientes Modelo 2 ---
##               Estimate Std. Error   t value     Pr(>|t|)
## (Intercept)  46.653158  9.9010257  4.711952 2.585372e-06
## clima_idx   -13.353846  3.1562449 -4.230928 2.409493e-05
## nse_medio     2.180864  0.9603211  2.270974 2.323165e-02
cat("\n--- Coeficientes Modelo 3 ---\n"); print(summary(m3)$coefficients)
## 
## --- Coeficientes Modelo 3 ---
##                   Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)     47.1247412  10.646757  4.4262062 9.994141e-06
## clima_idx      -13.3184351   3.170476 -4.2007679 2.751552e-05
## nse_medio        2.1093718   1.128657  1.8689212 6.174842e-02
## pct_nao_branco  -0.7206086   5.974164 -0.1206208 9.040009e-01
cat("\n--- Coeficientes Modelo 4 ---\n"); print(summary(m4)$coefficients)
## 
## --- Coeficientes Modelo 4 ---
##                            Estimate Std. Error    t value   Pr(>|t|)
## (Intercept)              -40.242376  78.218064 -0.5144895 0.60695441
## clima_idx                 14.648266  25.006807  0.5857712 0.55808121
## pct_nao_branco           105.021276  93.977694  1.1175128 0.26388053
## nse_medio                  2.285881   1.139404  2.0062078 0.04493963
## clima_idx:pct_nao_branco -33.789902  29.969912 -1.1274609 0.25965388

8.4.1 Comparação de modelos

if (!is.null(m0)) {
  print(anova(m0, m1, m2, m3, m4))
} else {
  print(anova(m1, m2, m3, m4))
}
## Analysis of Variance Table
## 
## Model 1: brecha_lp ~ clima_idx
## Model 2: brecha_lp ~ clima_idx + nse_medio
## Model 3: brecha_lp ~ clima_idx + nse_medio + pct_nao_branco
## Model 4: brecha_lp ~ clima_idx * pct_nao_branco + nse_medio
##   Res.Df     RSS Df Sum of Sq      F  Pr(>F)  
## 1   2550 1401167                              
## 2   2549 1398338  1   2829.22 5.1559 0.02325 *
## 3   2548 1398330  1      7.98 0.0146 0.90400  
## 4   2547 1397632  1    697.54 1.2712 0.25965  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

8.4.2 Interpretação automática do Modelo 3

get_fixef <- function(model) {
  if (inherits(model, "lmerMod")) fixef(model) else coef(model)
}

coef_m3 <- get_fixef(m3)
pval_m3 <- summary(m3)$coefficients["clima_idx", "Pr(>|t|)"]

cat("Efeito do clima na brecha:", round(coef_m3["clima_idx"], 4), "\n")
## Efeito do clima na brecha: -13.3184
cat("p-valor:", round(pval_m3, 4), "\n")
## p-valor: 0
if (pval_m3 < 0.05) {
  dir <- if (coef_m3["clima_idx"] < 0) "REDUZ" else "AMPLIA"
  cat("→ Resultado: clima", dir, "a brecha racial (p < 0.05)\n")
} else {
  cat("→ Resultado: clima não prediz estatisticamente a brecha (p >= 0.05)\n")
}
## → Resultado: clima REDUZ a brecha racial (p < 0.05)

8.5 Exportação

tabela_comp <- if (!is.null(m0)) {
  tibble(Modelo = c("M0 (Nulo)", "M1 (Clima)", "M2 (+ NSE)", "M3 (+ % NB)", "M4 (Interação)"),
         AIC    = round(AIC(m0, m1, m2, m3, m4)$AIC, 1),
         BIC    = round(BIC(m0, m1, m2, m3, m4)$BIC, 1))
} else {
  tibble(Modelo = c("M1 (Clima)", "M2 (+ NSE)", "M3 (+ % NB)", "M4 (Interação)"),
         AIC    = round(AIC(m1, m2, m3, m4)$AIC, 1),
         BIC    = round(BIC(m1, m2, m3, m4)$BIC, 1))
}
write_csv(tabela_comp, here("outputs", "tabelas", "04_01_comparacao_modelos.csv"))

format_coefs <- function(model, nome) {
  tidy(model, effects = "fixed") |>
    mutate(model = nome,
           across(where(is.numeric), ~ round(., 4)),
           ci_lower = round(estimate - 1.96 * std.error, 4),
           ci_upper = round(estimate + 1.96 * std.error, 4)) |>
    select(model, term, estimate, std.error, ci_lower, ci_upper, statistic, p.value)
}

resultados <- bind_rows(
  format_coefs(m1, "M1: Clima"),
  format_coefs(m2, "M2: Clima + NSE"),
  format_coefs(m3, "M3: Clima + NSE + %NB"),
  format_coefs(m4, "M4: Interação")
)
write_csv(resultados, here("outputs", "tabelas", "04_02_coeficientes_modelos.csv"))

9 Probabilidade Predita — Modelos Probit

Os modelos probit estimam a probabilidade de atingir proficiência adequada no SAEB 2023 (LP ≥ 275 pts; MT ≥ 300 pts) em função de raça, clima escolar e NSE. A abordagem de Marginal Effects at the Mean (MEM) avalia cada grupo racial com as covariáveis fixadas nas suas médias amostrais.

library(tidyverse)
library(data.table)
library(psych)
library(here)
library(patchwork)
library(scales)
LIMIAR_LP <- 275
LIMIAR_MT <- 300

9.1 Carga dos dados

aluno_raw <- fread(here("data", "clean", "aluno_9ef_filtrado.csv"),
                   sep = ";", encoding = "Latin-1")
escola_df <- fread(here("data", "clean", "escola_integrado.csv"),
                   sep = ";", encoding = "Latin-1") |>
  as_tibble()

cat("Alunos:", nrow(aluno_raw), "| Escolas:", nrow(escola_df), "\n")
## Alunos: 193097 | Escolas: 3116

9.2 Recodificação e criação de variáveis

cod_ordinal <- function(x, levels) {
  x[x %in% c(".", "*", "F")] <- NA_character_
  as.integer(factor(x, levels = levels, ordered = TRUE))
}

niveis_concord <- c("D", "C", "B", "A")
niveis_bens    <- c("A", "B", "C", "D")
niveis_escol   <- c("A", "B", "C", "D", "E")

aluno <- aluno_raw |>
  as_tibble() |>
  mutate(
    branco = case_when(
      TX_RESP_Q04 == "A"                 ~ 1L,
      TX_RESP_Q04 %in% c("B", "C", "E") ~ 0L,
      TRUE                               ~ NA_integer_
    ),
    raca_label = case_when(
      branco == 1L ~ "Branco",
      branco == 0L ~ "Não-branco",
      TRUE         ~ NA_character_
    )
  ) |>
  mutate(
    clim_seguranca     = cod_ordinal(TX_RESP_Q23d, niveis_concord),
    clim_prof_crenca   = cod_ordinal(TX_RESP_Q23h, niveis_concord),
    clim_prof_motiv    = cod_ordinal(TX_RESP_Q23i, niveis_concord),
    clim_interesse     = cod_ordinal(TX_RESP_Q23a, niveis_concord),
    clim_opiniao       = cod_ordinal(TX_RESP_Q23c, niveis_concord),
    clim_anti_bullying = cod_ordinal(TX_RESP_Q22f, niveis_concord),
    n_clim_validos = rowSums(!is.na(cbind(
      clim_seguranca, clim_prof_crenca, clim_prof_motiv,
      clim_interesse, clim_opiniao, clim_anti_bullying
    ))),
    clima_aluno = if_else(
      n_clim_validos >= 3L,
      rowMeans(cbind(clim_seguranca, clim_prof_crenca, clim_prof_motiv,
                     clim_interesse, clim_opiniao, clim_anti_bullying),
               na.rm = TRUE),
      NA_real_
    ),
    prof_lp_adeq = as.integer(!is.na(PROFICIENCIA_LP_SAEB) &
                                 PROFICIENCIA_LP_SAEB >= LIMIAR_LP),
    prof_mt_adeq = as.integer(!is.na(PROFICIENCIA_MT_SAEB) &
                                 PROFICIENCIA_MT_SAEB >= LIMIAR_MT),
    estado = case_when(
      ID_UF == 13L ~ "Amazonas",
      ID_UF == 15L ~ "Pará",
      TRUE         ~ "Outro"
    )
  )

9.3 NSE por PCA

itens_nse <- aluno |>
  transmute(
    escol_mae      = cod_ordinal(TX_RESP_Q08, niveis_escol),
    escol_pai      = cod_ordinal(TX_RESP_Q09, niveis_escol),
    bem_geladeira  = cod_ordinal(TX_RESP_Q12a, niveis_bens),
    bem_computador = cod_ordinal(TX_RESP_Q12b, niveis_bens),
    bem_carro      = cod_ordinal(TX_RESP_Q12c, niveis_bens),
    bem_banheiro   = cod_ordinal(TX_RESP_Q12d, niveis_bens),
    bem_quartos    = cod_ordinal(TX_RESP_Q12e, niveis_bens),
    bem_empregada  = cod_ordinal(TX_RESP_Q12f, niveis_bens),
    bem_moto       = cod_ordinal(TX_RESP_Q12g, niveis_bens)
  )

nse_pca  <- principal(itens_nse, nfactors = 1, rotate = "none", missing = TRUE)
aluno$nse <- as.numeric(nse_pca$scores[, 1])

cat(sprintf("Variância explicada pelo PC1: %.1f%%\n",
            nse_pca$Vaccounted["Proportion Var", 1] * 100))
## Variância explicada pelo PC1: 33.2%

9.4 Amostra analítica e centralização

aluno <- aluno |>
  left_join(escola_df |> select(ID_ESCOLA, clima_idx), by = "ID_ESCOLA")

dados_probit <- aluno |>
  filter(!is.na(branco), !is.na(clima_idx), !is.na(nse),
         !is.na(PROFICIENCIA_LP_SAEB), !is.na(PROFICIENCIA_MT_SAEB))

cat("N total:", nrow(dados_probit),
    "| Brancos:", sum(dados_probit$branco == 1L, na.rm = TRUE),
    "| Não-brancos:", sum(dados_probit$branco == 0L, na.rm = TRUE), "\n")
## N total: 148314 | Brancos: 27312 | Não-brancos: 121002
cat("% LP adequada:", round(100 * mean(dados_probit$prof_lp_adeq), 1), "%\n")
## % LP adequada: 28.5 %
cat("% MT adequada:", round(100 * mean(dados_probit$prof_mt_adeq), 1), "%\n")
## % MT adequada: 10.6 %
media_clima <- mean(dados_probit$clima_idx, na.rm = TRUE)
media_nse   <- mean(dados_probit$nse, na.rm = TRUE)

dados_probit <- dados_probit |>
  mutate(clima_c = clima_idx - media_clima, nse_c = nse - media_nse)

9.5 Ajuste dos modelos probit

m1_lp <- glm(prof_lp_adeq ~ branco + clima_c + nse_c,
             family = binomial("probit"), data = dados_probit)
m1_mt <- glm(prof_mt_adeq ~ branco + clima_c + nse_c,
             family = binomial("probit"), data = dados_probit)
m2_lp <- glm(prof_lp_adeq ~ branco * clima_c + nse_c,
             family = binomial("probit"), data = dados_probit)
m2_mt <- glm(prof_mt_adeq ~ branco * clima_c + nse_c,
             family = binomial("probit"), data = dados_probit)

cat("--- Coeficientes M2-LP ---\n"); print(summary(m2_lp)$coefficients)
## --- Coeficientes M2-LP ---
##                  Estimate  Std. Error     z value      Pr(>|z|)
## (Intercept)    -0.6335697 0.003930502 -161.193097  0.000000e+00
## branco          0.2324649 0.008945406   25.987071 6.933562e-149
## clima_c        -0.3760560 0.028018881  -13.421523  4.523238e-41
## nse_c           0.2339305 0.003527743   66.311641  0.000000e+00
## branco:clima_c -0.1525048 0.064524791   -2.363507  1.810287e-02
cat("\n--- Coeficientes M2-MT ---\n"); print(summary(m2_mt)$coefficients)
## 
## --- Coeficientes M2-MT ---
##                   Estimate  Std. Error     z value     Pr(>|z|)
## (Intercept)    -1.30671953 0.005046506 -258.935477 0.000000e+00
## branco          0.13771051 0.011055841   12.455906 1.298679e-35
## clima_c         0.07159213 0.035713294    2.004635 4.500205e-02
## nse_c           0.21447644 0.004330499   49.526952 0.000000e+00
## branco:clima_c -0.17718770 0.079241026   -2.236060 2.534783e-02

9.6 Probabilidade predita nas médias (MEM)

nd_medio <- data.frame(branco = c(0L, 1L), clima_c = 0, nse_c = 0)

mem <- nd_medio |>
  as_tibble() |>
  mutate(
    raca_label = c("Não-branco", "Branco"),
    prob_lp_m1 = predict(m1_lp, nd_medio, type = "response"),
    prob_lp_m2 = predict(m2_lp, nd_medio, type = "response"),
    prob_mt_m1 = predict(m1_mt, nd_medio, type = "response"),
    prob_mt_m2 = predict(m2_mt, nd_medio, type = "response")
  )

print(mem |> select(raca_label, starts_with("prob")))
## # A tibble: 2 × 5
##   raca_label prob_lp_m1 prob_lp_m2 prob_mt_m1 prob_mt_m2
##   <chr>           <dbl>      <dbl>      <dbl>      <dbl>
## 1 Não-branco      0.263      0.263     0.0957     0.0957
## 2 Branco          0.345      0.344     0.122      0.121
write_csv(mem |> select(-branco, -clima_c, -nse_c),
          here("outputs", "tabelas", "05_01_prob_predita_medias.csv"))

9.7 Curvas de probabilidade predita

clima_seq <- seq(min(dados_probit$clima_c, na.rm = TRUE),
                 max(dados_probit$clima_c, na.rm = TRUE),
                 length.out = 300)

grade <- expand.grid(branco = c(0L, 1L), clima_c = clima_seq, nse_c = 0) |>
  as_tibble() |>
  mutate(raca_label = ifelse(branco == 1L, "Branco", "Não-branco"),
         clima_orig  = clima_c + media_clima)

pred_ic <- function(modelo, newdata) {
  p <- predict(modelo, newdata = newdata, type = "link", se.fit = TRUE)
  tibble(prob  = pnorm(p$fit),
         lower = pnorm(p$fit - 1.96 * p$se.fit),
         upper = pnorm(p$fit + 1.96 * p$se.fit))
}

ic_lp <- pred_ic(m2_lp, grade)
ic_mt <- pred_ic(m2_mt, grade)

curvas <- grade |>
  mutate(prob_lp = ic_lp$prob, lo_lp = ic_lp$lower, hi_lp = ic_lp$upper,
         prob_mt = ic_mt$prob, lo_mt = ic_mt$lower, hi_mt = ic_mt$upper)

cores_raca <- c("Branco" = "#1D3557", "Não-branco" = "#E63946")

montar_curva <- function(data, y_col, lo_col, hi_col, titulo, subtitulo) {
  ggplot(data, aes(x = clima_orig, color = raca_label, fill = raca_label)) +
    geom_ribbon(aes(ymin = .data[[lo_col]], ymax = .data[[hi_col]]),
                alpha = 0.12, color = NA) +
    geom_line(aes(y = .data[[y_col]]), linewidth = 1.4) +
    geom_vline(xintercept = media_clima, linetype = "dashed",
               color = "gray60", linewidth = 0.8) +
    annotate("text", x = media_clima + 0.05, y = 0.06,
             label = "Média", size = 3.5, color = "gray50") +
    scale_color_manual(values = cores_raca, name = "Grupo racial") +
    scale_fill_manual(values = cores_raca, name = "Grupo racial") +
    scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1)) +
    labs(title = titulo, subtitle = subtitulo,
         x = "Índice de Clima Escolar", y = "Probabilidade Predita") +
    theme(plot.title = element_text(face = "bold"),
          panel.grid.minor = element_blank(), legend.position = "bottom")
}

fig_lp <- montar_curva(curvas, "prob_lp", "lo_lp", "hi_lp",
  "Probabilidade Predita — Língua Portuguesa",
  paste0("Modelo probit com interação | LP ≥ ", LIMIAR_LP, " pts | IC 95%"))

fig_mt <- montar_curva(curvas, "prob_mt", "lo_mt", "hi_mt",
  "Probabilidade Predita — Matemática",
  paste0("Modelo probit com interação | MT ≥ ", LIMIAR_MT, " pts | IC 95%"))

fig_lp

fig_mt

ggsave(here("outputs", "figuras", "05_01_prob_predita_lp.png"),
       fig_lp, width = 10, height = 6, dpi = 300)
ggsave(here("outputs", "figuras", "05_02_prob_predita_mt.png"),
       fig_mt, width = 10, height = 6, dpi = 300)

9.7.1 Painel LP + MT

fig_painel <- (fig_lp / fig_mt) +
  plot_annotation(
    title    = "Probabilidade Predita de Proficiência Adequada — SAEB 2023",
    subtitle = "Modelos probit | Manaus (AM) e Belém (PA) | Escolas públicas",
    theme    = theme(plot.title    = element_text(face = "bold", size = 14),
                     plot.subtitle = element_text(color = "gray50"))
  )

fig_painel

ggsave(here("outputs", "figuras", "05_04_prob_predita_painel.png"),
       fig_painel, width = 11, height = 12, dpi = 300)

9.7.2 Probabilidade predita por quartil de clima

quartis <- quantile(dados_probit$clima_idx, probs = c(0.25, 0.50, 0.75), na.rm = TRUE)

nd_quartis <- expand.grid(branco = c(0L, 1L), clima_q = as.numeric(quartis), nse_c = 0) |>
  as_tibble() |>
  mutate(raca_label = ifelse(branco == 1L, "Branco", "Não-branco"),
         clima_c    = clima_q - media_clima,
         quartil    = rep(c("Q1 (25%)", "Q2 (50%)", "Q3 (75%)"), each = 2))

nd_quartis$prob_lp <- predict(m2_lp, nd_quartis |> select(branco, clima_c, nse_c),
                               type = "response")
nd_quartis$prob_mt <- predict(m2_mt, nd_quartis |> select(branco, clima_c, nse_c),
                               type = "response")

print(nd_quartis |> select(quartil, raca_label, clima_q, prob_lp, prob_mt))
## # A tibble: 6 × 5
##   quartil  raca_label clima_q prob_lp prob_mt
##   <chr>    <chr>        <dbl>   <dbl>   <dbl>
## 1 Q1 (25%) Não-branco    3.01   0.275  0.0945
## 2 Q1 (25%) Branco        3.01   0.363  0.123 
## 3 Q2 (50%) Não-branco    3.10   0.264  0.0956
## 4 Q2 (50%) Branco        3.10   0.346  0.121 
## 5 Q3 (75%) Não-branco    3.20   0.252  0.0968
## 6 Q3 (75%) Branco        3.20   0.326  0.119
write_csv(nd_quartis |> select(quartil, clima_q, raca_label, prob_lp, prob_mt),
          here("outputs", "tabelas", "05_04_prob_por_quartil_clima.csv"))

fig_quartis <- nd_quartis |>
  pivot_longer(c(prob_lp, prob_mt), names_to = "disciplina", values_to = "prob") |>
  mutate(disciplina = recode(disciplina,
    "prob_lp" = "Língua Portuguesa", "prob_mt" = "Matemática")) |>
  ggplot(aes(x = quartil, y = prob, fill = raca_label)) +
  geom_col(position = position_dodge(0.7), width = 0.6, alpha = 0.85) +
  geom_text(aes(label = percent(prob, accuracy = 0.1)),
            position = position_dodge(0.7), vjust = -0.4, size = 3.5, fontface = "bold") +
  facet_wrap(~disciplina) +
  scale_fill_manual(values = cores_raca, name = "Grupo racial") +
  scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1),
                     expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Probabilidade Predita por Quartil de Clima Escolar",
       subtitle = "NSE mantido na média | Modelo probit com interação raça × clima",
       x = NULL, y = "Probabilidade Predita") +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.major.x = element_blank(), panel.grid.minor = element_blank(),
        legend.position = "bottom")

fig_quartis

ggsave(here("outputs", "figuras", "05_05_prob_por_quartil_clima.png"),
       fig_quartis, width = 11, height = 6.5, dpi = 300)

9.8 Exportação de coeficientes e ajuste

formatar_coefs <- function(modelo, nome) {
  coefs <- summary(modelo)$coefficients
  as.data.frame(coefs) |>
    rownames_to_column("Variável") |>
    transmute(
      Modelo          = nome,
      Variável,
      Estimativa      = round(Estimate, 4),
      `Erro Padrão`   = round(`Std. Error`, 4),
      `Estatística z` = round(`z value`, 3),
      `p-valor`       = round(`Pr(>|z|)`, 4),
      `Sig.` = case_when(
        `Pr(>|z|)` < 0.001 ~ "***",
        `Pr(>|z|)` < 0.01  ~ "**",
        `Pr(>|z|)` < 0.05  ~ "*",
        `Pr(>|z|)` < 0.10  ~ ".",
        TRUE               ~ ""
      )
    )
}

coeficientes <- bind_rows(
  formatar_coefs(m1_lp, "LP — M1 (sem interação)"),
  formatar_coefs(m2_lp, "LP — M2 (com interação)"),
  formatar_coefs(m1_mt, "MT — M1 (sem interação)"),
  formatar_coefs(m2_mt, "MT — M2 (com interação)")
)

write_csv(coeficientes, here("outputs", "tabelas", "05_02_coeficientes_probit.csv"))

tabela_ajuste <- tibble(
  Modelo   = c("LP — M1", "LP — M2", "MT — M1", "MT — M2"),
  AIC      = round(c(AIC(m1_lp), AIC(m2_lp), AIC(m1_mt), AIC(m2_mt)), 1),
  BIC      = round(c(BIC(m1_lp), BIC(m2_lp), BIC(m1_mt), BIC(m2_mt)), 1),
  Deviance = round(c(deviance(m1_lp), deviance(m2_lp), deviance(m1_mt), deviance(m2_mt)), 1),
  `N obs.` = nrow(dados_probit)
)

write_csv(tabela_ajuste, here("outputs", "tabelas", "05_03_ajuste_modelos_probit.csv"))

cat("Todos os arquivos exportados para outputs/tabelas/ e outputs/figuras/\n")
## Todos os arquivos exportados para outputs/tabelas/ e outputs/figuras/

10 Informações da Sessão

sessionInfo()
## R version 4.5.3 (2026-03-11)
## Platform: aarch64-apple-darwin20
## Running under: macOS Tahoe 26.3.1
## 
## Matrix products: default
## BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: America/Recife
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] patchwork_1.3.2     scales_1.4.0        emmeans_2.0.3       broom.mixed_0.2.9.7
##  [5] lmerTest_3.2-1      lme4_2.0-1          Matrix_1.7-4        psych_2.6.3        
##  [9] here_1.0.2          lubridate_1.9.5     forcats_1.0.1       stringr_1.6.0      
## [13] dplyr_1.2.1         purrr_1.2.2         readr_2.2.0         tidyr_1.3.2        
## [17] tibble_3.3.1        ggplot2_4.0.2       tidyverse_2.0.0     data.table_1.18.2.1
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1     farver_2.1.2         S7_0.2.1             fastmap_1.2.0       
##  [5] digest_0.6.39        timechange_0.4.0     estimability_1.5.1   lifecycle_1.0.5     
##  [9] magrittr_2.0.5       compiler_4.5.3       rlang_1.2.0          sass_0.4.10         
## [13] tools_4.5.3          utf8_1.2.6           yaml_2.3.12          knitr_1.51          
## [17] labeling_0.4.3       bit_4.6.0            mnormt_2.1.2         RColorBrewer_1.1-3  
## [21] rsconnect_1.8.0      withr_3.0.2          numDeriv_2016.8-1.1  grid_4.5.3          
## [25] future_1.70.0        GPArotation_2025.3-1 globals_0.19.1       MASS_7.3-65         
## [29] cli_3.6.6            mvtnorm_1.3-7        rmarkdown_2.31       crayon_1.5.3        
## [33] ragg_1.5.2           reformulas_0.4.4     generics_0.1.4       rstudioapi_0.18.0   
## [37] tzdb_0.5.0           minqa_1.2.8          cachem_1.1.0         splines_4.5.3       
## [41] parallel_4.5.3       vctrs_0.7.3          boot_1.3-32          jsonlite_2.0.0      
## [45] hms_1.1.4            bit64_4.6.0-1        listenv_0.10.1       systemfonts_1.3.2   
## [49] jquerylib_0.1.4      glue_1.8.0           parallelly_1.46.1    nloptr_2.2.1        
## [53] codetools_0.2-20     stringi_1.8.7        gtable_0.3.6         furrr_0.4.0         
## [57] pillar_1.11.1        htmltools_0.5.9      R6_2.6.1             textshaping_1.0.5   
## [61] Rdpack_2.6.6         rprojroot_2.1.1      vroom_1.7.1          evaluate_1.0.5      
## [65] lattice_0.22-9       rbibutils_2.4.1      backports_1.5.1      broom_1.0.12        
## [69] renv_1.2.1           bslib_0.10.0         Rcpp_1.1.1           coda_0.19-4.1       
## [73] nlme_3.1-168         mgcv_1.9-4           xfun_0.57            pkgconfig_2.0.3