Objetivo do curso: Capacitar participantes a extrair, validar, tratar e analisar microdados do SUS com R, integrando fontes de custos/preços e técnicas aplicadas à avaliação econômica.

Ecossistema de dados do SUS com R

Ementa

  • Como os dados do SUS são produzidos, organizados e disseminados?
  • Quais são os principais sistemas de informação e seus subsistemas?
  • Como acessar arquivos no FTP do DATASUS, APIs e portais de dados abertos?
  • Como baixar e ler um arquivo DBC no R?
  • Como interpretar campos usando um dicionário de dados?
  • Como integrar produção ambulatorial, internações, estabelecimentos e procedimentos?
  • Como utilizar esses dados em análises de economia da saúde?
  • Quais cuidados de qualidade, temporalidade, governança e interpretação devem ser adotados?

Objetivo da aula: construir um fluxo reprodutível e intermediário no R, partindo de um arquivo público do SUS até uma tabela enriquecida com metadados e informações cadastrais.


Fundamentos

O ecossistema de dados do SUS via FTP

O SUS produz dados durante atividades assistenciais, administrativas, epidemiológicas, regulatórias e financeiras. Esses registros são enviados, validados, centralizados e disseminados por diferentes estratégias de consolidação e sistemas de informação.

Um mesmo fenômeno pode exigir mais de uma fonte. Para estudar a produção de um procedimento, por exemplo, pode ser necessário combinar:

  • SIA: produção ambulatorial;
  • SIH: internações hospitalares;
  • CNES: características dos estabelecimentos;
  • SIGTAP: descrição e atributos dos procedimentos;
  • SIM: mortalidade;
  • SINASC: nascidos vivos;
  • SINAN: agravos de notificação.

Os sistemas não são apenas arquivos. Cada um possui finalidade, fluxo, unidade de registro, periodicidade, regras de validação e dicionário próprios.

Panorama dos principais centralizadores

Sistema Período observado Subsistemas Arquivos DBC Volume compactado Registros catalogados
SIA 1994-2026 14 58.572 429,6 GB 7,03 bilhões
SIH 1992-2026 6 31.937 83,1 GB 1,25 bilhão
CNES 2005-2026 18 80.191 53,3 GB 619,0 milhões
SINASC 1994-2024 2 1.666 10,6 GB 33,8 milhões
SIM 1996-2024 6 940 10,0 GB 32,8 milhões
SINAN 1999-2025 45 741 2,6 GB 23,5 milhões

Os totais de registros refletem o preenchimento disponível no catálogo. Valor zero pode significar contagem ainda não calculada, e não ausência de registros no arquivo.

Subsistemas ilustrativos

Sistema Subsistema Temporalidade típica Arquivos DBC Volume compactado Registros catalogados
SIA PA Mensal por UF 10.792 214,2 GB 3,76 bilhões
SIH RD Mensal por UF 11.157 25,4 GB 83,4 milhões
SIH SP Mensal por UF 9.412 56,4 GB 1,16 bilhão
CNES ST Mensal por UF 6.779 3,3 GB 31,0 milhões
SIM DO Anual por UF 812 9,6 GB 31,7 milhões
SINASC DN Anual por UF 1.558 10,4 GB 33,8 milhões

Essas diferenças alteram a estratégia analítica:

  • arquivos mensais exigem controle de competência;
  • arquivos anuais podem ter defasagem de consolidação;
  • subsistemas com várias linhas por evento não podem ser somados sem definir a unidade de análise;
  • grande quantidade de arquivos aumenta a importância de nomes padronizados e catálogos.

Exemplo de agregação com dplyr

O SQL usado para produzir a lista pode ser representado no R:

resumo_ftp <- catalogo |>
  transmute(
    sg_uf,
    sg_sistema = toupper(sg_sistema),
    sg_versao = toupper(sg_versao),
    sg_subsistema = toupper(sg_subsistema),
    ano_competencia = as.integer(ano_competencia),
    qt_bytes_ftp,
    qt_registro_dbc,
    dbc,
    no_dbc_origem
  ) |>
  group_by(
    sg_uf,
    sg_sistema,
    sg_versao,
    sg_subsistema,
    ano_competencia
  ) |>
  summarise(
    qt_bytes_ftp = sum(qt_bytes_ftp, na.rm = TRUE),
    qt_registro_dbc = sum(qt_registro_dbc, na.rm = TRUE),
    dbc = sum(dbc, na.rm = TRUE),
    no_dbc_origem = paste(no_dbc_origem, collapse = " "),
    .groups = "drop"
  ) |>
  arrange(
    sg_uf,
    sg_sistema,
    sg_versao,
    sg_subsistema,
    ano_competencia
  )

Resumo por sistema:

