As emendas parlamentares são a forma pela qual deputados e senadores mudam o Orçamento da União e direcionam dinheiro federal para estados, municípios e instituições. Elas ficaram bastante comentadas nos últimos anos, principalmente por causa da discussão sobre transparência no uso desses recursos.
Neste trabalho eu uso os dados abertos do Portal da Transparência, que são divulgados em três tabelas (Emendas, Por Favorecido e Convênios). A pergunta que guia a análise é:
Para onde vão os recursos das emendas e como Pernambuco se compara aos demais estados do Nordeste?
Para respondê-la, vou (1) limpar e juntar as três tabelas, (2) olhar a evolução do valor empenhado e pago ao longo dos anos, (3) comparar Pernambuco com os outros oito estados da região, (4) ver em quais áreas o dinheiro é aplicado e (5) identificar quem recebe os recursos dentro de Pernambuco.
Algumas palavras do vocabulário orçamentário que aparecem ao longo do texto:
library(dplyr) # manipulação de dados (filter, group_by, summarise, joins)
library(tidyr) # transformar tabelas (pivot_wider)
library(ggplot2) # gráficos
library(plotly) # deixa os gráficos interativos
library(DT) # tabelas interativas com busca e ordenação
library(scales) # formatação de números nos gráficos
| Pacote | Para que foi usado |
|---|---|
dplyr |
filtros, agrupamentos, resumos e junção das tabelas |
tidyr |
reorganizar tabelas entre formato longo e largo |
ggplot2 |
construção dos gráficos |
plotly |
interatividade nos gráficos (passar o mouse mostra os valores) |
DT |
tabelas que o leitor pode pesquisar e ordenar |
scales |
rótulos de números e moeda |
Os arquivos foram baixados do Portal da Transparência do Governo Federal (dados livres e públicos). São três tabelas em CSV:
A chave para ligar as tabelas é o Código da Emenda.
Os arquivos usam separador ;, vírgula como decimal e
codificação latin1. O Código da Emenda tem cerca de 12 dígitos,
então foi lido como texto para não virar notação científica. As
expressões “Sem informação” e “S/I” foram tratadas como valores ausentes
(NA) logo na leitura.
ler <- function(arquivo) {
read.csv2(arquivo,
fileEncoding = "latin1",
check.names = FALSE,
na.strings = c("", "Sem informação", "S/I"),
colClasses = c("Código da Emenda" = "character"))
}
emendas <- ler("EmendasParlamentares.csv")
favorecido <- ler("EmendasParlamentares_PorFavorecido.csv")
convenios <- ler("EmendasParlamentares_Convenios.csv")
tamanhos <- data.frame(
tabela = c("Emendas", "Por Favorecido", "Convênios"),
linhas = c(nrow(emendas), nrow(favorecido), nrow(convenios)),
colunas = c(ncol(emendas), ncol(favorecido), ncol(convenios))
)
tamanhos
# valores ausentes por tabela
nas <- data.frame(
tabela = c("Emendas", "Por Favorecido", "Convênios"),
total_NA = c(sum(is.na(emendas)), sum(is.na(favorecido)), sum(is.na(convenios)))
)
nas
# linhas totalmente duplicadas
c(emendas = sum(duplicated(emendas)),
favorecido = sum(duplicated(favorecido)),
convenios = sum(duplicated(convenios)))
## emendas favorecido convenios
## 0 0 0
# emendas sem código (não dá para ligar com as outras tabelas)
sem_codigo <- sum(is.na(emendas$`Código da Emenda`))
sem_codigo
## [1] 17810
As decisões foram estas:
Date. A coluna
Ano/Mês (ex.: 202610) foi separada em ano e mês.UF vem com o nome
por extenso na tabela de Emendas e com a sigla na de Favorecidos. Além
disso, algumas linhas da região Nordeste têm UF vazia ou
“Múltiplo” (recurso para a região inteira ou para vários estados). Essas
linhas foram retiradas da comparação entre estados,
porque não dá para atribuí-las a um estado.emendas <- emendas %>%
rename(codigo = `Código da Emenda`, ano = `Ano da Emenda`, tipo = `Tipo de Emenda`,
autor = `Nome do Autor da Emenda`, regiao = Região, uf = UF,
municipio = Município, funcao = `Nome Função`, subfuncao = `Nome Subfunção`,
empenhado = `Valor Empenhado`, liquidado = `Valor Liquidado`,
pago = `Valor Pago`, rap_pagos = `Valor Restos A Pagar Pagos`)
favorecido <- favorecido %>%
rename(codigo = `Código da Emenda`, tipo = `Tipo de Emenda`,
favorecido = Favorecido, tipo_fav = `Tipo Favorecido`,
uf_fav = `UF Favorecido`, municipio_fav = `Município Favorecido`,
recebido = `Valor Recebido`) %>%
mutate(ano = `Ano/Mês` %/% 100,
mes = `Ano/Mês` %% 100)
convenios <- convenios %>%
rename(codigo = `Código da Emenda`, convenente = Convenente,
valor_conv = `Valor Convênio`) %>%
mutate(data_pub = as.Date(`Data Publicação Convênio`, format = "%d/%m/%Y"))
# tipos de emenda com nomes mais curtos
emendas <- emendas %>%
mutate(tipo = case_when(
grepl("Finalidade Definida", tipo) ~ "Individual (finalidade definida)",
grepl("Especiais", tipo) ~ "Individual (transferência especial)",
grepl("Bancada", tipo) ~ "Bancada",
grepl("Comissão", tipo) ~ "Comissão",
grepl("Relator", tipo) ~ "Relator",
TRUE ~ tipo))
# base do Nordeste: só linhas que pertencem a um estado específico
nordeste <- emendas %>%
filter(regiao == "Nordeste", !is.na(uf), uf != "Múltiplo") %>%
mutate(uf = tools::toTitleCase(tolower(uf)),
destaque = ifelse(uf == "Pernambuco", "Pernambuco", "Outros estados"))
Como uma emenda aparece em várias linhas em cada tabela, juntar
direto multiplicaria os valores. Por isso, primeiro resumi cada
tabela para uma linha por emenda e só depois fiz o
left_join pelo código.
emendas_cod <- emendas %>%
filter(!is.na(codigo)) %>%
group_by(codigo) %>%
summarise(ano = first(ano), tipo = first(tipo), autor = first(autor),
empenhado = sum(empenhado), pago = sum(pago), .groups = "drop")
favorecido_cod <- favorecido %>%
group_by(codigo) %>%
summarise(n_favorecidos = n_distinct(favorecido),
total_recebido = sum(recebido), .groups = "drop")
convenios_cod <- convenios %>%
group_by(codigo) %>%
summarise(n_convenios = n(), total_convenios = sum(valor_conv), .groups = "drop")
emendas_final <- emendas_cod %>%
left_join(favorecido_cod, by = "codigo") %>%
left_join(convenios_cod, by = "codigo") %>%
mutate(tem_convenio = !is.na(n_convenios),
taxa_execucao = ifelse(empenhado > 0, pago / empenhado, NA))
dim(emendas_final)
## [1] 76795 12
A nova variável taxa_execucao (pago ÷ empenhado) mede
quanto do que foi prometido já virou pagamento.
Uma amostra da base final (as 100 primeiras linhas):
emendas_final %>%
head(100) %>%
mutate(across(c(empenhado, pago, total_recebido, total_convenios), ~ round(.x, 2))) %>%
datatable(options = list(pageLength = 5, scrollX = TRUE), rownames = FALSE)
emendas %>%
select(ano, empenhado, liquidado, pago) %>%
summary()
## ano empenhado liquidado pago
## Min. :2014 Min. : -35865 Min. :0.000e+00 Min. :0.000e+00
## 1st Qu.:2017 1st Qu.: 255000 1st Qu.:0.000e+00 1st Qu.:0.000e+00
## Median :2019 Median : 593000 Median :1.400e+03 Median :0.000e+00
## Mean :2020 Mean : 3619591 Mean :2.077e+06 Mean :2.055e+06
## 3rd Qu.:2023 3rd Qu.: 1989839 3rd Qu.:6.000e+05 3rd Qu.:5.621e+05
## Max. :2026 Max. :5019577208 Max. :5.020e+09 Max. :5.020e+09
por_ano <- emendas %>%
group_by(ano) %>%
summarise(empenhado = sum(empenhado) / 1e9,
pago = sum(pago) / 1e9,
rap_pagos = sum(rap_pagos) / 1e9,
taxa = pago / empenhado * 100)
g1 <- por_ano %>%
select(ano, Empenhado = empenhado, Pago = pago) %>%
pivot_longer(-ano, names_to = "situacao", values_to = "valor") %>%
ggplot(aes(factor(ano), valor, fill = situacao, text = paste0(situacao, ": R$ ", round(valor, 1), " bi"))) +
geom_col(position = "dodge") +
scale_fill_manual(values = c(Empenhado = "grey70", Pago = "#1b6ca8")) +
labs(x = NULL, y = "R$ bilhões", fill = NULL,
title = "Emendas parlamentares no Brasil: empenhado x pago por ano") +
theme_minimal()
ggplotly(g1, tooltip = "text")
O valor pago cresce bastante a partir de 2020. O maior valor pago está em 2025 (R$ 31,5 bi). Nos anos de 2014 e 2015 a taxa de execução aparece muito baixa (2,2% e 0,7%), mas isso não quer dizer que o dinheiro não foi gasto: ele foi pago depois, como restos a pagar (R$ 4,5 bi só para as emendas de 2014). Já o ano de 2026 ainda está em andamento, então seus números tendem a crescer.
por_uf <- nordeste %>%
group_by(uf, destaque) %>%
summarise(pago = sum(pago) / 1e9, empenhado = sum(empenhado) / 1e9, .groups = "drop") %>%
arrange(desc(pago))
g2 <- ggplot(por_uf, aes(reorder(uf, pago), pago, fill = destaque,
text = paste0(uf, ": R$ ", round(pago, 2), " bi pagos"))) +
geom_col() +
coord_flip() +
scale_fill_manual(values = c("Pernambuco" = "#d62728", "Outros estados" = "grey65")) +
labs(x = NULL, y = "Valor pago (R$ bilhões, 2014–2026)", fill = NULL,
title = "Emendas pagas por estado do Nordeste") +
theme_minimal()
ggplotly(g2, tooltip = "text")
Pernambuco aparece em 4º lugar no valor pago, com R$ 6,3 bi, o que corresponde a 12,8% do que foi pago aos nove estados do Nordeste. O estado que mais recebeu foi Bahia (R$ 9,1 bi).
Atenção: este é o valor absoluto. Estados maiores tendem a receber mais, e eu não controlei pelo tamanho da população, porque ela não faz parte dos dados originais (isso fica como limitação, comentada nas conclusões).
part_pe <- nordeste %>%
group_by(ano) %>%
summarise(participacao = sum(empenhado[uf == "Pernambuco"]) / sum(empenhado) * 100)
g3 <- ggplot(part_pe, aes(ano, participacao,
text = paste0(ano, ": ", round(participacao, 1), "%"))) +
geom_line(color = "#d62728", group = 1) +
geom_point(color = "#d62728") +
scale_x_continuous(breaks = part_pe$ano) +
labs(x = NULL, y = "% do empenhado no Nordeste",
title = "Participação de Pernambuco no total empenhado ao Nordeste") +
theme_minimal()
ggplotly(g3, tooltip = "text")
A participação fica na faixa de 10,5% a 14,4% ao longo dos anos, ou seja, Pernambuco mantém um papel parecido de um ano para o outro, sem grandes saltos.
funcoes <- nordeste %>%
mutate(grupo = ifelse(uf == "Pernambuco", "Pernambuco", "Demais estados do NE")) %>%
group_by(grupo, funcao) %>%
summarise(v = sum(empenhado), .groups = "drop") %>%
group_by(grupo) %>%
mutate(prop = v / sum(v) * 100) %>%
ungroup()
top_funcoes <- funcoes %>%
group_by(funcao) %>% summarise(m = max(prop)) %>% slice_max(m, n = 6) %>% pull(funcao)
g4 <- funcoes %>%
filter(funcao %in% top_funcoes) %>%
ggplot(aes(reorder(funcao, prop), prop, fill = grupo,
text = paste0(grupo, ": ", round(prop, 1), "%"))) +
geom_col(position = "dodge") +
coord_flip() +
scale_fill_manual(values = c("Pernambuco" = "#d62728", "Demais estados do NE" = "grey65")) +
labs(x = NULL, y = "% do valor empenhado", fill = NULL,
title = "Principais áreas (funções) das emendas") +
theme_minimal()
ggplotly(g4, tooltip = "text")
A Saúde domina: ela concentra 56,3% do que foi empenhado em Pernambuco e 56,5% nos demais estados. O perfil de Pernambuco é, portanto, muito parecido com o do resto do Nordeste. “Encargos especiais” e “Urbanismo” completam o grupo das três maiores áreas nos dois casos.
tipos <- nordeste %>%
group_by(ano, tipo) %>%
summarise(v = sum(empenhado) / 1e9, .groups = "drop")
g5 <- ggplot(tipos, aes(ano, v, fill = tipo,
text = paste0(tipo, ": R$ ", round(v, 2), " bi"))) +
geom_col() +
scale_x_continuous(breaks = unique(tipos$ano)) +
labs(x = NULL, y = "R$ bilhões empenhados", fill = NULL,
title = "Nordeste: valor empenhado por tipo de emenda") +
theme_minimal() +
theme(legend.position = "bottom")
ggplotly(g5, tooltip = "text")
Aqui aparece uma mudança de regra visível no gráfico: as emendas de relator aparecem em alguns anos entre 2016 e 2020 e depois somem, enquanto as transferências especiais (emendas individuais enviadas direto ao município, sem convênio) surgem em 2020 e passam a ocupar uma parte grande do total. Também cresce a emenda de bancada.
A tabela Por Favorecido mostra os destinatários finais.
Filtrando os favorecidos de Pernambuco
(UF Favorecido = PE):
fav_pe <- favorecido %>%
filter(uf_fav == "PE") %>%
group_by(favorecido, tipo_fav) %>%
summarise(recebido_mi = sum(recebido) / 1e6, pagamentos = n(), .groups = "drop") %>%
arrange(desc(recebido_mi))
fav_pe %>%
mutate(recebido_mi = round(recebido_mi, 1)) %>%
head(50) %>%
datatable(rownames = FALSE, colnames = c("Favorecido", "Tipo", "Recebido (R$ milhões)", "Nº de pagamentos"),
options = list(pageLength = 10))
Entre os favorecidos em Pernambuco, 98,2% do valor foi para pessoas jurídicas (prefeituras, fundos e empresas). O primeiro lugar da lista é FUNDO MUNICIPAL DE SAUDE (1.303 milhões), mas esse nome é genérico e reúne os fundos de saúde de vários municípios que têm o mesmo nome no cadastro (1757 pagamentos), então não é um único destinatário. Entre os nomes que identificam um só destinatário aparecem o Estado de Pernambuco e prefeituras como Petrolina e Caruaru. Isso combina com o peso da função Saúde visto antes.
Usando a base já juntada (emendas_final):
conv_tipo <- emendas_final %>%
group_by(tipo) %>%
summarise(emendas = n(), com_convenio = mean(tem_convenio) * 100, .groups = "drop") %>%
arrange(desc(com_convenio))
conv_tipo %>%
mutate(com_convenio = round(com_convenio, 1)) %>%
datatable(rownames = FALSE, colnames = c("Tipo de emenda", "Nº de emendas", "% com convênio"),
options = list(dom = "t"))
Limitações