library(readxl)
library(dplyr)
library(stringr)
library(tidyr)
library(knitr)
# ---------------------------------------------------------------------------
# CAMINHO DAS BASES DE DADOS <-- ajuste aqui se necessário (veja seção acima)
# ---------------------------------------------------------------------------
pasta_dados <- "../dados/rgps"
# Monta o caminho completo de um arquivo dentro da pasta de dados.
# Ex.: caminho_dado("receita_siga.xlsx") -> "../dados/rgps/receita_siga.xlsx"
caminho_dado <- function(arquivo) file.path(pasta_dados, arquivo)
# Função: formatar valores em reais
formatar_reais <- function(x) {
format(x, big.mark = ".", decimal.mark = ",", nsmall = 2, scientific = FALSE)
}RREO Anexo 4 - Demonstrativo do Resultado Previdenciário (RGPS)
Material Suplementar - Documento Quarto Executável
Sobre este documento
Este é um documento Quarto executável: o mesmo arquivo que gera o relatório contém o código que produz os resultados. Faz parte de um projeto experimental / piloto de transparência fiscal — uma prova de conceito que demonstra a reprodução de demonstrativos oficiais a partir de dados públicos.
Para reproduzir os resultados:
Fontes de dados
Receitas — Siga Brasil (Senado Federal)
Portal: https://www12.senado.leg.br/orcamento/sigabrasil
Caminho de acesso: Painel de Receitas → Arrecadação → Ano: 2025 → Esfera: Fiscal + Seguridade → Exportar em Excel
Arquivo resultante: receita_siga.xlsx
Colunas utilizadas:
| Coluna no arquivo | Papel no cálculo |
|---|---|
UO (Cod) Rec |
Identifica as UOs do RGPS |
Natureza Receita (Cod) Rec |
Distingue contribuições (1214*) |
Categoria Econômica (Cod) |
Corrente (1), Capital (2), Intra (7/8) |
Origem (Cod) Rec |
Contribuições (12), Compensação (19) |
Arrecadação |
Valor realizado |
Despesas — SOF (Secretaria de Orçamento Federal)
Portal: https://www1.siop.planejamento.gov.br/painelorcamento
Arquivo resultante: despesa_sof.xlsx
Colunas utilizadas:
| Coluna no arquivo | Papel no cálculo |
|---|---|
Unidade Orçamentária |
Identifica as UOs do RGPS |
Ação |
Identifica compensações (009W, 0531) |
Grupo de Despesa |
Grupo 3 = Outras Despesas Correntes |
Modalidade de Aplicação |
Modalidade 91 = Intra-orçamentária |
Natureza de Despesa |
Posições 5–6 = elemento de despesa |
Empenhado |
Valor empenhado |
Onde estão os dados (leia antes de executar)
Este documento lê dois arquivos Excel a partir da pasta dados/rgps/ do repositório. Como o .qmd está em standalones/, o caminho padrão é ../dados/rgps (um nível acima, dentro de dados/rgps).
Se você renderizar o documento a partir da própria pasta standalones/, não precisa mudar nada. Se os seus arquivos estiverem em outro lugar, ajuste apenas a variável pasta_dados no bloco de configuração abaixo. Exemplos:
- Arquivos na mesma pasta do
.qmd:pasta_dados <- "." - Arquivos em
dados/rgps/(padrão):pasta_dados <- "../dados/rgps" - Um caminho completo no seu computador:
pasta_dados <- "C:/Users/voce/Desktop/dados"(use barras normais/, mesmo no Windows)
Configuração inicial
Parâmetros do RGPS
O RREO Anexo 4 segrega o Regime Geral de Previdência Social (RGPS) e os Regimes Próprios (RPPS). O RGPS é identificado por quatro Unidades Orçamentárias (UOs), conforme o Manual de Demonstrativos Fiscais (MDF) da STN:
uos_rgps <- c(
"33904", # Fundo do Regime Geral de Previdência Social
"40904", # Fundo de Amparo ao Trabalhador (FAT)
"55902", # Fundo Nacional de Assistência Social (FNAS)
"25917" # Fundo do Seguro Rural
)Receitas previdenciárias do RGPS
Critérios de classificação
O MDF-STN define sete itens de receita para o RGPS. A classificação utiliza três atributos da base do Siga Brasil:
- Natureza de receita (8 dígitos): naturezas iniciadas em
1214são contribuições de empregadores e trabalhadores - Categoria econômica: 1 = corrente, 2 = capital, 7/8 = intra-orçamentária
- Origem: 12 = contribuições, 19 = compensação previdenciária, 22 = alienações
Importação e classificação
dados_receita_siga <- read_excel(caminho_dado("receita_siga.xlsx"))
dados_receita_siga <- dados_receita_siga |>
rename(
unidade_orcamentaria_codigo = `UO (Cod) Rec`,
natureza_receita_codigo_completo = `Natureza Receita (Cod) Rec`,
nre1_categoria_economica_codigo = `Categoria Econômica (Cod) Receita`,
nre2_origem_receita_codigo_origem = `Origem (Cod) Rec`,
saldo_r_item_informacao = `Arrecadação`
) |>
mutate(across(c(unidade_orcamentaria_codigo,
natureza_receita_codigo_completo,
nre1_categoria_economica_codigo,
nre2_origem_receita_codigo_origem), as.character))
receitas_rgps <- dados_receita_siga |>
filter(unidade_orcamentaria_codigo %in% uos_rgps) |>
mutate(item_receita = case_when(
# 01 - Contribuições de empregadores, trabalhadores e demais segurados
# Naturezas iniciadas em 1214 (contribuições previdenciárias ao RGPS)
str_starts(natureza_receita_codigo_completo, "1214")
~ "01 Receitas de Contribuições",
# 02 - Demais contribuições (origem 12, exceto natureza 1214*)
nre2_origem_receita_codigo_origem == "12"
~ "02 Outras Contribuições",
# 03 - Compensação previdenciária RPPS/RGPS (origem 19)
nre2_origem_receita_codigo_origem == "19"
~ "03 Compensação Previdenciária RPPS para RGPS",
# 04 - Demais receitas correntes (categoria 1, exceto origens 12 e 19)
nre1_categoria_economica_codigo == "1"
~ "04 Demais Receitas Correntes",
# 05 - Alienação de bens (categoria 2, origem 22)
nre1_categoria_economica_codigo == "2" &
nre2_origem_receita_codigo_origem == "22"
~ "05 Alienação de Bens",
# 06 - Demais receitas de capital (categoria 2, exceto origem 22)
nre1_categoria_economica_codigo == "2"
~ "06 Outras Receitas de Capital",
# 07 - Intra-orçamentárias (categorias 7 ou 8)
nre1_categoria_economica_codigo %in% c("7", "8")
~ "07 Receitas Previdenciárias (INTRA)",
TRUE ~ "99 Não classificado"
)) |>
group_by(item_receita) |>
summarise(valor = sum(saldo_r_item_informacao, na.rm = TRUE), .groups = "drop") |>
filter(valor != 0) |>
arrange(item_receita)
total_receita_rgps <- sum(receitas_rgps$valor)Resultado das receitas
receitas_rgps |>
bind_rows(tibble(item_receita = "TOTAL", valor = total_receita_rgps)) |>
mutate(valor_milhares = formatar_reais(valor / 1000)) |>
select(item_receita, valor_milhares) |>
kable(col.names = c("Item", "R$ milhares"),
align = c("l", "r"),
caption = "Receitas previdenciárias do RGPS — 2025")| Item | R$ milhares |
|---|---|
| 01 Receitas de Contribuições | 707.444.745,81 |
| 03 Compensação Previdenciária RPPS para RGPS | 1.555.922,39 |
| 04 Demais Receitas Correntes | 386.553,53 |
| 05 Alienação de Bens | 12.183,95 |
| TOTAL | 709.399.405,68 |
Despesas previdenciárias do RGPS
Critérios de classificação
O MDF-STN define sete itens de despesa para o RGPS. A classificação utiliza:
- Elemento de despesa: extraído das posições 5–6 do código de natureza de despesa (ex.: código
33905300→ elemento53= aposentadorias RGPS) - Grupo de despesa: apenas grupo 3 (Outras Despesas Correntes)
- Modalidade de aplicação: modalidade 91 = intra-orçamentária
- Ação governamental: ações
009We0531identificam compensações entre RGPS e RPPS
Importação e classificação
dados_despesa_sof <- read_excel(caminho_dado("despesa_sof.xlsx"))
dados_despesa_sof <- dados_despesa_sof |>
mutate(
unidade_orcamentaria_codigo = str_extract(`Unidade Orçamentária`, "^[0-9]+"),
acao_governo_codigo = str_extract(`Ação`, "^[A-Za-z0-9]+"),
grupo_despesa_codigo_grupo = str_extract(`Grupo de Despesa`, "^[0-9]+"),
modalidade_aplicacao_codigo = str_extract(`Modalidade de Aplicação`, "^[0-9]+"),
# Elemento: posições 5-6 do código de natureza de despesa
# Exemplo: "33905300" -> "53" (Aposentadorias e Reformas - RGPS)
elemento_despesa_codigo = str_sub(
str_extract(`Natureza de Despesa`, "^[0-9]+"), 5, 6
),
saldo_r_item_informacao = as.numeric(Empenhado)
)
despesas_rgps <- dados_despesa_sof |>
filter(unidade_orcamentaria_codigo %in% uos_rgps) |>
mutate(item_despesa = case_when(
# 01 - Aposentadorias e reformas (elementos 53 ou 54)
elemento_despesa_codigo %in% c("53", "54") &
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo != "91"
~ "01 Aposentadorias",
# 02 - Pensões (elementos 55 ou 56)
elemento_despesa_codigo %in% c("55", "56") &
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo != "91"
~ "02 Pensões",
# 03 - Outros benefícios previdenciários (elementos 57 ou 58)
elemento_despesa_codigo %in% c("57", "58") &
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo != "91"
~ "03 Outros Benefícios",
# 04 - Compensação previdenciária RGPS/RPPS (ações 009W e 0531)
acao_governo_codigo %in% c("009W", "0531") &
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo != "91"
~ "04 Compensação RGPS para RPPS",
# 05 - Demais despesas correntes (grupo 3, não-intra, não classificadas)
!elemento_despesa_codigo %in% c("53","54","55","56","57","58","00") &
!acao_governo_codigo %in% c("009W", "0531") &
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo != "91"
~ "05 Demais Despesas",
# 06 - A Detalhar (elemento 00)
elemento_despesa_codigo == "00" &
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo != "91"
~ "06 A Detalhar",
# 07 - Intra-orçamentárias (modalidade 91, grupo 3)
grupo_despesa_codigo_grupo == "3" &
modalidade_aplicacao_codigo == "91"
~ "07 Despesas Previdenciárias (INTRA)",
TRUE ~ NA_character_
)) |>
filter(!is.na(item_despesa)) |>
group_by(item_despesa) |>
summarise(valor = sum(saldo_r_item_informacao, na.rm = TRUE), .groups = "drop") |>
filter(valor != 0) |>
arrange(item_despesa)
total_despesa_rgps <- sum(despesas_rgps$valor)Resultado das despesas
despesas_rgps |>
bind_rows(tibble(item_despesa = "TOTAL", valor = total_despesa_rgps)) |>
mutate(valor_milhares = formatar_reais(valor / 1000)) |>
select(item_despesa, valor_milhares) |>
kable(col.names = c("Item", "R$ milhares"),
align = c("l", "r"),
caption = "Despesas previdenciárias do RGPS — 2025")| Item | R$ milhares |
|---|---|
| 01 Aposentadorias | 695.210.703,75 |
| 02 Pensões | 224.098.049,24 |
| 03 Outros Benefícios | 61.668.786,14 |
| 04 Compensação RGPS para RPPS | 6.652.154,39 |
| 05 Demais Despesas | 42.736.751,46 |
| TOTAL | 1.030.366.444,98 |
Resultado previdenciário e validação
resultado_rgps <- total_receita_rgps - total_despesa_rgps
# Valores do relatório oficial (R$ milhares)
oficial_receita <- 709399406
oficial_despesa <- 1030366445
oficial_resultado <- -320967039
tibble(
Item = c("Receitas Previdenciárias",
"Despesas Previdenciárias",
"Resultado Previdenciário"),
Calculado = c(total_receita_rgps / 1000,
total_despesa_rgps / 1000,
resultado_rgps / 1000),
Oficial = c(oficial_receita,
oficial_despesa,
oficial_resultado),
Diferença = Calculado - Oficial
) |>
mutate(across(c(Calculado, Oficial, Diferença), formatar_reais)) |>
kable(align = c("l","r","r","r"),
caption = "Validação: calculado vs. oficial (R$ milhares)")| Item | Calculado | Oficial | Diferença |
|---|---|---|---|
| Receitas Previdenciárias | 709.399.405,68 | 709.399.406,00 | -0,32424998 |
| Despesas Previdenciárias | 1.030.366.444,98 | 1.030.366.445,00 | -0,01512003 |
| Resultado Previdenciário | -320.967.039,31 | -320.967.039,00 | -0,30913001 |
Documento gerado com Quarto e R 4.6.0.
Dados: Siga Brasil (Senado Federal) e SOF — exercício 2025.