catalogo |>
  group_by(sg_sistema) |>
  summarise(
    primeiro_ano = min(ano_competencia, na.rm = TRUE),
    ultimo_ano = max(ano_competencia, na.rm = TRUE),
    arquivos = sum(dbc, na.rm = TRUE),
    gigabytes = sum(qt_bytes_ftp, na.rm = TRUE) / 1e9,
    registros = sum(qt_registro_dbc, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(gigabytes))

Dado, informação e metadado no SUS

Considere o código 0418010048 isoladamente:

  • como dado, é apenas uma sequência de caracteres;
  • com o SIGTAP, torna-se a identificação de um procedimento;
  • associado à competência, ao estabelecimento e à quantidade aprovada, torna-se informação;
  • analisado no contexto assistencial e financeiro, pode apoiar conhecimento e decisão.

Metadados descrevem como interpretar o registro:

Elemento Exemplo
Nome do campo PA_PROC_ID
Descrição Código do procedimento ambulatorial
Tipo Caractere
Tamanho 10 posições
Domínio Procedimentos válidos no SIGTAP
Temporalidade Competência informada em PA_CMP
Origem Arquivo PA do SIA

SIGTAP

O SIGTAP organiza a Tabela de Procedimentos, Medicamentos e OPM do SUS. Além do código e do nome, registra atributos e compatibilidades que variam por competência.

Pode conter relações com:

  • grupo, subgrupo e forma de organização;
  • modalidade de atendimento;
  • instrumento de registro;
  • financiamento;
  • CBO;
  • CID;
  • serviço e classificação;
  • idade e sexo;
  • valores de referência.

Um procedimento deve ser interpretado usando o SIGTAP da competência correspondente. A tabela pode mudar ao longo do tempo.

Identificação

url: http://sigtap.datasus.gov.br/tabela-unificada/app/sec/procedimento/exibir/0418010048/08/2026

Campo Valor
Código 04.18.01.004-8
Procedimento Implante de cateter de longa permanência para hemodiálise
Competência 08/2026
Histórico Consultar histórico de alterações

Classificação do procedimento

Nível Código Descrição
Grupo 04 Procedimentos cirúrgicos
Subgrupo 18 Cirurgia em nefrologia
Forma de organização 01 Acessos para diálise

Características

Campo Valor
Modalidade de atendimento Ambulatorial
Complexidade Alta complexidade
Financiamento Fundo de Ações Estratégicas e Compensação — FAEC
Subtipo de financiamento Nefrologia
Instrumento de registro APAC — procedimento principal
Sexo Ambos
Média de permanência
Tempo de permanência
Quantidade máxima 1
Idade mínima 0 meses
Idade máxima 130 anos
Pontos

Atributos complementares

Atributos complementares
Inclui o valor da anestesia
Exige CPF ou CNS
Exige o registro de dados complementares na APAC
Programa Mais Acesso a Especialistas — Componente Cirurgias Ambulatoriais

Valores

Componente Valor
Serviço ambulatorial R$ 200,00
Total ambulatorial R$ 200,00
Serviço hospitalar R$ 0,00
Serviço profissional R$ 0,00
Total hospitalar R$ 0,00

CID principal

CID-10 Descrição
N180 Doença renal em estádio final

CIDs secundários

CID-10 Descrição
E140 Diabetes mellitus não especificado — com coma
E141 Diabetes mellitus não especificado — com cetoacidose
E142 Diabetes mellitus não especificado — com complicações renais
E143 Diabetes mellitus não especificado — com complicações oftálmicas
E144 Diabetes mellitus não especificado — com complicações neurológicas
E145 Diabetes mellitus não especificado — com complicações circulatórias periféricas
E146 Diabetes mellitus não especificado — com outras complicações especificadas
E147 Diabetes mellitus não especificado — com complicações múltiplas
E148 Diabetes mellitus não especificado — com complicações não especificadas
E149 Diabetes mellitus não especificado — sem complicações
I10 Hipertensão essencial (primária)
N030 Síndrome nefrítica crônica — anormalidade glomerular minor
N031 Síndrome nefrítica crônica — lesões glomerulares focais e segmentares
N032 Síndrome nefrítica crônica — glomerulonefrite membranosa difusa
N033 Síndrome nefrítica crônica — glomerulonefrite proliferativa mesangial difusa
N034 Síndrome nefrítica crônica — glomerulonefrite proliferativa endocapilar difusa
N035 Síndrome nefrítica crônica — glomerulonefrite mesangiocapilar difusa
N036 Síndrome nefrítica crônica — doença de depósito denso
N037 Síndrome nefrítica crônica — glomerulonefrite difusa em crescente
N038 Síndrome nefrítica crônica — outras
N039 Síndrome nefrítica crônica — não especificada
N188 Outra insuficiência renal crônica
N189 Insuficiência renal crônica não especificada
Q613 Rim policístico não especificado
T861 Falência ou rejeição de transplante de rim

Classificação Brasileira de Ocupações — CBO

CBO Ocupação
225109 Médico nefrologista
225210 Médico cirurgião cardiovascular
225220 Médico cirurgião do aparelho digestivo
225225 Médico cirurgião geral
225230 Médico cirurgião pediátrico

Serviço e classificação

Serviço Classificação Descrição
130 003 Confecção/intervenção de acessos para diálise — Atenção à Doença Renal Crônica

Habilitações

Código Habilitação
3802 Agora Tem Especialistas — Modalidade 1
3805 Agora Tem Especialistas — Componente Créditos Financeiros
3806 Agora Tem Especialistas — Componente Ressarcimento ao SUS

Origem SIA/SIH

Modalidade Código de origem Descrição
Ambulatorial 27011011 Acesso para hemodiálise: implante de cateter de longa permanência

Regras condicionadas

Código Regra
0015 Condiciona o tipo de financiamento em FAEC
0013 Gera compensação financeira

Relação Nacional de Ações e Serviços de Saúde — RENASES

Código Ação ou serviço
058 Cirurgias ambulatoriais com anestesia
061 Cirurgias ambulatoriais em nefrologia
143 Intervenções cirúrgicas para criação de acessos para diálise

Estrutura hierárquica do SIGTAP

O Sistema de Gerenciamento da Tabela de Procedimentos, Medicamentos e OPM do SUS — SIGTAP — organiza os procedimentos em níveis hierárquicos.

Grupo
└── Subgrupo
    └── Forma de organização
        └── Procedimento

O código do procedimento pode ser interpretado como:

GG.SS.FF.PPP-D
Parte Significado
GG Grupo
SS Subgrupo
FF Forma de organização
PPP Sequencial do procedimento
D Dígito verificador

Exemplo:

04.18.01.004-8
Nível Código Descrição
Grupo 04 Procedimentos cirúrgicos
Subgrupo 0418 Cirurgia em nefrologia
Forma de organização 041801 Acessos para diálise
Procedimento 0418010048 Implante de cateter de longa permanência para hemodiálise

No SIGTAP, o termo correto é forma de organização. A forma de apresentação ou registro da produção é representada por outro atributo, denominado instrumento de registro, como BPA-C, BPA-I, APAC e AIH.

Grupos do SIGTAP

Grupo Descrição Exemplos de subgrupos Exemplos de formas de organização
01 Ações de promoção e prevenção em saúde 0101 Ações coletivas e individuais em saúde;
0102 Vigilância em saúde
010101 Educação em saúde;
010102 Saúde bucal;
010201 Vigilância sanitária
02 Procedimentos com finalidade diagnóstica 0201 Coleta de material;
0202 Diagnóstico em laboratório clínico;
0204 Diagnóstico por radiologia;
0206 Diagnóstico por tomografia
020101 Coleta de material por punção ou biópsia;
020201 Exames bioquímicos;
020401 Exames radiológicos da cabeça e pescoço
03 Procedimentos clínicos 0301 Consultas, atendimentos e acompanhamentos;
0304 Tratamento em oncologia;
0305 Tratamento em nefrologia;
0309 Terapias especializadas
030101 Consultas médicas e de outros profissionais de nível superior;
030108 Atendimento e acompanhamento psicossocial;
030114 Cuidados paliativos
04 Procedimentos cirúrgicos 0401 Pequenas cirurgias e cirurgias de pele, tecido subcutâneo e mucosa;
0406 Cirurgia do aparelho circulatório;
0416 Cirurgia em oncologia;
0418 Cirurgia em nefrologia
041801 Acessos para diálise;
formas específicas de cirurgia conforme órgão, sistema ou especialidade
05 Transplantes de órgãos, tecidos e células 0501 Coleta e exames para doação e transplante;
0502 Avaliação de morte encefálica;
0505 Transplante de órgãos, tecidos e células;
0506 Acompanhamento pré e pós-transplante
Formas de organização relacionadas à doação, avaliação, processamento, transplante e acompanhamento
06 Medicamentos 0601 Medicamentos de dispensação excepcional;
0602 Medicamentos estratégicos;
0603 Medicamentos de âmbito hospitalar e de urgência;
0604 Componente Especializado da Assistência Farmacêutica
Formas organizadas por classe farmacológica ou finalidade terapêutica, como agentes antitrombóticos e medicamentos do sistema respiratório
07 Órteses, próteses e materiais especiais 0701 OPM não relacionadas ao ato cirúrgico;
0702 OPM relacionadas ao ato cirúrgico
070101 OPM auxiliares da locomoção;
070103 OPM auditivas;
070204 OPM em assistência cardiovascular;
070210 OPM em nefrologia
08 Ações complementares da atenção à saúde 0801 Ações relacionadas ao estabelecimento;
0802 Ações relacionadas ao atendimento;
0803 Autorização e regulação;
0804 Telessaúde
080101 Incentivos;
080201 Diárias;
080301 Deslocamento e ajuda de custo;
080402 Atendimento em saúde mediado por tecnologia digital
09 Procedimentos para Ofertas de Cuidados Integrados 0901 Atenção em oncologia;
0902 Atenção em cardiologia;
0903 Atenção em ortopedia;
0904 Atenção em otorrinolaringologia;
0905 Atenção em oftalmologia;
0906 Atenção em saúde da mulher
090101 Ofertas de Cuidados Integrados em oncologia;
090201 Ofertas de Cuidados Integrados em cardiologia;
090301 Ofertas de Cuidados Integrados em ortopedia;
090601 Ofertas de Cuidados Integrados em saúde da mulher — ginecologia

Os exemplos refletem a estrutura disponível na competência 08/2026. Grupos, subgrupos, formas de organização e procedimentos são atributos temporais e devem ser relacionados à competência correspondente.

A análise econômica deve integrar essas dimensões sem tratar valor SIGTAP, valor aprovado, crédito contratual, transferência e despesa executada como conceitos equivalentes.

Fonte: SIGTAP — Sistema de Gerenciamento da Tabela de Procedimentos, Medicamentos e OPM do SUS.

Documentação técnica: Especificação Técnica para Integração com o SIGTAP.

Dados de produção e dados analíticos

Os arquivos disseminados resultam de processos operacionais. Para uso analítico, é comum realizar:

  1. seleção de competências e unidades geográficas;
  2. download dos arquivos;
  3. leitura e padronização dos atributos;
  4. aplicação dos dicionários;
  5. validação da unidade de registro;
  6. integração com tabelas de referência;
  7. construção de indicadores.

O produto analítico deve conservar a rastreabilidade até o arquivo de origem. Isso significa registrar, em cada linha, de qual arquivo e competência o dado foi obtido.

Exemplo de rastreabilidade

As colunas de rastreabilidade podem ser acrescentadas com mutate():

dados <- dados |>
  dplyr::mutate(
    arquivo_origem = basename(arquivo),
    competencia_origem = "202501"
  )

Esse código deve ser lido da seguinte forma:

Trecho Função
dados \|> Envia o objeto dados para a próxima função
dplyr::mutate() Cria ou modifica colunas
arquivo_origem = basename(arquivo) Registra o nome do arquivo
competencia_origem = "202501" Registra a competência do arquivo
dados <- Armazena novamente o resultado no objeto dados

Os valores são repetidos em todas as linhas porque todos os registros foram obtidos do mesmo arquivo.

Exemplo simplificado

Antes da inclusão da rastreabilidade:

pa_cnes pa_proc_id pa_qtdapr
2000016 0301010072 10
2000024 0301010072 5

Depois da inclusão:

pa_cnes pa_proc_id pa_qtdapr arquivo_origem competencia_origem
2000016 0301010072 10 PAAC2501.dbc 202501
2000024 0301010072 5 PAAC2501.dbc 202501

Exemplo hipotético

dados <- data.frame(
  pa_cnes = c("2000016", "2000024"),
  pa_proc_id = c("0301010072", "0301010072"),
  pa_qtdapr = c(10, 5)
)

arquivo <- "PAAC2501.dbc"

dados <- dados |>
  dplyr::mutate(
    arquivo_origem = basename(arquivo),
    competencia_origem = "202501"
  )

dados

Resultado esperado:

  pa_cnes pa_proc_id pa_qtdapr arquivo_origem competencia_origem
1 2000016 0301010072        10  PAAC2501.dbc              202501
2 2000024 0301010072         5  PAAC2501.dbc              202501

Exemplo com dados reais

Considere o arquivo:

PAAC2501.dbc

O nome informa:

Parte Significado
PA Produção Ambulatorial
AC Acre
25 Ano de 2025
01 Mês de janeiro
.dbc Formato do arquivo

Portanto, a competência é 202501.

Primeiro, o arquivo é lido:

arquivo <- "PAAC2501.dbc"
url="ftp://ftp.datasus.gov.br/dissemin/publicos/SIASUS/200801_/Dados/"
curl_download(
  paste0(url,arquivo),
  destfile= arquivo
)

dados <- read.dbc::read.dbc(arquivo)

Nesse momento, o objeto dados contém os registros do arquivo, mas pode não conservar explicitamente o nome do arquivo utilizado.

Importância da rastreabilidade

As colunas de origem permitem:

  • identificar de qual arquivo veio cada registro;
  • localizar problemas em uma competência específica;
  • verificar se arquivos foram processados mais de uma vez;
  • reproduzir a análise;
  • auditar a consolidação;
  • separar dados de diferentes competências e unidades federativas.

Quando vários arquivos forem processados, a rastreabilidade deve ser acrescentada antes da consolidação.

dados_ac <- read.dbc::read.dbc(
  "PAAC2501.dbc"
) |>
  dplyr::mutate(
    arquivo_origem = "PAAC2501.dbc",
    competencia_origem = "202501",
    uf_origem = "AC"
  )

dados_am <- read.dbc::read.dbc(
  "PAAM2501.dbc"
) |>
  dplyr::mutate(
    arquivo_origem = "PAAM2501.dbc",
    competencia_origem = "202501",
    uf_origem = "AM"
  )

dados <- dplyr::bind_rows(
  dados_ac,
  dados_am
)

Assim, mesmo depois da consolidação, cada registro continua associado ao seu arquivo de origem.


Fontes de dados abertos

Ministério da Saúde

No ecossistema analisado nesta aula, o Ministério da Saúde e a SEIDIGI/MS mantêm sistemas federais, nacionais, padrões, documentos técnicos e canais de disseminação.

Os principais canais utilizados serão:

  • FTP de arquivos de disseminação;
  • Portal de Dados Abertos do SUS;
  • APIs públicas;
  • documentos de layout e dicionários de dados.

Anvisa

A Agência Nacional de Vigilância Sanitária atua na regulação sanitária de produtos e serviços. No campo econômico, a Câmara de Regulação do Mercado de Medicamentos - CMED estabelece critérios e limites regulatórios de preços de medicamentos.

Essas informações podem apoiar:

  • comparação entre preço observado e teto regulatório;
  • análise de compras públicas;
  • estudos de acesso a medicamentos;
  • avaliação de impacto orçamentário.

Preço regulado, preço de compra, valor SIGTAP (MS) e custo do tratamento são conceitos diferentes.

repositório: https://dados.anvisa.gov.br/dados/

ANS

A Agência Nacional de Saúde Suplementar regula o setor de planos privados de assistência à saúde e disponibiliza bases sobre beneficiários, operadoras, produtos, utilização e informações econômico-financeiras.

Esses dados permitem estudar:

  • cobertura da saúde suplementar;
  • concentração de mercado;
  • receitas, despesas e desempenho das operadoras;
  • utilização de serviços;
  • relações entre os setores público e suplementar.

inventário de dados abertos: https://www.gov.br/ans/pt-br/acesso-a-informacao/perfil-do-setor/dados-abertos-1. Tabulador: https://www.ans.gov.br/anstabnet/


Sistemas e centralizadores de informação

Visão geral

Sistema ou fonte Conteúdo principal Unidade típica de análise Uso em economia da saúde
Sistema de Informações Ambulatoriais do SUS (SIA) Produção ambulatorial financiada pelo SUS Procedimento, atendimento, BPA ou APAC Quantidades apresentadas e aprovadas, valores ambulatoriais e perfil de utilização
Sistema de Informações Hospitalares do SUS (SIH) Internações financiadas pelo SUS AIH, internação ou ato hospitalar Permanência, utilização de recursos, procedimentos e valores hospitalares
Sistema de Informações sobre Mortalidade (SIM) Óbitos e causas de morte Declaração de óbito Mortalidade, sobrevida, carga de doença, anos de vida perdidos e desfechos
Sistema de Informação de Agravos de Notificação (SINAN) Agravos e doenças de notificação compulsória Notificação ou investigação Incidência, prevalência, vigilância e impacto econômico dos agravos
Sistema de Informações sobre Nascidos Vivos (SINASC) Nascidos vivos e características maternas e neonatais Declaração de nascido vivo Saúde materno-infantil, planejamento, desfechos perinatais e denominadores populacionais
Cadastro Nacional de Estabelecimentos de Saúde (CNES) Estabelecimentos, serviços, equipamentos, leitos, equipes e profissionais Estabelecimento por competência Oferta, capacidade instalada, disponibilidade tecnológica e perfil dos prestadores
Sistema de Gerenciamento da Tabela de Procedimentos, Medicamentos e OPM do SUS (SIGTAP) Procedimentos, medicamentos e OPM do SUS, com atributos e regras de compatibilidade Procedimento por competência Valores de referência, modalidade, complexidade, financiamento e compatibilidades
Comunicação de Informação Hospitalar e Ambulatorial (CIHA) Informações hospitalares e ambulatoriais não registradas no SIH em determinados segmentos Evento hospitalar ou ambulatorial Complementação da utilização assistencial e análise de atendimentos não representados pelo SIH
Sistema de Informações sobre Orçamentos Públicos em Saúde (SIOPS) Receitas totais e despesas públicas em saúde declaradas pelos entes federativos Ente federativo por período e classificação orçamentária Financiamento público, gasto em saúde, execução orçamentária e cumprimento dos mínimos constitucionais
Banco de Preços em Saúde (BPS) Compras públicas e privadas de medicamentos e dispositivos médicos Item de compra, instituição e data da aquisição Preços praticados, dispersão de preços, estimativas de custos e comparação entre compradores
Fundo Nacional de Saúde (FNS) Transferências federais, convênios, propostas, instrumentos e pagamentos Transferência, proposta, instrumento ou ordem bancária Fluxo de recursos federais, execução financeira e distribuição dos repasses
Plataforma InvestSUS (InvestSUS) Repasses, propostas, saldos e instrumentos acompanhados pelo Fundo Nacional de Saúde Proposta, transferência, conta ou instrumento Monitoramento de financiamento, investimento, empenho, pagamento e saldos
Sistema de Controle do Limite Financeiro da Média e Alta Complexidade (SISMAC) Limites financeiros da média e alta complexidade e seus componentes Gestor ou ente federativo por competência e componente financeiro Análise do teto MAC, alterações de limites, alocação de recursos e comparação com a produção
Sistema de Monitoramento de Obras (SISMOB) Propostas, execução e monitoramento de obras financiadas pelo Ministério da Saúde Obra, proposta ou estabelecimento Investimento em infraestrutura, execução física e financeira e expansão da capacidade instalada
Câmara de Regulação do Mercado de Medicamentos (CMED) Preços regulados de medicamentos, como PF, PMC e PMVG Medicamento e apresentação por lista e alíquota Valores máximos regulatórios, aplicação do CAP e referência para estimativas de custos
Relação Nacional de Medicamentos Essenciais (RENAME) Medicamentos e insumos selecionados para utilização no SUS Medicamento, apresentação e componente da assistência farmacêutica Definição do conjunto de tecnologias disponíveis, comparação de alternativas e planejamento farmacêutico
Componente Especializado da Assistência Farmacêutica (CEAF) Medicamentos especializados, critérios de acesso, autorização e dispensação Solicitação, autorização ou dispensação Utilização de medicamentos especializados, continuidade do tratamento e impacto orçamentário
Sistema de Informações Ambulatoriais — APAC de Medicamentos (SIA/AM) Registros de APAC de medicamentos APAC, usuário, medicamento e competência Quantidades autorizadas, utilização de medicamentos e acompanhamento da assistência farmacêutica
Sistema de Informações Ambulatoriais — APAC de Quimioterapia (SIA/AQ) Registros de APAC relacionados à quimioterapia APAC, usuário, procedimento oncológico e competência Utilização de tratamentos oncológicos, produção, valores aprovados e trajetórias assistenciais
Agência Nacional de Saúde Suplementar (ANS) Beneficiários, operadoras, planos, utilização e informações econômico-financeiras da saúde suplementar Beneficiário, operadora, plano, evento ou período Comparação entre saúde suplementar e SUS, despesas assistenciais, cobertura e utilização
Padrão de Troca de Informações na Saúde Suplementar (TISS) Troca padronizada de informações entre prestadores e operadoras da saúde suplementar Guia, evento assistencial ou item de cobrança Utilização, pagamentos, custos assistenciais e padrões de cobrança na saúde suplementar
Rede Nacional de Dados em Saúde (RNDS) Documentos clínicos e registros interoperáveis de saúde Documento clínico, evento ou indivíduo, conforme autorização Integração longitudinal de informações e análise de trajetórias assistenciais em ambientes autorizados
Tabulador de Informações de Saúde (TabNet) Tabulações agregadas de sistemas oficiais do SUS Célula agregada segundo período, território e filtros Validação externa dos microdados, construção de indicadores e comparação de totais
Sala de Apoio à Gestão Estratégica (SAGE) Indicadores, painéis e informações estratégicas do Ministério da Saúde Indicador por período, território ou programa Monitoramento de políticas, contextualização dos resultados e validação com dados consolidados
Comissão Nacional de Incorporação de Tecnologias no Sistema Único de Saúde (Conitec) Recomendações sobre incorporação, exclusão ou alteração de tecnologias no SUS Tecnologia, indicação ou recomendação Evidências de eficácia, segurança, custo-efetividade e impacto orçamentário
Protocolos Clínicos e Diretrizes Terapêuticas (PCDT) Critérios diagnósticos, tratamentos, acompanhamento e regras de acesso Condição clínica, população ou tecnologia Definição do comparador, população elegível, recursos utilizados e padrão assistencial
Rede Brasileira de Avaliação de Tecnologias em Saúde (Rebrats) Estudos, métodos e instituições de Avaliação de Tecnologias em Saúde Estudo, relatório ou tecnologia avaliada Evidências econômicas, avaliações de custo-efetividade e apoio metodológico
Portal de Dados Abertos do Sistema Único de Saúde (Portal de Dados Abertos do SUS) Conjuntos e recursos publicados por diferentes áreas do Ministério da Saúde Conjunto, recurso ou registro, conforme a base Descoberta de fontes complementares, integração de dados e reprodução de análises

A unidade de análise varia conforme o arquivo, o subsistema e a forma de disseminação. Sistemas de produção, como SIA e SIH, disponibilizam registros assistenciais; sistemas financeiros, como SIOPS, SISMAC e InvestSUS, representam orçamento, limites ou transferências; fontes como TabNet e SAGE apresentam dados previamente agregados.

Valores do SIA, SIH e SIGTAP não devem ser interpretados automaticamente como custos econômicos reais. O BPS representa preços informados em compras, enquanto as listas da CMED apresentam limites regulatórios. SIOPS, FNS, InvestSUS, SISMAC e SISMOB representam dimensões distintas do financiamento e da execução dos recursos públicos.

Fluxo da produção ambulatorial e hospitalar

A produção assistencial do SUS é registrada por diferentes instrumentos. A escolha depende da modalidade de atendimento, da necessidade de identificação do usuário e da exigência de autorização prévia.

Instrumento Sistema Característica principal
Boletim de Produção Ambulatorial Consolidado (BPA-C) Sistema de Informações Ambulatoriais do SUS (SIA) Registra a produção ambulatorial de forma consolidada, sem identificação individual do usuário
Boletim de Produção Ambulatorial Individualizado (BPA-I) Sistema de Informações Ambulatoriais do SUS (SIA) Registra a produção ambulatorial individualizada, com informações do usuário e do atendimento
Autorização de Procedimentos Ambulatoriais (APAC) Sistema de Informações Ambulatoriais do SUS (SIA) Registra procedimentos ambulatoriais que exigem autorização, identificação do usuário e acompanhamento
Autorização de Internação Hospitalar (AIH) Sistema de Informações Hospitalares do SUS (SIH) Registra internações hospitalares autorizadas e financiadas pelo SUS

Arquivo SIA PA - produção ambulatorial

O Sistema de Informações Ambulatoriais recebe e processa a produção ambulatorial. Os registros podem resultar de diferentes instrumentos, como BPA e APAC.

O arquivo, cuja nomenclatura padrão é PAUFAAMM.dbc, consolida procedimentos ambulatoriais. Seu preenchimento varia conforme o instrumento identificado em PA_DOCORIG.

Campos particularmente úteis:

Campo Conteúdo
PA_CODUNI Código CNES do estabelecimento
PA_GESTAO Município gestor ou indicação de gestão estadual
PA_CMP Competência de realização
PA_PROC_ID Procedimento ambulatorial
PA_DOCORIG Instrumento de registro
PA_QTDAPR Quantidade aprovada
PA_VALAPR Valor aprovado
PA_TPFIN Tipo de financiamento
PA_SUBFIN Subtipo de financiamento

A linha do PA não representa sempre uma pessoa. Dependendo do instrumento, pode representar produção consolidada, atendimento individualizado ou procedimento de uma APAC.

BPA-C

O Boletim de Produção Ambulatorial Consolidado (BPA-C) registra quantidades agregadas de procedimentos.

Uma linha geralmente representa a produção consolidada segundo combinações como:

  • estabelecimento;
  • competência;
  • procedimento;
  • CBO;
  • características administrativas.

O BPA-C não identifica individualmente cada usuário. Por isso, é adequado para analisar quantidade produzida, mas não para acompanhar trajetórias individuais.

BPA-I

O Boletim de Produção Ambulatorial Individualizado (BPA-I) registra procedimentos com informações individualizadas do atendimento.

Pode incluir:

  • estabelecimento;
  • usuário;
  • procedimento;
  • profissional;
  • CBO;
  • data do atendimento;
  • município de residência;
  • diagnóstico, quando exigido;
  • quantidade apresentada.

Individualização não significa necessariamente autorização prévia. O instrumento de registro e as regras do procedimento devem ser consultados no SIGTAP.

APAC

A Autorização de Procedimentos Ambulatoriais de Alta Complexidade/Custo (APAC) é utilizada em linhas de cuidado ou procedimentos que exigem autorização, acompanhamento e registro individualizado.

O fluxo simplificado é:

Solicitação → avaliação técnica → autorização → realização → apresentação da produção → processamento no SIA

A APAC é utilizada, entre outras áreas, em:

  • medicamentos do Componente Especializado da Assistência Farmacêutica;
  • quimioterapia;
  • radioterapia;
  • terapia renal substitutiva;
  • atenção domiciliar;
  • outros tratamentos continuados ou especializados.

Uma APAC pode gerar vários registros no arquivo PA:

  • P: procedimento principal;
  • S: procedimento secundário.

AIH

A Autorização de Internação Hospitalar (AIH) é utilizada para registrar e processar internações financiadas pelo SUS.

O fluxo simplificado é:

Indicação de internação → solicitação → autorização → internação → alta ou encerramento → processamento no SIH

A AIH reúne informações como:

  • estabelecimento;
  • usuário;
  • diagnóstico;
  • procedimento solicitado;
  • procedimento realizado;
  • datas de internação e saída;
  • permanência;
  • utilização de UTI;
  • valores hospitalares e profissionais;
  • motivo de saída;
  • ocorrência de óbito.

Relação entre os instrumentos e os arquivos disseminados

Instrumento Arquivo de disseminação Unidade aproximada
BPA-C SIA PA Produção consolidada
BPA-I SIA PA e BI Atendimento individualizado
APAC SIA PA e arquivos temáticos Autorização e procedimentos associados
AIH SIH RD e SP Internação e atos profissionais

O arquivo PA reúne registros originados por instrumentos diferentes. Antes de contar atendimentos ou usuários, verifique PA_DOCORIG e a unidade de registro.

Fonte: Informe Técnico do SIA.

Regulação do acesso a medicamentos do CEAF

O Componente Especializado da Assistência Farmacêutica (CEAF) é uma estratégia de acesso ambulatorial a medicamentos cujas linhas de cuidado são definidas em Protocolos Clínicos e Diretrizes Terapêuticas (PCDT).

SIGTAP Grupo 06.04 - Medicamentos do CEAF

O fluxo geral é:

Prescrição → solicitação → avaliação documental e clínica → autorização → dispensação → renovação e acompanhamento

Prescrição

O profissional prescreve o medicamento e preenche os documentos exigidos, incluindo:

  • Laudo para Solicitação, Avaliação e Autorização de Medicamentos — LME;
  • prescrição;
  • exames;
  • documentos previstos no PCDT;
  • identificação do usuário.

Solicitação

O usuário ou responsável apresenta a documentação à unidade responsável definida pela Secretaria Estadual de Saúde ou do Distrito Federal.

Avaliação e autorização

A solicitação é avaliada segundo:

  • diagnóstico;
  • critérios de inclusão;
  • critérios de exclusão;
  • tratamento prévio;
  • exames obrigatórios;
  • dose;
  • duração;
  • regras do PCDT.

Dispensação

Após o deferimento, o medicamento é fornecido pela unidade responsável. A continuidade pode exigir renovação, exames e reavaliação.

As Secretarias Estaduais de Saúde e do Distrito Federal são responsáveis pela avaliação das solicitações e pela dispensação no CEAF.

veja a lista de PCDT. Saiba mais sobre o Componente Especializado da Assistência Farmacêutica (CEAF).

Arquivo SIA AM — APAC de medicamentos

O arquivo AMUFAAMM.dbc contém registros processados de APAC de medicamentos.

Exemplo:

AMAC2501.dbc

Interpretação:

Parte Significado
AM APAC de medicamentos
AC Acre
25 Ano de 2025
01 Janeiro
.dbc Arquivo DBF comprimido

O arquivo pode apoiar análises sobre:

  • usuários autorizados;
  • procedimentos de medicamentos;
  • diagnóstico;
  • estabelecimento;
  • município;
  • quantidade;
  • competência;
  • continuidade do tratamento.

Exemplo de download:

url <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "SIASUS/200801_/Dados/AMAC2501.dbc"
)

