Reprodutibilidade no SUS: Como Extrair e Analisar Microdados do SINAN e SIH com Python
Publicado: Atualizado: Por: Komesu, D.K.
Arte conceitual: Quantilica Ecosystem Architecture
Um guia técnico de reprodutibilidade aberta para pesquisadores, epidemiologistas e engenheiros de dados. Detalhamos a superação do formato proprietário .dbc com motores nativos em Rust (WebAssembly e Python), a extração concorrente do SINAN e SIH via datasus-fetcher e a validação analítica com DataContract em Polars.
Engenharia de Dados em Saúde Pública & Reprodutibilidade Aberta
Este guia técnico estabelece a esteira de engenharia de dados, descompressão algorítmica e reprodutibilidade aberta utilizada para embasar a investigação jornalística sobre a crise sanitária de 2024: O Colapso Silencioso dos Leitos: A Anatomia da Maior Epidemia de Dengue nos Microdados do SUS.
A produção de inteligência epidemiológica no Brasil enfrenta um paradoxo central: enquanto o Sistema Único de Saúde (SUS) hospeda um dos maiores acervos públicos de dados em saúde do planeta, o acesso computacional a esses registros permanece obstruído por barreiras tecnológicas concebidas há mais de três décadas.
Pesquisadores universitários, sanitaristas e cientistas de dados frequentemente deparam-se com uma esteira arcaica de coleta manual via FTP, scripts monolíticos na linguagem R sujeitos a vazamentos de memória e binários proprietários de 32 bits restritos ao ecossistema Windows.
Este guia documenta o pipeline analítico completo para extração, descompressão em nível de bits e validação de contratos de dados em lote sobre os microdados do Sistema de Informação de Agravos de Notificação (SINAN) e do Sistema de Informações Hospitalares (SIH/SUS).
O Labirinto do Formato .dbc e a Arquitetura de Descompressão
O principal gargalo de interoperabilidade no ecossistema do Ministério da Saúde reside na extensão .dbc.

