Introdução

Introdução

A educação brasileira carrega, ao longo de décadas, desafios estruturais que impactam diretamente o futuro de milhões de estudantes. Entre esses desafios, dois se destacam pela intensidade com que afetam a trajetória escolar: a distorção idade-série — quando o estudante está em uma série incompatível com sua idade — e o abandono escolar, fenômeno que interrompe o direito à educação e compromete oportunidades futuras.

Ambos os indicadores se conectam profundamente à desigualdade social, ao acesso desigual a políticas públicas e às condições socioeconômicas regionais. Em muitos contextos, a repetência e o atraso escolar funcionam como um ciclo que se retroalimenta: estudantes mais velhos, deslocados do grupo etário, tendem a apresentar menor engajamento, maior exposição a riscos e maior probabilidade de abandonar a escola.

Neste trabalho, busco compreender como esses dois fenômenos — distorção idade-série e abandono escolar — influenciam a taxa de aprovação no Brasil, utilizando dados oficiais do INEP entre 2022 e 2024. Por meio de análise estatística e visualização de dados, investigamos padrões, relações e possíveis implicações para o sistema educacional brasileiro.

Meu objetivo não é apenas descrever números, mas gerar reflexão sobre os fatores que moldam a permanência e o sucesso dos estudantes. Ao entender como essas variáveis se relacionam, contribuímos para uma discussão essencial: como garantir que mais alunos avancem em suas trajetórias escolares com dignidade e qualidade?

Definição do problema e Justificativa sociopedagógica

A reprovação e o abandono escolar continuam sendo indicadores críticos na educação básica brasileira. Entretanto, esses fenômenos não acontecem de forma isolada. Diversos estudos apontam que eles estão profundamente associados à distorção idade-série, situação em que o estudante acumula atrasos sucessivos que prejudicam seu aprendizado, sua motivação e seu vínculo com a escola.

O problema central que investigamos é:

Em que medida a distorção idade-série e o abandono escolar explicam a variação nas taxas de aprovação?

Justifica-se esta análise porque:

  • A distorção idade-série funciona como um marcador de desigualdade educacional.

  • O abandono escolar está associado a vulnerabilidades sociais e impactos econômicos.

  • A aprovação escolar é um dos principais indicadores de progressão e sucesso educacional.

  • Entender as relações entre esses indicadores auxilia gestores, pesquisadores e escolas na criação de políticas mais eficientes.

Além disso, o período analisado (2022–2024) é particularmente relevante, pois marca a fase de recuperação pós-pandemia, quando o país enfrentou picos de defasagem de aprendizagem e aumento nas desigualdades regionais.

Abordagem, metodologia e utilidade da análise

A análise proposta parte da seguinte declaração de problema: entender como a distorção idade-série e o abandono escolar influenciam a taxa de aprovação no Brasil. Para abordar essa questão, utilizo os microdados oficiais do INEP referentes aos indicadores educacionais de 2022 a 2024, incluindo informações desagregadas por dependência administrativa, localização geográfica e etapas de ensino. Esses dados foram previamente tratados, padronizados e consolidados em uma base unificada, garantindo consistência, comparabilidade e ausência de duplicidades.

A metodologia empregada combina análise descritiva, estudos correlacionais e visualização gráfica. Primeiro, foram calculados indicadores agregados de aprovação, abandono e distorção idade-série, permitindo observar tendências gerais. Em seguida, aplicou-se uma análise de correlação para verificar a direção e intensidade das relações entre as variáveis. Por fim, utilizaram-se gráficos de dispersão e tendências para interpretar visualmente o comportamento dos fenômenos ao longo dos anos e entre diferentes grupos. Essa abordagem é adequada porque permite identificar, de forma direta, se taxas mais elevadas de distorção e abandono se associam a reduções nas taxas de aprovação — oferecendo evidências estatísticas e empíricas para sustentar conclusões.

Ao adotar essa técnica, minha intenção é fornecer um diagnóstico claro que ajuda a responder total ou parcialmente o problema proposto. Embora a correlação não determine causalidade, ela revela padrões consistentes que sugerem onde políticas públicas ou ações de gestão podem ser mais efetivas. A combinação de estatísticas descritivas e correlações permite mapear fragilidades do sistema educacional e identificar grupos mais vulneráveis a reprovação e abandono.

