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"
)
