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:

  1. Quanto foi aplicado em ASPS (o numerador)
  2. 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

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)
}

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.