Essa análise também tem utilidade prática para potenciais “clientes” — como gestores escolares, secretarias de educação, pesquisadores e formuladores de políticas públicas. Os resultados ajudam a:

  • identificar fatores que mais pressionam a taxa de aprovação;

  • priorizar regiões, redes ou etapas de ensino que exigem intervenção imediata;

  • compreender como distorção e abandono caminham juntos e afetam o desempenho;

  • embasar decisões com evidências, evitando achismos;

  • orientar alocação de recursos, formação docente e políticas de permanência.

Com isso, a análise não apenas descreve o cenário educacional brasileiro, mas contribui para a formulação de estratégias mais eficientes, voltadas à redução da desigualdade e à melhoria da qualidade da educação.

Pacotes utilizados

Descrição utilizados

Todos os pacotes necessários para a análise foram carregados antecipadamente com o objetivo de garantir transparência, reprodutibilidade e facilidade de replicação dos resultados. Ao explicitar previamente as dependências do projeto, qualquer leitor, avaliador ou pesquisador pode instalar as mesmas bibliotecas e reproduzir o processamento de dados e as análises estatísticas sem inconsistências ou incompatibilidades.

Propósito de cada pacote utilizado

  1. readxl
  • Permite importar arquivos Excel (.xlsx) diretamente para o R.

  • Fundamental porque os indicadores educacionais do INEP são fornecidos exatamente nesse formato.

  1. dplyr
  • Pacote central para manipulação e transformação de dados.

  • Usado para selecionar colunas, filtrar linhas, criar novas variáveis, agrupar dados e sumarizar resultados.

  1. tidyr
  • Auxilia na organização dos dados, especialmente em tarefas de pivotar colunas, normalizar estruturas e tratar bases “largas” ou “longas”.

  1. stringr
  • Conjunto de funções para manipulação de texto (strings).

  • Essencial para ajustar nomes de variáveis, extrair anos dos nomes de arquivos e padronizar categorias.

  1. purrr
  • Facilita operações repetidas com listas e funções, como aplicar automaticamente funções de limpeza em vários arquivos do INEP.

  1. janitor
  • padronizar nomes das colunas (clean_names()),

  • remover linhas vazias ou duplicadas,

  • facilitar inspeções iniciais da base.

  1. ggplot2
  • Principal biblioteca de visualização de dados no R.

  • Utilizado para gerar gráficos de correlação, dispersão e tendências temporais.

Fonte dos Dados

Fonte Principal

Todos os dados utilizados neste projeto estão disponíveis publicamente no portal do INEP, na área de dados abertos.

Link para fonte dos dados: INEP – Indicadores Educacionais

Descrição e Preparação dos Dados

Os dados utilizados neste projeto foram obtidos no portal de Dados Abertos do Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira (INEP), que publica anualmente indicadores oficiais da Educação Básica. O propósito original dessas bases é monitorar o desempenho e condições do fluxo escolar, permitindo que gestores, pesquisadores e o público geral acompanhem:

  • Taxas de aprovação, reprovação e abandono escolar

  • Indicadores de distorção idade-série

  • Resultados desagregados por ano, unidade da federação, localização (urbana/rural) e dependência administrativa (Federal, Estadual, Municipal)

As bases utilizadas correspondem aos anos 2022, 2023 e 2024, sendo disponibilizadas pelo INEP já em formato de planilha Excel (.xlsx). Cada arquivo contém múltiplas seções e cabeçalhos extensos, pois foram originalmente organizados para leitura humana, não para análise automática. Assim, foi necessário um processo consistente de limpeza.

Os dados originais possuíam:

  • Várias linhas de cabeçalho decorativo (identificação do INEP, título da tabela, explicações metodológicas).

  • Ausência de nomes claros para as colunas, exigindo criação manual.

  • Uso de vírgula no padrão brasileiro (“95,3”), necessitando conversão para ponto decimal.

  • Valores ausentes representados por “–”, células vazias ou zeros artificiais, dependendo do indicador.

O volume de variáveis variava entre arquivos, mas cada tabela continha aproximadamente:

  • 4 variáveis categóricas (ano, UF/região, localização, dependência administrativa)

  • +38 a 60 variáveis numéricas, dependendo do tipo (rendimento ou distorção)

