Análise da Cobertura da Educação Infantil no Brasil (2007–2024)

Autor

Bianca Fialho Salgado Djelberian

1 Introdução e Contexto da Análise

Este estudo investiga a evolução da cobertura da educação infantil no Brasil ao longo de 18 anos (2007-2024), com foco específico na pré-escola para crianças de 4 a 5 anos. A análise busca compreender os padrões de expansão do acesso à educação infantil, identificar desigualdades regionais e avaliar o progresso rumo à universalização prevista na Meta 1 do Plano Nacional de Educação.

A relevância desta análise reside na importância crucial da educação infantil para o desenvolvimento cognitivo e social das crianças, além de representar um indicador fundamental das políticas públicas educacionais. Utilizei fontes oficiais robustas, o Censo Escolar do INEP para dados de matrículas e as estimativas populacionais do DATASUS/IBGE, garantindo confiabilidade e comparabilidade temporal.

2 Metodologia e Processamento de Dados

2.1 Estrutura do Pipeline de Dados

O processo analítico seguiu um fluxo reprodutível em quatro etapas principais:

  1. Extração de Matrículas: Leitura consolidada de 18 arquivos anuais do Censo Escolar (2007-2024)
  2. Obtenção de Dados Populacionais: Processamento das estimativas oficiais de população por município
  3. Integração e Limpeza: Junção das bases via código IBGE e cálculos de cobertura
  4. Agregação e Visualização: Criação de indicadores nacionais e regionais

2.2 Tratamento Estatístico

A taxa de cobertura foi calculada como: Taxa = (Matrículas na Pré-Escola / População 4-5 anos) × 100

As agregações regionais seguiram a divisão oficial do IBGE, permitindo análises comparativas entre as cinco grandes regiões brasileiras.

caminho_dados <- "C:/Users/gabri/Documents/Trab_Bianca_R/dados"

# 1. Ver todos os arquivos
arquivos <- list.files(caminho_dados)
print("TODOS os arquivos na pasta:")
[1] "TODOS os arquivos na pasta:"
print(arquivos)
 [1] "dados.Rproj"                                   
 [2] "ibge_cnv_popsvs2024br223851189_122_186_143.csv"
 [3] "microdados_ed_basica_2007.csv"                 
 [4] "microdados_ed_basica_2008.csv"                 
 [5] "microdados_ed_basica_2009.csv"                 
 [6] "microdados_ed_basica_2010.csv"                 
 [7] "microdados_ed_basica_2011.csv"                 
 [8] "microdados_ed_basica_2012.csv"                 
 [9] "microdados_ed_basica_2013.csv"                 
[10] "microdados_ed_basica_2014.csv"                 
[11] "microdados_ed_basica_2015.csv"                 
[12] "microdados_ed_basica_2016.csv"                 
[13] "microdados_ed_basica_2017.csv"                 
[14] "microdados_ed_basica_2018.csv"                 
[15] "microdados_ed_basica_2019.csv"                 
[16] "microdados_ed_basica_2020.CSV"                 
[17] "microdados_ed_basica_2021.csv"                 
[18] "microdados_ed_basica_2022.csv"                 
[19] "microdados_ed_basica_2023.csv"                 
[20] "microdados_ed_basica_2024.csv"                 
[21] "output"                                        
[22] "trabalho_r.qmd"                                
[23] "trabalho_r.rmarkdown"                          
# 2. Ver só os de microdados
arquivos_censo <- arquivos[grepl("microdados_ed_basica", arquivos)]
print("Arquivos de microdados:")
[1] "Arquivos de microdados:"
print(arquivos_censo)
 [1] "microdados_ed_basica_2007.csv" "microdados_ed_basica_2008.csv"
 [3] "microdados_ed_basica_2009.csv" "microdados_ed_basica_2010.csv"
 [5] "microdados_ed_basica_2011.csv" "microdados_ed_basica_2012.csv"
 [7] "microdados_ed_basica_2013.csv" "microdados_ed_basica_2014.csv"
 [9] "microdados_ed_basica_2015.csv" "microdados_ed_basica_2016.csv"
[11] "microdados_ed_basica_2017.csv" "microdados_ed_basica_2018.csv"
[13] "microdados_ed_basica_2019.csv" "microdados_ed_basica_2020.CSV"
[15] "microdados_ed_basica_2021.csv" "microdados_ed_basica_2022.csv"
[17] "microdados_ed_basica_2023.csv" "microdados_ed_basica_2024.csv"
# 3. ADICIONAR CAMINHO COMPLETO
arquivos_censo_completos <- file.path(caminho_dados, arquivos_censo)