curl::curl_download(url, "AMAC2501.dbc")
am <- read.dbc::read.dbc("AMAC2501.dbc")

Exploração mínima:

dim(am)
names(am)
head(am, 3)

O arquivo AM registra APAC processada no SIA. Ele não comprova isoladamente adesão ao tratamento, consumo pelo paciente ou resultado clínico.

Regulação do tratamento oncológico e arquivo SIA AQ

A assistência oncológica é organizada em estabelecimentos habilitados e envolve diagnóstico, estadiamento, definição terapêutica, autorização e registro da produção.

A APAC é utilizada para registrar procedimentos ambulatoriais de tratamento, incluindo quimioterapia.

O arquivo AQUFAAMM.dbc contém registros de APAC de quimioterapia.

Exemplo:

AQAC2501.dbc

Campos e informações podem permitir análises sobre:

  • estabelecimento;
  • usuário;
  • diagnóstico;
  • tipo de tumor;
  • procedimento;
  • esquema ou finalidade terapêutica;
  • competência;
  • continuidade do tratamento;
  • quantidade apresentada ou aprovada.

Exemplo de download:

url <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "SIASUS/200801_/Dados/AQAC2501.dbc"
)

curl::curl_download(url, "AQAC2501.dbc")
aq <- read.dbc::read.dbc("AQAC2501.dbc")

Exploração mínima:

dim(aq)
names(aq)
head(aq, 3)

Particularidade do financiamento oncológico

No tratamento oncológico, a APAC registra procedimentos terapêuticos. O financiamento não deve ser interpretado automaticamente como reembolso de cada medicamento utilizado.

O estabelecimento habilitado organiza o tratamento conforme:

  • condição clínica;
  • estadiamento;
  • diretrizes diagnósticas e terapêuticas;
  • estrutura disponível;
  • procedimentos autorizados;
  • regras de financiamento do SUS.

O procedimento registrado, o medicamento utilizado, o valor aprovado e o custo real do tratamento são dimensões diferentes.

Fonte: Legislação da Assistência Farmacêutica em Oncologia.

PCDT, Conitec, ATS e Rebrats

Os Protocolos Clínicos e Diretrizes Terapêuticas (PCDT) estabelecem critérios para diagnóstico, tratamento e acompanhamento de condições clínicas no SUS.

Podem definir:

  • critérios de inclusão e exclusão;
  • exames necessários;
  • alternativas terapêuticas;
  • doses e esquemas;
  • mecanismos de monitoramento;
  • critérios de interrupção;
  • responsabilidades dos gestores.

Conitec

A Comissão Nacional de Incorporação de Tecnologias no SUS (Conitec) assessora o Ministério da Saúde em processos relacionados a:

  • incorporação;
  • exclusão;
  • alteração de tecnologias;
  • elaboração ou atualização de PCDT.

A decisão considera elementos como:

  • eficácia;
  • efetividade;
  • segurança;
  • avaliação econômica;
  • impacto orçamentário;
  • relevância para o SUS;
  • participação social.

A Conitec avalia e recomenda. A decisão e a publicação dos PCDT são formalizadas pelo Ministério da Saúde.

Avaliação de Tecnologias em Saúde

A Avaliação de Tecnologias em Saúde (ATS) examina consequências clínicas, econômicas, sociais, organizacionais e éticas do uso de tecnologias.

Tecnologia em saúde pode incluir:

  • medicamentos;
  • equipamentos;
  • procedimentos;
  • testes diagnósticos;
  • sistemas;
  • modelos de cuidado.

Em economia da saúde, a ATS pode utilizar:

  • custo-efetividade;
  • custo-utilidade;
  • custo-benefício;
  • impacto orçamentário;
  • análise de incerteza;
  • avaliação de equidade.

Rebrats

A Rede Brasileira de Avaliação de Tecnologias em Saúde (Rebrats) articula instituições e núcleos que produzem e disseminam estudos de ATS para apoiar decisões no SUS.

A Rebrats contribui por meio de:

  • pareceres técnico-científicos;
  • revisões sistemáticas;
  • avaliações econômicas;
  • análises de impacto orçamentário;
  • formação de profissionais;
  • desenvolvimento de métodos;
  • cooperação entre instituições.

Relação com os dados do SIA e SIH

Componente Papel
Conitec Avaliação e recomendação sobre tecnologias e protocolos
PCDT Definição de critérios clínicos e terapêuticos
SIGTAP Regras administrativas e atributos dos procedimentos
SIA/SIH Registro da produção processada
SIA AM Registros de APAC de medicamentos
SIA AQ Registros de APAC de quimioterapia
Rebrats Produção e disseminação de estudos de ATS

Os dados administrativos podem apoiar ATS e monitoramento pós-incorporação, mas possuem limitações:

  • não registram todos os desfechos clínicos;
  • valores aprovados não equivalem necessariamente a custos;
  • podem existir mudanças de codificação;
  • a cobertura depende da qualidade do registro;
  • comparações históricas exigem compatibilidade temporal com PCDT e SIGTAP.

Fontes:

SIH: internações hospitalares

O Sistema de Informações Hospitalares dissemina dados das Autorizações de Internação Hospitalar - AIH.

Arquivo RD - Reduzido de AIH

O arquivo RDUFAAMM.dbc contém dados reduzidos das AIH.

Campo Conteúdo
N_AIH Número da AIH
CNES Estabelecimento hospitalar
PROC_REA Procedimento principal realizado
QT_DIARIAS Quantidade de diárias
DIAS_PERM Dias de permanência
VAL_SH Valor dos serviços hospitalares
VAL_SP Valor dos serviços profissionais
VAL_TOT Valor total da AIH
DIAG_PRINC Diagnóstico principal
MORTE Indicador de óbito
MUNIC_RES Município de residência
MUNIC_MOV Município do estabelecimento

Arquivo SP - Atos profissionais

O arquivo SPUFAAMM.dbc detalha atos profissionais associados à internação. Ele possui maior granularidade que o RD e pode conter várias linhas para uma AIH.

O PA pertence ao SIA e o RD pertence ao SIH. Ambos são mensais e podem ser articulados com CNES e SIGTAP, mas possuem unidades de registro diferentes.

Regulação do acesso e registros do SIA e SIH

A regulação do acesso organiza a entrada dos usuários nos serviços segundo:

  • necessidade clínica;
  • risco;
  • disponibilidade da oferta;
  • referências territoriais;
  • protocolos;
  • prioridades;
  • pactuações entre gestores.

Sistemas como SISREG e e-SUS Regulação podem registrar:

  • solicitações;
  • filas;
  • classificação de risco;
  • agendamentos;
  • encaminhamentos;
  • autorizações;
  • disponibilidade de vagas.

O SIA e o SIH possuem outra função principal: registrar, processar e disseminar a produção ambulatorial e hospitalar apresentada pelos gestores.

Etapa Sistema ou instrumento associado
Solicitação de acesso Sistema local, SISREG ou e-SUS Regulação
Avaliação e priorização Central de regulação
Autorização ambulatorial APAC ou autorização do BPA-I, quando exigida
Autorização hospitalar AIH
Registro da produção SIA ou SIH
Processamento e controle Gestor e sistemas nacionais
Disseminação Arquivos públicos do SIA e SIH

O SIA e o SIH podem apoiar análises de acesso por meio de:

  • município de residência;
  • município de atendimento;
  • estabelecimento;
  • procedimento;
  • competência;
  • quantidade aprovada;
  • internação;
  • permanência;
  • deslocamento entre territórios.

Entretanto, essas bases geralmente não apresentam toda a demanda reprimida.

A ausência de produção pode significar ausência de demanda, falta de oferta, barreira de acesso, não autorização, não realização ou falha de registro.

Para estudar acesso de forma mais completa, combine:

  • filas reguladas;
  • solicitações;
  • oferta do CNES;
  • produção do SIA e SIH;
  • população;
  • tempos de espera;
  • pactuações regionais.

Fonte: Sistemas de Informação na Regulação do Acesso.

SIM, SINAN e SINASC

  • SIM: permite analisar causas básicas e associadas de morte, local de residência, características demográficas e circunstâncias do óbito.
  • SINAN: organiza notificações e investigações de agravos; seus subsistemas variam conforme a doença ou agravo.
  • SINASC: reúne informações da Declaração de Nascido Vivo, incluindo características maternas, gestação, parto e recém-nascido.

Essas fontes não medem custos diretamente, mas ajudam a definir necessidades, desfechos, carga de doença e populações de referência.

CNES

O Cadastro Nacional de Estabelecimentos de Saúde descreve a oferta e a estrutura dos serviços.

Subsistemas frequentes:

Sigla Conteúdo
ST Estabelecimentos
DC Dados complementares
PF Profissionais
LT Leitos
EQ Equipamentos
SR Serviços especializados
EP Equipes
HB Habilitações
GM Gestão e metas

O CNES permite contextualizar a produção segundo estabelecimento, município, gestão, natureza e capacidade instalada.

Domínios da produção ambulatorial e hospitalar

Complexidade

A complexidade é um atributo do procedimento no SIGTAP. Ela não deve ser inferida apenas pelo estabelecimento, pelo valor ou pelo instrumento de registro.

Valor do domínio Complexidade
1 Atenção Básica
2 Média complexidade
3 Alta complexidade
4 Não se aplica

A complexidade do procedimento pode mudar entre competências. A análise histórica deve utilizar a classificação vigente no mês da produção.

Financiamento

O tipo de financiamento identifica a forma geral de financiamento associada ao procedimento na competência consultada.

Código SIGTAP Tipo de financiamento
01 Atenção Básica — PAB
02 Assistência Farmacêutica
04 Fundo de Ações Estratégicas e Compensação — FAEC
05 Incentivo — MAC
06 Média e Alta Complexidade — MAC
07 Vigilância em Saúde
08 Gestão em Saúde

Os códigos não são necessariamente sequenciais. A ausência do código 03 não deve ser corrigida ou recodificada durante a importação.

Interpretação econômica
Financiamento Interpretação geral Forma predominante de financiamento Cuidados na análise
Piso da Atenção Básica (PAB) Denominação histórica relacionada ao financiamento das ações e dos procedimentos da atenção primária à saúde Transferências vinculadas ao custeio da atenção básica, conforme as regras vigentes em cada competência Não representa necessariamente pagamento por procedimento. A classificação deve ser interpretada conforme a competência e a norma de financiamento vigente
Assistência Farmacêutica Financiamento de medicamentos, insumos e ações dos componentes da assistência farmacêutica Transferências e aquisições organizadas conforme os componentes Básico, Estratégico e Especializado da Assistência Farmacêutica O valor registrado no procedimento não comprova o custo de aquisição, dispensação ou transferência financeira
Fundo de Ações Estratégicas e Compensação (FAEC) Financiamento de ações estratégicas, procedimentos específicos e novas incorporações, conforme definição do Ministério da Saúde Transferência geralmente condicionada à produção aprovada e informada nos sistemas SIA e SIH É necessário verificar produção apresentada, aprovada e paga, além das regras, limites e portarias vigentes
Incentivo — Média e Alta Complexidade (Incentivo — MAC) Recursos vinculados a políticas, redes, habilitações, qualificações ou serviços específicos de média e alta complexidade Custeio fixo, complementar ou condicionado ao atendimento dos critérios definidos em portaria Não corresponde necessariamente à quantidade produzida multiplicada pelo valor do SIGTAP; pode depender de habilitação, adesão ou manutenção do serviço
Média e Alta Complexidade (MAC) Financiamento regular de ações e serviços ambulatoriais e hospitalares especializados Transferência regular dentro do limite financeiro MAC dos estados, do Distrito Federal e dos municípios A produção registrada no SIA e no SIH subsidia programação e controle, mas o valor do SIGTAP não representa necessariamente o valor efetivamente transferido ou pago ao prestador
Vigilância em Saúde Financiamento de ações de vigilância epidemiológica, sanitária, ambiental e de saúde do trabalhador Transferências e incentivos associados à execução de ações, programas e estratégias de vigilância Os resultados não devem ser avaliados somente por produção; devem ser considerados cobertura, oportunidade, completude e indicadores epidemiológicos
Gestão em Saúde Financiamento de ações de planejamento, regulação, controle, avaliação, auditoria, participação social e fortalecimento da gestão do SUS Transferências ou incentivos vinculados a políticas e ações de organização da gestão Em geral, não existe correspondência direta entre o recurso transferido e um procedimento assistencial individualizado

A classificação de financiamento registrada no SIGTAP informa a vinculação geral do procedimento, mas não comprova isoladamente o pagamento ao estabelecimento ou a transferência ao gestor. Para análises financeiras, deve ser integrada aos dados do Fundo Nacional de Saúde (FNS), InvestSUS, SISMAC, SIOPS, SIA, SIH e às portarias vigentes na respectiva competência.