Essas características tornam essas bases típicas de dados governamentais brutos: completos, porém não imediatamente adequados para análise computacional.

Tratando os dados

Função limpar_inep_rendimento

limpar_inep_rendimento <- function(arquivo) {
  
  # Ler arquivo pulando cabeçalhos decorativos
  df <- read_excel(arquivo, skip = 9, col_names = FALSE)
  
  # Criar nomes das colunas conforme estrutura oficial
  nomes <- c(
    "ano", "unidade_geografica", "localizacao", "dependencia_administrativa",
    
    # Aprovação EF
    paste0("aprov_fund_", c(
      "total", "anos_iniciais", "anos_finais",
      "1ano","2ano","3ano","4ano","5ano","6ano","7ano","8ano","9ano"
    )),
    
    # Aprovação EM
    paste0("aprov_med_", c("total","1serie","2serie","3serie","4serie","nao_seriado")),
    
    # Reprovação EF
    paste0("reprov_fund_", c(
      "total", "anos_iniciais", "anos_finais",
      "1ano","2ano","3ano","4ano","5ano","6ano","7ano","8ano","9ano"
    )),
    
    # Reprovação EM
    paste0("reprov_med_", c("total","1serie","2serie","3serie","4serie","nao_seriado")),
    
    # Abandono EF
    paste0("aband_fund_", c(
      "total", "anos_iniciais", "anos_finais",
      "1ano","2ano","3ano","4ano","5ano","6ano","7ano","8ano","9ano"
    )),
    
    # Abandono EM
    paste0("aband_med_", c("total","1serie","2serie","3serie","4serie","nao_seriado"))
  )
  
  # Aplicar nomes
  colnames(df) <- nomes
  
  # Tratamento de dados
  df <- df %>%
    mutate(across(where(is.character), ~ gsub(",", ".", .))) %>%  # vírgula → ponto
    mutate(across(everything(), ~ na_if(., "--"))) %>%            # "--" → NA
    mutate(across(everything(), ~ na_if(., ""))) %>%              # "" → NA
    mutate(across(-c(ano, unidade_geografica, localizacao, dependencia_administrativa),
                  ~ suppressWarnings(as.numeric(.))))              # converter números
  
  return(df)
}

Esta função realiza o tratamento das planilhas de rendimento do INEP, que possuem várias linhas de cabeçalhos decorativos e valores inconsistentes. Primeiro ignoramos as linhas iniciais e aplicamos nomes padronizados às colunas, garantindo que cada indicador (aprovação, reprovação e abandono por série e nível de ensino) seja identificado corretamente. Em seguida, substituímos vírgulas por pontos, convertemos valores inválidos (“–”, strings vazias) em NA e transformamos as colunas numéricas para permitir análises estatísticas confiáveis.

Após a Função limpar_inep_distorcao

limpar_inep_distorcao <- function(arquivo) {
  
  df <- read_excel(arquivo, skip = 9, col_names = FALSE)
  
  nomes <- c(
    "ano", "unidade_geografica", "localizacao", "dependencia_administrativa",
    
    # TDI – Ensino Fundamental
    paste0("tdi_fund_", c(
      "total","anos_iniciais","anos_finais",
      "1ano","2ano","3ano","4ano","5ano",
      "6ano","7ano","8ano","9ano"
    )),
    
    # TDI – Ensino Médio
    paste0("tdi_med_", c("total","1serie","2serie","3serie","4serie"))
  )
  
  colnames(df) <- nomes
  
  df <- df %>%
    mutate(across(where(is.character), ~ gsub(",", ".", .))) %>%
    mutate(across(everything(), ~ na_if(., "--"))) %>%
    mutate(across(everything(), ~ na_if(., ""))) %>%
    mutate(across(-c(ano, unidade_geografica, localizacao, dependencia_administrativa),
                  ~ suppressWarnings(as.numeric(.))))
  
  return(df)
}

Esta função segue a mesma lógica da anterior, mas aplicada às planilhas de distorção idade-série. Após ignorar os cabeçalhos decorativos, atribuímos nomes coerentes às colunas (TDI no EF e EM), padronizamos valores, tratamos ausências e convertemos os indicadores para formato numérico. Isso garante que os dados de TDI fiquem organizados e consistentes para integração com as demais bases.

Após o Bloco que Importa os Dados