print("Arquivos que serão lidos:")
[1] "Arquivos que serão lidos:"
print(basename(arquivos_censo_completos))
 [1] "microdados_ed_basica_2007.csv" "microdados_ed_basica_2008.csv"
 [3] "microdados_ed_basica_2009.csv" "microdados_ed_basica_2010.csv"
 [5] "microdados_ed_basica_2011.csv" "microdados_ed_basica_2012.csv"
 [7] "microdados_ed_basica_2013.csv" "microdados_ed_basica_2014.csv"
 [9] "microdados_ed_basica_2015.csv" "microdados_ed_basica_2016.csv"
[11] "microdados_ed_basica_2017.csv" "microdados_ed_basica_2018.csv"
[13] "microdados_ed_basica_2019.csv" "microdados_ed_basica_2020.CSV"
[15] "microdados_ed_basica_2021.csv" "microdados_ed_basica_2022.csv"
[17] "microdados_ed_basica_2023.csv" "microdados_ed_basica_2024.csv"
# 4. Ler os arquivos
matriculas_brutas <- map_dfr(arquivos_censo_completos, ~{
  cat("Lendo:", basename(.x), "\n")
  read_csv2(.x, col_select = c("NU_ANO_CENSO", "CO_MUNICIPIO", "QT_MAT_INF_PRE"))
})
Lendo: microdados_ed_basica_2007.csv 
Lendo: microdados_ed_basica_2008.csv 
Lendo: microdados_ed_basica_2009.csv 
Lendo: microdados_ed_basica_2010.csv 
Lendo: microdados_ed_basica_2011.csv 
Lendo: microdados_ed_basica_2012.csv 
Lendo: microdados_ed_basica_2013.csv 
Lendo: microdados_ed_basica_2014.csv 
Lendo: microdados_ed_basica_2015.csv 
Lendo: microdados_ed_basica_2016.csv 
Lendo: microdados_ed_basica_2017.csv 
Lendo: microdados_ed_basica_2018.csv 
Lendo: microdados_ed_basica_2019.csv 
Lendo: microdados_ed_basica_2020.CSV 
Lendo: microdados_ed_basica_2021.csv 
Lendo: microdados_ed_basica_2022.csv 
Lendo: microdados_ed_basica_2023.csv 
Lendo: microdados_ed_basica_2024.csv 
print("Anos carregados:")
[1] "Anos carregados:"
print(sort(unique(matriculas_brutas$NU_ANO_CENSO)))
 [1] 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
[16] 2022 2023 2024
# --- LEITURA CORRIGIDA DA POPULAÇÃO ---

caminho_populacao <- file.path(caminho_dados, "ibge_cnv_popsvs2024br223851189_122_186_143.csv")

# Ler diretamente pulando as primeiras linhas problemáticas
populacao_bruta <- readr::read_delim(
  caminho_populacao,
  delim = ";", 
  skip = 4,  # Pula mais uma linha para evitar o cabeçalho problemático
  col_names = FALSE,
  locale = locale(encoding = "latin1")
)

print("Estrutura do arquivo de população:")
[1] "Estrutura do arquivo de população:"
print(dim(populacao_bruta))
[1] 5578   19
print(head(populacao_bruta[, 1:5], 3))
# A tibble: 3 × 5
  X1                              X2    X3    X4    X5
  <chr>                        <dbl> <dbl> <dbl> <dbl>
1 Município                     2007  2008  2009  2010
2 110001 ALTA FLORESTA D'OESTE   977   945   910   870
3 110002 ARIQUEMES              3558  3525  3481  3397
# Verificar quantas colunas temos (cada ano é uma coluna)
num_anos <- ncol(populacao_bruta) - 1  # menos a coluna do município
print(paste("Número de anos no arquivo:", num_anos))
[1] "Número de anos no arquivo: 18"
# Criar nomes das colunas: município + anos de 2007 a 2024
nomes_colunas <- c("municipio_nome", 2007:(2007 + num_anos - 1))
names(populacao_bruta) <- nomes_colunas[1:ncol(populacao_bruta)]

print("Primeiras linhas com nomes corrigidos:")
[1] "Primeiras linhas com nomes corrigidos:"
print(head(populacao_bruta[, 1:5], 3))
# A tibble: 3 × 5
  municipio_nome               `2007` `2008` `2009` `2010`
  <chr>                         <dbl>  <dbl>  <dbl>  <dbl>