O Piso da Atenção Básica (PAB) é uma denominação histórica do financiamento federal destinado à manutenção das ações de atenção primária à saúde. Tradicionalmente, era composto por uma parcela fixa, calculada segundo critérios populacionais, e por componentes variáveis associados à implantação de equipes, programas e estratégias prioritárias. Embora o modelo federal de financiamento da atenção primária tenha sido reformulado ao longo do tempo, a expressão Atenção Básica (PAB) permanece em classificações e registros históricos do SUS, inclusive no SIGTAP. Essa classificação indica que o procedimento está relacionado ao financiamento da atenção básica, mas não representa necessariamente pagamento individual por procedimento. Para análises financeiras, é necessário considerar a competência dos dados e consultar as normas de financiamento vigentes naquele período.

A classificação Média e Alta Complexidade (MAC) identifica, em termos gerais, procedimentos ambulatoriais e hospitalares financiados pelo limite financeiro regular de média e alta complexidade dos estados e municípios. O limite MAC é transferido regularmente aos fundos de saúde e financia o funcionamento de serviços especializados, hospitais, ambulatórios, exames, terapias e outros componentes das redes de atenção. A produção registrada no SIA e no SIH é utilizada para programação, monitoramento, regulação, avaliação e controle, mas o valor informado no SIGTAP não deve ser interpretado automaticamente como o valor efetivamente transferido ao estabelecimento ou ao gestor.

A classificação Incentivo — MAC também pertence ao campo da média e alta complexidade, mas identifica recursos vinculados a uma política, rede, serviço ou estratégia específica. Em geral, esses incentivos são instituídos por portarias e podem depender de habilitação, qualificação, adesão, cumprimento de critérios ou manutenção de determinado serviço. Por isso, o incentivo não corresponde necessariamente à multiplicação da quantidade produzida pelo valor do procedimento. Dependendo da regra aplicável, pode assumir a forma de custeio fixo, complemento financeiro ou transferência condicionada ao funcionamento de uma rede ou serviço.

O tipo de financiamento do procedimento não comprova o pagamento efetivamente realizado. Para analisar repasses, limites e execução financeira, devem ser consultadas fontes como SISMAC, Fundo Nacional de Saúde, InvestSUS e SIOPS.

Rubrica FAEC

A rubrica FAEC detalha programas, políticas, especialidades ou finalidades relacionadas ao financiamento e à classificação da produção.

A denominação do campo não significa que todos os valores do domínio sejam necessariamente FAEC. O domínio também contém categorias de MAC, incentivos, vigilância, gestão e valores não discriminados. Por isso, a rubrica deve ser analisada em conjunto com o tipo de financiamento.

Valor do domínio Rubrica
1 Atenção Básica — PAB
2 Assistência Farmacêutica
3 Coleta de material
4 Diagnóstico em laboratório clínico
5 Coleta e exame anatomopatológico do colo uterino
6 Diagnóstico em neurologia
7 Diagnóstico em otorrinolaringologia e fonoaudiologia
8 Diagnóstico em psicologia e psiquiatria
9 Consultas médicas e de outros profissionais de nível superior
10 Atenção domiciliar
11 Atendimento e acompanhamento em reabilitação física, mental, visual, auditiva e de múltiplas deficiências
12 Atendimento e acompanhamento psicossocial
13 Atendimento e acompanhamento em saúde do idoso
14 Atendimento e acompanhamento de queimados
15 Atendimento e acompanhamento de diagnóstico de doenças endócrinas, metabólicas e nutricionais
16 Tratamento de doenças do sistema nervoso central e periférico
17 Tratamento de doenças do aparelho da visão
18 Tratamento em oncologia
19 Nefrologia
20 Tratamentos odontológicos
21 Cirurgia do sistema nervoso central e periférico
22 Cirurgias de ouvido, nariz e garganta
23 Deformidade labiopalatal e craniofacial
24 Cirurgia do aparelho da visão
25 Cirurgia do aparelho circulatório
26 Cirurgia do aparelho digestivo, órgãos anexos e parede abdominal, incluindo pré e pós-operatório
27 Cirurgia do aparelho geniturinário
28 Tratamento de queimados
29 Cirurgia reparadora para lipodistrofia
30 Outras cirurgias plásticas e reparadoras
31 Cirurgia orofacial
32 Procedimentos sequenciais
33 Cirurgias em nefrologia
34 Transplantes de órgãos, tecidos e células
35 Medicamentos para transplante
36 OPM auditivas
37 OPM em odontologia
38 OPM em queimados
39 OPM em nefrologia
40 OPM para transplantes
41 Incentivos ao pré-natal e nascimento
42 Incentivo ao registro civil de nascimento
43 Central Nacional de Regulação de Alta Complexidade — CNRAC
44 Reguladores da atividade hormonal — inibidores de prolactina
45 Política Nacional de Cirurgias Eletivas
46 Redesignação e acompanhamento
47 Projeto Olhar Brasil
48 Mamografia para rastreamento
49 Projeto Olhar Brasil — consulta
50 Projeto Olhar Brasil — óculos
51 Implementação de cirurgia cardiovascular pediátrica
52 Cirurgias eletivas — Componente I
53 Cirurgias eletivas — Componente II
54 Cirurgias eletivas — Componente III
55 Prótese mamária — exames
56 Prótese mamária — cirurgia
57 Transplante — histocompatibilidade
58 Triagem neonatal
59 Controle de qualidade do exame citopatológico do colo do útero
60 Exames do leite materno
61 Atenção às pessoas em situação de violência sexual
62 Sangue e hemoderivados
63 Mamografia para rastreamento na faixa etária recomendada
64 Doenças raras
65 Cadeiras de rodas
66 Sistema de frequência modulada pessoal — FM
67 Medicamentos em urgência
68 Cirurgias eletivas — Componente Único
69 Atenção Especializada em Saúde Auditiva
70 Terapias especializadas em angiologia
71 Tratamento de doença macular
72 OPME não relacionadas ao ato cirúrgico
73 Diagnóstico e tratamento em oncologia
74 Diagnóstico de trombofilia em gestante
75 Reabilitação pós-COVID-19
76 Telemedicina em urgência
77 Fisioterapia cardiovascular
78 Hemodinâmica em atendimento de urgência
79 Exames sorológicos e imunológicos
80 QualiSUS Cardio
81 Pré-cirúrgico em cirurgias prioritárias
82 Programa Agora Tem Especialistas — Componente Cirúrgico, anteriormente Redução das Filas
83 Síndrome Respiratória Aguda Grave — SRAG
84 Alta Complexidade em Cardiologia
85 Cirurgia da face e do sistema estomatognático
86 Neurocirurgias
87 Exames coprológicos
88 Programa Agora Tem Especialistas — Componente Ambulatorial
89 Saúde bucal
90 Radioterapia
91 Recursos vinculados à parcela única
92 Recursos vinculados a emendas parlamentares
93 Materno-infantil
94 Saúde da mulher
95 FAEC CNRAC — código anterior à Tabela Unificada, válido para 2008-01
96 FAEC eletiva — código anterior à Tabela Unificada, válido para 2008-01
97 Incentivo — MAC
98 Média e Alta Complexidade — MAC
99 Vigilância em Saúde
100 Gestão do SUS
101 Não discriminado ou não se aplica

Fonte orçamentária

A fonte orçamentária identifica categorias específicas associadas à origem ou modalidade do recurso.

Valor do domínio Fonte orçamentária
1 Modalidade 1 — Serviço de Saúde — Agora Tem Especialistas
2 Modalidade 2 — Equipes Volantes — Agora Tem Especialistas
3 Crédito financeiro — parcelas vencidas e vincendas
4 Crédito financeiro — transação tributária
5 Branco ou ignorado

A fonte orçamentária deve ser analisada de acordo com a competência e com as normas específicas do programa. Ela não substitui a consulta à execução orçamentária, aos repasses do Fundo Nacional de Saúde ou aos registros do SIOPS.

Regra contratual

A regra contratual informa como o procedimento participa da geração de crédito no processamento contratual.

Valor do domínio Regra contratual
1 Não gera crédito para produção de internação ou produção ambulatorial
2 Sem crédito na média complexidade ambulatorial, exceto FAEC
3 Sem crédito na média complexidade hospitalar, exceto FAEC
4 Sem crédito na alta complexidade ambulatorial, exceto FAEC
5 Sem crédito na alta complexidade hospitalar, exceto FAEC
6 Sem crédito nos procedimentos financiados pelo FAEC
7 Sem crédito total, incluindo FAEC
8 Sem crédito nas ações especializadas de odontologia — CEO I, II e III
9 Sem crédito no incentivo à Saúde do Trabalhador, exceto FAEC
10 Sem crédito total para hospital universitário do Ministério da Educação — HU/MEC
11 Sem crédito total para o Ministério da Saúde
12 Sem crédito para Núcleo Ampliado de Saúde da Família — NASF, exceto FAEC
13 Sem crédito total, incluindo FAEC — exclusivo para a Rede Sarah
14 Sem regra contratual
Cuidados de interpretação
  • Sem crédito não significa que o procedimento não possa ser registrado;
  • a regra contratual pode impedir ou modificar a geração de crédito em determinado componente;
  • registro de produção, aprovação, crédito e pagamento são etapas diferentes;
  • a regra deve ser interpretada junto ao financiamento, à rubrica, ao instrumento de registro e à competência;
  • o valor aprovado no SIA ou no SIH não comprova isoladamente o repasse financeiro ao estabelecimento;
  • alterações históricas devem ser preservadas por competência.

Relação entre os atributos financeiros

Atributo Pergunta respondida
Complexidade Em qual nível assistencial o procedimento está classificado?
Financiamento Qual é a modalidade geral de financiamento do procedimento?
Rubrica FAEC A qual programa, especialidade ou finalidade financeira a produção está associada?
Fonte orçamentária Qual categoria de origem ou modalidade do recurso está associada ao registro?
Regra contratual Como o procedimento participa da geração de crédito contratual?
Valor do procedimento Qual valor de referência está definido no SIGTAP para a competência?
Produção aprovada Qual quantidade ou valor foi aprovado no processamento do SIA ou SIH?
Repasse financeiro Qual recurso foi efetivamente transferido pelo Fundo Nacional de Saúde?
Despesa executada Qual valor foi empenhado, liquidado ou pago pelo ente federativo?

Produção especializada e financiamento

A produção ambulatorial e hospitalar de média e alta complexidade é registrada principalmente no SIA e no SIH.

Os recursos federais destinados a essas ações estão organizados, de forma geral, em dois componentes:

Componente Característica
Limite Financeiro MAC Recursos transferidos regularmente aos fundos estaduais, distrital e municipais
FAEC Financiamento de ações estratégicas e determinados procedimentos, apurado com base na produção registrada

Limite Financeiro MAC

O Limite Financeiro da Média e Alta Complexidade Ambulatorial e Hospitalar financia ações e serviços especializados sob gestão estadual, distrital ou municipal.

Ele pode contemplar:

  • consultas especializadas;
  • exames;
  • procedimentos ambulatoriais;
  • internações;
  • incentivos de custeio;
  • serviços habilitados;
  • redes e políticas específicas.

A transferência federal ocorre de forma regular e automática aos fundos de saúde, observadas as regras de programação e financiamento.

FAEC

O Fundo de Ações Estratégicas e Compensação (FAEC) financia procedimentos ou políticas considerados estratégicos, além de determinados procedimentos incorporados ao SUS.

O fluxo simplificado é:

Produção assistencial → registro no SIA ou SIH → processamento → apuração → transferência financeira

A classificação do financiamento pode ser investigada no SIA por campos como:

  • PA_TPFIN: tipo de financiamento;
  • PA_SUBFIN: subtipo de financiamento;
  • PA_VALAPR: valor aprovado;
  • PA_QTDAPR: quantidade aprovada.

Exemplo:

pa |>
  dplyr::group_by(PA_TPFIN, PA_SUBFIN) |>
  dplyr::summarise(
    quantidade = sum(PA_QTDAPR, na.rm = TRUE),
    valor_aprovado = sum(PA_VALAPR, na.rm = TRUE),
    .groups = "drop"
  )
Cuidados de interpretação
  • nem toda produção registrada gera pagamento adicional ao estabelecimento;
  • produção aprovada não é sinônimo de transferência federal;
  • valor SIGTAP não representa necessariamente custo;
  • Limite MAC e FAEC possuem lógicas distintas;
  • incentivos e recursos globais podem não ser identificados em cada procedimento;
  • diferenças entre produção apresentada e aprovada devem ser consideradas.

Para estudar alocação de recursos, combine SIA/SIH com informações do SISMAC, Fundo Nacional de Saúde, InvestSUS e SIOPS.

Fonte: Financiamento da Média e Alta Complexidade.

Volumetria e temporalidade

Leitura da lista FTP

A lista fornecida é uma fotografia do catálogo em 15 de agosto de 2026. Ela agrega arquivos por UF, sistema, versão, subsistema e ano de competência.

catalogo <- readr::read_csv(
  "lista_ftp_sus.csv",
  show_col_types = FALSE
)

Exemplo de web scraping da ficha do CNES

A ficha pública do estabelecimento pode ser consultada pelo código do município e pelo código CNES:

A página do CNES carrega parte das informações por JavaScript. Por isso, uma leitura simples com rvest::read_html() pode retornar apenas a estrutura da página, sem os valores preenchidos no navegador.

Para reproduzir a renderização, pode-se utilizar o pacote chromote, que controla uma sessão do Chrome ou Chromium.

Para extrações recorrentes ou em grande volume, prefira os arquivos DBC, as extrações oficiais ou o webservice do CNES. O web scraping é mais sensível a alterações na estrutura visual do portal.

Instalar os pacotes

Execute uma única vez:

install.packages(c(
  "chromote",
  "jsonlite",
  "tibble",
  "tidyr"
))
Função de extração

Como a função é extensa e representa apenas a implementação técnica, o chunk pode utilizar echo=FALSE. Nesse caso, o código será executado durante o knit, mas não aparecerá no HTML.

Executar a extração

O código de execução permanece curto e pode ser apresentado na aula:

url_cnes <- paste0(
  "https://cnes.datasus.gov.br/pages/",
  "estabelecimentos/ficha/infGerais/",
  "3548502025752"
)

# O cache local evita uma nova consulta a cada knit.
arquivo_cache_cnes <- file.path(
  diretorio_dados,
  "ficha_cnes_2025752.csv"
)

# Fallback documentado com os valores observados na consulta utilizada
# no material. Ele mantém o knit funcional quando o portal ou o navegador
# automatizado estiverem indisponíveis.
ficha_cnes_exemplo <- tibble::tribble(
  ~campo, ~valor,
  "Nome", "SANTA CASA DE SANTOS",
  "CNES", "2025752",
  "CNPJ", "58.198.524/0001-19",
  "Nome Empresarial",
  "IRMANDADE DA SANTA CASA DA MISERICORDIA DE SANTOS",
  "Natureza Jurídica(Grupo)",
  "ENTIDADES SEM FINS LUCRATIVOS",
  "Logradouro", "AV DOUTOR CLAUDIO LUIZ DA COSTA",
  "Número", "50",
  "Bairro", "JABAQUARA",
  "Município", "354850 - SANTOS",
  "UF", "SP",
  "CEP", "11075-900",
  "Telefone", "(13)3202-0600",
  "Dependência", "INDIVIDUAL",
  "Regional de Saúde", "204",
  "Tipo de Estabelecimento", "HOSPITAL GERAL",
  "Gestão", "MUNICIPAL",
  "Horário de funcionamento", "Sempre aberto"
)

campos_obrigatorios_cnes <- c(
  "Nome",
  "CNES",
  "Gestão",
  "Tipo de Estabelecimento"
)