library(readxl)
library(dplyr)
library(purrr)
library(janitor)

caminho <- "C:/Users/carlo/Downloads/data"

arquivos <- list(
  rendimento_2022 = file.path(caminho, "tx_rend_brasil_regioes_ufs_2022.xlsx"),
  rendimento_2023 = file.path(caminho, "tx_rend_brasil_regioes_ufs_2023.xlsx"),
  rendimento_2024 = file.path(caminho, "tx_rend_brasil_regioes_ufs_2024.xlsx"),
  
  distorcao_2022 = file.path(caminho, "TDI_BRASIL_REGIOES_UFS_2022.xlsx"),
  distorcao_2023 = file.path(caminho, "TDI_BRASIL_REGIOES_UFS_2023.xlsx"),
  distorcao_2024 = file.path(caminho, "TDI_BRASIL_REGIOES_UFS_2024.xlsx")
)

dados <- map(arquivos, ~ read_excel(.x) %>% clean_names())

names(dados) <- names(arquivos)

Aqui apenas organizamos os caminhos dos arquivos e realizamos uma leitura inicial. Esse passo cria uma estrutura clara e reproduzível para acessar todas as planilhas do INEP antes do tratamento definitivo.

Após o Bloco que Aplica as Funções de Tratamento

dados <- map2(
  names(arquivos),
  arquivos,
  function(nm, arq) {
    if (grepl("rendimento", nm)) {
      limpar_inep_rendimento(arq)
    } else {
      limpar_inep_distorcao(arq)
    }
  }
) %>% set_names(names(arquivos))

Utilizamos map2() para aplicar automaticamente a função correta (rendimento ou distorção) a cada arquivo. Isso padroniza o processo de limpeza para todos os anos (2022–2024) e assegura que todas as planilhas sejam tratadas da mesma maneira, eliminando inconsistências.

Após Unir os Data Frames (bind_rows)

# Rendimento (2022–2024)
rendimento <- bind_rows(
  dados$rendimento_2022 %>% mutate(ano = 2022),
  dados$rendimento_2023 %>% mutate(ano = 2023),
  dados$rendimento_2024 %>% mutate(ano = 2024)
)

# Distorção idade-série
distorcao <- bind_rows(
  dados$distorcao_2022 %>% mutate(ano = 2022),
  dados$distorcao_2023 %>% mutate(ano = 2023),
  dados$distorcao_2024 %>% mutate(ano = 2024)
)

Neste passo consolidamos os dados de cada ano em duas grandes bases: rendimento e distorção. A união por ano permite análises comparativas, tendências e agregação dos indicadores ao longo do tempo.

Após o inner_join() (base_final)

# --- 1. Unir os datasets já tratados ---
rendimento$origem <- "rendimento"
distorcao$origem <- "distorcao"

# Garantir que ano, localização, unidade, dependência existam em ambos
chaves <- c("ano","unidade_geografica","localizacao","dependencia_administrativa")

# Selecionar só variáveis importantes
rend_key <- rendimento %>% select(any_of(chaves),
                                  starts_with("aprov"),
                                  starts_with("reprov"),
                                  starts_with("aband"))

dist_key <- distorcao %>% select(any_of(chaves),
                                  starts_with("tdi"))

# --- 2. Juntar (inner_join garante alinhamento perfeito entre bases) ---
base_final <- rend_key %>%
  inner_join(dist_key, by = chaves)