1 Município                      2007   2008   2009   2010
2 110001 ALTA FLORESTA D'OESTE    977    945    910    870
3 110002 ARIQUEMES               3558   3525   3481   3397
# Transformar para formato longo
populacao_longa <- populacao_bruta %>%
  mutate(codigo_ibge6 = as.numeric(str_extract(municipio_nome, "^\\d{6}"))) %>%
  filter(!is.na(codigo_ibge6)) %>%
  select(-municipio_nome) %>%
  pivot_longer(
    cols = -codigo_ibge6, 
    names_to = "ano", 
    values_to = "populacao_4_5"
  ) %>%
  mutate(
    ano = as.numeric(ano),
    populacao_4_5 = as.numeric(gsub("\\.", "", populacao_4_5))
  ) %>%
  filter(ano >= 2007 & ano <= 2024) %>%
  select(codigo_ibge6, ano, populacao_4_5)

print("População - totais por ano:")
[1] "População - totais por ano:"
populacao_longa %>%
  group_by(ano) %>%
  summarise(total_populacao = sum(populacao_4_5, na.rm = TRUE)) %>%
  print(n = 20)
# A tibble: 18 × 2
     ano total_populacao
   <dbl>           <dbl>
 1  2007         6444899
 2  2008         6337608
 3  2009         6252509
 4  2010         6184732
 5  2011         6069212
 6  2012         5952483
 7  2013         5899908
 8  2014         5827732
 9  2015         5785757
10  2016         5810159
11  2017         5811376
12  2018         5825071
13  2019         5912557
14  2020         5909382
15  2021         5783926
16  2022         5762481
17  2023         5770617
18  2024         5628472
# --- CONTINUAR COM O RESTO DO CÓDIGO ---

# Tabela de conversão de código IBGE
url_ibge_api <- "https://servicodados.ibge.gov.br/api/v1/localidades/municipios"
tabela_conversao_ibge <- fromJSON(url_ibge_api) %>%
  as_tibble() %>%
  transmute(codigo_ibge7 = as.numeric(id), codigo_ibge6 = as.numeric(substr(id, 1, 6)))

populacao_longa <- populacao_longa %>%
  left_join(tabela_conversao_ibge, by = "codigo_ibge6")

