Pular para o conteúdo principal

Reprodutibilidade no SUS: Como Extrair e Analisar Microdados do SINAN e SIH com Python

Publicado: Atualizado: Por: Komesu, D.K.

Ilustração conceitual representando fluxos luminosos de dados binários sendo transformados em colunas estruturadas para análise em saúde. Arte conceitual: Quantilica Ecosystem Architecture
Engenharia de dados abertos no SUS: descompressão algorítmica de contêineres legados .dbc e modelagem colunar de microdados em saúde pública.

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.

Diagrama de blocos detalhando o pipeline de dados da extração no FTP do DATASUS via datasus-fetcher, descompressão via WebAssembly no Alpaca até a persistência analítica em Polars e Parquet.
Figura 1: Fluxograma arquitetural do pipeline de dados: extração de microdados brutos no FTP via datasus-fetcher, descompressão bit-level do formato .dbc (PKWARE DCL implode/blast via WebAssembly no Alpaca) e validação analítica via contratos de dados.Elaboração: Quantilica Ecosystem Architecture.

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:

  1. 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.
  2. No Terminal e Python (Engenharia de Dados em Escala): Para automação em servidores e pipelines de Big Data, o pacote datasus-fetcher com a extensão analítica (datasus-fetcher[analysis], instalada com quantilica install datasus --extra analysis) traz um motor Rust nativo capaz de descompactar múltiplos arquivos .dbc em 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\):

\[ CI_{i,t} = \left( \frac{\sum_{k} \mathbb{I}(k \in \mathcal{C}_{i,t})}{\text{Pop}_{i,t}} \right) \times 100.000 \]

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:

\[ T_H = \left( \frac{\sum_{k} \mathbb{I}(\text{HOSPITALIZ}_k = 1)}{\sum_{k} \mathbb{I}(k \in \mathcal{C})} \right) \times 100\% \]

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:

\[ TL = \left( \frac{\sum_{k} \mathbb{I}(\text{EVOLUCAO}_k = 2)}{\sum_{k} \mathbb{I}(k \in \mathcal{C})} \right) \times 100\% \]
\[ TLH = \left( \frac{\sum_{j \in \mathcal{A}} \mathbb{I}(\text{MORTE}_j = 1)}{|\mathcal{A}|} \right) \times 100\% \]

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:

\[ \overline{C}_{\text{grupo}} = \frac{\sum_{j \in \mathcal{A}_{\text{grupo}}} \text{VAL}_{\text{TOT}, j}}{|\mathcal{A}_{\text{grupo}}|} \]
\[ \overline{P} = \frac{\sum_{j \in \mathcal{A}} \text{DIAS}_{\text{PERM}, j}}{|\mathcal{A}|}, \quad \overline{P}_{\text{UTI}} = \frac{\sum_{j \in \mathcal{A}_{\text{UTI}}} \text{UTI}_{\text{MES}, j}}{|\mathcal{A}_{\text{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

  1. ADLER, M. Blast: inflate PKWARE Data Compression Library (DCL) compressed data. Versão 1.3. Pasadena: California Institute of Technology, 2013.
  2. 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.
  3. 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.
  4. PKWARE INC. PKWARE Data Compression Library for DOS, OS/2, and Windows. Brown Deer: PKWARE, 1993.
  5. SHANNON, C. E. A Mathematical Theory of Communication. The Bell System Technical Journal, v. 27, p. 379–423, 1948.