glimpse(base_final)
## Rows: 1,772
## Columns: 75
## $ ano                        <dbl> 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2…
## $ unidade_geografica         <chr> "Brasil", "Brasil", "Brasil", "Brasil", "Br…
## $ localizacao                <chr> "Total", "Urbana", "Rural", "Total", "Urban…
## $ dependencia_administrativa <chr> "Total", "Total", "Total", "Federal", "Fede…
## $ aprov_fund_total           <dbl> 94.2, 94.7, 90.8, 96.1, 96.0, 98.6, 93.8, 9…
## $ aprov_fund_anos_iniciais   <dbl> 96.0, 96.5, 93.1, 97.5, 97.5, 97.5, 96.9, 9…
## $ aprov_fund_anos_finais     <dbl> 92.1, 92.7, 87.5, 95.5, 95.4, 100.0, 92.7, …
## $ aprov_fund_1ano            <dbl> 98.7, 98.7, 98.5, 98.4, 98.4, 100.0, 98.9, …
## $ aprov_fund_2ano            <dbl> 97.8, 97.9, 97.5, 97.5, 97.4, 100.0, 98.4, …
## $ aprov_fund_3ano            <dbl> 94.2, 94.7, 91.4, 95.6, 95.7, 85.7, 95.3, 9…
## $ aprov_fund_4ano            <dbl> 95.0, 95.7, 91.0, 97.9, 97.9, 100.0, 97.3, …
## $ aprov_fund_5ano            <dbl> 94.2, 95.3, 87.8, 97.9, 97.9, 100.0, 95.2, …
## $ aprov_fund_6ano            <dbl> 92.4, 93.3, 86.3, 96.5, 96.5, 100.0, 94.3, …
## $ aprov_fund_7ano            <dbl> 91.9, 92.6, 86.7, 95.4, 95.4, 100.0, 93.2, …
## $ aprov_fund_8ano            <dbl> 91.3, 91.9, 86.9, 95.0, 94.9, 100.0, 91.8, …
## $ aprov_fund_9ano            <dbl> 92.9, 93.2, 90.4, 95.1, 95.1, 100.0, 91.6, …
## $ aprov_med_total            <dbl> 86.6, 86.7, 85.2, 88.3, 88.2, 88.6, 85.0, 8…
## $ aprov_med_1serie           <dbl> 85.1, 85.2, 83.5, 84.6, 84.6, 84.5, 83.6, 8…
## $ aprov_med_2serie           <dbl> 86.5, 86.6, 85.5, 89.4, 89.2, 90.5, 84.9, 8…
## $ aprov_med_3serie           <dbl> 88.7, 88.8, 87.7, 91.9, 91.7, 93.6, 87.1, 8…
## $ aprov_med_4serie           <dbl> 89.9, 90.1, 86.7, 89.6, 90.0, 84.0, 89.8, 9…
## $ aprov_med_nao_seriado      <dbl> 79.2, 79.0, 80.5, 86.1, 86.2, 84.9, 74.6, 7…
## $ reprov_fund_total          <dbl> 4.7, 4.3, 7.0, 3.8, 3.9, 1.4, 4.9, 4.8, 5.9…
## $ reprov_fund_anos_iniciais  <dbl> 3.5, 3.1, 6.0, 2.4, 2.4, 2.5, 2.6, 2.4, 5.4…
## $ reprov_fund_anos_finais    <dbl> 6.0, 5.7, 8.5, 4.4, 4.5, 0.0, 5.7, 5.6, 6.2…
## $ reprov_fund_1ano           <dbl> 0.8, 0.8, 0.7, 1.4, 1.4, 0.0, 0.5, 0.4, 1.3…
## $ reprov_fund_2ano           <dbl> 1.8, 1.8, 1.8, 2.5, 2.5, 0.0, 1.2, 1.2, 2.4…
## $ reprov_fund_3ano           <dbl> 5.4, 5.0, 7.8, 4.1, 4.0, 14.3, 4.3, 4.1, 7.…
## $ reprov_fund_4ano           <dbl> 4.5, 3.9, 8.0, 2.1, 2.1, 0.0, 2.2, 1.9, 6.2…
## $ reprov_fund_5ano           <dbl> 5.2, 4.2, 10.8, 1.9, 2.0, 0.0, 4.2, 3.9, 8.…
## $ reprov_fund_6ano           <dbl> 6.3, 5.7, 10.8, 3.4, 3.4, 0.0, 4.8, 4.7, 6.…
## $ reprov_fund_7ano           <dbl> 6.4, 6.0, 9.6, 4.4, 4.4, 0.0, 5.4, 5.4, 6.4…
## $ reprov_fund_8ano           <dbl> 6.5, 6.3, 8.4, 4.9, 5.0, 0.0, 6.3, 6.3, 6.2…
## $ reprov_fund_9ano           <dbl> 4.8, 4.8, 4.8, 4.9, 4.9, 0.0, 6.0, 6.0, 6.1…
## $ reprov_med_total           <dbl> 7.7, 7.8, 6.6, 9.5, 9.6, 8.9, 8.4, 8.5, 6.6…
## $ reprov_med_1serie          <dbl> 9.4, 9.5, 8.2, 12.9, 13.0, 12.5, 10.2, 10.3…
## $ reprov_med_2serie          <dbl> 7.6, 7.7, 6.2, 8.7, 8.9, 7.6, 8.4, 8.5, 6.3…
## $ reprov_med_3serie          <dbl> 5.5, 5.6, 4.6, 6.2, 6.4, 4.5, 6.2, 6.3, 4.8…
## $ reprov_med_4serie          <dbl> 6.0, 5.8, 8.4, 7.6, 7.2, 12.9, 4.9, 4.7, 9.…
## $ reprov_med_nao_seriado     <dbl> 9.3, 9.1, 10.8, 10.4, 10.5, 9.3, 14.6, 15.8…
## $ aband_fund_total           <dbl> 1.1, 1.0, 2.2, 0.1, 0.1, 0.0, 1.3, 1.3, 2.5…
## $ aband_fund_anos_iniciais   <dbl> 0.5, 0.4, 0.9, 0.1, 0.1, 0.0, 0.5, 0.4, 1.5…
## $ aband_fund_anos_finais     <dbl> 1.9, 1.6, 4.0, 0.1, 0.1, 0.0, 1.6, 1.6, 3.0…
## $ aband_fund_1ano            <dbl> 0.5, 0.5, 0.8, 0.2, 0.2, 0.0, 0.6, 0.6, 1.3…
## $ aband_fund_2ano            <dbl> 0.4, 0.3, 0.7, 0.0, 0.1, 0.0, 0.4, 0.3, 1.2…
## $ aband_fund_3ano            <dbl> 0.4, 0.3, 0.8, 0.3, 0.3, 0.0, 0.4, 0.4, 1.2…
## $ aband_fund_4ano            <dbl> 0.5, 0.4, 1.0, 0.0, 0.0, 0.0, 0.5, 0.4, 1.5…
## $ aband_fund_5ano            <dbl> 0.6, 0.5, 1.4, 0.2, 0.1, 0.0, 0.6, 0.4, 2.1…
## $ aband_fund_6ano            <dbl> 1.3, 1.0, 2.9, 0.1, 0.1, 0.0, 0.9, 0.9, 1.9…
## $ aband_fund_7ano            <dbl> 1.7, 1.4, 3.7, 0.2, 0.2, 0.0, 1.4, 1.3, 2.4…
## $ aband_fund_8ano            <dbl> 2.2, 1.8, 4.7, 0.1, 0.1, 0.0, 1.9, 1.9, 3.4…
## $ aband_fund_9ano            <dbl> 2.3, 2.0, 4.8, 0.0, 0.0, 0.0, 2.4, 2.3, 4.1…
## $ aband_med_total            <dbl> 5.7, 5.5, 8.2, 2.2, 2.2, 2.5, 6.6, 6.5, 8.9…
## $ aband_med_1serie           <dbl> 5.5, 5.3, 8.3, 2.5, 2.4, 3.0, 6.2, 6.1, 9.0…
## $ aband_med_2serie           <dbl> 5.9, 5.7, 8.3, 1.9, 1.9, 1.9, 6.7, 6.6, 8.9…
## $ aband_med_3serie           <dbl> 5.8, 5.6, 7.7, 1.9, 1.9, 1.9, 6.7, 6.6, 8.3…
## $ aband_med_4serie           <dbl> 4.1, 4.1, 4.9, 2.8, 2.8, 3.1, 5.3, 5.1, 10.…
## $ aband_med_nao_seriado      <dbl> 11.5, 11.9, 8.7, 3.5, 3.3, 5.8, 10.8, 11.1,…
## $ tdi_fund_total             <dbl> 12.3, 11.4, 18.5, 10.4, 10.4, 7.8, 14.2, 13…
## $ tdi_fund_anos_iniciais     <dbl> 7.1, 6.6, 10.3, 4.2, 4.2, 3.8, 6.5, 5.7, 16…
## $ tdi_fund_anos_finais       <dbl> 18.5, 17.0, 30.6, 13.0, 13.0, 12.9, 17.0, 1…
## $ tdi_fund_1ano              <dbl> 4.0, 3.9, 4.3, 1.9, 2.0, 0.0, 4.3, 3.8, 10.…
## $ tdi_fund_2ano              <dbl> 4.4, 4.3, 4.7, 2.9, 2.9, 5.9, 3.9, 3.4, 10.…
## $ tdi_fund_3ano              <dbl> 6.3, 6.0, 8.3, 3.2, 3.2, 6.7, 5.8, 5.1, 15.…
## $ tdi_fund_4ano              <dbl> 8.1, 7.5, 12.3, 4.0, 4.0, 6.7, 6.5, 5.5, 18…
## $ tdi_fund_5ano              <dbl> 12.5, 11.2, 20.1, 8.1, 8.2, 0.0, 10.7, 9.6,…
## $ tdi_fund_6ano              <dbl> 16.5, 15.0, 27.5, 11.0, 11.1, 0.0, 14.1, 13…
## $ tdi_fund_7ano              <dbl> 18.2, 16.6, 30.7, 11.7, 11.7, 14.3, 15.9, 1…
## $ tdi_fund_8ano              <dbl> 19.7, 18.0, 32.6, 14.8, 14.8, 16.7, 18.4, 1…
## $ tdi_fund_9ano              <dbl> 19.8, 18.4, 31.7, 14.0, 14.0, 23.1, 19.3, 1…
## $ tdi_med_total              <dbl> 22.2, 21.5, 34.4, 23.4, 23.6, 22.6, 24.4, 2…
## $ tdi_med_1serie             <dbl> 24.2, 23.5, 35.5, 21.3, 21.1, 22.4, 26.7, 2…
## $ tdi_med_2serie             <dbl> 21.3, 20.7, 33.1, 25.2, 25.5, 23.7, 23.4, 2…
## $ tdi_med_3serie             <dbl> 20.4, 19.7, 34.2, 21.9, 22.2, 20.0, 22.6, 2…
## $ tdi_med_4serie             <dbl> 30.8, 30.5, 34.1, 31.9, 31.8, 34.5, 24.6, 2…