# Limpar e agregar matrículas
matriculas_agregadas <- matriculas_brutas %>%
  group_by(NU_ANO_CENSO, CO_MUNICIPIO) %>%
  summarise(
    matriculas_pre_escola = sum(QT_MAT_INF_PRE, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  rename(ano = NU_ANO_CENSO, codigo_ibge = CO_MUNICIPIO)

# Junção final
dados_cobertura <- matriculas_agregadas %>%
  left_join(populacao_longa, by = c("codigo_ibge" = "codigo_ibge7", "ano")) %>%
  mutate(taxa_cobertura = (matriculas_pre_escola / pmax(populacao_4_5, 1)) * 100)

# Agregações por Região e Brasil
dados_agregados <- dados_cobertura %>%
  mutate(cod_regiao = as.numeric(substr(codigo_ibge, 1, 1))) %>%
  group_by(ano, cod_regiao) %>%
  summarise(
    matriculas_pre_escola = sum(matriculas_pre_escola, na.rm = TRUE),
    populacao_4_5 = sum(populacao_4_5, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    nome_regiao = factor(
      cod_regiao,
      levels = c(1, 2, 3, 4, 5),
      labels = c("Norte", "Nordeste", "Sudeste", "Sul", "Centro-Oeste")
    )
  )

dados_brasil <- dados_agregados %>%
  group_by(ano) %>%
  summarise(
    matriculas_pre_escola = sum(matriculas_pre_escola, na.rm = TRUE),
    populacao_4_5 = sum(populacao_4_5, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(taxa_cobertura = (matriculas_pre_escola / pmax(populacao_4_5, 1)) * 100)

print("Dados do Brasil completos:")
[1] "Dados do Brasil completos:"
print(dados_brasil)
# A tibble: 18 × 4
     ano matriculas_pre_escola populacao_4_5 taxa_cobertura
   <dbl>                 <dbl>         <dbl>          <dbl>
 1  2007               4976641       6443118           77.2
 2  2008               5015087       6335872           79.2
 3  2009               4900441       6251139           78.4
 4  2010               4717516       6183369           76.3
 5  2011               4696625       6067848           77.4
 6  2012               4765943       5951119           80.1
 7  2013               4870332       5899908           82.5
 8  2014               4971941       5827732           85.3
 9  2015               4923158       5785757           85.1
10  2016               5040210       5810159           86.7
11  2017               5101935       5811376           87.8
12  2018               5157892       5825071           88.5
13  2019               5217686       5912557           88.2
14  2020               5177806       5909382           87.6
15  2021               4902189       5783926           84.8
16  2022               5093075       5762481           88.4
17  2023               5338282       5770617           92.5
18  2024               5304203       5628472           94.2

3 Visualização dos Dados

3.1 Evolução da Cobertura no Brasil (2007-2024)

O gráfico nacional evidencia um avanço expressivo e contínuo da taxa de cobertura da pré-escola no Brasil entre 2007 e 2024.

O país parte de cerca de 77% de cobertura em 2007 e atinge 94% em 2024, consolidando uma tendência de expansão praticamente ininterrupta.

É possível identificar três fases distintas: um crescimento moderado entre 2007 e 2013, uma aceleração clara entre 2013 e 2018, e uma oscilação conjuntural entre 2019 e 2021, quando há uma leve retração associada aos impactos da pandemia de COVID-19.

A partir de 2022, observa-se uma recuperação vigorosa, culminando em um recorde histórico em 2024, o que demonstra a resiliência das políticas públicas de educação infantil e a eficácia dos esforços nacionais de ampliação do acesso escolar na faixa etária de 4 a 5 anos.

Em síntese, a trajetória revela que o Brasil está muito próximo da universalização da pré-escola, representando um dos avanços sociais mais consistentes das últimas duas décadas.

3.2 Comparativo entre as Grandes Regiões (2007-2024)

O gráfico comparativo revela um panorama de forte convergência regional na cobertura da pré-escola entre 2007 e 2024, ainda que partindo de pontos de partida muito distintos.

Em 2007, o Nordeste e o Sudeste já apresentavam os maiores níveis de cobertura (em torno de 84% a 86%), refletindo sistemas educacionais mais estruturados.

O Sul, por outro lado, registrava um patamar bem inferior, próximo de 60%, mas foi justamente essa região que apresentou a maior taxa de crescimento relativo ao longo da série, superando as demais a partir de 2018 e alcançando cerca de 96% em 2024, tornando-se líder nacional.

O Centro-Oeste seguiu trajetória ascendente estável, saindo de 59% e atingindo cerca de 92% ao final do período, com avanços consistentes após 2012.

Já o Norte, que iniciou com uma das coberturas mais baixas (em torno de 69%), também avançou de modo expressivo, chegando a aproximadamente 90% em 2024, embora ainda permaneça ligeiramente abaixo da média nacional.

O Nordeste, apesar de já ter começado em patamar elevado, manteve crescimento contínuo, chegando próximo de 94% em 2024, enquanto o Sudeste apresentou desempenho estável e consolidado, em torno de 95%.

Todas as regiões sofreram um recuo momentâneo em 2021, claramente associado à pandemia de COVID-19, mas recuperaram rapidamente nos anos seguintes.

Em síntese, o gráfico demonstra que as políticas públicas voltadas à ampliação da educação infantil foram eficazes em reduzir as disparidades regionais: o intervalo entre a região mais e a menos atendida caiu de cerca de 25 pontos percentuais em 2007 para apenas 6 p.p. em 2024, consolidando um cenário de quase universalização nacional com equilíbrio territorial.

4 Conclusões e Implicações

4.1 Principais Achados

A análise evidencia que o Brasil está muito próximo da universalização da educação infantil, com a taxa de cobertura da pré-escola alcançando 94,2% em 2024. O avanço de 17 pontos percentuais ao longo de 18 anos demonstra um esforço contínuo de expansão do direito à educação desde a primeira infância, sustentado por políticas públicas consistentes e progressivas.

A evolução temporal revela uma trajetória de crescimento estável e resiliente, mesmo diante de choques conjunturais, como a pandemia de COVID-19, que provocou uma leve retração em 2021 seguida de recuperação rápida. Além disso, observa-se uma redução substancial das disparidades regionais, com as regiões Sul, Sudeste e Nordeste atingindo níveis próximos de universalização e o Norte apresentando expressiva melhora a partir de uma base historicamente mais baixa. Esse movimento confirma a efetividade das políticas de equalização educacional, ainda que persista a necessidade de atenção diferenciada a territórios específicos.

Entretanto, a expansão quantitativa deve ser acompanhada de uma agenda de qualificação da oferta, de modo a assegurar que o aumento do acesso seja traduzido em melhoria da qualidade pedagógica e na garantia de aprendizagens significativas.

4.2 Recomendações para Políticas Públicas

  1. Focalização finalística: Direcionar esforços para os municípios e comunidades que ainda não atingiram cobertura plena, priorizando contextos de vulnerabilidade social e baixo IDH.

  2. Qualificação da oferta: Consolidar a transição do foco na expansão quantitativa para a melhoria da qualidade pedagógica, com investimento em formação docente, infraestrutura adequada e acompanhamento do desenvolvimento infantil.

  3. Monitoramento contínuo: Manter sistemas robustos de avaliação e acompanhamento, permitindo identificar retrocessos e desigualdades emergentes com base em dados integrados e atualizados.

  4. Integração de políticas públicas: Articular a educação infantil com saúde, assistência social e políticas de desenvolvimento local, garantindo o atendimento integral às crianças e famílias.

O caso brasileiro demonstra que é possível combater desigualdades históricas por meio de políticas educacionais consistentes, intersetoriais e sustentadas no tempo. O sucesso da expansão da pré-escola constitui, portanto, uma referência relevante para outros países em desenvolvimento que buscam equilibrar equidade e eficiência em suas políticas de primeira infância.

5 Aspectos Técnicos e Reprodutibilidade

5.1 Glossário de Variáveis

Variável Descrição
ano Ano de referência da observação.
codigo_ibge Código do município de 7 dígitos.
matriculas_pre_escola Total de matrículas na pré-escola (4-5 anos).
populacao_4_5 População estimada na faixa etária de 4 a 5 anos.
taxa_cobertura Razão percentual entre matrículas e população.

5.2 Como Reproduzir

Pré-requisitos:

  • R (versão 4.3.0 ou superior)
  • RStudio (versão 2023.12.0 ou superior)
  • Pacotes: tidyverse, jsonlite, plotly

Execução:

  • Criar diretório dados com os arquivos do Censo Escolar (salvar apenas os arquivos .csv que o zip fornecer) e população
  • Executar o script sequencialmente
  • Os gráficos serão gerados automaticamente

5.3 Divulgação de Uso de IA

Durante o desenvolvimento deste trabalho, utilizei bastante o ChatGPT (OpenAI) como ferramenta de apoio técnico e editorial, com o objetivo de aumentar a clareza, a reprodutibilidade e a qualidade comunicativa do código e das análises. O uso da IA ocorreu de forma complementar e supervisionada, preservando integralmente minha autoria intelectual sobre o problema de pesquisa, as decisões metodológicas, a interpretação dos resultados e as conclusões substantivas.

As interações com a ferramenta concentraram-se em três eixos principais:

  • Otimização e organização do pipeline de dados, garantindo legibilidade e estrutura lógica;
  • Diagnóstico e correção de erros técnicos, sem alterar a lógica original do código;
  • Aprimoramento da comunicação científica, especialmente na redação das interpretações e conclusões.

A seguir, apresento alguns exemplos de prompts efetivamente utilizados durante o processo:

Prompt 1 – Organização e clareza do código

“ChatGPT, me ajuda a deixar meu código mais limpo e organizado, por favor. Quero que ele fique fácil de entender, com as etapas bem divididas e comentadas.”

Prompt 2 – Diagnóstico de erro e depuração

“Meu lindo código é esse, mas ele não consegue pegar os anos de 2019 a 2024 por algum motivo. Me ajude a descobrir por que está dando esse erro, sem mudar o resto do pipeline.”

Prompt 3 – Criação de Gráficos

“O código já está rodando, mas quero ajuda para gerar os gráficos, consegue me auxiliar em transformar os meus dois gráficos existentes em interativos?”

6 Fontes dos Dados

Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira (INEP).
Censo Escolar da Educação Básica – Microdados (2007–2024).
Disponível em: https://www.gov.br/inep/pt-br/acesso-a-informacao/dados-abertos/microdados/censo-escolar.
Acesso em: outubro de 2025.

Departamento de Informática do Sistema Único de Saúde (DATASUS) – Ministério da Saúde.
Estimativas populacionais por município (faixa etária 4–5 anos), base IBGE/SVS.
Disponível em: http://tabnet.datasus.gov.br/cgi/deftohtm.exe?ibge/cnv/popsvs2024br.def.
Acesso em: outubro de 2025.