Carrega pacotes. O tidyverse é uma coleção de pacotes
que inclui o dplyr (para manipulação de dados) e o
ggplot2 (para gráficos). O knitr e
kableExtra ajudam a formatar tabelas.
# Instale os pacotes se ainda não os tiver
# install.packages("tidyverse")
# install.packages("knitr")
# install.packages("kableExtra")
# install.packages("patchwork")
library(tidyverse) # Pacote principal para manipulação e gráficos
library(knitr) # Para formatar tabelas
library(kableExtra) # Funções extras para tabelas
library(patchwork)
dados <- readxl::read_excel("dados_mucuri.xlsx", sheet = "gasto")
# Visualizar os primeiros dados
kable(head(dados), caption = "Amostra dos Dados Carregados") %>%
kable_styling(bootstrap_options = "striped", full_width = F)
| ano | id_ente | nom_munic | gasto_aluno_SIOPE | gasto_aluno_SICONFI | populacao | tamanho |
|---|---|---|---|---|---|---|
| 2015 | 3100906 | Águas Formosas | 4499.187 | 4535.783 | 19248 | Médio |
| 2015 | 3104700 | Ataléia | 3135.075 | 3924.822 | 14188 | Médio |
| 2015 | 3113701 | Carlos Chagas | 2443.781 | 2291.972 | 20090 | Médio |
| 2015 | 3126802 | Frei Gaspar | 2370.562 | 2482.505 | 6031 | Pequeno |
| 2015 | 3127057 | Fronteira dos Vales | 3641.837 | 2636.991 | 4765 | Pequeno |
| 2015 | 3132305 | Itaipé | 2285.553 | 2498.093 | 12489 | Médio |
Colunas de diferença.
diff_abs (Diferença Absoluta): SIOPE - SICONFIdiff_perc (Diferença Percentual): A diferença como uma
porcentagem do valor do SICONFI.dados <- dados %>%
mutate(
diff_abs = gasto_aluno_SIOPE - gasto_aluno_SICONFI,
diff_perc = (diff_abs / gasto_aluno_SICONFI) * 100
)
kable(head(dados), caption = "Amostra dos Dados com Campos Calculados") %>%
kable_styling(bootstrap_options = "striped", full_width = F)
| ano | id_ente | nom_munic | gasto_aluno_SIOPE | gasto_aluno_SICONFI | populacao | tamanho | diff_abs | diff_perc |
|---|---|---|---|---|---|---|---|---|
| 2015 | 3100906 | Águas Formosas | 4499.187 | 4535.783 | 19248 | Médio | -36.59574 | -0.8068229 |
| 2015 | 3104700 | Ataléia | 3135.075 | 3924.822 | 14188 | Médio | -789.74750 | -20.1218662 |
| 2015 | 3113701 | Carlos Chagas | 2443.781 | 2291.972 | 20090 | Médio | 151.80910 | 6.6235155 |
| 2015 | 3126802 | Frei Gaspar | 2370.562 | 2482.505 | 6031 | Pequeno | -111.94281 | -4.5092682 |
| 2015 | 3127057 | Fronteira dos Vales | 3641.837 | 2636.991 | 4765 | Pequeno | 1004.84616 | 38.1057844 |
| 2015 | 3132305 | Itaipé | 2285.553 | 2498.093 | 12489 | Médio | -212.53944 | -8.5080682 |
Esta seção fornece um resumo de todo o conjunto de dados, antes de quebrá-lo por ano.
# Gasto e diferença
estatisticas_gerais <- dados %>%
select(gasto_aluno_SIOPE, gasto_aluno_SICONFI, diff_abs, diff_perc) %>%
summary()
# Sumário
print(estatisticas_gerais)
## gasto_aluno_SIOPE gasto_aluno_SICONFI diff_abs diff_perc
## Min. : 2091 Min. : 1546 Min. :-19219.4 Min. :-57.192
## 1st Qu.: 5072 1st Qu.: 5334 1st Qu.: -2070.1 1st Qu.:-18.113
## Median : 8257 Median : 9505 Median : -754.2 Median : -8.921
## Mean : 8481 Mean : 9812 Mean : -1331.0 Mean : -6.328
## 3rd Qu.:10875 3rd Qu.:12408 3rd Qu.: 107.8 3rd Qu.: 1.735
## Max. :18283 Max. :36201 Max. : 3276.9 Max. :211.916
dados %>%
summarise(
Fonte = "Geral",
Media_SIOPE = mean(gasto_aluno_SIOPE, na.rm = TRUE),
Media_SICONFI = mean(gasto_aluno_SICONFI, na.rm = TRUE),
Media_Diff_Abs = mean(diff_abs, na.rm = TRUE),
SD_Diff_Abs = sd(diff_abs, na.rm = TRUE),
Media_Diff_Perc = mean(diff_perc, na.rm = TRUE),
SD_Diff_Perc = sd(diff_perc, na.rm = TRUE)
) %>%
kable(caption = "Estatísticas Descritivas Gerais (2015-2023)", digits = 2) %>%
kable_styling(bootstrap_options = "striped", full_width = T)
| Fonte | Media_SIOPE | Media_SICONFI | Media_Diff_Abs | SD_Diff_Abs | Media_Diff_Perc | SD_Diff_Perc |
|---|---|---|---|---|---|---|
| Geral | 8480.62 | 9811.64 | -1331.02 | 2872.72 | -6.33 | 27.08 |
# Gráfico para a Diferença Absoluta
p1 <- ggplot(dados, aes(x = diff_abs)) +
geom_density(fill = "steelblue", alpha = 0.7) +
geom_vline(xintercept = 0, linetype = "dashed", color = "red", linewidth = 1) +
geom_vline(aes(xintercept = mean(diff_abs)), linetype = "dotted", color = "black", linewidth = 1) +
labs(title = "Distribuição da Diferença Absoluta (SIOPE - SICONFI)",
subtitle = "Linha vermelha = 0; Linha preta pontilhada = Média",
x = "Diferença Absoluta (R$)", y = "Densidade") +
theme_minimal()
# Gráfico para a Diferença Percentual
p2 <- ggplot(dados, aes(x = diff_perc)) +
geom_density(fill = "coral", alpha = 0.7) +
geom_vline(xintercept = 0, linetype = "dashed", color = "red", linewidth = 1) +
geom_vline(aes(xintercept = mean(diff_perc)), linetype = "dotted", color = "black", linewidth = 1) +
labs(title = "Distribuição da Diferença % (SIOPE - SICONFI)",
subtitle = "Linha vermelha = 0; Linha preta pontilhada = Média",
x = "Diferença Percentual (%)", y = "Densidade") +
theme_minimal()
p1 + p2
# --- GRÁFICO 1: Boxplot dos Níveis de Gasto ---
dados_long_gasto <- dados %>%
select(gasto_aluno_SIOPE, gasto_aluno_SICONFI) %>%
pivot_longer(
cols = c(gasto_aluno_SIOPE, gasto_aluno_SICONFI),
names_to = "Fonte",
values_to = "Gasto_por_Aluno"
)
b1 <- ggplot(dados_long_gasto, aes(x = Fonte, y = Gasto_por_Aluno, fill = Fonte)) +
geom_boxplot(alpha = 0.8) +
scale_fill_manual(values = c("gasto_aluno_SIOPE" = "steelblue", "gasto_aluno_SICONFI" = "coral")) +
labs(title = "Distribuição dos Gastos por Aluno (SIOPE vs. SICONFI)",
x = "Fonte de Dados",
y = "Gasto por Aluno (R$)") +
theme_light() +
theme(legend.position = "none")
# --- GRÁFICO 2: Boxplot das Diferenças ---
dados_long_diff <- dados %>%
select(diff_abs, diff_perc) %>%
pivot_longer(
cols = c(diff_abs, diff_perc),
names_to = "Metrica_Diferenca",
values_to = "Valor"
)
b2 <- ggplot(dados_long_diff, aes(x = Metrica_Diferenca, y = Valor, fill = Metrica_Diferenca)) +
geom_boxplot(alpha = 0.8, show.legend = FALSE) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red", linewidth = 1) +
facet_wrap(~ Metrica_Diferenca, scales = "free") +
scale_fill_manual(values = c("diff_abs" = "darkgreen", "diff_perc" = "purple")) +
labs(title = "Distribuição das Diferenças (Absoluta e Percentual)",
x = "Métrica de Diferença",
y = "Valor") +
theme_light()
b1 + b2
ggplot(dados_long_gasto, aes(x = Gasto_por_Aluno, color = Fonte)) +
stat_ecdf(linewidth = 1.2) +
scale_color_manual(values = c("gasto_aluno_SIOPE" = "steelblue", "gasto_aluno_SICONFI" = "coral")) +
labs(
title = "Comparação das Distribuições de Gasto (ECDF) - Geral",
subtitle = "O gráfico mostra a % de observações abaixo de um certo valor de gasto.",
x = "Gasto por Aluno (R$)",
y = "Proporção Cumulativa (0 a 1)"
) +
theme_bw() +
theme(legend.position = "bottom")
Esta é a seção central da nova análise. Aqui, quebramos as estatísticas descritivas por ano para ver a evolução.
analise_ano <- dados %>%
group_by(ano) %>%
summarise(
N_Obs = n(),
Media_SIOPE = mean(gasto_aluno_SIOPE, na.rm = TRUE),
Media_SICONFI = mean(gasto_aluno_SICONFI, na.rm = TRUE),
Media_Diff_Abs = mean(diff_abs, na.rm = TRUE),
SD_Diff_Abs = sd(diff_abs, na.rm = TRUE),
Media_Diff_Perc = mean(diff_perc, na.rm = TRUE)
) %>%
arrange(ano)
kable(analise_ano,
caption = "Análise da Diferença Média por Ano",
digits = 2) %>%
kable_styling(bootstrap_options = "striped", full_width = F)
| ano | N_Obs | Media_SIOPE | Media_SICONFI | Media_Diff_Abs | SD_Diff_Abs | Media_Diff_Perc |
|---|---|---|---|---|---|---|
| 2015 | 13 | 2913.04 | 2818.62 | 94.42 | 478.54 | 4.24 |
| 2016 | 13 | 4985.97 | 6067.43 | -1081.46 | 1082.20 | -15.75 |
| 2017 | 13 | 10984.25 | 13339.02 | -2354.77 | 3138.34 | -15.06 |
| 2018 | 13 | 8715.43 | 10994.65 | -2279.22 | 2637.93 | -19.15 |
| 2019 | 13 | 9158.59 | 10074.80 | -916.21 | 1561.67 | -6.87 |
| 2020 | 13 | 9191.33 | 8627.27 | 564.06 | 1334.11 | 7.48 |
| 2021 | 13 | 4687.60 | 4220.40 | 467.20 | 1029.83 | 21.61 |
| 2022 | 13 | 10415.79 | 12882.38 | -2466.59 | 3369.77 | -15.72 |
| 2023 | 13 | 15273.57 | 19280.21 | -4006.64 | 4880.67 | -17.73 |
Isto mostra como a distribuição da diferença absoluta mudou
ano a ano (visualização da tabela summary()).
ggplot(dados, aes(x = factor(ano), y = diff_abs, fill = factor(ano))) +
geom_boxplot(show.legend = FALSE) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs(
title = "Distribuição da Diferença Absoluta (SIOPE - SICONFI) por Ano",
subtitle = "Agrupado por Ano (2015-2023)",
x = "Ano",
y = "Diferença Absoluta (R$)"
) +
theme_light()
Isto mostra como a forma da distribuição da diferença percentual mudou ano a ano.
ggplot(dados, aes(x = factor(ano), y = diff_perc, fill = factor(ano))) +
geom_violin(trim = FALSE, show.legend = FALSE) +
geom_boxplot(width = 0.1, fill = "white", show.legend = FALSE) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs(
title = "Distribuição da Diferença Percentual (SIOPE - SICONFI) por Ano",
subtitle = "Agrupado por Ano (2015-2023)",
x = "Ano",
y = "Diferença Percentual (%)"
) +
theme_light()
Este é um gráfico poderoso que mostra como a relação entre as distribuições SIOPE e SICONFI mudou a cada ano.
# Precisamos do 'dados_long' que foi criado na Seção 3.2
dados_long_completo <- dados %>%
pivot_longer(
cols = c(gasto_aluno_SIOPE, gasto_aluno_SICONFI),
names_to = "Fonte",
values_to = "Gasto_por_Aluno"
)
ggplot(dados_long_completo, aes(x = Gasto_por_Aluno, color = Fonte)) +
stat_ecdf(linewidth = 1) +
facet_wrap(~ ano, ncol = 3) +
scale_color_manual(values = c("gasto_aluno_SIOPE" = "steelblue", "gasto_aluno_SICONFI" = "coral")) +
labs(
title = "Evolução da Comparação das Distribuições de Gasto (ECDF) por Ano",
subtitle = "Observe como a distância entre as curvas azul (SIOPE) e vermelha (SICONFI) muda ao longo dos anos.",
x = "Gasto por Aluno (R$)",
y = "Proporção Cumulativa (0 a 1)"
) +
theme_bw() +
theme(legend.position = "bottom",
strip.text = element_text(face = "bold"))
Esta seção cumpre sua nova solicitação de ver o “gráfico de gap por município para cada ano”.
Este gráfico mostra o gasto de SIOPE vs. SICONFI para todos os 13 municípios, com um painel separado para cada ano.
ggplot(dados, aes(y = fct_reorder(nom_munic, gasto_aluno_SIOPE, .fun = mean),
x = gasto_aluno_SICONFI, xend = gasto_aluno_SIOPE)) +
geom_segment(aes(yend = fct_reorder(nom_munic, gasto_aluno_SIOPE, .fun = mean)),
color = "grey", linewidth = 1, alpha = 0.7) +
geom_point(aes(color = "SICONFI"), size = 2.5, alpha = 0.8) +
geom_point(aes(x = gasto_aluno_SIOPE, color = "SIOPE"), size = 2.5, alpha = 0.8) +
# Agrupa por ano em 3 colunas
facet_wrap(~ ano, ncol = 3) +
scale_color_manual(values = c("SIOPE" = "steelblue", "SICONFI" = "coral")) +
labs(
title = "Gap Anual do Gasto por Aluno (SIOPE vs. SICONFI)",
subtitle = "Comparação lado a lado para cada município, por ano.",
x = "Gasto por Aluno (R$)",
y = "Município",
color = "Fonte de Dados"
) +
theme_bw() +
theme(legend.position = "bottom",
# Texto do eixo Y menor para caber nos 13 municípios por painel
axis.text.y = element_text(size = 7),
strip.text = element_text(face = "bold"))
Esta seção foi mantida conforme sua solicitação. Ela mostra a mesma informação da seção anterior, mas com o eixo X sendo o tempo (útil para ver a tendência de cada município).
ggplot(dados_long_completo, aes(x = ano, y = Gasto_por_Aluno, color = Fonte, group = Fonte)) +
geom_line(linewidth = 1) +
geom_point() +
geom_smooth(method = "lm", linetype = "dotted", se = FALSE, linewidth = 0.8) +
facet_wrap(~ nom_munic, scales = "free_y", ncol = 4) +
labs(
title = "Comparação Gasto por Aluno (SIOPE vs. SICONFI) por Município",
subtitle = "Período: 2015-2023",
x = "Ano",
y = "Gasto por Aluno (R$)",
color = "Fonte de Dados"
) +
scale_x_continuous(breaks = seq(2015, 2023, by = 2)) +
theme_bw() + # Tema limpo
theme(
legend.position = "bottom",
strip.text = element_text(size = 8, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1)
)
O gráfico abaixo foca em plotar a diff_perc ao longo do
tempo.
ggplot(dados, aes(x = ano, y = diff_perc)) +
geom_line(color = "darkgreen", linewidth = 1) +
geom_point(color = "darkgreen") +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
facet_wrap(~ nom_munic, ncol = 4) +
labs(
title = "Evolução da Diferença Percentual (SIOPE - SICONFI) / SICONFI",
subtitle = "Período: 2015-2023. Linha vermelha = 0% de diferença.",
x = "Ano",
y = "Diferença Percentual (%)"
) +
scale_x_continuous(breaks = seq(2015, 2023, by = 2)) +
theme_bw() +
theme(
strip.text = element_text(size = 8, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1)
)