Aqui unimos as duas bases tratadas utilizando variáveis comuns (ano, unidade, localização e dependência). O uso de inner_join garante que apenas combinações válidas e correspondentes sejam mantidas. O resultado é um dataset final completo, contendo simultaneamente aprovação, abandono e distorção para a mesma unidade de análise.

Após a Criação das Variáveis Centrais

base_final <- base_final %>%
  mutate(
    # Indicadores combinados
    distorcao_total = rowMeans(select(., tdi_fund_total, tdi_med_total), na.rm = TRUE),
    abandono_total  = rowMeans(select(., aband_fund_total, aband_med_total), na.rm = TRUE),
    aprovacao_total = rowMeans(select(., aprov_fund_total, aprov_med_total), na.rm = TRUE)
  )

Criamos três indicadores agregados principais — aprovação total, abandono total e distorção total. Eles sintetizam dezenas de variáveis em métricas únicas que representam o desempenho geral da educação. Esses indicadores servem como base para toda a análise estatística e gráfica do estudo.

Conjunto de Dados Final

# Mostrar 10 linhas e todas as colunas

head(base_final, 10)

Análises

Principais Estatísticas

library(dplyr)

resumo_variaveis <- base_final %>%
  summarise(
    across(
      c(aprovacao_total, abandono_total, distorcao_total),
      list(media = ~mean(., na.rm = TRUE),
           mediana = ~median(., na.rm = TRUE),
           minimo = ~min(., na.rm = TRUE),
           maximo = ~max(., na.rm = TRUE),
           desvio_padrao = ~sd(., na.rm = TRUE))
    )
  )