if (file.exists(arquivo_cache_cnes)) {
  ficha_cache <- tryCatch(
    readr::read_csv(
      arquivo_cache_cnes,
      show_col_types = FALSE,
      col_types = readr::cols(.default = "c")
    ),
    error = function(e) NULL
  )

  cache_valido <- !is.null(ficha_cache) &&
    "campo" %in% names(ficha_cache) &&
    all(campos_obrigatorios_cnes %in% ficha_cache$campo)

  if (cache_valido) {
    ficha_cnes <- ficha_cache
    status_cnes <- "cache local"
  } else {
    ficha_cnes <- ficha_cnes_exemplo
    status_cnes <- "exemplo local: cache incompleto"
  }
} else {
  resultado_cnes <- tryCatch(
    {
      dados <- raspar_ficha_cnes(
        url_cnes,
        tempo_limite = 45
      )

      campos_validos <- all(
        campos_obrigatorios_cnes %in% dados$campo
      )

      if (nrow(dados) == 0 || !campos_validos) {
        stop(
          "A página não retornou todos os campos obrigatórios."
        )
      }

      list(
        dados = dados,
        status = "coleta ao vivo",
        erro = NA_character_
      )
    },
    error = function(e) {
      list(
        dados = ficha_cnes_exemplo,
        status = "exemplo local de contingência",
        erro = conditionMessage(e)
      )
    }
  )

  ficha_cnes <- resultado_cnes$dados
  status_cnes <- resultado_cnes$status

  if (identical(status_cnes, "coleta ao vivo")) {
    try(
      readr::write_csv(
        ficha_cnes,
        arquivo_cache_cnes
      ),
      silent = TRUE
    )
  }
}

ficha_cnes
Mostrar resultado
tibble::tibble(
  origem_resultado = status_cnes
)
Mostrar resultado

Se o portal não responder, o navegador não estiver disponível ou o carregamento exceder o limite, o documento utiliza o exemplo local identificado como exemplo de contingência. O resultado não é apresentado como uma coleta ao vivo. Depois da primeira coleta bem-sucedida, a ficha é armazenada em dados_modulo_2/ficha_cnes_2025752.csv e reutilizada nos próximos knits.

Organizar os campos em uma linha

A função retorna uma tabela no formato longo, com uma linha por campo:

campo valor
Nome SANTA CASA DE SANTOS
CNES 2025752
Gestão MUNICIPAL

Para produzir uma linha por estabelecimento:

ficha_cnes_larga <- ficha_cnes |>
  dplyr::filter(
    nzchar(valor)
  ) |>
  dplyr::group_by(campo) |>
  dplyr::summarise(
    valor = dplyr::first(valor),
    .groups = "drop"
  ) |>
  tidyr::pivot_wider(
    names_from = campo,
    values_from = valor
  )

ficha_cnes_larga
Mostrar resultado
Resultado ilustrativo

Na consulta apresentada, os principais dados foram:

Campo Valor
Nome Santa Casa de Santos
CNES 2025752
CNPJ 58.198.524/0001-19
Nome empresarial Irmandade da Santa Casa da Misericórdia de Santos
Natureza jurídica Entidades sem fins lucrativos
Logradouro Avenida Doutor Cláudio Luiz da Costa
Número 50
Bairro Jabaquara
Município 354850 — Santos
UF SP
CEP 11075-900
Telefone (13) 3202-0600
Dependência Individual
Regional de Saúde 204
Tipo de estabelecimento Hospital Geral
Gestão Municipal
Horário de funcionamento Sempre aberto
Acrescentar rastreabilidade

Registre a página e o momento da coleta:

ficha_cnes <- ficha_cnes |>
  dplyr::mutate(
    url_origem = url_cnes,
    coletado_em = Sys.time()
  )

Essas informações permitem identificar:

  • a página consultada;
  • o momento da extração;
  • possíveis mudanças posteriores no cadastro;
  • a origem dos atributos integrados à análise.
Integração com a produção ambulatorial

A integração da ficha cadastral com o SIA será executada no Fluxo do FTP à análise, depois que o arquivo PA for baixado, lido, selecionado e tipificado. Essa ordem garante que o objeto pa_min exista antes da junção.

Ocultar código no HTML

Existem duas formas principais de ocultar o código.

Para ocultar completamente um chunk específico:

Para manter o botão que permite mostrar o código, altere o YAML:

output:
  html_document:
    code_folding: hide

Com code_folding: hide, os códigos são apresentados recolhidos por padrão, mas o leitor pode clicar para exibi-los.

Configuração Execução Código no HTML
echo=FALSE Sim Não aparece e não pode ser expandido
include=FALSE Sim Código, mensagens, resultados e gráficos não aparecem
results='hide' Sim Código aparece, mas a saída textual é omitida
fig.show='hide' Sim Código é executado, mas os gráficos não aparecem
code_folding: hide Sim Código fica recolhido e pode ser expandido

Para este exemplo, recomenda-se:

  • deixar a função extensa com echo=FALSE;
  • mostrar o chunk curto que chama a função;
  • apresentar a tabela resultante;
  • registrar URL e data da extração.
Cuidados
  • não faça diversas requisições simultâneas ao portal;
  • adote intervalo entre consultas quando processar vários estabelecimentos;
  • armazene localmente os resultados já consultados;
  • verifique se a estrutura dos campos mudou;
  • registre falhas e páginas não encontradas;
  • não utilize o scraping como substituto de uma base histórica;
  • prefira DBC ou webservice para extrações em grande volume.

A ficha do portal representa uma consulta cadastral. Para análises históricas, deve ser utilizada a competência correspondente dos arquivos do CNES.

Fontes:

Fluxo do FTP à análise

Preparar o ambiente

Os exemplos deste fluxo são executados durante o knit. O parâmetro executar_exemplos está definido como true no cabeçalho YAML. Para gerar uma versão sem downloads e sem execução, altere-o temporariamente para false.

O HTML oferece dois controles independentes:

  • Code: mostra ou oculta o código do chunk;
  • Mostrar resultado/Mostrar gráfico: expande a saída gerada pelo chunk.

Instale os pacotes uma única vez:

install.packages(c("curl", "dplyr", "readr", "remotes"))
remotes::install_github("danicat/read.dbc")

Carregue os pacotes a cada nova sessão:

library(curl)
library(dplyr)
library(read.dbc)

Baixar um arquivo DBC

Neste exemplo, será baixada a produção ambulatorial do Acre referente a janeiro de 2025.

url <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "SIASUS/200801_/Dados/PAAC2501.dbc"
)

arquivo_pa <- file.path(diretorio_dados, "PAAC2501.dbc")
baixar_arquivo(url, arquivo_pa)

Confirme que o arquivo foi criado:

file.exists(arquivo_pa)
Mostrar resultado
## [1] TRUE
file.info(arquivo_pa)$size
Mostrar resultado
## [1] 3683334

Descompactar e ler com read.dbc

A função read.dbc() descomprime e lê o conteúdo diretamente em um data frame.

pa <- read.dbc::read.dbc(arquivo_pa)

Não é necessário gerar um DBF intermediário para iniciar a análise.

class(pa)
Mostrar resultado
## [1] "data.frame"
dim(pa)
Mostrar resultado
## [1] 154136     60

Explorar a tabela

Comece pela estrutura, pelos nomes e por uma amostra das linhas.

names(pa)
Mostrar resultado
##  [1] "PA_CODUNI"  "PA_GESTAO"  "PA_CONDIC"  "PA_UFMUN"   "PA_REGCT"  
##  [6] "PA_INCOUT"  "PA_INCURG"  "PA_TPUPS"   "PA_TIPPRE"  "PA_MN_IND" 
## [11] "PA_CNPJCPF" "PA_CNPJMNT" "PA_CNPJ_CC" "PA_MVM"     "PA_CMP"    
## [16] "PA_PROC_ID" "PA_TPFIN"   "PA_SUBFIN"  "PA_NIVCPL"  "PA_DOCORIG"
## [21] "PA_AUTORIZ" "PA_CNSMED"  "PA_CBOCOD"  "PA_MOTSAI"  "PA_OBITO"  
## [26] "PA_ENCERR"  "PA_PERMAN"  "PA_ALTA"    "PA_TRANSF"  "PA_CIDPRI" 
## [31] "PA_CIDSEC"  "PA_CIDCAS"  "PA_CATEND"  "PA_IDADE"   "IDADEMIN"  
## [36] "IDADEMAX"   "PA_FLIDADE" "PA_SEXO"    "PA_RACACOR" "PA_MUNPCN" 
## [41] "PA_QTDPRO"  "PA_QTDAPR"  "PA_VALPRO"  "PA_VALAPR"  "PA_UFDIF"  
## [46] "PA_MNDIF"   "PA_DIF_VAL" "NU_VPA_TOT" "NU_PA_TOT"  "PA_INDICA" 
## [51] "PA_CODOCO"  "PA_FLQT"    "PA_FLER"    "PA_ETNIA"   "PA_VL_CF"  
## [56] "PA_VL_CL"   "PA_VL_INC"  "PA_SRV_C"   "PA_INE"     "PA_NAT_JUR"
str(pa)
Mostrar resultado
## 'data.frame':    154136 obs. of  60 variables:
##  $ PA_CODUNI : Factor w/ 195 levels "0117382","0128619",..: 100 123 123 123 123 123 123 123 123 123 ...
##  $ PA_GESTAO : Factor w/ 21 levels "120000","120001",..: 16 1 1 1 1 1 1 1 1 1 ...
##  $ PA_CONDIC : Factor w/ 2 levels "EP","PG": 2 1 1 1 1 1 1 1 1 1 ...
##  $ PA_UFMUN  : Factor w/ 22 levels "120001","120005",..: 15 15 15 15 15 15 15 15 15 15 ...
##  $ PA_REGCT  : Factor w/ 4 levels "0000","7111",..: 1 3 3 3 3 3 3 3 3 3 ...
##  $ PA_INCOUT : Factor w/ 2 levels "0000","2452": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_INCURG : Factor w/ 1 level "0000": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_TPUPS  : Factor w/ 21 levels "02","04","05",..: 1 15 15 15 15 15 15 15 15 15 ...
##  $ PA_TIPPRE : Factor w/ 1 level "00": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_MN_IND : Factor w/ 2 levels "I","M": 2 2 2 2 2 2 2 2 2 2 ...
##  $ PA_CNPJCPF: Factor w/ 60 levels "00529443000255",..: 36 30 30 30 30 30 30 30 30 30 ...
##  $ PA_CNPJMNT: Factor w/ 23 levels "00000000000000",..: 7 6 6 6 6 6 6 6 6 6 ...
##  $ PA_CNPJ_CC: Factor w/ 1 level "00000000000000": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_MVM    : Factor w/ 1 level "202501": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_CMP    : Factor w/ 4 levels "202410","202411",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ PA_PROC_ID: Factor w/ 998 levels "0101010010","0101010028",..: 520 474 468 472 474 474 468 474 474 474 ...
##  $ PA_TPFIN  : Factor w/ 6 levels "01","02","04",..: 1 5 5 5 5 5 5 5 5 5 ...
##  $ PA_SUBFIN : Factor w/ 7 levels "0000","0013",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_NIVCPL : Factor w/ 4 levels "0","1","2","3": 2 3 3 3 3 3 3 3 3 3 ...
##  $ PA_DOCORIG: Factor w/ 5 levels "B","C","I","P",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ PA_AUTORIZ: Factor w/ 7757 levels "0000000000000",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_CNSMED : Factor w/ 1019 levels "000000000000000",..: 549 964 221 97 280 280 295 293 39 988 ...
##  $ PA_CBOCOD : Factor w/ 92 levels "221105","221205",..: 23 21 38 38 21 21 38 21 21 21 ...
##  $ PA_MOTSAI : Factor w/ 10 levels "00","11","12",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_OBITO  : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_ENCERR : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_PERMAN : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_ALTA   : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_TRANSF : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_CIDPRI : Factor w/ 1050 levels "0000","1111",..: 1 1 1 966 1 1 22 654 7 1013 ...
##  $ PA_CIDSEC : Factor w/ 1 level "0000": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_CIDCAS : Factor w/ 27 levels "0000","B181",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_CATEND : Factor w/ 7 levels "01","02","03",..: 1 2 2 2 2 2 2 2 2 2 ...
##  $ PA_IDADE  : Factor w/ 111 levels "000","001","002",..: 47 37 10 5 1 14 32 52 34 23 ...
##  $ IDADEMIN  : Factor w/ 23 levels "0","1","10","12",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ IDADEMAX  : Factor w/ 19 levels "0","1","100",..: 5 5 5 5 5 5 5 5 5 5 ...
##  $ PA_FLIDADE: Factor w/ 3 levels "0","1","3": 2 2 2 2 2 2 2 2 2 2 ...
##  $ PA_SEXO   : Factor w/ 3 levels "0","F","M": 2 3 2 3 2 3 2 3 2 2 ...
##  $ PA_RACACOR: Factor w/ 6 levels "00","01","02",..: 5 4 4 4 4 4 4 4 4 4 ...
##  $ PA_MUNPCN : Factor w/ 212 levels "110002","110004",..: 40 40 40 40 40 40 40 40 40 40 ...
##  $ PA_QTDPRO : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_QTDAPR : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_VALPRO : num  0 0 12.5 11 0 ...
##  $ PA_VALAPR : num  0 0 12.5 11 0 ...
##  $ PA_UFDIF  : Factor w/ 3 levels "0","1","9": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_MNDIF  : Factor w/ 3 levels "0","1","9": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_DIF_VAL: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ NU_VPA_TOT: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ NU_PA_TOT : num  0 0 12.5 11 0 ...
##  $ PA_INDICA : Factor w/ 3 levels "0","5","6": 2 2 2 2 2 2 2 2 2 2 ...
##  $ PA_CODOCO : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_FLQT   : Factor w/ 7 levels "K","L","M","N",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_FLER   : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PA_ETNIA  : Factor w/ 34 levels "0001","0002",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ PA_VL_CF  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ PA_VL_CL  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ PA_VL_INC : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ PA_SRV_C  : Factor w/ 54 levels "108001","114007",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ PA_INE    : Factor w/ 0 levels: NA NA NA NA NA NA NA NA NA NA ...
##  $ PA_NAT_JUR: Factor w/ 7 levels "1023","1147",..: 3 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "data_types")= chr [1:60] "C" "C" "C" "C" ...
head(pa, 3)
Mostrar resultado

Selecione apenas os campos necessários para reduzir a complexidade:

pa_min <- pa |>
  select(
    PA_CODUNI,
    PA_GESTAO,
    PA_CMP,
    PA_PROC_ID,
    PA_DOCORIG,
    PA_QTDAPR,
    PA_VALAPR
  )

Verifique a unidade de registro e os valores:

pa_min |>
  summarise(
    linhas = n(),
    estabelecimentos = n_distinct(PA_CODUNI),
    procedimentos = n_distinct(PA_PROC_ID),
    quantidade = sum(PA_QTDAPR, na.rm = TRUE),
    valor_aprovado = sum(PA_VALAPR, na.rm = TRUE)
  )
Mostrar resultado

Tipificar usando o dicionário

Segundo o layout do SIA, os identificadores e competências são campos de caracteres. Preservá-los como texto evita a perda de zeros à esquerda.

pa_min <- pa_min |>
  mutate(
    across(
      c(PA_CODUNI, PA_GESTAO, PA_CMP, PA_PROC_ID, PA_DOCORIG),
      as.character
    ),
    PA_QTDAPR = as.numeric(PA_QTDAPR),
    PA_VALAPR = as.numeric(PA_VALAPR)
  )

Adicione descrições mínimas como atributos:

attr(pa_min$PA_CODUNI, "label") <- "Código CNES do estabelecimento"
attr(pa_min$PA_PROC_ID, "label") <- "Código do procedimento ambulatorial"
attr(pa_min$PA_VALAPR, "label") <- "Valor aprovado da produção"

Consulte os metadados adicionados:

attr(pa_min$PA_VALAPR, "label")
Mostrar resultado
## [1] "Valor aprovado da produção"

Na prática, recomenda-se manter um dicionário tabular versionado, com uma linha por variável e colunas para tipo, descrição, domínio, fonte e vigência.

Integrar a ficha cadastral com a produção ambulatorial

Depois de transformar a ficha em uma linha e preparar pa_min, padronize o código CNES:

ficha_cnes_min <- ficha_cnes_larga |>
  dplyr::transmute(
    CNES = as.character(CNES),
    nome_estabelecimento = Nome,
    gestao_portal = Gestão,
    tipo_estabelecimento_portal =
      `Tipo de Estabelecimento`
  )

