Introdução
Esta vinheta descreve o uso da função RGFdata(). Seu
objetivo é abstrair a complexidade da API do SICONFI, tornando a análise
dos dados do Relatório de Gestão Fiscal (RGF) muito mais simples, rápida
e escalável.
O Tesouro Nacional disponibiliza a Application Programming Interface (API) de dados abertos para atender à demanda por dados brutos oriundos do Siconfi. Por meio dessa ferramenta, é possível obter desde pequenas frações até grandes volumes de dados inseridos pelos entes subnacionais e pela União.
No entanto, a estrutura bruta retornada pela API muitas vezes exige
um tratamento complexo. A função RGFdata() automatiza esse
processo, resolvendo desde a paginação até a conversão matemática de
colunas temporais relativas (como <MR-X>), além de
suportar a extração em lote (vetorizada) de múltiplos exercícios e entes
simultaneamente.
Para iniciar nossas análises, carregamos os pacotes necessários:
Exemplo 1: Análise Longitudinal (Série Histórica)
Neste primeiro exemplo, demonstramos o quão simples é utilizar o pacote para obter uma série histórica do RGF e empregá-la na elaboração de um gráfico.
Extrairemos do Anexo 01 (3º quadrimestre) os valores da Despesa com
Pessoal Total (DTP) para o Poder Executivo da União, englobando os anos
de 2017 a 2023 de uma só vez utilizando a vetorização do parâmetro
year.
# Extração da série histórica com um único comando vetorizado
df_rgf_uniao <- RGFdata(
cod.ibge = 1,
year = 2017:2023,
power = "E",
period = 3,
annex = 1
)
# Filtragem dos dados e execução do gráfico
df_rgf_uniao %>%
filter(
rotulo == "União",
cod_conta == "DespesaComPessoalTotal",
coluna == "VALOR"
) %>%
ggplot(aes(x = exercicio)) +
geom_col(aes(y = valor), fill = "#004c4c") +
geom_text(
aes(y = valor, label = round(valor/1e9, 0)),
fontface = "bold",
vjust = 1.4,
size = 5,
colour = "white"
) +
labs(
x = "Exercício", y = "",
title = 'Despesa com Pessoal Total - Executivo (União)',
subtitle = '(Valores Nominais, em Bilhões de Reais)',
caption = "Fonte: Elaborado com RREORGFdataR via SICONFI."
) +
scale_x_continuous(n.breaks = 7) +
theme_classic() +
theme(
legend.position = "none",
text = element_text(size = 10),
axis.line = element_blank(),
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 10),
axis.text.y = element_blank(),
axis.text.x = element_text(angle = 60, vjust = .95, hjust = 1, size = 8),
axis.ticks.y = element_blank(),
legend.background = element_blank(),
plot.caption.position = "panel"
)
Exemplo 2: Análise Transversal (Comparação entre Poderes)
Diferente do RREO, o RGF é segregado por Poder governamental. A
arquitetura da função RGFdata() permite passar múltiplos
poderes em um único vetor, consolidando a análise de um ente federativo
inteiro sem a necessidade de múltiplos downloads manuais
estruturados.
Abaixo, extraímos a DTP de todos os poderes do Estado de Goiás para o encerramento do exercício de 2023.
# Solicitando dados para Executivo, Legislativo, Judiciário, Ministério Público e Defensoria
df_poderes_go <- RGFdata(
cod.ibge = 52,
year = 2023,
power = c("E", "L", "J", "M", "D"),
period = 3,
annex = 1
)
# Comparando as Despesas com Pessoal Líquida (DPL) entre os poderes públicos
df_poderes_go %>%
filter(
cod_conta == "DespesaComPessoalLiquida",
coluna == "TOTAL (ÚLTIMOS 12 MESES) (a)"
) %>%
mutate(
co_poder = case_when(
co_poder == "E" ~ "Executivo",
co_poder == "L" ~ "Legislativo",
co_poder == "J" ~ "Judiciário",
co_poder == "M" ~ "Min. Público",
co_poder == "D" ~ "Defensoria"
)
) %>%
# PASSO CRÍTICO: Consolida as linhas divididas do mesmo poder (ex: Assembleia + TCE)
group_by(co_poder) %>%
summarise(valor = sum(valor, na.rm = TRUE), .groups = "drop") %>%
# Ordena do menor para o maior APÓS a soma
mutate(co_poder = reorder(co_poder, valor)) %>%
ggplot(aes(x = co_poder, y = valor, fill = co_poder)) +
geom_col(show.legend = FALSE) +
geom_text(
aes(label = paste0("R$ ", round(valor/1e6, 1), " Mi")),
hjust = -0.1, fontface = "bold", color = "#34495e"
) +
coord_flip() +
scale_fill_brewer(palette = "Greens") + # Ajustado para paleta nativa válida
labs(
title = "Despesa com Pessoal Líquida por Poder - Goiás (2023)",
x = "", y = ""
) +
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +
theme_minimal() +
theme(
axis.text.x = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
)
Exemplo 3: Ingestão de Data Lake (Persistência em Parquet)
Ao trabalhar com cenários de grande escala (como baixar dados de
municípios em lote nacional), a função disponibiliza integração nativa
com o pacote arrow. Utilizando o argumento
save_path com a extensão .parquet, a função
persiste os dados de forma colunar compactada.
# Extração massiva para todos os municípios, salvando diretamente em disco
RGFdata(
cod.ibge = "all_muni",
year = 2023,
power = "E",
period = 2,
annex = 1,
simplified = TRUE, # Suporte nativo ao RGF Simplificado Municipal (< 50k hab.)
save_path = "dados_rgf_municipios_2023.parquet"
)
# Leitura otimizada (Lazy Loading) do arquivo gerado via Apache Arrow
library(arrow)
dataset_rgf <- open_dataset("dados_rgf_municipios_2023.parquet")
# O motor C++ filtra direto do HD, sem carregar o país inteiro na RAM
dados_goiania <- dataset_rgf %>%
filter(cod_ibge == "5208707") %>%
collect()