resumo_variaveis

As estatísticas mostram que a aprovação média é alta, enquanto abandono e distorção variam mais entre regiões e redes. O desvio-padrão relativamente elevado da distorção indica forte desigualdade entre unidades. Essas métricas oferecem uma visão geral do comportamento dos indicadores e ajudam a contextualizar padrões mais profundos.

Análise de Correlações

library(dplyr)

correlacoes <- base_final %>% 
  select(aprovacao_total, distorcao_total, abandono_total)

as.data.frame(cor(correlacoes, use = "complete.obs"))

A análise de correlação revela relações claras:

  • Aprovação × Distorção: relação negativa moderada (cerca de –0.67).

  • Aprovação × Abandono: relação negativa forte (aprox. –0.79).

  • Distorção × Abandono: relação positiva significativa (aprox. +0.70).

Esses resultados indicam que quanto maior a distorção e o abandono, menor tende a ser a taxa de aprovação.

Tabelas Resumo (por ano, UF, localização, dependência)

tabela_resumo <- base_final %>%
  group_by(ano, unidade_geografica, localizacao) %>%
  summarise(
    media_aprov = mean(aprovacao_total, na.rm = TRUE),
    media_aband = mean(abandono_total, na.rm = TRUE),
    media_tdi   = mean(distorcao_total, na.rm = TRUE),
    .groups = "drop"
  )
