library(dplyr)
library(knitr)
# ---------------------------------------------------------------------------
# CAMINHO DAS BASES DE DADOS <-- ajuste aqui se necessário (veja seção acima)
# ---------------------------------------------------------------------------
pasta_dados <- "../dados"
# Monta o caminho completo de um arquivo dentro da pasta de dados.
# Ex.: caminho_dado("despesa_unificada.csv.gz") -> "../dados/despesa_unificada.csv.gz"
caminho_dado <- function(arquivo) file.path(pasta_dados, arquivo)
# Lê um CSV comprimido (.csv.gz). Marcamos os nomes das colunas como UTF-8
# para que os acentos sejam reconhecidos em qualquer sistema operacional.
ler_csv_gz <- function(caminho) {
df <- read.csv(gzfile(caminho), check.names = FALSE, stringsAsFactors = FALSE)
Encoding(names(df)) <- "UTF-8"
df
}
# Seleciona uma coluna pelo NOME. Normaliza acentos, espaços extras e
# caracteres invisíveis (BOM) que costumam vir no cabeçalho exportado — assim
# a leitura é legível e ao mesmo tempo tolerante a variações do arquivo.
# Se o nome não existir, para com mensagem clara em vez de somar a coluna errada.
coluna <- function(dados, nome) {
normalizar <- function(x) {
x <- iconv(x, to = "ASCII//TRANSLIT")
tolower(trimws(gsub("[^A-Za-z0-9]+", " ", x)))
}
i <- match(normalizar(nome), normalizar(names(dados)))
if (is.na(i)) {
stop("Coluna nao encontrada no arquivo: '", nome, "'.\nColunas disponiveis: ",
paste(names(dados), collapse = " | "), call. = FALSE)
}
dados[[i]]
}
# Formata em "R$ mil" com separador de milhar brasileiro.
em_mil <- function(reais) {
format(round(reais / 1000), big.mark = ".", decimal.mark = ",", scientific = FALSE)
}RREO Anexo 12 - Despesa com Saúde (Mínimo Constitucional)
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.
A intenção é explicar por que cada valor entra na conta, de forma que alguém da área de contabilidade, mesmo sem experiência em programação, acompanhe cada passo e reconheça os critérios do Manual de Demonstrativos Fiscais (MDF-STN).
Para reproduzir: instale R e Quarto, coloque o arquivo de dados na mesma pasta e rode quarto render rreo_a12_saude.qmd.
O que este demonstrativo verifica
A Constituição obriga a União a aplicar, todo ano, um mínimo em Ações e Serviços Públicos de Saúde (ASPS). Desde a Emenda Constitucional 95/2016, esse mínimo é 15% da Receita Corrente Líquida (RCL).
O RREO Anexo 12 responde a uma pergunta objetiva:
A União gastou em saúde pelo menos 15% da RCL?
O cálculo, portanto, tem duas partes:
- Quanto foi aplicado em ASPS (o numerador)
- Qual era o mínimo exigido = 15% da RCL (o piso a comparar)
Fonte de dados
Os dados vêm do Siga Brasil (Senado Federal): https://www12.senado.leg.br/orcamento/sigabrasil
Arquivo: despesa_unificada.csv.gz (a mesma base de despesa usada por outros demonstrativos).
| Coluna no arquivo | Papel no cálculo |
|---|---|
ID Uso (Cod) DESP |
É o critério central. O identificador de uso 6 marca as despesas que compõem o mínimo de saúde (ASPS). |
Empenhado (R$) |
Valor empenhado — é a métrica usada pelo demonstrativo oficial para as ASPS. |
Liquidado (R$) |
Valor liquidado — informado a título de comparação. |
O ID Uso (identificador de uso) é um atributo que o próprio SIAFI atribui à despesa para sinalizar a que finalidade legal ela serve. O código 6 significa, exatamente, “recurso que conta para o mínimo constitucional de saúde”. Isso simplifica muito o cálculo: em vez de recriar todas as regras de quais programas e ações são saúde, aproveitamos essa marcação oficial.
Onde estão os dados (leia antes de executar)
Este documento lê os arquivos de dados a partir da pasta dados/ do repositório. Como o .qmd está em standalones/, o caminho padrão é ../dados (a pasta dados que fica um nível acima).
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, basta ajustar uma única linha no bloco de configuração abaixo — a variável pasta_dados. Exemplos:
- Arquivos na mesma pasta do
.qmd:pasta_dados <- "." - Arquivos em
dados/um nível acima (padrão):pasta_dados <- "../dados" - Um caminho completo no seu computador:
pasta_dados <- "C:/Users/voce/Desktop/dados"(use barras normais/, mesmo no Windows)
Configuração inicial
Passo 1 — Identificar as despesas de saúde (ASPS)
Carregamos a base e ficamos apenas com as linhas marcadas com ID Uso = 6 — as que compõem o mínimo de saúde.
despesa <- ler_csv_gz(caminho_dado("despesa_unificada.csv.gz"))
# A base tem muitas colunas; para este demonstrativo precisamos de três.
base <- data.frame(
id_uso = as.character(coluna(despesa, "ID Uso (Cod) DESP")),
empenhado = as.numeric(coluna(despesa, "Empenhado (R$)")),
liquidado = as.numeric(coluna(despesa, "Liquidado (R$)")),
stringsAsFactors = FALSE
)
# ASPS = despesas que contam para o mínimo de saúde (ID Uso = 6)
asps <- base[base$id_uso == "6", ]
cat("Linhas de despesa de saúde (ASPS):", nrow(asps), "\n")Linhas de despesa de saúde (ASPS): 13324
Passo 2 — Somar o aplicado em saúde
O demonstrativo oficial usa o valor empenhado como medida das ASPS. Somamos também o liquidado apenas para comparação.
asps_empenhado <- sum(asps$empenhado, na.rm = TRUE)
asps_liquidado <- sum(asps$liquidado, na.rm = TRUE)
cat("ASPS empenhadas: R$", em_mil(asps_empenhado), "mil\n")ASPS empenhadas: R$ 236.096.564 mil
cat("ASPS liquidadas: R$", em_mil(asps_liquidado), "mil\n")ASPS liquidadas: R$ 214.584.552 mil
Passo 3 — Calcular o mínimo exigido (15% da RCL)
O piso constitucional é 15% da Receita Corrente Líquida do exercício. Usamos a RCL oficial de 2025 (que este projeto reproduz separadamente no documento rreo_a03_rcl.qmd).
rcl_2025_mil <- 1517735497 # RCL oficial 2025 (em R$ mil)
minimo_mil <- rcl_2025_mil * 0.15 # piso constitucional = 15% da RCL
cat("RCL 2025: R$", format(rcl_2025_mil, big.mark=".", decimal.mark=","), "mil\n")RCL 2025: R$ 1.517.735.497 mil
cat("Mínimo exigido (15%): R$", format(round(minimo_mil), big.mark=".", decimal.mark=","), "mil\n")Mínimo exigido (15%): R$ 227.660.325 mil
Passo 4 — Verificar o cumprimento
Comparamos o aplicado (empenhado) com o mínimo. Também expressamos o gasto como percentual da RCL, que é a forma como o resultado costuma ser comunicado.
asps_empenhado_mil <- round(asps_empenhado / 1000)
percentual_rcl <- asps_empenhado_mil / rcl_2025_mil * 100
cumpriu <- asps_empenhado_mil >= minimo_mil
cat("Aplicado em saúde: ", percentual_rcl |> round(2), "% da RCL\n")Aplicado em saúde: 15.56 % da RCL
cat("Situação: ", if (cumpriu) "MÍNIMO CUMPRIDO" else "MÍNIMO NÃO CUMPRIDO", "\n")Situação: MÍNIMO CUMPRIDO
Demonstrativo completo e validação
demonstrativo <- data.frame(
Item = c(
"ASPS Empenhadas (numerador do mínimo)",
"ASPS Liquidadas (comparação)",
"Mínimo exigido (15% da RCL)"
),
`R$ mil` = c(
em_mil(asps_empenhado),
em_mil(asps_liquidado),
format(round(minimo_mil), big.mark=".", decimal.mark=",")
),
check.names = FALSE
)
kable(demonstrativo, align = c("l", "r"))| Item | R$ mil |
|---|---|
| ASPS Empenhadas (numerador do mínimo) | 236.096.564 |
| ASPS Liquidadas (comparação) | 214.584.552 |
| Mínimo exigido (15% da RCL) | 227.660.325 |
oficial_mil <- 236096564 # ASPS empenhadas — valor publicado no DOU (Dez/2025)
diferenca <- asps_empenhado_mil - oficial_mil
cat("Nossas ASPS: R$", format(asps_empenhado_mil, big.mark=".", decimal.mark=","), "mil\n")Nossas ASPS: R$ 236.096.564 mil
cat("ASPS oficiais: R$", format(oficial_mil, big.mark=".", decimal.mark=","), "mil\n")ASPS oficiais: R$ 236.096.564 mil
cat("Diferença: R$", format(diferenca, big.mark=".", decimal.mark=","), "mil\n\n")Diferença: R$ 0 mil
if (diferenca == 0) {
cat("VALIDADO: coincide com o valor publicado no Diário Oficial (R$ mil).\n")
} else {
cat("Diferença encontrada — investigar.\n")
}VALIDADO: coincide com o valor publicado no Diário Oficial (R$ mil).
Conclusão
A aplicação da União em saúde em 2025 foi reproduzida a partir de dados exclusivamente públicos, e coincide com o valor oficial. O critério central — o identificador de uso 6 — é uma marcação que o próprio SIAFI atribui às despesas de saúde, o que torna o cálculo direto e auditável: cada real contado tem uma origem rastreável.