Integre com os registros do SIA:

pa_ficha <- pa_min |>
  dplyr::left_join(
    ficha_cnes_min,
    by = c("PA_CODUNI" = "CNES")
  )

Verifique o resultado:

pa_ficha |>
  dplyr::count(
    PA_CODUNI,
    nome_estabelecimento,
    gestao_portal,
    tipo_estabelecimento_portal
  )
Mostrar resultado

Baixar outro DBC para integração

Agora será baixado o cadastro de estabelecimentos do CNES para a mesma UF e competência.

url_cnes <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "CNES/200508_/Dados/ST/STAC2501.dbc"
)

arquivo_st <- file.path(diretorio_dados, "STAC2501.dbc")
baixar_arquivo(url_cnes, arquivo_st)
cnes <- read.dbc::read.dbc(arquivo_st)

Selecione uma linha por estabelecimento:

cnes_min <- cnes |>
  transmute(
    CNES = as.character(CNES),
    CODUFMUN = as.character(CODUFMUN),
    TPGESTAO = as.character(TPGESTAO)
  ) |>
  distinct(CNES, .keep_all = TRUE)

Integrar SIA e CNES

O campo PA_CODUNI do SIA corresponde ao código CNES do cadastro de estabelecimentos.

pa_cnes <- pa_min |>
  left_join(
    cnes_min,
    by = c("PA_CODUNI" = "CNES")
  )

Verifique a qualidade da junção:

pa_cnes |>
  summarise(
    linhas = n(),
    sem_cnes = sum(is.na(CODUFMUN)),
    percentual_sem_cnes = mean(is.na(CODUFMUN)) * 100
  )
Mostrar resultado

Uma junção não deve ser considerada correta apenas porque o código executou. Verifique duplicidades na chave, perdas de correspondência e compatibilidade temporal.

Resumir a produção

Calcule quantidade e valor aprovado por procedimento:

resumo_pa <- pa_cnes |>
  group_by(PA_PROC_ID) |>
  summarise(
    estabelecimentos = n_distinct(PA_CODUNI),
    quantidade_aprovada = sum(PA_QTDAPR, na.rm = TRUE),
    valor_aprovado = sum(PA_VALAPR, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(valor_aprovado))

Visualize os procedimentos com maior valor aprovado:

head(resumo_pa, 10)
Mostrar resultado

Repetir o fluxo com o SIH

O mesmo padrão pode ser aplicado às internações:

url_sih <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "SIHSUS/200801_/Dados/RDAC2501.dbc"
)

arquivo_rd <- file.path(diretorio_dados, "RDAC2501.dbc")
baixar_arquivo(url_sih, arquivo_rd)
rd <- read.dbc::read.dbc(arquivo_rd)

Resumo hospitalar mínimo:

rd |>
  summarise(
    aih = n_distinct(N_AIH),
    internacoes = n(),
    permanencia = sum(DIAS_PERM, na.rm = TRUE),
    valor_total = sum(VAL_TOT, na.rm = TRUE),
    obitos = sum(MORTE == 1, na.rm = TRUE)
  )
Mostrar resultado

Enriquecer a produção ambulatorial com atributos do CNES

O leiaute do arquivo de Produção Ambulatorial (PA) já contém alguns atributos provenientes do CNES:

Campo do PA Conteúdo
PA_CODUNI Código CNES do estabelecimento executante
PA_UFMUN Município do estabelecimento
PA_TPUPS Tipo de estabelecimento
PA_CNPJCPF CPF ou CNPJ do estabelecimento
PA_CNPJMNT CNPJ da mantenedora
PA_NAT_JUR Natureza jurídica
PA_GESTAO Município ou estado responsável pela gestão

A integração com o CNES é mais útil quando acrescenta atributos que não estão disponíveis no PA ou quando permite validar os atributos já existentes.

Segundo o leiaute do CNES, os arquivos mais úteis para esse enriquecimento são:

Arquivo do CNES Conteúdo Exemplos de uso
ST Características gerais do estabelecimento Esfera administrativa, turno, atividade de ensino, tipo de prestador e gestão
LT Leitos por tipo e especialidade Porte hospitalar, disponibilidade de leitos e participação dos leitos SUS
EQ Equipamentos Capacidade diagnóstica e tecnológica
SR Serviços especializados Identificação da oferta de serviços
HB Habilitações Redes, linhas de cuidado e serviços de alta complexidade
PR Profissionais Oferta de profissionais e composição das equipes

Atributos adicionais de interesse

Atributo Arquivo Utilidade analítica
ESFERA_A ST ou LT Identificar a esfera administrativa do estabelecimento
TP_PREST ou TPPREST ST Identificar o tipo de prestador
TURNO_AT ST Caracterizar o turno de atendimento
ATIVIDAD ST Identificar atividade de ensino ou pesquisa
CLIENTEL ST Caracterizar o fluxo predominante da clientela
VINC_SUS ST Verificar a existência de vínculo cadastrado com o SUS
QTLEITP1 ST Quantidade de leitos cirúrgicos existentes
QTLEITP2 ST Quantidade de leitos clínicos existentes
QTLEITP3 ST Quantidade de leitos complementares existentes
QT_EXIST LT Quantidade de leitos existentes por tipo e especialidade
QT_CONTR LT Quantidade de leitos contratados
QT_SUS LT Quantidade de leitos disponíveis ao SUS
TP_LEITO LT Tipo de leito
CODLEITO LT Especialidade do leito

O arquivo ST apresenta um resumo dos leitos. Entretanto, o arquivo LT é mais adequado para estudar capacidade hospitalar porque apresenta os leitos por tipo e especialidade, diferenciando leitos existentes, contratados e disponíveis ao SUS.


Baixar o cadastro de estabelecimentos

Baixe o arquivo ST para a mesma UF e competência da produção ambulatorial:

url_st <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "CNES/200508_/Dados/ST/STAC2501.dbc"
)

arquivo_st <- file.path(diretorio_dados, "STAC2501.dbc")
baixar_arquivo(url_st, arquivo_st)
cnes_st <- read.dbc::read.dbc(arquivo_st)

Selecione uma linha por estabelecimento:

cnes_estabelecimento <- cnes_st |>
  dplyr::transmute(
    CNES = as.character(CNES),
    CODUFMUN = as.character(CODUFMUN),
    TPGESTAO = as.character(TPGESTAO),
    ESFERA_A = as.character(ESFERA_A),
    TP_UNID = as.character(TP_UNID),
    TURNO_AT = as.character(TURNO_AT),
    ATIVIDAD = as.character(ATIVIDAD),
    VINC_SUS = as.character(VINC_SUS)
  ) |>
  dplyr::distinct(CNES, .keep_all = TRUE)

Esses atributos permitem comparar a produção segundo características institucionais:

pa_min |>
  dplyr::left_join(
    cnes_estabelecimento,
    by = c("PA_CODUNI" = "CNES")
  ) |>
  dplyr::count(ESFERA_A)
Mostrar resultado

Baixar os leitos do CNES

Para calcular o porte hospitalar, baixe o arquivo LT da mesma UF e competência:

url_lt <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "CNES/200508_/Dados/LT/LTAC2501.dbc"
)

arquivo_lt <- file.path(diretorio_dados, "LTAC2501.dbc")
baixar_arquivo(url_lt, arquivo_lt)
cnes_lt <- read.dbc::read.dbc(arquivo_lt)

O arquivo possui mais de uma linha por estabelecimento, pois os leitos são discriminados por tipo e especialidade.

cnes_lt |>
  dplyr::select(
    CNES,
    TP_LEITO,
    CODLEITO,
    QT_EXIST,
    QT_CONTR,
    QT_SUS
  ) |>
  head()
Mostrar resultado

Antes da integração com o PA, agregue os leitos para obter uma linha por estabelecimento:

cnes_leitos <- cnes_lt |>
  dplyr::transmute(
    CNES = as.character(CNES),
    leitos_existentes = as.numeric(QT_EXIST),
    leitos_contratados = as.numeric(QT_CONTR),
    leitos_sus = as.numeric(QT_SUS)
  ) |>
  dplyr::group_by(CNES) |>
  dplyr::summarise(
    leitos_existentes = sum(
      leitos_existentes,
      na.rm = TRUE
    ),
    leitos_contratados = sum(
      leitos_contratados,
      na.rm = TRUE
    ),
    leitos_sus = sum(
      leitos_sus,
      na.rm = TRUE
    ),
    .groups = "drop"
  )

A agregação antes da junção é necessária para evitar a multiplicação das linhas do PA. Se um estabelecimento tiver dez tipos de leito, uma junção direta com o arquivo LT poderá repetir cada registro de produção dez vezes.


Classificar o porte hospitalar

Neste exemplo didático, será adotado o ponto de corte de 50 leitos:

cnes_leitos <- cnes_leitos |>
  dplyr::mutate(
    porte_leitos = dplyr::case_when(
      leitos_existentes == 0 ~ "Sem leitos cadastrados",
      leitos_existentes < 50 ~ "Menos de 50 leitos",
      leitos_existentes >= 50 ~ "50 leitos ou mais",
      TRUE ~ "Não informado"
    )
  )

A classificação separa estabelecimentos sem leitos daqueles que possuem menos de 50 leitos. Isso evita classificar unidades exclusivamente ambulatoriais como hospitais de pequeno porte.

O ponto de corte de 50 leitos é uma regra analítica adotada para o exemplo. Ele não deve ser apresentado como classificação normativa oficial sem a indicação da respectiva norma ou referência metodológica.

Também é possível calcular a proporção de leitos destinados ao SUS:

cnes_leitos <- cnes_leitos |>
  dplyr::mutate(
    percentual_leitos_sus = dplyr::if_else(
      leitos_existentes > 0,
      leitos_sus / leitos_existentes * 100,
      NA_real_
    )
  )

Integrar SIA, estabelecimentos e leitos

Primeiro, integre os atributos gerais do estabelecimento:

pa_cnes <- pa_min |>
  dplyr::left_join(
    cnes_estabelecimento,
    by = c("PA_CODUNI" = "CNES")
  )

Em seguida, acrescente os indicadores de leitos:

pa_cnes <- pa_cnes |>
  dplyr::left_join(
    cnes_leitos,
    by = c("PA_CODUNI" = "CNES")
  )

Cada registro de produção passa a conter atributos como:

  • esfera administrativa;
  • tipo de estabelecimento;
  • atividade de ensino;
  • turno de atendimento;
  • total de leitos existentes;
  • total de leitos contratados;
  • total de leitos SUS;
  • percentual de leitos SUS;
  • categoria de porte hospitalar.

Verificar a qualidade da integração

Use um campo estrutural do cadastro para avaliar a junção com o arquivo ST:

pa_cnes |>
  dplyr::summarise(
    linhas = dplyr::n(),
    sem_cnes_st = sum(is.na(TP_UNID)),
    percentual_sem_cnes_st = mean(is.na(TP_UNID)) * 100
  )
Mostrar resultado

A ausência de leitos deve ser avaliada separadamente:

pa_cnes |>
  dplyr::summarise(
    estabelecimentos = dplyr::n_distinct(PA_CODUNI),
    estabelecimentos_com_leitos = dplyr::n_distinct(
      PA_CODUNI[!is.na(leitos_existentes)]
    ),
    percentual_com_leitos = mean(
      !is.na(leitos_existentes)
    ) * 100
  )
Mostrar resultado

Um estabelecimento sem correspondência no arquivo LT não representa necessariamente erro. Unidades básicas, laboratórios, centros de diagnóstico e outros estabelecimentos exclusivamente ambulatoriais podem não possuir leitos.


Explorar a produção segundo o porte hospitalar

Supondo que PA_VALAPR contenha o valor aprovado e PA_QTDAPR a quantidade aprovada:

pa_cnes |>
  dplyr::group_by(porte_leitos) |>
  dplyr::summarise(
    estabelecimentos = dplyr::n_distinct(PA_CODUNI),
    quantidade_aprovada = sum(PA_QTDAPR, na.rm = TRUE),
    valor_aprovado = sum(PA_VALAPR, na.rm = TRUE),
    .groups = "drop"
  )
Mostrar resultado

A tabela permite comparar a produção ambulatorial realizada por:

  • estabelecimentos sem leitos;
  • estabelecimentos com menos de 50 leitos;
  • estabelecimentos com 50 leitos ou mais.

Entretanto, o número de leitos não mede diretamente a capacidade ambulatorial. Hospitais com muitos leitos podem ter produção ambulatorial reduzida, enquanto unidades sem leitos podem apresentar grande volume de consultas, exames ou terapias.


Indicadores possíveis

Indicador Cálculo geral Interpretação
Produção por leito existente Quantidade aprovada ÷ leitos existentes Relação entre produção ambulatorial e porte hospitalar
Valor aprovado por leito SUS Valor aprovado ÷ leitos SUS Valor ambulatorial associado à capacidade disponível ao SUS
Participação dos leitos SUS Leitos SUS ÷ leitos existentes Parcela da capacidade cadastrada destinada ao SUS
Produção por esfera administrativa Produção agrupada por ESFERA_A Participação de estabelecimentos públicos e demais esferas
Produção por atividade de ensino Produção agrupada por ATIVIDAD Participação de estabelecimentos com atividade de ensino
Produção por porte hospitalar Produção agrupada por porte_leitos Concentração da produção segundo a capacidade hospitalar

Esses indicadores representam relações entre produção ambulatorial e capacidade cadastrada. Eles não devem ser interpretados automaticamente como produtividade, eficiência ou custo por leito, pois o numerador é ambulatorial e o denominador representa capacidade hospitalar.

Fontes documentais utilizadas:

  • Informe Técnico do Sistema de Informação Ambulatorial do SUS — SIASUS, leiaute do arquivo PA;
  • Informe Técnico do Sistema de Cadastro Nacional de Estabelecimentos de Saúde — CNES, leiautes dos arquivos ST e LT.

Tratar, analisar e visualizar os indicadores

Preparar uma base analítica por estabelecimento

Como os atributos do CNES foram repetidos em cada linha do PA após a junção, os leitos não devem ser somados diretamente na base pa_cnes. Primeiro, agregue a produção por estabelecimento.

library(dplyr)
library(ggplot2)
library(scales)

producao_cnes <- pa_cnes |>
  group_by(PA_CODUNI) |>
  summarise(
    quantidade_aprovada = sum(
      PA_QTDAPR,
      na.rm = TRUE
    ),
    valor_aprovado = sum(
      PA_VALAPR,
      na.rm = TRUE
    ),
    procedimentos = n_distinct(PA_PROC_ID),
    .groups = "drop"
  )

Depois, integre os atributos do estabelecimento e os leitos, ambos com uma linha por CNES:

indicadores_cnes <- producao_cnes |>
  left_join(
    cnes_estabelecimento,
    by = c("PA_CODUNI" = "CNES")
  ) |>
  left_join(
    cnes_leitos,
    by = c("PA_CODUNI" = "CNES")
  )

Verifique se a base resultante possui uma linha por estabelecimento:

indicadores_cnes |>
  summarise(
    linhas = n(),
    estabelecimentos = n_distinct(PA_CODUNI),
    uma_linha_por_cnes = linhas == estabelecimentos
  )
Mostrar resultado

Tratar valores ausentes e denominadores

A ausência de correspondência no arquivo de leitos não significa necessariamente que o estabelecimento tenha zero leitos. Por isso, valores ausentes não devem ser substituídos automaticamente por zero.

indicadores_cnes <- indicadores_cnes |>
  mutate(
    possui_informacao_leitos = !is.na(leitos_existentes),

    possui_leitos = case_when(
      is.na(leitos_existentes) ~ NA,
      leitos_existentes > 0 ~ TRUE,
      TRUE ~ FALSE
    )
  )

Indicadores que utilizam leitos como denominador devem ser calculados somente quando o denominador for maior que zero:

indicadores_cnes <- indicadores_cnes |>
  mutate(
    producao_por_leito = if_else(
      leitos_existentes > 0,
      quantidade_aprovada / leitos_existentes,
      NA_real_
    ),

    valor_por_leito_sus = if_else(
      leitos_sus > 0,
      valor_aprovado / leitos_sus,
      NA_real_
    ),

    percentual_leitos_sus = if_else(
      leitos_existentes > 0,
      leitos_sus / leitos_existentes * 100,
      NA_real_
    )
  )

