Médias gerais

library(tidyverse)
## Warning in system("timedatectl", intern = TRUE): running command 'timedatectl'
## had status 1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(plotly)
## 
## Attaching package: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
inep_notas_estadual <- read_csv("data/inep_notas_estadual.csv")
## Rows: 270 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): nivel, sg_uf
## dbl (4): ano, media_portugues, media_matematica, total_escolas
## lgl (1): codigo_ibge
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Dados fornecidos
dados_nacional <- data.frame(
  ano = c(2005, 2007, 2009, 2011, 2013, 2015, 2017, 2019, 2021, 2023),
  media_portugues = c(171.00, 171.28, 177.39, 184.05, 188.36, 200.74, 207.00, 206.50, 200.77, 205.81),
  media_matematica = c(178.65, 188.70, 197.12, 202.71, 203.74, 213.24, 216.88, 220.10, 210.52, 216.72),
  total_escolas = c(27949, 37261, 43541, 40399, 38832, 38469, 41520, 42157, 32740, 41301)
)

# Transformar para formato longo (tidy) para facilitar visualização
dados_long <- dados_nacional %>%
  pivot_longer(
    cols = starts_with("media_"),
    names_to = "disciplina",
    names_prefix = "media_",
    values_to = "media"
  )

# 1. Gráfico de linhas - Evolução das médias
ggplot(dados_long, aes(x = ano, y = media, color = disciplina)) +
  geom_line(size = 1.5) +
  geom_point(size = 3) +
  geom_text(aes(label = round(media, 1)), vjust = -0.8, size = 3) +
  scale_color_manual(
    values = c("portugues" = "#3498db", "matematica" = "#e74c3c"),
    labels = c("Português", "Matemática")
  ) +
  scale_x_continuous(breaks = dados_nacional$ano) +
  labs(
    title = "Evolução das Médias Nacionais do ENEM (2005-2023)",
    subtitle = "Médias em Português e Matemática",
    x = "Ano",
    y = "Média",
    color = "Disciplina"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    plot.subtitle = element_text(hjust = 0.5, size = 12),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "bottom",
    panel.grid.minor = element_blank()
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# 2. Gráfico de barras lado a lado
ggplot(dados_long, aes(x = factor(ano), y = media, fill = disciplina)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.7) +
  geom_text(
    aes(label = round(media, 1)),
    position = position_dodge(width = 0.8),
    vjust = -0.5,
    size = 3
  ) +
  scale_fill_manual(
    values = c("portugues" = "#3498db", "matematica" = "#e74c3c"),
    labels = c("Português", "Matemática")
  ) +
  labs(
    title = "Médias Nacionais por Ano e Disciplina",
    x = "Ano",
    y = "Média",
    fill = "Disciplina"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

# 3. Gráfico de diferença entre disciplinas
dados_nacional <- dados_nacional %>%
  mutate(diferenca = media_matematica - media_portugues)

ggplot(dados_nacional, aes(x = factor(ano), y = diferenca)) +
  geom_bar(stat = "identity", fill = ifelse(dados_nacional$diferenca > 0, "#2ecc71", "#e74c3c"), width = 0.6) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
  geom_text(
    aes(label = paste0(ifelse(diferenca > 0, "+", ""), round(diferenca, 1))),
    vjust = ifelse(dados_nacional$diferenca > 0, -0.5, 1.5),
    size = 3.5
  ) +
  labs(
    title = "Diferença entre Médias de Matemática e Português",
    subtitle = "Valores positivos = Matemática > Português",
    x = "Ano",
    y = "Diferença (Matemática - Português)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

# 4. Visualização interativa com plotly
p <- plot_ly() %>%
  add_trace(
    data = dados_nacional,
    x = ~ano,
    y = ~media_portugues,
    type = 'scatter',
    mode = 'lines+markers',
    name = 'Português',
    line = list(color = '#3498db', width = 3),
    marker = list(size = 8)
  ) %>%
  add_trace(
    x = ~ano,
    y = ~media_matematica,
    type = 'scatter',
    mode = 'lines+markers',
    name = 'Matemática',
    line = list(color = '#e74c3c', width = 3),
    marker = list(size = 8)
  ) %>%
  layout(
    title = list(
      text = "<b>Evolução das Médias Nacionais do ENEM (2005-2023)</b>",
      x = 0.05
    ),
    xaxis = list(
      title = "Ano",
      tickmode = 'array',
      tickvals = dados_nacional$ano
    ),
    yaxis = list(title = "Média"),
    hovermode = 'x unified',
    legend = list(orientation = 'h', x = 0.5, y = -0.2, xanchor = 'center'),
    plot_bgcolor = '#f5f5f5'
  )

# Exibir gráfico interativo
p
# 5. Heatmap de performance (opcional)
ggplot(dados_long, aes(x = factor(ano), y = disciplina, fill = media)) +
  geom_tile(color = "white", size = 1) +
  geom_text(aes(label = round(media, 1)), color = "white", size = 5, fontface = "bold") +
  scale_fill_gradient(low = "#e74c3c", high = "#2ecc71", name = "Média") +
  scale_y_discrete(labels = c("Português", "Matemática")) +
  labs(
    title = "Heatmap de Performance por Ano e Disciplina",
    x = "Ano",
    y = "Disciplina"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

# 6. Análise estatística básica
cat("===== RESUMO ESTATÍSTICO =====\n")
## ===== RESUMO ESTATÍSTICO =====
cat("Português:\n")
## Português:
cat(sprintf("  Média geral: %.2f\n", mean(dados_nacional$media_portugues)))
##   Média geral: 191.29
cat(sprintf("  Variação total: +%.1f pontos\n", 
    dados_nacional$media_portugues[10] - dados_nacional$media_portugues[1]))
##   Variação total: +34.8 pontos
cat(sprintf("  Melhor ano: %d (%.1f)\n", 
    dados_nacional$ano[which.max(dados_nacional$media_portugues)],
    max(dados_nacional$media_portugues)))
##   Melhor ano: 2017 (207.0)
cat("\nMatemática:\n")
## 
## Matemática:
cat(sprintf("  Média geral: %.2f\n", mean(dados_nacional$media_matematica)))
##   Média geral: 204.84
cat(sprintf("  Variação total: +%.1f pontos\n", 
    dados_nacional$media_matematica[10] - dados_nacional$media_matematica[1]))
##   Variação total: +38.1 pontos
cat(sprintf("  Melhor ano: %d (%.1f)\n", 
    dados_nacional$ano[which.max(dados_nacional$media_matematica)],
    max(dados_nacional$media_matematica)))
##   Melhor ano: 2019 (220.1)
cat("\nDiferença Matemática-Português:\n")
## 
## Diferença Matemática-Português:
cat(sprintf("  Média da diferença: %.2f\n", mean(dados_nacional$diferenca)))
##   Média da diferença: 13.55
cat(sprintf("  Ano com maior diferença: %d (%.1f)\n", 
    dados_nacional$ano[which.max(dados_nacional$diferenca)],
    max(dados_nacional$diferenca)))
##   Ano com maior diferença: 2009 (19.7)
# 7. Exportar gráficos (opcional)
# ggsave("evolucao_medias_nacionais.png", width = 12, height = 8, dpi = 300)
# ggsave("diferenca_disciplinas.png", width = 10, height = 6, dpi = 300)

# 8. Dataframe para análise adicional
print(dados_nacional %>%
  mutate(
    crescimento_portugues = round((media_portugues/lag(media_portugues) - 1) * 100, 2),
    crescimento_matematica = round((media_matematica/lag(media_matematica) - 1) * 100, 2)
  ))
##     ano media_portugues media_matematica total_escolas diferenca
## 1  2005          171.00           178.65         27949      7.65
## 2  2007          171.28           188.70         37261     17.42
## 3  2009          177.39           197.12         43541     19.73
## 4  2011          184.05           202.71         40399     18.66
## 5  2013          188.36           203.74         38832     15.38
## 6  2015          200.74           213.24         38469     12.50
## 7  2017          207.00           216.88         41520      9.88
## 8  2019          206.50           220.10         42157     13.60
## 9  2021          200.77           210.52         32740      9.75
## 10 2023          205.81           216.72         41301     10.91
##    crescimento_portugues crescimento_matematica
## 1                     NA                     NA
## 2                   0.16                   5.63
## 3                   3.57                   4.46
## 4                   3.75                   2.84
## 5                   2.34                   0.51
## 6                   6.57                   4.66
## 7                   3.12                   1.71
## 8                  -0.24                   1.48
## 9                  -2.77                  -4.35
## 10                  2.51                   2.95

Médias regionais por estado

library(tidyverse)
library(ggplot2)

# 1. Transformar para formato longo (tidy)
dados_long <- inep_notas_estadual %>%
  select(-codigo_ibge) %>%  # Remover coluna vazia
  pivot_longer(
    cols = c(media_portugues, media_matematica),
    names_to = "disciplina",
    names_prefix = "media_",
    values_to = "nota"
  ) %>%
  mutate(
    disciplina = factor(disciplina, 
                       levels = c("portugues", "matematica"),
                       labels = c("Português", "Matemática"))
  )

# 2. Gráfico facets - um painel para cada estado
ggplot(dados_long, aes(x = ano, y = nota, color = disciplina)) +
  geom_line(size = 1.2, alpha = 0.8) +
  geom_point(size = 2) +
  facet_wrap(~ sg_uf, ncol = 6) +  # 6 colunas para organizar os 27 estados
  scale_color_manual(values = c("Português" = "#3498db", "Matemática" = "#e74c3c")) +
  labs(
    title = "Evolução das Médias por Estado (2005-2023)",
    subtitle = "Português vs Matemática",
    x = "Ano",
    y = "Nota Média",
    color = "Disciplina"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    plot.subtitle = element_text(hjust = 0.5, size = 12),
    axis.text.x = element_text(angle = 45, hjust = 1, size = 8),
    strip.text = element_text(face = "bold"),
    legend.position = "bottom",
    panel.spacing = unit(1, "lines")
  )

# 3. Versão com pontos apenas nos anos ímpares para melhor legibilidade
ggplot(dados_long, aes(x = ano, y = nota, color = disciplina)) +
  geom_line(size = 1) +
  geom_point(data = subset(dados_long, ano %% 2 == 1), size = 2) +  # Apenas anos ímpares
  facet_wrap(~ sg_uf, ncol = 6) +
  scale_color_manual(values = c("Português" = "#3498db", "Matemática" = "#e74c3c")) +
  scale_x_continuous(breaks = seq(2005, 2023, 3)) +  # Apenas a cada 3 anos
  labs(
    title = "Evolução das Médias por Estado",
    subtitle = "Anos ímpares destacados",
    x = "Ano",
    y = "Nota Média",
    color = "Disciplina"
  ) +
  theme_minimal()

# 4. Versão separada por disciplina (2 gráficos)
ggplot(dados_long, aes(x = ano, y = nota, group = sg_uf, color = sg_uf)) +
  geom_line(alpha = 0.6, size = 0.8) +
  facet_wrap(~ disciplina, ncol = 2) +
  labs(
    title = "Comparação entre Estados por Disciplina",
    x = "Ano",
    y = "Nota Média"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",  # Remover legenda (muitos estados)
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  # Adicionar labels apenas para alguns estados extremos (opcional)
  geom_text(
    data = dados_long %>%
      group_by(sg_uf, disciplina) %>%
      filter(ano == max(ano)),  # Mostrar apenas o último ano
    aes(label = sg_uf),
    vjust = -0.5,
    hjust = 0.5,
    size = 2,
    check_overlap = TRUE
  )

# 5. Versão mais limpa - média móvel de 2 anos para suavizar
dados_suavizado <- dados_long %>%
  arrange(sg_uf, disciplina, ano) %>%
  group_by(sg_uf, disciplina) %>%
  mutate(
    nota_suavizada = zoo::rollmean(nota, k = 2, fill = NA, align = "right")
  ) %>%
  filter(!is.na(nota_suavizada))

ggplot(dados_suavizado, aes(x = ano, y = nota_suavizada, color = disciplina)) +
  geom_line(size = 1) +
  facet_wrap(~ sg_uf, ncol = 6) +
  scale_color_manual(values = c("Português" = "#3498db", "Matemática" = "#e74c3c")) +
  labs(
    title = "Evolução Suavizada por Estado",
    subtitle = "Média móvel de 2 anos",
    x = "Ano",
    y = "Nota Média Suavizada",
    color = "Disciplina"
  ) +
  theme_minimal()

Previsões

library(tidyverse)
library(broom)

# 1. Função para ajustar modelo linear e fazer previsões
ajustar_modelo_e_prever <- function(dados, estado, disciplina) {
  
  # Filtrar dados para o estado e disciplina específicos
  dados_filtrados <- dados %>%
    filter(sg_uf == estado, disciplina_nome == disciplina)
  
  if (nrow(dados_filtrados) < 3) {
    warning(paste("Dados insuficientes para", estado, "-", disciplina))
    return(NULL)
  }
  
  # Ajustar modelo linear simples (nota ~ ano)
  modelo <- lm(nota ~ ano, data = dados_filtrados)
  
  # Criar dataframe para previsões
  anos_futuros <- data.frame(ano = c(2025, 2027))
  
  # Fazer previsões
  previsoes <- predict(modelo, newdata = anos_futuros, se.fit = TRUE)
  
  # Coletar resultados
  resultado <- data.frame(
    estado = estado,
    disciplina = disciplina,
    ano = anos_futuros$ano,
    previsao = previsoes$fit,
    erro_padrao = previsoes$se.fit,
    intercepto = coef(modelo)[1],
    coeficiente_ano = coef(modelo)[2],
    r_quadrado = summary(modelo)$r.squared,
    stringsAsFactors = FALSE
  )
  
  return(list(modelo = modelo, previsoes = resultado))
}

# 2. Transformar dados para formato longo (se ainda não tiver feito)
dados_long <- inep_notas_estadual %>%
  select(-codigo_ibge) %>%
  pivot_longer(
    cols = c(media_portugues, media_matematica),
    names_to = "disciplina_nome",
    names_prefix = "media_",
    values_to = "nota"
  ) %>%
  mutate(
    disciplina_nome = factor(disciplina_nome, 
                            levels = c("portugues", "matematica"),
                            labels = c("Português", "Matemática"))
  )

# 3. Lista de estados únicos
estados <- unique(dados_long$sg_uf)

# 4. Ajustar modelos para todos os estados e disciplinas
resultados <- list()
previsoes_completas <- data.frame()

for(estado in estados) {
  for(disciplina in c("Português", "Matemática")) {
    
    resultado <- ajustar_modelo_e_prever(dados_long, estado, disciplina)
    
    if(!is.null(resultado)) {
      # Armazenar modelo
      resultados[[paste(estado, disciplina, sep = "_")]] <- resultado$modelo
      
      # Adicionar previsões ao dataframe
      previsoes_completas <- bind_rows(previsoes_completas, resultado$previsoes)
    }
  }
}

# 5. Visualizar previsões
print(previsoes_completas)
##         estado disciplina  ano previsao erro_padrao intercepto coeficiente_ano
## 1...1       AC  Português 2025 215.4687    5.663333  -4369.990        2.264424
## 2...2       AC  Português 2027 219.9975    6.486157  -4369.990        2.264424
## 1...3       AC Matemática 2025 226.9580    7.174972  -4507.124        2.337818
## 2...4       AC Matemática 2027 231.6336    8.217420  -4507.124        2.337818
## 1...5       AL  Português 2025 206.1900    4.705942  -5985.155        3.057455
## 2...6       AL  Português 2027 212.3049    5.389666  -5985.155        3.057455
## 1...7       AL Matemática 2025 222.1880    4.395380  -6198.719        3.170818
## 2...8       AL Matemática 2027 228.5296    5.033983  -6198.719        3.170818
## 1...9       AM  Português 2025 201.7367    3.807422  -3486.463        1.821333
## 2...10      AM  Português 2027 205.3793    4.360601  -3486.463        1.821333
## 1...11      AM Matemática 2025 212.8027    4.236777  -3241.418        1.705788
## 2...12      AM Matemática 2027 216.2142    4.852336  -3241.418        1.705788
## 1...13      AP  Português 2025 186.8773    2.420584  -2757.350        1.453939
## 2...14      AP  Português 2027 189.7852    2.772270  -2757.350        1.453939
## 1...15      AP Matemática 2025 195.7173    2.802795  -2448.258        1.305667
## 2...16      AP Matemática 2027 198.3287    3.210012  -2448.258        1.305667
## 1...17      BA  Português 2025 194.8313    3.732122  -3527.732        1.838303
## 2...18      BA  Português 2027 198.5079    4.274360  -3527.732        1.838303
## 1...19      BA Matemática 2025 204.5387    3.651358  -3064.486        1.614333
## 2...20      BA Matemática 2027 207.7673    4.181862  -3064.486        1.614333
## 1...21      CE  Português 2025 240.9140    5.273124  -8413.384        4.273727
## 2...22      CE  Português 2027 249.4615    6.039254  -8413.384        4.273727
## 1...23      CE Matemática 2025 251.4527    5.544314  -8184.820        4.166061
## 2...24      CE Matemática 2027 259.7848    6.349846  -8184.820        4.166061
## 1...25      DF  Português 2025 227.7207    3.004486  -3273.995        1.729242
## 2...26      DF  Português 2027 231.1792    3.441007  -3273.995        1.729242
## 1...27      DF Matemática 2025 235.6667    4.535905  -2354.247        1.278970
## 2...28      DF Matemática 2027 238.2246    5.194925  -2354.247        1.278970
## 1...29      ES  Português 2025 228.0067    3.316385  -4971.212        2.567515
## 2...30      ES  Português 2027 233.1417    3.798222  -4971.212        2.567515
## 1...31      ES Matemática 2025 238.1147    4.388069  -4378.824        2.279970
## 2...32      ES Matemática 2027 242.6746    5.025610  -4378.824        2.279970
## 1...33      GO  Português 2025 228.1520    4.754277  -5123.003        2.642545
## 2...34      GO  Português 2027 233.4371    5.445024  -5123.003        2.642545
## 1...35      GO Matemática 2025 236.8647    5.512535  -4605.954        2.391515
## 2...36      GO Matemática 2027 241.6477    6.313449  -4605.954        2.391515
## 1...37      MA  Português 2025 185.0307    3.390901  -3204.942        1.674061
## 2...38      MA  Português 2027 188.3788    3.883564  -3204.942        1.674061
## 1...39      MA Matemática 2025 194.5080    3.668560  -2752.419        1.455273
## 2...40      MA Matemática 2027 197.4185    4.201563  -2752.419        1.455273
## 1...41      MG  Português 2025 225.1060    6.120023  -3816.242        1.995727
## 2...42      MG  Português 2027 229.0975    7.009198  -3816.242        1.995727
## 1...43      MG Matemática 2025 234.1147    7.658432  -2795.592        1.496152
## 2...44      MG Matemática 2027 237.1070    8.771123  -2795.592        1.496152
## 1...45      MS  Português 2025 213.6287    5.972573  -3265.996        1.718333
## 2...46      MS  Português 2027 217.0653    6.840326  -3265.996        1.718333
## 1...47      MS Matemática 2025 221.2127    7.078389  -2435.710        1.312061
## 2...48      MS Matemática 2027 223.8368    8.106806  -2435.710        1.312061
## 1...49      MT  Português 2025 211.6260    3.468691  -4007.922        2.083727
## 2...50      MT  Português 2027 215.7935    3.972655  -4007.922        2.083727
## 1...51      MT Matemática 2025 220.4900    3.880258  -3386.403        1.781182
## 2...52      MT Matemática 2027 224.0524    4.444019  -3386.403        1.781182
## 1...53      PA  Português 2025 186.0307    3.081062  -2558.703        1.355424
## 2...54      PA  Português 2027 188.7415    3.528708  -2558.703        1.355424
## 1...55      PA Matemática 2025 195.6507    3.492714  -2268.345        1.216788
## 2...56      PA Matemática 2027 198.0842    4.000170  -2268.345        1.216788
## 1...57      PB  Português 2025 200.5233    2.701072  -4201.336        2.173758
## 2...58      PB  Português 2027 204.8708    3.093510  -4201.336        2.173758
## 1...59      PB Matemática 2025 211.3000    3.234370  -3726.405        1.944545
## 2...60      PB Matemática 2027 215.1891    3.704290  -3726.405        1.944545
## 1...61      PE  Português 2025 204.2027    3.810406  -4796.566        2.469515
## 2...62      PE  Português 2027 209.1417    4.364019  -4796.566        2.469515
## 1...63      PE Matemática 2025 216.3007    3.670518  -4511.829        2.334879
## 2...64      PE Matemática 2027 220.9704    4.203806  -4511.829        2.334879
## 1...65      PI  Português 2025 203.2360    3.290195  -4372.896        2.259818
## 2...66      PI  Português 2027 207.7556    3.768226  -4372.896        2.259818
## 1...67      PI Matemática 2025 213.6500    4.079815  -4045.845        2.103455
## 2...68      PI Matemática 2027 217.8569    4.672570  -4045.845        2.103455
## 1...69      PR  Português 2025 237.0247    4.247304  -5272.939        2.720970
## 2...70      PR  Português 2027 242.4666    4.864393  -5272.939        2.720970
## 1...71      PR Matemática 2025 250.8200    5.362985  -4584.696        2.387909
## 2...72      PR Matemática 2027 255.5958    6.142171  -4584.696        2.387909
## 1...73      RJ  Português 2025 216.3033    4.317510  -3454.531        1.812758
## 2...74      RJ  Português 2027 219.9288    4.944799  -3454.531        1.812758
## 1...75      RJ Matemática 2025 225.6127    5.408129  -2821.583        1.504788
## 2...76      RJ Matemática 2027 228.6222    6.193874  -2821.583        1.504788
## 1...77      RN  Português 2025 196.3567    3.562429  -4489.248        2.313879
## 2...78      RN  Português 2027 200.9844    4.080013  -4489.248        2.313879
## 1...79      RN Matemática 2025 203.9840    3.667637  -3679.782        1.917909
## 2...80      RN Matemática 2027 207.8198    4.200506  -3679.782        1.917909
## 1...81      RO  Português 2025 210.3360    5.814501  -3867.094        2.013545
## 2...82      RO  Português 2027 214.3631    6.659287  -3867.094        2.013545
## 1...83      RO Matemática 2025 222.0040    6.627896  -3445.455        1.811091
## 2...84      RO Matemática 2027 225.6262    7.590861  -3445.455        1.811091
## 1...85      RR  Português 2025 193.0900    4.423340  -2506.971        1.333364
## 2...86      RR  Português 2027 195.7567    5.066006  -2506.971        1.333364
## 1...87      RR Matemática 2025 205.0533    5.697031  -2451.992        1.312121
## 2...88      RR Matemática 2027 207.6776    6.524750  -2451.992        1.312121
## 1...89      RS  Português 2025 228.7560    3.516058  -4738.569        2.453000
## 2...90      RS  Português 2027 233.6620    4.026905  -4738.569        2.453000
## 1...91      RS Matemática 2025 237.6940    4.333790  -3925.890        2.056091
## 2...92      RS Matemática 2027 241.8062    4.963444  -3925.890        2.056091
## 1...93      SC  Português 2025 236.7800    5.125791  -5510.170        2.838000
## 2...94      SC  Português 2027 242.4560    5.870515  -5510.170        2.838000
## 1...95      SC Matemática 2025 246.0880    5.562773  -4663.985        2.424727
## 2...96      SC Matemática 2027 250.9375    6.370987  -4663.985        2.424727
## 1...97      SE  Português 2025 186.8027    2.908175  -2688.452        1.419879
## 2...98      SE  Português 2027 189.6424    3.330703  -2688.452        1.419879
## 1...99      SE Matemática 2025 199.1120    2.911992  -2310.415        1.239273
## 2...100     SE Matemática 2027 201.5905    3.335074  -2310.415        1.239273
## 1...101     SP  Português 2025 232.8793    5.653523  -4790.471        2.480667
## 2...102     SP  Português 2027 237.8407    6.474922  -4790.471        2.480667
## 1...103     SP Matemática 2025 247.0860    6.406278  -4435.634        2.312455
## 2...104     SP Matemática 2027 251.7109    7.337044  -4435.634        2.312455
## 1...105     TO  Português 2025 200.3560    4.093477  -3078.303        1.619091
## 2...106     TO  Português 2027 203.5942    4.688216  -3078.303        1.619091
## 1...107     TO Matemática 2025 212.5707    4.962777  -3018.532        1.595606
## 2...108     TO Matemática 2027 215.7619    5.683817  -3018.532        1.595606
##         r_quadrado
## 1...1    0.7547534
## 2...2    0.7547534
## 1...3    0.6714498
## 2...4    0.6714498
## 1...5    0.8904187
## 2...6    0.8904187
## 1...7    0.9092393
## 2...8    0.9092393
## 1...9    0.8149867
## 2...10   0.8149867
## 1...11   0.7573048
## 2...12   0.7573048
## 1...13   0.8741374
## 2...14   0.8741374
## 1...15   0.8068552
## 2...16   0.8068552
## 1...17   0.8236454
## 2...18   0.8236454
## 1...19   0.7900384
## 2...20   0.7900384
## 1...21   0.9267115
## 2...22   0.9267115
## 1...23   0.9157463
## 2...24   0.9157463
## 1...25   0.8644397
## 2...26   0.8644397
## 1...27   0.6048157
## 2...28   0.6048157
## 1...29   0.9202418
## 2...30   0.9202418
## 1...31   0.8386283
## 2...32   0.8386283
## 1...33   0.8560555
## 2...34   0.8560555
## 1...35   0.7836926
## 2...36   0.7836926
## 1...37   0.8243098
## 2...38   0.8243098
## 1...39   0.7518119
## 2...40   0.7518119
## 1...41   0.6718130
## 2...42   0.6718130
## 1...43   0.4235270
## 2...44   0.4235270
## 1...45   0.6144046
## 2...46   0.6144046
## 1...47   0.3981010
## 2...48   0.3981010
## 1...49   0.8741623
## 2...50   0.8741623
## 1...51   0.8022255
## 2...52   0.8022255
## 1...53   0.7883805
## 2...54   0.7883805
## 1...55   0.7002695
## 2...56   0.7002695
## 1...57   0.9257474
## 2...58   0.9257474
## 1...59   0.8743411
## 2...60   0.8743411
## 1...61   0.8899356
## 2...62   0.8899356
## 1...63   0.8862268
## 2...64   0.8862268
## 1...65   0.9008037
## 2...66   0.9008037
## 1...67   0.8365214
## 2...68   0.8365214
## 1...69   0.8876460
## 2...70   0.8876460
## 1...71   0.7923758
## 2...72   0.7923758
## 1...73   0.7723893
## 2...74   0.7723893
## 1...75   0.5984495
## 2...76   0.5984495
## 1...77   0.8903652
## 2...78   0.8903652
## 1...79   0.8403571
## 2...80   0.8403571
## 1...81   0.6977477
## 2...82   0.6977477
## 1...83   0.5897168
## 2...84   0.5897168
## 1...85   0.6362513
## 2...86   0.6362513
## 1...87   0.5052275
## 2...88   0.5052275
## 1...89   0.9035628
## 2...90   0.9035628
## 1...91   0.8124851
## 2...92   0.8124851
## 1...93   0.8550958
## 2...94   0.8550958
## 1...95   0.7852884
## 2...96   0.7852884
## 1...97   0.8210683
## 2...98   0.8210683
## 1...99   0.7771069
## 2...100  0.7771069
## 1...101  0.7875145
## 2...102  0.7875145
## 1...103  0.7149551
## 2...104  0.7149551
## 1...105  0.7507191
## 2...106  0.7507191
## 1...107  0.6655413
## 2...108  0.6655413
# 6. Resumo estatístico das previsões
resumo_previsoes <- previsoes_completas %>%
  group_by(disciplina, ano) %>%
  summarise(
    media_previsao = mean(previsao, na.rm = TRUE),
    desvio_previsao = sd(previsao, na.rm = TRUE),
    min_previsao = min(previsao, na.rm = TRUE),
    max_previsao = max(previsao, na.rm = TRUE),
    .groups = 'drop'
  )

print(resumo_previsoes)
## # A tibble: 4 × 6
##   disciplina   ano media_previsao desvio_previsao min_previsao max_previsao
##   <chr>      <dbl>          <dbl>           <dbl>        <dbl>        <dbl>
## 1 Matemática  2025           222.            17.5         195.         251.
## 2 Matemática  2027           225.            18.4         197.         260.
## 3 Português   2025           211.            17.4         185.         241.
## 4 Português   2027           215.            18.3         188.         249.
# 7. Gráfico das previsões para 2025
previsoes_2025 <- previsoes_completas %>%
  filter(ano == 2025)

ggplot(previsoes_2025, aes(x = reorder(estado, previsao), y = previsao, fill = disciplina)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  geom_errorbar(aes(ymin = previsao - 1.96 * erro_padrao, 
                    ymax = previsao + 1.96 * erro_padrao),
                position = position_dodge(width = 0.8),
                width = 0.3) +
  labs(
    title = "Previsões para 2025 por Estado",
    subtitle = "Com intervalo de confiança de 95%",
    x = "Estado",
    y = "Nota Prevista",
    fill = "Disciplina"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
    legend.position = "bottom"
  ) +
  scale_fill_manual(values = c("Português" = "#3498db", "Matemática" = "#e74c3c"))

# 8. Visualizar modelos específicos (exemplo: SP)
if("SP_Português" %in% names(resultados)) {
  modelo_sp_port <- resultados[["SP_Português"]]
  
  # Resumo do modelo
  print(summary(modelo_sp_port))
  
  # Gráfico do ajuste para SP Português
  dados_sp_port <- dados_long %>%
    filter(sg_uf == "SP", disciplina_nome == "Português")
  
  ggplot(dados_sp_port, aes(x = ano, y = nota)) +
    geom_point(size = 3, color = "#3498db") +
    geom_smooth(method = "lm", se = TRUE, color = "#2c3e50", fill = "lightblue") +
    geom_point(data = filter(previsoes_completas, estado == "SP" & disciplina == "Português"),
               aes(x = ano, y = previsao),
               color = "red", size = 4, shape = 17) +
    labs(
      title = "Modelo Linear - SP Português",
      subtitle = paste("R² =", round(summary(modelo_sp_port)$r.squared, 3)),
      x = "Ano",
      y = "Nota"
    ) +
    theme_minimal()
}
## 
## Call:
## lm(formula = nota ~ ano, data = dados_filtrados)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -10.288  -5.901  -1.192   4.686  13.386 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -4790.4707   917.5296  -5.221 0.000802 ***
## ano             2.4807     0.4556   5.445 0.000612 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.276 on 8 degrees of freedom
## Multiple R-squared:  0.7875, Adjusted R-squared:  0.761 
## F-statistic: 29.65 on 1 and 8 DF,  p-value: 0.0006122
## `geom_smooth()` using formula = 'y ~ x'

# 9. Tabela de coeficientes (crescimento anual por estado)
coeficientes <- previsoes_completas %>%
  select(estado, disciplina, coeficiente_ano, r_quadrado) %>%
  distinct() %>%
  arrange(disciplina, desc(coeficiente_ano))

print("Estados com maior crescimento anual:")
## [1] "Estados com maior crescimento anual:"
print(coeficientes)
##        estado disciplina coeficiente_ano r_quadrado
## 1...1      CE Matemática        4.166061  0.9157463
## 1...2      AL Matemática        3.170818  0.9092393
## 1...3      SC Matemática        2.424727  0.7852884
## 1...4      GO Matemática        2.391515  0.7836926
## 1...5      PR Matemática        2.387909  0.7923758
## 1...6      AC Matemática        2.337818  0.6714498
## 1...7      PE Matemática        2.334879  0.8862268
## 1...8      SP Matemática        2.312455  0.7149551
## 1...9      ES Matemática        2.279970  0.8386283
## 1...10     PI Matemática        2.103455  0.8365214
## 1...11     RS Matemática        2.056091  0.8124851
## 1...12     PB Matemática        1.944545  0.8743411
## 1...13     RN Matemática        1.917909  0.8403571
## 1...14     RO Matemática        1.811091  0.5897168
## 1...15     MT Matemática        1.781182  0.8022255
## 1...16     AM Matemática        1.705788  0.7573048
## 1...17     BA Matemática        1.614333  0.7900384
## 1...18     TO Matemática        1.595606  0.6655413
## 1...19     RJ Matemática        1.504788  0.5984495
## 1...20     MG Matemática        1.496152  0.4235270
## 1...21     MA Matemática        1.455273  0.7518119
## 1...22     RR Matemática        1.312121  0.5052275
## 1...23     MS Matemática        1.312061  0.3981010
## 1...24     AP Matemática        1.305667  0.8068552
## 1...25     DF Matemática        1.278970  0.6048157
## 1...26     SE Matemática        1.239273  0.7771069
## 1...27     PA Matemática        1.216788  0.7002695
## 1...28     CE  Português        4.273727  0.9267115
## 1...29     AL  Português        3.057455  0.8904187
## 1...30     SC  Português        2.838000  0.8550958
## 1...31     PR  Português        2.720970  0.8876460
## 1...32     GO  Português        2.642545  0.8560555
## 1...33     ES  Português        2.567515  0.9202418
## 1...34     SP  Português        2.480667  0.7875145
## 1...35     PE  Português        2.469515  0.8899356
## 1...36     RS  Português        2.453000  0.9035628
## 1...37     RN  Português        2.313879  0.8903652
## 1...38     AC  Português        2.264424  0.7547534
## 1...39     PI  Português        2.259818  0.9008037
## 1...40     PB  Português        2.173758  0.9257474
## 1...41     MT  Português        2.083727  0.8741623
## 1...42     RO  Português        2.013545  0.6977477
## 1...43     MG  Português        1.995727  0.6718130
## 1...44     BA  Português        1.838303  0.8236454
## 1...45     AM  Português        1.821333  0.8149867
## 1...46     RJ  Português        1.812758  0.7723893
## 1...47     DF  Português        1.729242  0.8644397
## 1...48     MS  Português        1.718333  0.6144046
## 1...49     MA  Português        1.674061  0.8243098
## 1...50     TO  Português        1.619091  0.7507191
## 1...51     AP  Português        1.453939  0.8741374
## 1...52     SE  Português        1.419879  0.8210683
## 1...53     PA  Português        1.355424  0.7883805
## 1...54     RR  Português        1.333364  0.6362513
# 10. Exportar previsões para CSV
write.csv(previsoes_completas, "previsoes_2025_2027.csv", row.names = FALSE, fileEncoding = "UTF-8")

# 11. Versão simplificada - previsões nacionais médias
previsoes_nacionais <- previsoes_completas %>%
  group_by(disciplina, ano) %>%
  summarise(
    previsao_media = mean(previsao),
    .groups = 'drop'
  )

print("Previsões nacionais médias:")
## [1] "Previsões nacionais médias:"
print(previsoes_nacionais)
## # A tibble: 4 × 3
##   disciplina   ano previsao_media
##   <chr>      <dbl>          <dbl>
## 1 Matemática  2025           222.
## 2 Matemática  2027           225.
## 3 Português   2025           211.
## 4 Português   2027           215.
# 12. Heatmap de crescimento
ggplot(coeficientes, aes(x = estado, y = disciplina, fill = coeficiente_ano)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(coeficiente_ano, 2)), color = "white", size = 3) +
  scale_fill_gradient2(low = "red", mid = "white", high = "green", midpoint = 0) +
  labs(
    title = "Taxa de Crescimento Anual por Estado",
    subtitle = "Valores positivos = tendência de crescimento",
    x = "Estado",
    y = "Disciplina",
    fill = "Crescimento/ano"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
    legend.position = "right"
  )