tabela_resumo

Os resumos por grupo mostram desigualdades persistentes: redes rurais e algumas UFs mantêm maiores níveis de distorção e abandono, enquanto regiões urbanas e federais apresentam melhores taxas de aprovação. Essas variações ajudam a identificar grupos e contextos prioritários.

Distorção vs Aprovação

library(ggplot2)

ggplot(base_final, aes(x = distorcao_total, y = aprovacao_total, color = localizacao)) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    title = "Relação entre Distorção Idade-Série e Taxa de Aprovação",
    x = "Distorção Idade-Série (%)",
    y = "Taxa de Aprovação (%)"
  )

O gráfico evidencia uma tendência decrescente: unidades com maior distorção idade-série apresentam sistematicamente menores taxas de aprovação. A linha de regressão confirma essa relação negativa.

Abandono vs Aprovação

ggplot(base_final, aes(x = abandono_total, y = aprovacao_total)) +
  geom_point(alpha = 0.6, color = "darkred") +
  geom_smooth(method = "lm", color = "black") +
  labs(
    title = "Relação entre Abandono Escolar e Taxa de Aprovação",
    x = "Taxa de abandono (%)",
    y = "Taxa de aprovação (%)"
  ) +
  theme_minimal()

Há uma clara queda na aprovação conforme o abandono escolar cresce. A dispersão mostra que mesmo pequenos aumentos no abandono estão associados a reduções perceptíveis na aprovação.

Distorção vs Abandono

ggplot(base_final, aes(x = distorcao_total, y = abandono_total)) +
  geom_point(alpha = 0.6, color = "steelblue") +
  geom_smooth(method = "lm", color = "black") +
  labs(
    title = "Relação entre Distorção Idade-Série e Abandono Escolar",
    x = "Distorção idade-série (%)",
    y = "Abandono escolar (%)"
  ) +
  theme_minimal()

A relação positiva indica que escolas e redes com maior distorção idade-série também tendem a apresentar maior abandono. Isso reforça a ideia de que atraso escolar e desistência fazem parte de um mesmo ciclo de exclusão.

Conclusão

A análise dos indicadores educacionais brasileiros entre 2022 e 2024 mostra de forma consistente que a distorção idade-série e o abandono escolar exercem influência direta e negativa sobre a taxa de aprovação. Os resultados revelam três padrões principais: (1) quanto maior a distorção idade-série, menor tende a ser a aprovação; (2) quanto maior o abandono, menor a aprovação; e (3) distorção e abandono caminham juntos, reforçando mutuamente seus efeitos sobre o fluxo escolar. Essa dinâmica ficou evidente nas correlações encontradas: a aprovação apresenta correlações negativas tanto com a distorção (r = –0.67) quanto com o abandono (r = –0.79), enquanto distorção e abandono possuem correlação positiva significativa (r = 0.70).

Do ponto de vista educacional, os resultados indicam que o fracasso escolar não se distribui de forma isolada: ele se acumula e se amplifica ao longo do tempo. Estudantes com atraso escolar enfrentam maiores barreiras de aprendizagem, maior probabilidade de reprovação e, como consequência, maior risco de abandono. Esses fatores reduzem diretamente a taxa de aprovação, criando um ciclo prolongado de exclusão educacional — especialmente em contextos mais vulneráveis. Assim, os achados reforçam a necessidade de políticas públicas voltadas à correção de fluxo, monitoramento preventivo do abandono, recuperação de aprendizagem, e intervenções direcionadas a grupos específicos (como redes rurais e estaduais).

Em síntese, entender essas relações não apenas esclarece o funcionamento dos indicadores educacionais, mas também contribui para a construção de um diagnóstico sólido que pode orientar gestores, escolas e pesquisadores na formulação de ações eficazes para melhorar o desempenho e promover maior equidade no sistema educacional brasileiro.