A Anatomia do Contêiner .dbc
Criado pelo Departamento de Informática do SUS (DATASUS) no início dos anos 1990 para permitir a distribuição de bases volumosas em disquetes de 1,44 MB e redes discadas, o arquivo .dbc não é um formato padrão de mercado.
Tecnicamente, trata-se de uma tabela relacional dBASE III+ / xBase (.dbf) encapsulada e compactada através do algoritmo implode da biblioteca proprietária PKWARE Data Compression Library (DCL). O algoritmo opera no fluxo de bits com base em dois núcleos:
- Janela Deslizante LZ77: Uma janela de 4.096 bytes (4 KB) que localiza sequências idênticas de bytes e as substitui por pares de ponteiro (distância e comprimento).
- Codificação de Shannon-Fano: Árvores de comprimento variável que codificam símbolos literais e referências, alcançando reduções de 60% a 85% do espaço físico sobre tabelas tabulares acolchoadas com espaços em branco.
O contêiner .dbc possui um cabeçalho inicial reduzido contendo magic bytes de identificação e um número inteiro de 32 bits (little-endian) que registra a dimensão exata do arquivo DBF descompactado. A partir desse deslocamento, todo o conteúdo é um fluxo contínuo de bits codificados que exige o algoritmo inverso explode (frequentemente implementado como a rotina blast, formalizada em código aberto por Mark Adler).
A Barreira Operacional dos Softwares Oficiais
Durante décadas, a leitura oficial desses arquivos exigia a instalação do software TabWin / TabNet, disponibilizado como um binário compilado para Microsoft Windows dependente de chamadas DLL antigas de 32 bits. Essa restrição excluía cientistas de dados operando em servidores Linux em nuvem, contêineres Docker, arquiteturas ARM (como Apple Silicon) e pipelines headless de integração contínua.
Para superar essa dívida tecnológica, o ecossistema Quantilica desenvolveu duas abordagens complementares de código aberto:
- No Navegador (Zero Instalação): Para conversões pontuais com total preservação da privacidade sob a LGPD, o módulo Alpaca do Quantilica Portal disponibiliza o conversor em /alpaca/converter. O motor em Rust é compilado para WebAssembly (
.wasm, 38 KB) e executado em segundo plano por um Web Worker dedicado (dbc-converter.worker.mjs), processando arquivos pesados diretamente na memória do navegador e gerando tabelas CSV em UTF-8 com BOM. - No Terminal e Python (Engenharia de Dados em Escala): Para automação em servidores e pipelines de Big Data, o pacote
datasus-fetchercom a extensão analítica (datasus-fetcher[analysis], instalada comquantilica install datasus --extra analysis) traz um motor Rust nativo capaz de descompactar múltiplos arquivos.dbcem paralelo e convertê-los diretamente para o padrão colunar Apache Parquet.
Extração Automatizada com datasus-fetcher
Para pipelines de larga escala, o datasus-fetcher resolve automaticamente a árvore de diretórios do servidor FTP oficial (ftp.datasus.gov.br), implementando conexões concorrentes com retentativas exponenciais e validação de hashes SHA-256.
A sincronização de microdados brutos do SINAN Dengue e do SIH-RD pode ser acionada diretamente pelo terminal:
# 1. Instalar o fetcher (com o extra analysis) no ambiente do ecossistema Quantilica
quantilica install datasus --extra analysis
# 2. SINAN Dengue: um arquivo nacional por ano (região "br")
quantilica datasus sync sinan-deng -o ./dados_datasus --start 2024 --end 2024 --regions br
# 3. SIH-RD: arquivos mensais por UF (repita --regions para cada estado)
quantilica datasus sync sih-rd -o ./dados_datasus --start 2024-01 --end 2024-12 --regions sp --regions mg --regions pr --threads 4
O comando realiza o download particionado e produz um arquivo manifest.json com proveniência temporal, checksum criptográfico e contagem de registros, garantindo auditabilidade estrita.
Dicionário de Variáveis Críticas dos Microdados
Para fins de padronização em pesquisas científicas, detalhamos abaixo os dicionários de variáveis fundamentais utilizadas nos estudos de arboviroses e morbidade hospitalar.
1. Sistema de Informação de Agravos de Notificação (sinan-deng)
O SINAN reúne as notificações compulsórias preenchidas na atenção básica e emergencial:
| Campo Primário | Tipo | Domínio / Valores Válidos | Descrição Semântica e Regra de Saneamento |
|---|---|---|---|
DT_NOTIFIC |
Data (8) | YYYYMMDD |
Data de notificação do caso na unidade de saúde. |
SEM_NOT |
Texto (6) | YYYYWW |
Semana epidemiológica da notificação. |
SG_UF_NOT |
Texto (2) | Código IBGE da UF (31, 35, 41) |
UF onde o caso foi notificado. |
SG_UF |
Texto (2) | Código IBGE da UF (31, 35, 41) |
UF de residência do paciente (recorte usado pelo Ministério da Saúde). |
ID_MUNICIP |
Texto (6) | Código IBGE (6 dígitos) | Município de notificação (o de residência é ID_MN_RESI). |
CLASSI_FIN |
Texto (2) | 10=Dengue, 11=Com sinais de alarme, 12=Grave, 5=Descartado, 8=Inconclusivo |
Classificação diagnóstica final do caso. |
CRITERIO |
Texto (1) | 1=Laboratorial, 2=Clínico-epi |
Critério de confirmação diagnóstica. |
EVOLUCAO |
Texto (1) | 1=Cura, 2=Óbito pelo agravo, 3=Óbito por outras causas, 4=Óbito em investigação, 9=Ignorado |
Desfecho clínico final registrado no SINAN. |
HOSPITALIZ |
Texto (1) | 1=Sim, 2=Não, 9=Ignorado |
Indicador de evolução para internação clínica. |
Regra de Saneamento Canônica: pelo critério do Ministério da Saúde, casos prováveis são todas as notificações exceto as descartadas (CLASSI_FIN == '5'); inconclusivos (8) e casos sem classificação final permanecem na contagem. O arquivo público do DATASUS (ex.: DENGBR24.dbc) já vem sem os descartados, de modo que, em 2024, os 6.564.924 registros do arquivo final equivalem aos casos prováveis. Óbitos confirmados por dengue exigem EVOLUCAO == '2' e CLASSI_FIN em 10, 11 ou 12 (6.334 em 2024); para comparar com o Painel de Arboviroses, agregue por UF de residência (SG_UF).
2. Sistema de Informações Hospitalares (sih-rd)
O SIH-RD consolida as Autorizações de Internação Hospitalar (AIH) faturadas por hospitais públicos e conveniados ao SUS:
| Campo Primário | Tipo | Domínio / Valores Válidos | Descrição Semântica e Regra Financeira |
|---|---|---|---|
N_AIH |
Texto (13) | Numérico | Número único da Autorização de Internação Hospitalar. |
UF_ZI |
Texto (6) | Código IBGE do gestor (ex.: 530000) |
Gestor da AIH; o município do hospital está em MUNIC_MOV e a UF do hospital é a do próprio arquivo (RDUFAAMM). |
DIAG_PRINC |
Texto (4) | CID-10 (A90, A91) |
Causa primária de internação hospitalar. |
VAL_TOT |
Decimal (2 casas) | Reais (R$) | Valor total liquidado pelo Fundo Nacional de Saúde. |
DIAS_PERM |
Inteiro | Dias inteiros | Tempo total de permanência do paciente no leito. |
UTI_MES_TO |
Inteiro | Dias inteiros | Total de dias em Unidade de Terapia Intensiva (UTI). |
MORTE |
Código (1) | 1=Óbito hospitalar, 0=Alta |
Desfecho do episódio de internação na AIH. |
IDENT |
Texto (1) | 1=AIH principal, 5=Longa permanência |
Use 1 para contar internações sem duplicar continuações. |
Regra de Saneamento Canônica: Internações de dengue são identificadas pelos CIDs principais A90 (dengue clássica) e A91 (febre hemorrágica da dengue), contando apenas AIHs com IDENT == '1'. Episódios com UTI_MES_TO > 0 são classificados como leitos críticos, enquanto UTI_MES_TO == 0 refere-se a leitos de enfermaria clínica.
Formalização Matemática dos Indicadores Epidemiológicos
Para eliminar ambiguidades metodológicas, cada indicador monitorado pela vigilância em saúde pública é formalizado matematicamente:
1. Coeficiente de Incidência Populacional (\(CI_{i,t}\))
O coeficiente de incidência avalia o risco de adoecimento por 100 mil habitantes em uma Unidade da Federação \(i\) no período \(t\):
Onde \(\mathcal{C}_{i,t}\) representa o conjunto de casos prováveis notificados no SINAN no estado \(i\) no período \(t\) e \(\text{Pop}_{i,t}\) é a população residente estimada pelo IBGE.
2. Taxa de Hospitalização (\(T_H\))
Mede a fração de pacientes diagnosticados que demandaram admissão em leito de internação:
3. Taxa de Letalidade Geral (\(TL\)) e Intra-Hospitalar (\(TLH\))
A taxa de letalidade populacional confronta o total de óbitos com os casos prováveis, enquanto a letalidade hospitalar avalia o desfecho entre os pacientes que alcançaram a rede terciária:
Onde \(\mathcal{A}\) denota o conjunto de AIHs pagas sob os CIDs A90 ou A91.
4. Custo Médio Unitário (\(\overline{C}\)) e Tempo de Permanência (\(\overline{P}\))
O custo médio é calculado separadamente para enfermarias clínicas e leitos de UTI:
Validação de Esquema com Data Contracts em Polars
Na engenharia de dados em saúde, variações silenciosas de layout entre competências anuais (colunas nulas ausentes, preenchimento de tipos alfanuméricos em campos numéricos ou desvios de encoding) podem corromper pipelines analíticos.
Para blindar o fluxo de processamento, utilizamos a biblioteca quantilica-analytics, que aplica Contratos de Dados (Data Contracts) rígidos sobre DataFrames processados em Polars:
import polars as pl
from quantilica.analytics import DataContract, Field
# 1. Definição formal do contrato para o agregado de AIHs do SIH-RD
contrato_vigilancia = DataContract(
dataset_id="sih_dengue_agregado_uf",
fields=[
Field(name="uf", dtype=pl.Utf8, description="Sigla federativa"),
Field(name="ano", dtype=pl.Int64, description="Ano da competência"),
Field(name="internacoes_totais", dtype=pl.Int64, description="Volume de AIHs pagas"),
Field(name="custo_total_reais", dtype=pl.Float64, description="Despesa liquidada em R$"),
],
)
# 2. DataFrame consolidado após ingestão e tratamento dos microdados
dados_sih = pl.DataFrame({
"uf": ["SP", "MG", "PR", "RJ"],
"ano": [2024, 2024, 2024, 2024],
# Valores reais de 2024: AIHs tipo 1 com CID A90/A91 por UF do hospital (SIH-RD, extração 20/10/2026)
"internacoes_totais": [30889, 35473, 22206, 8343],
"custo_total_reais": [16981520.54, 17249138.03, 9491649.80, 4637777.33],
})
# 3. Validação estática de tipagem e integridade estrutural
contrato_vigilancia.validate(dados_sih)
print(f"Contrato '{contrato_vigilancia.dataset_id}' validado com sucesso: {dados_sih.shape[0]} registros conformes.")
Esse padrão impede que dados inconsistentes alcancem modelos estatísticos, dashboards ou sistemas de vigilância preditiva.
Perguntas Frequentes (FAQ)
O que é o algoritmo PKWARE DCL implode utilizado nos arquivos .dbc?
É uma técnica proprietária de compressão sem perdas desenvolvida pela PKWARE que combina uma janela deslizante LZ77 de 4 KB com árvores de codificação Shannon-Fano. O formato foi adotado pelo DATASUS para permitir o armazenamento compacto de tabelas DBF em mídias de baixa densidade nos anos 1990.
Como descompactar um arquivo .dbc sem instalar o TabWin ou máquinas virtuais Windows?
Para uso em pipelines de desenvolvimento e automação, instale o pacote datasus-fetcher com a extensão analítica (datasus-fetcher[analysis], ou quantilica install datasus --extra analysis), que contém rotinas nativas em Rust para conversão direta para Parquet. No navegador, acesse /alpaca/converter para converter arquivos .dbc em CSV via WebAssembly sem envio de dados a servidores.
Qual é a diferença metodológica entre os casos do SINAN e as internações do SIH-RD?
O SINAN registra a suspeita clínica notificada no primeiro ponto de contato assistencial (atenção primária, UPAs e consultórios). O SIH-RD registra apenas os eventos que culminaram em emissão de Autorização de Internação Hospitalar (AIH) faturada pela rede conveniada ao SUS, representando a parcela de pacientes com descompensação clínica.
Referências Técnicas e Bibliográficas
- ADLER, M. Blast: inflate PKWARE Data Compression Library (DCL) compressed data. Versão 1.3. Pasadena: California Institute of Technology, 2013.
- MINISTÉRIO DA SAÚDE (BRASIL). Manual de Operação do Sistema de Informação de Agravos de Notificação - SINAN. 2. ed. Brasília: Secretaria de Vigilância em Saúde, 2023.
- MINISTÉRIO DA SAÚDE (BRASIL). Manual Técnico Operacional do Sistema de Informações Hospitalares - SIH/SUS. Brasília: Departamento de Informática do SUS (DATASUS), 2024.
- PKWARE INC. PKWARE Data Compression Library for DOS, OS/2, and Windows. Brown Deer: PKWARE, 1993.
- SHANNON, C. E. A Mathematical Theory of Communication. The Bell System Technical Journal, v. 27, p. 379–423, 1948.