NA indica que o indicador não pôde ser calculado. O valor zero deve ser reservado para situações em que a medida foi observada e seu valor é realmente zero.


Criar faixas de porte hospitalar

Além da classificação binária de 50 leitos, pode ser útil criar faixas mais detalhadas:

indicadores_cnes <- indicadores_cnes |>
  mutate(
    porte_leitos = case_when(
      is.na(leitos_existentes) ~ "Sem informação",
      leitos_existentes == 0 ~ "Sem leitos",
      leitos_existentes < 50 ~ "Menos de 50",
      leitos_existentes < 150 ~ "50 a 149",
      leitos_existentes < 300 ~ "150 a 299",
      leitos_existentes >= 300 ~ "300 ou mais"
    ),

    porte_leitos = factor(
      porte_leitos,
      levels = c(
        "Sem informação",
        "Sem leitos",
        "Menos de 50",
        "50 a 149",
        "150 a 299",
        "300 ou mais"
      )
    )
  )

As faixas são analíticas e devem ser documentadas no método do estudo.


Validar os indicadores

Verifique valores negativos ou incompatíveis:

indicadores_cnes |>
  summarise(
    leitos_negativos = sum(
      leitos_existentes < 0,
      na.rm = TRUE
    ),
    leitos_sus_maiores_que_existentes = sum(
      leitos_sus > leitos_existentes,
      na.rm = TRUE
    ),
    producao_negativa = sum(
      quantidade_aprovada < 0,
      na.rm = TRUE
    ),
    valor_negativo = sum(
      valor_aprovado < 0,
      na.rm = TRUE
    )
  )
Mostrar resultado

Também é necessário examinar a distribuição:

indicadores_cnes |>
  summarise(
    estabelecimentos = n(),
    mediana_leitos = median(
      leitos_existentes,
      na.rm = TRUE
    ),
    mediana_producao_por_leito = median(
      producao_por_leito,
      na.rm = TRUE
    ),
    p95_producao_por_leito = quantile(
      producao_por_leito,
      0.95,
      na.rm = TRUE
    ),
    maximo_producao_por_leito = max(
      producao_por_leito,
      na.rm = TRUE
    )
  )
Mostrar resultado

Valores muito elevados devem ser investigados antes de qualquer exclusão. Eles podem representar:

  • estabelecimento com poucos leitos e grande produção ambulatorial;
  • concentração regional de serviços;
  • erro cadastral no número de leitos;
  • duplicação de registros;
  • alteração cadastral entre competências;
  • produção especializada que não depende diretamente de leitos.

Criar uma tabela-resumo por porte

resumo_porte <- indicadores_cnes |>
  group_by(porte_leitos) |>
  summarise(
    estabelecimentos = n_distinct(PA_CODUNI),

    quantidade_aprovada = sum(
      quantidade_aprovada,
      na.rm = TRUE
    ),

    valor_aprovado = sum(
      valor_aprovado,
      na.rm = TRUE
    ),

    leitos_existentes = sum(
      leitos_existentes,
      na.rm = TRUE
    ),

    leitos_sus = sum(
      leitos_sus,
      na.rm = TRUE
    ),

    mediana_producao_por_leito = median(
      producao_por_leito,
      na.rm = TRUE
    ),

    .groups = "drop"
  )

Calcule a participação de cada porte na produção e no valor aprovado:

resumo_porte <- resumo_porte |>
  mutate(
    percentual_producao =
      quantidade_aprovada /
      sum(quantidade_aprovada) * 100,

    percentual_valor =
      valor_aprovado /
      sum(valor_aprovado) * 100
  )

Visualize a tabela:

resumo_porte
Mostrar resultado

Visualizar estabelecimentos por porte

ggplot(
  resumo_porte,
  aes(
    x = porte_leitos,
    y = estabelecimentos
  )
) +
  geom_col(
    fill = "#337ab7"
  ) +
  labs(
    title = "Estabelecimentos segundo o porte",
    subtitle = "Classificação pelo número de leitos existentes",
    x = NULL,
    y = "Número de estabelecimentos"
  ) +
  scale_y_continuous(
    labels = label_number(
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 30,
      hjust = 1
    )
  )
Mostrar gráfico


Visualizar a produção por porte

ggplot(
  resumo_porte,
  aes(
    x = porte_leitos,
    y = quantidade_aprovada
  )
) +
  geom_col(
    fill = "#2e6da4"
  ) +
  labs(
    title = "Produção ambulatorial por porte",
    subtitle = "Quantidade aprovada no SIA",
    x = NULL,
    y = "Quantidade aprovada"
  ) +
  scale_y_continuous(
    labels = label_number(
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 30,
      hjust = 1
    )
  )
Mostrar gráfico

Esse gráfico mostra o volume absoluto. Categorias com mais estabelecimentos tendem a apresentar maior produção total.


Visualizar a participação percentual

ggplot(
  resumo_porte,
  aes(
    x = porte_leitos,
    y = percentual_producao
  )
) +
  geom_col(
    fill = "#337ab7"
  ) +
  geom_text(
    aes(
      label = paste0(
        round(percentual_producao, 1),
        "%"
      )
    ),
    vjust = -0.4
  ) +
  labs(
    title = "Participação na produção ambulatorial",
    x = NULL,
    y = "Participação na produção"
  ) +
  scale_y_continuous(
    labels = label_percent(
      scale = 1,
      decimal.mark = ","
    ),
    expand = expansion(
      mult = c(0, 0.1)
    )
  ) +
  theme_minimal()
Mostrar gráfico


Comparar a produção típica por leito

A média pode ser fortemente influenciada por valores extremos. Para comparar estabelecimentos, utilize a mediana:

producao_por_porte <- indicadores_cnes |>
  filter(
    !is.na(producao_por_leito),
    producao_por_leito >= 0
  ) |>
  group_by(porte_leitos) |>
  summarise(
    estabelecimentos = n(),
    media = mean(producao_por_leito),
    mediana = median(producao_por_leito),
    primeiro_quartil = quantile(
      producao_por_leito,
      0.25
    ),
    terceiro_quartil = quantile(
      producao_por_leito,
      0.75
    ),
    .groups = "drop"
  )

producao_por_porte
Mostrar resultado

Visualize a mediana:

ggplot(
  producao_por_porte,
  aes(
    x = porte_leitos,
    y = mediana
  )
) +
  geom_col(
    fill = "#337ab7"
  ) +
  labs(
    title = "Produção ambulatorial mediana por leito",
    subtitle = "Mediana dos indicadores dos estabelecimentos",
    x = NULL,
    y = "Quantidade aprovada por leito"
  ) +
  scale_y_continuous(
    labels = label_number(
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  theme_minimal()
Mostrar gráfico


Visualizar a distribuição com boxplot

Para tornar o gráfico legível, limite apenas sua escala visual ao percentil 95. Os registros não são removidos da base.

limite_p95 <- quantile(
  indicadores_cnes$producao_por_leito,
  0.95,
  na.rm = TRUE
)

ggplot(
  indicadores_cnes,
  aes(
    x = porte_leitos,
    y = producao_por_leito
  )
) +
  geom_boxplot(
    fill = "#eaf3f9",
    color = "#2e6da4",
    outlier.alpha = 0.25
  ) +
  coord_cartesian(
    ylim = c(0, limite_p95)
  ) +
  labs(
    title = "Distribuição da produção ambulatorial por leito",
    subtitle = "Escala visual limitada ao percentil 95",
    x = NULL,
    y = "Quantidade aprovada por leito"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 30,
      hjust = 1
    )
  )
Mostrar gráfico

coord_cartesian() apenas altera a área exibida. Os valores extremos permanecem nos cálculos e na base analítica.


Comparar leitos existentes e leitos SUS

leitos_porte <- resumo_porte |>
  select(
    porte_leitos,
    leitos_existentes,
    leitos_sus
  ) |>
  tidyr::pivot_longer(
    cols = c(
      leitos_existentes,
      leitos_sus
    ),
    names_to = "tipo_leito",
    values_to = "quantidade"
  )
ggplot(
  leitos_porte,
  aes(
    x = porte_leitos,
    y = quantidade,
    fill = tipo_leito
  )
) +
  geom_col(
    position = "dodge"
  ) +
  scale_fill_manual(
    values = c(
      leitos_existentes = "#6b7280",
      leitos_sus = "#337ab7"
    ),
    labels = c(
      leitos_existentes = "Existentes",
      leitos_sus = "Disponíveis ao SUS"
    )
  ) +
  labs(
    title = "Leitos existentes e leitos SUS",
    x = NULL,
    y = "Número de leitos",
    fill = NULL
  ) +
  scale_y_continuous(
    labels = label_number(
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 30,
      hjust = 1
    ),
    legend.position = "top"
  )
Mostrar gráfico


Visualizar a participação dos leitos SUS

percentual_sus_porte <- indicadores_cnes |>
  filter(
    leitos_existentes > 0
  ) |>
  group_by(porte_leitos) |>
  summarise(
    leitos_existentes = sum(
      leitos_existentes,
      na.rm = TRUE
    ),
    leitos_sus = sum(
      leitos_sus,
      na.rm = TRUE
    ),
    percentual_leitos_sus =
      leitos_sus /
      leitos_existentes * 100,
    .groups = "drop"
  )
ggplot(
  percentual_sus_porte,
  aes(
    x = porte_leitos,
    y = percentual_leitos_sus
  )
) +
  geom_col(
    fill = "#337ab7"
  ) +
  geom_text(
    aes(
      label = paste0(
        round(percentual_leitos_sus, 1),
        "%"
      )
    ),
    vjust = -0.4
  ) +
  labs(
    title = "Participação dos leitos SUS",
    subtitle = "Leitos SUS em relação aos leitos existentes",
    x = NULL,
    y = "Leitos SUS"
  ) +
  scale_y_continuous(
    labels = label_percent(
      scale = 1,
      decimal.mark = ","
    ),
    limits = c(0, 100),
    expand = expansion(
      mult = c(0, 0.08)
    )
  ) +
  theme_minimal()
Mostrar gráfico

A razão agregada é calculada pela divisão entre os totais de leitos:

with(
  percentual_sus_porte,
  sum(leitos_sus) / sum(leitos_existentes)
)
Mostrar resultado
## [1] 0.9589816

Ela não deve ser substituída pela média simples dos percentuais dos estabelecimentos, pois estabelecimentos pequenos e grandes receberiam o mesmo peso.


Relacionar capacidade e produção

Um gráfico de dispersão permite observar a associação entre leitos e produção:

ggplot(
  indicadores_cnes |>
    filter(
      leitos_existentes > 0,
      quantidade_aprovada > 0
    ),
  aes(
    x = leitos_existentes,
    y = quantidade_aprovada
  )
) +
  geom_point(
    color = "#337ab7",
    alpha = 0.6
  ) +
  scale_x_log10(
    labels = label_number(
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  scale_y_log10(
    labels = label_number(
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  labs(
    title = "Capacidade hospitalar e produção ambulatorial",
    subtitle = "Escalas logarítmicas",
    x = "Leitos existentes",
    y = "Quantidade aprovada"
  ) +
  theme_minimal()
Mostrar gráfico

A escala logarítmica reduz a concentração visual causada por estabelecimentos muito grandes. Ela não altera os valores da base.


Destacar estabelecimentos discrepantes

Identifique os estabelecimentos acima do percentil 95 de produção por leito:

limite_p95 <- quantile(
  indicadores_cnes$producao_por_leito,
  0.95,
  na.rm = TRUE
)

estabelecimentos_atipicos <- indicadores_cnes |>
  filter(
    producao_por_leito > limite_p95
  ) |>
  arrange(
    desc(producao_por_leito)
  ) |>
  select(
    PA_CODUNI,
    TP_UNID,
    porte_leitos,
    leitos_existentes,
    quantidade_aprovada,
    producao_por_leito
  )

estabelecimentos_atipicos
Mostrar resultado

Esses registros devem ser investigados, não removidos automaticamente.


Comparar por esfera administrativa

resumo_esfera <- indicadores_cnes |>
  group_by(ESFERA_A) |>
  summarise(
    estabelecimentos = n_distinct(PA_CODUNI),
    quantidade_aprovada = sum(
      quantidade_aprovada,
      na.rm = TRUE
    ),
    valor_aprovado = sum(
      valor_aprovado,
      na.rm = TRUE
    ),
    leitos_sus = sum(
      leitos_sus,
      na.rm = TRUE
    ),
    .groups = "drop"
  )
ggplot(
  resumo_esfera,
  aes(
    x = reorder(
      ESFERA_A,
      valor_aprovado
    ),
    y = valor_aprovado
  )
) +
  geom_col(
    fill = "#337ab7"
  ) +
  coord_flip() +
  labs(
    title = "Valor ambulatorial aprovado por esfera administrativa",
    x = "Esfera administrativa",
    y = "Valor aprovado"
  ) +
  scale_y_continuous(
    labels = label_currency(
      prefix = "R$ ",
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  theme_minimal()
Mostrar gráfico

Os códigos de ESFERA_A devem ser interpretados com a tabela de domínio correspondente à competência do CNES.


Criar um painel analítico mínimo

painel_cnes <- indicadores_cnes |>
  summarise(
    estabelecimentos = n_distinct(PA_CODUNI),

    estabelecimentos_com_leitos = n_distinct(
      PA_CODUNI[leitos_existentes > 0],
      na.rm = TRUE
    ),

    leitos_existentes = sum(
      leitos_existentes,
      na.rm = TRUE
    ),

    leitos_sus = sum(
      leitos_sus,
      na.rm = TRUE
    ),

    quantidade_aprovada = sum(
      quantidade_aprovada,
      na.rm = TRUE
    ),

    valor_aprovado = sum(
      valor_aprovado,
      na.rm = TRUE
    ),

    percentual_leitos_sus =
      leitos_sus /
      leitos_existentes * 100
  )

painel_cnes
Mostrar resultado

Esse painel resume:

  • número de estabelecimentos com produção;
  • número de estabelecimentos com leitos;
  • capacidade hospitalar existente;
  • capacidade disponível ao SUS;
  • produção ambulatorial aprovada;
  • valor ambulatorial aprovado;
  • participação dos leitos SUS.

Cuidados de interpretação

Os indicadores construídos combinam duas dimensões diferentes:

Dimensão Fonte Unidade
Produção ambulatorial SIA/PA Procedimento ou registro de produção
Capacidade hospitalar CNES/LT Leito cadastrado por estabelecimento e competência

Essa integração pode apoiar a caracterização dos prestadores, mas não produz diretamente medidas de eficiência ou custo hospitalar.

Antes de comparar estabelecimentos, considere:

  • tipo de estabelecimento;
  • perfil assistencial;
  • especialidades oferecidas;
  • habilitações;
  • complexidade dos procedimentos;
  • composição da clientela;
  • atividade de ensino;
  • localização;
  • abrangência regional;
  • competência do cadastro;
  • possíveis diferenças entre capacidade cadastrada e capacidade efetivamente disponível.

O denominador deve ser coerente com o fenômeno analisado. Para procedimentos exclusivamente ambulatoriais, número de consultórios, equipamentos, profissionais ou habilitações pode ser mais informativo que o número de leitos.

Metadados aplicados à análise

Dicionário de dados mínimo

Um dicionário analítico pode ser representado como uma tabela:

dicionario_pa <- tibble::tribble(
  ~campo,       ~tipo,       ~descricao,
  "PA_CODUNI", "character", "Código CNES do estabelecimento",
  "PA_CMP",    "character", "Competência de realização",
  "PA_PROC_ID", "character", "Código do procedimento",
  "PA_QTDAPR", "numeric",   "Quantidade aprovada",
  "PA_VALAPR", "numeric",   "Valor aprovado"
)

Esse objeto pode orientar validações automáticas:

setdiff(dicionario_pa$campo, names(pa))

Resultado vazio significa que todos os campos esperados estão presentes.

Chaves e granularidade

Uma coluna não é necessariamente uma chave apenas porque se chama identificador.

Exemplos:

Fonte Possível identificador Cuidado
SIA PA PA_CODUNI + PA_CMP + PA_PROC_ID Pode haver várias linhas por instrumento e atributos adicionais
SIH RD N_AIH Reapresentações e regras do sistema devem ser verificadas
SIH SP SP_NAIH Vários atos profissionais por AIH
CNES ST CNES por competência Cadastro varia no tempo
SIGTAP Procedimento por competência Atributos podem mudar mensalmente

Antes de um left_join(), teste a unicidade da tabela que será adicionada:

cnes_min |>
  count(CNES) |>
  filter(n > 1)

Temporalidade dos metadados

O vínculo deve respeitar a competência sempre que a dimensão variar no tempo.

Exemplo conceitual:

dados |>
  left_join(
    sigtap,
    by = c(
      "procedimento" = "co_procedimento",
      "competencia" = "dt_competencia"
    )
  )

Usar apenas o código pode atribuir ao registro histórico uma descrição, valor ou regra de uma competência diferente.


Qualidade e validação

Verificações mínimas após a leitura

stopifnot(nrow(pa) > 0)
stopifnot(all(c("PA_CODUNI", "PA_PROC_ID") %in% names(pa)))
stopifnot(all(nchar(pa$PA_CODUNI) == 7 | is.na(pa$PA_CODUNI)))

Competência de processamento e ocorrência

Alguns sistemas distinguem:

  • competência de processamento;
  • competência de realização;
  • data do evento;
  • data de atualização ou disseminação.

Essas datas não devem ser tratadas como equivalentes sem consultar o layout.

Valores ausentes e códigos especiais

Valores como 0, 9, 99, espaços e texto vazio podem representar categorias diferentes de ausência. A conversão automática para NA pode apagar significado.

pa_min |>
  count(PA_DOCORIG, sort = TRUE)

Consulte o domínio antes de recodificar.

Revisões e arquivos recentes

Competências recentes podem estar incompletas ou sofrer substituição. Registre:

  • data do download;
  • endereço da fonte;
  • nome e tamanho do arquivo;
  • competência;
  • versão do dicionário;
  • código usado no processamento.

Privacidade e uso responsável

Mesmo em bases públicas, combinações de variáveis podem aumentar o risco de identificação indireta. Evite divulgar tabelas muito detalhadas com pequenas contagens e avalie a finalidade, a necessidade e o contexto da publicação.


Economia da saúde com dados do SUS

Produção não é custo

Os campos financeiros de SIA e SIH são fundamentais para analisar o financiamento registrado nos sistemas, mas não representam necessariamente o custo econômico integral do cuidado.

É necessário distinguir:

Conceito Exemplo de fonte
Quantidade produzida ou aprovada SIA e SIH
Valor aprovado ou pago segundo regras administrativas SIA e SIH
Valor de referência do procedimento SIGTAP
Preço observado em compras públicas BPS
Teto regulatório de medicamento CMED/Anvisa
Custo apurado pelo prestador Sistema de custos
Despesa orçamentária Sistemas orçamentários e financeiros

Aplicações do SIA

O SIA pode apoiar estudos de:

  • volume de procedimentos por estabelecimento e gestor;
  • concentração territorial da oferta;
  • evolução de quantidades e valores aprovados;
  • participação de diferentes tipos de financiamento;
  • produção de medicamentos, OPM e procedimentos especializados;
  • acesso ambulatorial segundo município de atendimento.

Exemplo de valor médio administrativo por unidade aprovada:

resumo_pa |>
  mutate(
    valor_medio_aprovado = if_else(
      quantidade_aprovada > 0,
      valor_aprovado / quantidade_aprovada,
      NA_real_
    )
  )

Esse quociente não deve ser chamado automaticamente de custo médio.

Aplicações do SIH

O SIH permite analisar:

  • internações e permanência;
  • valores hospitalares e profissionais;
  • utilização de UTI;
  • procedimentos realizados;
  • mortalidade hospitalar registrada;
  • variações entre estabelecimentos e territórios.

Exemplo:

rd |>
  group_by(PROC_REA) |>
  summarise(
    internacoes = n(),
    permanencia_media = mean(DIAS_PERM, na.rm = TRUE),
    valor_medio_aih = mean(VAL_TOT, na.rm = TRUE),
    mortalidade = mean(MORTE == 1, na.rm = TRUE),
    .groups = "drop"
  )

BPS, CMED e SIGTAP

As três fontes respondem a perguntas diferentes:

  • BPS: por quanto determinados itens foram adquiridos por instituições?
  • CMED: quais limites regulatórios se aplicam aos preços de medicamentos?
  • SIGTAP: quais atributos e valores de referência estão associados aos procedimentos do SUS?

Não existe equivalência automática entre código CATMAT, registro sanitário, apresentação farmacêutica e código SIGTAP. Qualquer relacionamento deve ser documentado e validado.

Consulta mínima à API do BPS:

library(httr2)

bps <- request(
  "https://apidadosabertos.saude.gov.br/v1/economia-da-saude/bps"
) |>
  req_url_query(
    codigoCatmat = "405899",
    anoCompra = 2025,
    pagina = 1,
    tamanhoPagina = 10
  ) |>
  req_perform() |>
  resp_body_json(simplifyVector = TRUE)

Comece inspecionando a estrutura, pois APIs podem alterar nomes e níveis da resposta:

str(bps, max.level = 2)

Papel do CNES

O CNES acrescenta contexto à produção:

  • localização do estabelecimento;
  • esfera e tipo de gestão;
  • natureza jurídica;
  • leitos;
  • equipamentos;
  • profissionais;
  • serviços e habilitações.

Isso permite comparar produção, valores e capacidade instalada, desde que todas as fontes sejam alinhadas pela competência.


Recuperar o CNS da APAC de Medicamentos no arquivo PA

O arquivo de Procedimentos Ambulatoriais (PA) reúne a produção processada pelo SIA. O arquivo AM contém as APAC de medicamentos e disponibiliza o CNS do paciente no campo AP_CNSPCN.

A integração utiliza:

PA AM Significado
PA_CMP AP_CMP Competência do atendimento
PA_AUTORIZ AP_AUTORIZ Número da autorização/APAC
AP_CNSPCN CNS disseminado do paciente

A competência precisa fazer parte da chave porque os dados serão consolidados para vários meses.

Arquivos utilizados

Para o Acre, nas competências de setembro a novembro de 2024, são esperados:

Tipo Competência Arquivo
PA 202409 PAAC2409.dbc
PA 202410 PAAC2410.dbc
PA 202411 PAAC2411.dbc
AM 202409 AMAC2409.dbc
AM 202410 AMAC2410.dbc
AM 202411 AMAC2411.dbc

O código não pressupõe que exista somente um arquivo por competência. Todos os arquivos cujo nome contenha o padrão %UFAAMM%, como %AC2409%, serão selecionados.

Preparar o ambiente

library(curl)
library(dplyr)
library(read.dbc)

url_ftp <- paste0(
  "ftp://ftp.datasus.gov.br/dissemin/publicos/",
  "SIASUS/200801_/Dados/"
)

uf <- "AC"
competencias <- sprintf("24%02d", 9:11)
diretorio <- "dados_sia"

dir.create(
  diretorio,
  showWarnings = FALSE,
  recursive = TRUE
)

Listar os arquivos disponíveis no FTP

A listagem é obtida uma única vez. Depois, o código procura os arquivos PA e AM usando o padrão formado por UF e competência.

conteudo_ftp <- curl_fetch_memory(url_ftp)$content |>
  rawToChar()

arquivos_ftp <- regmatches(
  conteudo_ftp,
  gregexpr(
    "[[:alnum:]_-]+\\.[dD][bB][cC]",
    conteudo_ftp
  )
)[[1]] |>
  unique()

Filtrar PA e AM com for

O filtro grepl(filtro_uf_aamm, ...) equivale conceitualmente a:

LIKE '%UFAAMM%'

Por exemplo:

LIKE '%AC2409%'

O prefixo PA ou AM diferencia os dois tipos de arquivo.

arquivos <- data.frame()

for (tipo in c("PA", "AM")) {
  for (aamm in competencias) {
    filtro_uf_aamm <- paste0(uf, aamm)

    encontrados <- arquivos_ftp[
      startsWith(toupper(arquivos_ftp), tipo) &
        grepl(
          filtro_uf_aamm,
          toupper(arquivos_ftp),
          fixed = TRUE
        )
    ]

    if (length(encontrados) == 0) {
      stop(
        "Nenhum arquivo encontrado para ",
        tipo,
        " ",
        filtro_uf_aamm
      )
    }

    arquivos <- bind_rows(
      arquivos,
      data.frame(
        tipo = tipo,
        uf = uf,
        competencia = paste0("20", aamm),
        arquivo = encontrados,
        url = paste0(url_ftp, encontrados)
      )
    )
  }
}

arquivos |>
  arrange(tipo, competencia, arquivo)
Mostrar resultado

Se uma UF possuir dois ou mais arquivos do mesmo tipo na mesma competência, todos aparecerão na tabela e serão processados.

Baixar os arquivos

arquivos$destino <- file.path(
  diretorio,
  arquivos$arquivo
)

for (i in seq_len(nrow(arquivos))) {
  if (!file.exists(arquivos$destino[i])) {
    curl_download(
      arquivos$url[i],
      arquivos$destino[i],
      mode = "wb"
    )
  }
}

stopifnot(
  all(file.exists(arquivos$destino)),
  all(file.info(arquivos$destino)$size > 0)
)

Ler e consolidar os DBC

A função lê todos os arquivos encontrados para determinado tipo. A coluna arquivo_origem mantém a rastreabilidade.

ler_conjunto_dbc <- function(tipo) {
  selecionados <- arquivos[
    arquivos$tipo == tipo,
  ]

  partes <- vector(
    "list",
    nrow(selecionados)
  )

  for (i in seq_len(nrow(selecionados))) {
    dados <- read.dbc(
      selecionados$destino[i]
    )

    dados$arquivo_origem <-
      selecionados$arquivo[i]

    dados$competencia_arquivo <-
      selecionados$competencia[i]

    partes[[i]] <- dados
  }

  bind_rows(partes)
}

pa <- ler_conjunto_dbc("PA")
am <- ler_conjunto_dbc("AM")

Verifique as competências efetivamente presentes nos campos internos:

pa |>
  count(PA_CMP, arquivo_origem)
Mostrar resultado
am |>
  count(AP_CMP, arquivo_origem)
Mostrar resultado

A competência do nome do arquivo é útil para rastreabilidade. Para a integração, utilize os campos internos PA_CMP e AP_CMP.

Preparar o CNS do AM

A função abaixo remove bytes inválidos e mantém somente caracteres numéricos. Valores com tamanho diferente do esperado são transformados em NA.

normalizar_codigo <- function(x, tamanho) {
  if (is.numeric(x)) {
    x <- format(
      x,
      scientific = FALSE,
      trim = TRUE
    )
  }

  x <- as.character(x)

  x <- gsub(
    "[^0-9]",
    "",
    x,
    useBytes = TRUE
  )

  x[x == ""] <- NA_character_

  tamanho_invalido <-
    !is.na(x) &
    nchar(x, type = "bytes") != tamanho

  x[tamanho_invalido] <- NA_character_

  x
}

am_cns <- am |>
  transmute(
    competencia_chave = normalizar_codigo(
      AP_CMP,
      6
    ),
    autorizacao_chave = normalizar_codigo(
      AP_AUTORIZ,
      13
    ),
    cns_am = normalizar_codigo(
      AP_CNSPCN,
      15
    )
  ) |>
  filter(
    !is.na(competencia_chave),
    !is.na(autorizacao_chave),
    !is.na(cns_am),
    cns_am != "000000000000000"
  ) |>
  distinct()

Verificar autorizações associadas a mais de um CNS

autorizacoes_ambiguas <- am_cns |>
  count(
    competencia_chave,
    autorizacao_chave,
    name = "quantidade_cns"
  ) |>
  filter(quantidade_cns > 1)

if (nrow(autorizacoes_ambiguas) > 0) {
  stop(
    "Existem autorizações associadas ",
    "a mais de um CNS na mesma competência."
  )
}

Acrescentar o CNS ao PA consolidado

A mesma normalização deve ser aplicada às chaves do PA.

linhas_pa <- nrow(pa)

pa_consolidado <- pa |>
  mutate(
    competencia_chave = normalizar_codigo(
      PA_CMP,
      6
    ),
    autorizacao_chave = normalizar_codigo(
      PA_AUTORIZ,
      13
    )
  ) |>
  left_join(
    am_cns,
    by = c(
      "competencia_chave",
      "autorizacao_chave"
    )
  ) |>
  select(
    -competencia_chave,
    -autorizacao_chave
  )

stopifnot(
  nrow(pa_consolidado) == linhas_pa
)

Verificar o resultado

pa_consolidado |>
  summarise(
    linhas_pa = n(),
    linhas_com_cns = sum(
      !is.na(cns_am)
    ),
    autorizacoes_com_cns = n_distinct(
      PA_AUTORIZ[!is.na(cns_am)]
    ),
    cns_distintos = n_distinct(
      cns_am,
      na.rm = TRUE
    )
  )
Mostrar resultado

Exercício integrado

Utilize os exemplos anteriores para responder:

  • Quantos procedimentos ambulatoriais foram aprovados no Acre em janeiro de 2025?
  • Quantos estabelecimentos aparecem no PA?
  • Qual proporção foi encontrada no CNES da mesma competência?
  • Quais procedimentos concentraram os maiores valores aprovados?
  • O ranking muda quando se utiliza quantidade em vez de valor?
  • Quais limitações impedem interpretar PA_VALAPR como custo econômico?

Estrutura mínima da resposta:

resultado <- pa_cnes |>
  group_by(PA_PROC_ID) |>
  summarise(
    estabelecimentos = n_distinct(PA_CODUNI),
    quantidade = sum(PA_QTDAPR, na.rm = TRUE),
    valor = sum(PA_VALAPR, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(valor))

Síntese

Uma análise intermediária de dados do SUS exige mais do que importar arquivos:

  1. compreender a finalidade do sistema;
  2. identificar a unidade de registro;
  3. selecionar a competência adequada;
  4. consultar o dicionário correspondente;
  5. preservar códigos como texto;
  6. validar chaves antes das junções;
  7. integrar dimensões temporalmente compatíveis;
  8. distinguir produção, valor administrativo, preço e custo;
  9. documentar origem, versão e limitações.

O código pode ser curto. A interpretação precisa ser rigorosa.


Referências

BRASIL. Ministério da Saúde. Comissão Intergestores Tripartite. Disponível em: https://www.gov.br/saude/pt-br/acesso-a-informacao/gestao-do-sus/articulacao-interfederativa/cit. Acesso em: 17 ago. 2026.

BRASIL. Ministério da Saúde. Portal de Dados Abertos do SUS. Disponível em: https://dadosabertos.saude.gov.br/. Acesso em: 17 ago. 2026.

BRASIL. Ministério da Saúde. CNES: Informe Técnico 2017-06. Brasília, DF: Ministério da Saúde, 2017.

BRASIL. Ministério da Saúde. Informe Técnico do Sistema de Informações Ambulatoriais do SUS. Brasília, DF: Ministério da Saúde, 2019.

BRASIL. Ministério da Saúde. Informe Técnico do Sistema de Informações Hospitalares do SUS. Brasília, DF: Ministério da Saúde, 2016.

BRASIL. Ministério da Saúde. Sistema de Informações Ambulatoriais. Disponível em: https://www.gov.br/saude/pt-br/composicao/saes/samu-192/sistemas. Acesso em: 17 ago. 2026.

BRASIL. Agência Nacional de Saúde Suplementar. Dados abertos. Disponível em: https://www.gov.br/ans/pt-br/acesso-a-informacao/perfil-do-setor/dados-abertos-1. Acesso em: 17 ago. 2026.

BRASIL. Agência Nacional de Saúde Suplementar. Quem somos. Disponível em: https://www.gov.br/ans/pt-br/acesso-a-informacao/institucional/quem-somos-1. Acesso em: 17 ago. 2026.

BRASIL. Agência Nacional de Vigilância Sanitária. Câmara de Regulação do Mercado de Medicamentos. Disponível em: https://www.gov.br/anvisa/pt-br/assuntos/medicamentos/cmed. Acesso em: 17 ago. 2026.