信息速览
DATASUS 是巴西卫生部信息技术司维护的国家卫生信息总库,也是整个统一卫生系统(SUS)唯一成体系的官方数据出口。它不提供一张统一的宽表,而是把出生、死亡、住院、门诊、法定传染病通报拆成五个以上互不相同的子系统,每个子系统有自己的记录单位、自己的主键、自己的字段命名,再按年份和州切成一个个压缩包分发。想从里面取出一个能建模的表,第一步不是写 SQL,而是决定你要的是哪一套记录。
这份数据在中低收入国家的公共卫生研究里几乎是标配:巴西是全球少数把全民公立医疗系统的行政记录完整公开的国家,从 1979 年的死亡登记到次年的住院授权,全部免费、无需申请、无需伦理审批即可下载。对做拉美真实世界数据、做卫生服务研究、做死亡率趋势分析的团队,它是绕不开的起点。但正因为「免费且公开」,「公开等于好用」这个默认假设在这里失效得格外彻底——文件格式是 1990 年代的,字段名是葡语缩写,疾病编码是巴西本地扩展版,同一年的数据还可能有两套版本。
本篇要讲清的就是这套「非英语世界的国家级卫生数据」长什么样:它由哪几个子系统拼成、字段按什么规律命名、下载渠道有几条、什么时候会拿到错的版本,以及哪些分析根本不该用它。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方名称 | DATASUS,Departamento de Informática do SUS(统一卫生系统信息技术司) |
| 所属机构 | 巴西卫生部(Ministério da Saúde) |
| 数据性质 | 全国行政登记 + 生命登记 + 传染病通报的汇总数据仓库 |
| 覆盖人口 | 巴西全国,约两亿人 |
| 子系统数量 | 五大核心子系统(SIM / SINASC / SIH / SIA / SINAN)加若干专题库 |
| 时间跨度 | SIM 自 1979,SINASC 自 1994,SIH 自 1992 前后,SINAN 自 1990 年代末 |
| 地理粒度 | 全国 / 大区 / 州 / 市,市代码为七位 IBGE 码 |
| 文件格式 | DBC(压缩)→ DBF(表)→ 可转 CSV / Parquet |
| 切分方式 | 按年 × 按州(部分子系统按年 × 月或按年 × 病种) |
| 字段语言 | 葡萄牙语缩写,无官方英文版字典 |
| 疾病编码 | CID-10 巴西本地扩展版,非 WHO 原版 |
| 访问门槛 | 无需注册,网页端或 FTP 直接下载 |
| 许可 | 政府开放数据;文件页不逐条标注,须自行核对 |
| 主要渠道 | 文件传输页、TabNet 在线聚合、开放数据门户、FTP |
| 典型滞后 | 年度结束后 6–18 个月出现可用版本 |
| 版本状态 | 同一子系统可能有前版与最终版两套并存 |
§1 它要解决的具体麻烦
1.1 一个国家的卫生系统没有统一出口时会发生什么
任何一个人口两亿的国家,卫生数据天然散落在三类地方:医院的账单系统、民政的生死登记、疾控的传染病报告。这三类系统的建设时间不同、主管部门不同、填报单位不同,最后能拼到一起的概率接近于零。DATASUS 的存在意义,就是把这些散落的系统在联邦层面收口成一个可以下载的仓库,让研究者不必给二十七个州卫生厅分别写信。
它的做法不是「统一建模」,而是「统一投递」:各子系统保持自己的表结构,DATASUS 只负责把它们按年按州打包、放到服务器上、提供一个在线聚合界面。这个选择在 1990 年代是合理的——当年统一建模的成本远高于分头发布——但它把整合的负担完整地转嫁给了使用者。所以你拿到手的不是一座整理好的图书馆,而是一排排标着年份和州名的档案抽屉,每个抽屉里的表格长得都不一样。
理解这一点,后面所有的坑都能归位:字段名不统一不是疏漏,是设计;版本并存不是失误,是投递节奏的副产品;格式老旧不是懒惰,是持续三十年的兼容包袱。
1.2 三条常见的错误期待
期待一:以为它像 Kaggle 一样是一个整理好的数据集。 实际上它是一台文件服务器加一个查询界面。首页没有「下载全部」的按钮,也没有数据字典的集中入口,字段含义散落在各子系统的技术文档里,且多数文档只有葡语版。第一次打开的人常见反应是「找不到数据在哪」——数据在,但入口分散在文件传输页、TabNet、开放数据门户和 FTP 四处,各有各的目录逻辑。
期待二:以为「公开」意味着「干净」。 公开只说明分发环节没有门槛,不说明内容质量。同一份死亡登记在不同州、不同年份的填报完整度差别很大,早期年份的字段缺失本身就是一个研究对象。把它当成一张可以直接扔进模型的特征表,等于把填报系统的缺陷当成信号学进去。
期待三:以为字段名可以猜。 中文和英文使用者最容易在这一步翻车。DTOBITO 是死亡日期,CAUSABAS 是根本死因,NU_IDADE_N 是一个把年龄数值和单位压在同一个数字里的复合编码,MUNIC_RES 是居住地市代码而不是就诊地。这些缩写从葡语词根来,靠英文直觉猜不出来,靠葡语词典也未必猜得全,因为它们是三十年前为了省字节定下的。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 全国逐年死亡率与死因构成 | SIM 按年按州的个体级死亡记录 | 够,且是拉美最完整的一套 |
| 住院量、住院费用、平均住院日 | SIH 的住院授权单记录 | 够用,但只覆盖公立系统 |
| 出生体重、孕周、分娩方式 | SINASC 出生登记 | 够,字段相当细 |
| 单个患者的完整就诊轨迹 | 无;各子系统主键不同 | 不够,需要自行链接且成功率有限 |
| 私立医院与补充保险人群 | 无 | 不够,系统外人群整体缺失 |
| 门诊就诊人次 | SIA 的生产量记录 | 部分够,生产量与人次不是一回事 |
| 现成的英文数据字典 | 无 | 不够,须自建对照表 |
| 直接可用的 CSV | 无,只有 DBC/DBF | 不够,须自行转换 |
| 传染病发病监测 | SINAN 按病种通报 | 够,但按病种分库,字段差异大 |
| 数据采集说明与质控报告 | 部分子系统有,葡语 | 部分够,须逐份核对 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 要做拉美某国的全国死因趋势分析 | SIM 提供数十年的个体级死亡记录,死因用 CID-10 编码 | 先确定用哪一套版本,再核对市代码与年份边界 |
| 要用真实世界数据做住院费用模型 | SIH 有逐次住院的金额、天数、主诊断与操作码 | 明确结论只能约束到公立系统,写进限制段 |
| 要给出生结局建预测模型 | SINASC 有出生体重、孕周、产检次数、母亲年龄 | 先处理年龄复合编码与缺失填报,再做特征工程 |
| 要在低资源环境做流行病学教学 | 免费、无需申请、体量足够大 | 用 TabNet 先出一张聚合表当教学样例 |
| 要做跨国卫生系统比较 | 巴西是少数行政记录全公开的国家 | 与同类国家的口径逐项对齐,别直接比绝对数 |
| 只想快速验证一个假设 | TabNet 在线聚合可以几秒钟出表 | 先用聚合数确认方向,再决定要不要下全量 |
| 要训练临床文本模型 | 无自由文本,只有编码与结构化字段 | 换数据源,这套不合适 |
| 要做州以下的地理精细分析 | 市代码可到市级,但部分字段为保护隐私做了扰动 | 先确认目标粒度的可用性 |
1.5 一句话判断
它是拉美公共卫生研究绕不开的底座,但拿到的是一排档案抽屉而不是一张表;把它当数据集用会处处受阻,把它当档案系统用才顺。
1.6 不适合谁:四条边界
第一条,不适合需要个体级纵向轨迹的研究。 SIM、SINASC、SIH、SIA 各有自己的主键,彼此之间没有官方提供的链接键。想做「一个人从出生到住院到死亡」的完整轨迹,需要基于姓名、出生日期、母亲姓名做概率链接,而姓名在公开文件中已被处理掉相当一部分,链接成功率因此受限。如果你的研究设计依赖纵向追踪,这套数据从一开始就不该选。
第二条,不适合代表全国医疗利用的研究。 SIH 覆盖的是 SUS 付费的住院授权,SIA 覆盖的是 SUS 门诊生产量。巴西有相当比例人口持有补充医疗保险,其就诊记录不进入这两个库。任何以「全国住院率」「全国门诊量」为标题的结论,都必须先扣掉这部分人口,否则就是把公立系统负担说成全国负担。
第三条,不适合需要自由文本或影像的场景。 这套数据全部是结构化编码字段,没有病历正文、没有影像、没有检验值原值。做医学 NLP、做多模态、做影像诊断的团队在这里找不到素材,唯一能沾边的是传染病通报里偶有的简短备注字段,且质量不稳定。
第四条,不适合要求字段含义明确无歧义的分析。 部分字段的取值含义随时间改过,部分字段在不同州的填报标准不同,部分编码在本地扩展版与 WHO 原版之间码位不一致。如果研究结论对这些字段的语义高度敏感,就需要逐州逐年核对技术文档,这个成本往往超过研究本身的价值。
§2 数据构成与规格
2.1 五个子系统各自是什么
DATASUS 旗下子系统众多,但对绝大多数研究而言,真正高频使用的是五个。它们的定位差异不是「表不一样」,而是「记录的事件不一样」。
| 子系统 | 葡语全称 | 记录单位 | 起点 | 一句话定位 |
|---|---|---|---|---|
| SIM | Sistema de Informação sobre Mortalidade | 一次死亡 | 1979 | 死亡登记,含根本死因 |
| SINASC | Sistema de Informações sobre Nascidos Vivos | 一次活产 | 1994 | 出生登记,含出生结局与母亲信息 |
| SIH | Sistema de Informações Hospitalares | 一次住院授权 | 1990 年代初 | 公立系统住院账单 |
| SIA | Sistema de Informação Ambulatorial | 一次门诊生产量上报 | 1990 年代初 | 公立系统门诊服务量 |
| SINAN | Sistema de Informação de Agravos de Notificação | 一次法定传染病通报 | 1990 年代末 | 需上报疾病的个案通报 |
除此之外还有几个偏专题的库:疫苗覆盖、初级保健服务量、检验与影像生产量、卫生机构名录等。它们的使用频率低于上面五个,但在特定问题上不可替代,比如研究基层卫生覆盖时会用到初级保健库。写选题前先确认你要的事件落在哪个库里,这一步错了后面全错。
五个子系统之间的关系可以用一句话概括:SIM 与 SINASC 构成生命的两端,SIH 与 SIA 构成服务的两端,SINAN 是中间那层针对特定疾病的放大镜。它们共享同一套地理编码(IBGE 市代码)与同一套疾病分类(CID-10),这是唯一能让它们横向拼在一起的公共维度。
2.2 字段与记录的完整字典
字段字典按子系统分开维护,这里给出每个子系统最关键的字段。完整字段数远多于此,且逐年有增减,下表是建模时最先要用到的那些。
SIM 死亡登记的关键字段
| 字段名 | 葡语原词 | 含义 | 类型 | 常见坑 |
|---|---|---|---|---|
| NUMERODO | Número da Declaração de Óbito | 死亡证明书编号 | 字符 | 跨州可能重复,不能单独作主键 |
| DTOBITO | Data do Óbito | 死亡日期 | 日期 | 早期版本为 DDMMYYYY 文本 |
| DTNASC | Data de Nascimento | 出生日期 | 日期 | 与年龄字段可能不一致 |
| CAUSABAS | Causa Básica | 根本死因 | CID-10 | 巴西本地扩展码,须对照表 |
| LINHAA / LINHAB | Linhas A / B | 死因链中间环节 | 文本 | 分栏字段,常被忽略 |
| CIDPRE | CID Pré-codificado | 预编码死因 | CID-10 | 与 CAUSABAS 可能不同 |
| SEXO | Sexo | 性别 | 单字符 | 取值 1/2/9,非 M/F |
| RACACOR | Raça/Cor | 种族肤色 | 单字符 | 1 白 2 黑 3 黄 4 棕 5 原住民 |
| IDADE | Idade | 年龄 | 复合 | 数值与单位压在同一个数字里 |
| ESC | Escolaridade | 教育年限 | 数字 | 2010 年前后口径改变 |
| CODMUNRES | Código do Município de Residência | 居住地市代码 | 六位 | 需补零成七位 IBGE 码 |
| CODMUNOCOR | Código do Município de Ocorrência | 发生地市代码 | 六位 | 与居住地不同,别混用 |
| LOCOCOR | Local de Ocorrência | 死亡发生场所 | 单字符 | 1 医院 2 其他卫生机构 3 domicílio 等 |
| ASSISTMED | Assistência Médica | 是否有医疗救助 | 单字符 | 反映就医可及性的粗指标 |
| NECROPSIA | Necropsia | 是否尸检 | 单字符 | 缺失率高 |
SINASC 出生登记的关键字段
| 字段名 | 葡语原词 | 含义 | 类型 | 常见坑 |
|---|---|---|---|---|
| NUMERODN | Número da Declaração de Nascido Vivo | 出生登记编号 | 字符 | 主键,但跨年可能重用 |
| DTNASC | Data de Nascimento | 出生日期 | 日期 | 早产判断依赖它与孕周 |
| SEMAGESTAC | Semanas de Gestação | 孕周 | 数字 | 1–2 表示按日期估算,非真实周数 |
| PESO | Peso ao Nascer | 出生体重(克) | 数字 | 空格与 0 含义不同 |
| IDADEMAE | Idade da Mãe | 母亲年龄 | 数字 | 极端值存在,需截断 |
| ESCMAE | Escolaridade da Mãe | 母亲教育 | 数字 | 分类与死亡登记不同套 |
| RACACORMAE | Raça/Cor da Mãe | 母亲种族肤色 | 单字符 | 与新生儿种族字段并存 |
| QTDGESTANT | Quantidade de Gestação | 孕次 | 数字 | 与产次同填易矛盾 |
| QTDNORMAL / QTDCESAREO | Parto Normal / Cesáreo | 阴道产 / 剖宫产 | 数字 | 两字段之和应等于新生儿数 |
| CONSULTAS | Consultas Pré-natal | 产检次数 | 分类 | 分类区间非具体次数 |
| GESTACAO | Gestação | 孕周分组 | 分类 | 与 SEMAGESTAC 可矛盾 |
| CODMUNNASC | Código do Município de Nascimento | 出生地市代码 | 六位 | 与研究母亲居住地不同 |
| APGAR1 / APGAR5 | Apgar 1 / 5 分钟 | Apgar 评分 | 数字 | 空白率高,勿当完整变量 |
| CODANOMAL | Código da Anomalia | 出生缺陷 | CID-10 | 检出率依赖诊断能力 |
SIH 住院授权的关键字段
| 字段名 | 葡语原词 | 含义 | 类型 | 常见坑 |
|---|---|---|---|---|
| N_AIH | Número da AIH | 住院授权单号 | 字符 | 主键,一单可含多行 |
| DT_INTER | Data de Internação | 入院日期 | 日期 | 与出院日期共同算住院日 |
| DT_SAIDA | Data de Saída | 出院日期 | 日期 | 跨年住院跨文件,需拼接 |
| DIAG_PRINC | Diagnóstico Principal | 主诊断 | CID-10 | 出院诊断,非入院诊断 |
| DIAG_SECUN | Diagnóstico Secundário | 次诊断 | CID-10 | 常缺失 |
| PROC_REA | Procedimento Realizado | 主操作 | 本地操作码 | 非 ICD 码,另有 SIGTAP 表 |
| VAL_TOT | Valor Total | 总金额(雷亚尔) | 数字 | 名义值,未通胀调整 |
| DIAS_PERM | Dias de Permanência | 住院日 | 数字 | 与日期差可能不一致 |
| MORTE | Morte | 住院转归是否死亡 | 数字 | 与 SIM 死亡登记是两套口径 |
| CAR_INT | Caráter da Internação | 入院性质 | 单字符 | 1 择期 2 急诊 3 其他 |
| MUNIC_RES | Município de Residência | 居住地市代码 | 六位 | 决定归因于哪个地区 |
| MUNIC_MOV | Município do Estabelecimento | 机构所在地市代码 | 六位 | 别与居住地混用 |
| CNES | Cadastro Nacional de Estabelecimentos | 机构代码 | 字符 | 需另表查机构等级 |
| IDADE | Idade | 年龄 | 复合 | 与 SIM 同一套复合编码 |
SIA 门诊生产量与 SINAN 通报的字段差异
| 子系统 | 记录单位 | 核心字段 | 与另外四个的根本差别 |
|---|---|---|---|
| SIA | 一次生产量上报 | PA_PROC_ID 操作码、PA_QTDAPRS 数量、PA_VALAPRS 金额 | 以「量」计数,不绑定具体病人 |
| SINAN | 一次法定传染病通报 | ID_AGRAVO 病种码、DT_NOTIFIC 通报日期、DT_SIN_PRI 症状起始 | 按病种分库,字段集随病种变 |
这两张表放在一起看,能看出一个规律:SIM 与 SIH 记录的是「事件本身有唯一凭证」,所以有主键;SIA 记录的是「一段时间内做了多少次」,所以没有个体标识;SINAN 记录的是「一次上报」,同一病人可多次上报,去重是使用者的责任。
2.3 一条记录的完整解剖
以 SIM 的一条死亡记录为例,看它从下载到可用要经过哪些变形。下面是解压后 DBF 表的一行,用文本形式呈现字段与取值(示意,取值结构与官方字典一致)。
NUMERODO DTOBITO DTNASC CAUSABAS SEXO RACACOR IDADE CODMUNRES LOCOCOR
000123456 15/03/2019 02/07/1948 I219 1 4 4705 3550308 1
这一行的读法:死亡证明书编号 000123456,2019 年 3 月 15 日死亡,1948 年 7 月 2 日出生,根本死因 I219(急性心肌梗死,未特指),男性,棕色肤色,年龄编码 4705,居住地市代码 3550308(圣保罗市),死亡发生场所为医院。
其中 IDADE=4705 是最容易被误解的一个。它不是一个四位数字,而是一个三位数值加一位单位码:前三位是数值,最后一位是单位(这里 4 代表岁)。如果没有拆开,这条记录会在年龄分布图上落在 4705 岁的位置,任何按年龄分组的统计都会崩掉。DBF 里的日期字段也常以 SAS 日期数字存储,即从 1960 年 1 月 1 日起算的天数,直接读出来是一个五位数而不是日期。
下面这段 Python 把这两件事一次处理掉,并做最基本的完整性检查。
import pandas as pd
from dbfread import DBF
#-- 读 DBC 前须先解压为 DBF(blast 工具或 datasus-dbc 库)
rows = list(DBF("DOBR2019.dbf", encoding="latin-1", char_decode_errors="replace"))
df = pd.DataFrame(rows)
#-- 年龄复合编码:前三位为数值,末位为单位(0 分 1 时 2 日 3 月 4 岁 5 百岁)
age_code = pd.to_numeric(df["idade"], errors="coerce").fillna(0).astype(int)
unit = age_code % 10
value = age_code // 10
unit_days = {0: 0, 1: 0, 2: 1, 3: 30.4, 4: 365.25, 5: 36525.0}
df["age_days"] = value * unit.map(unit_days)
df["age_years"] = df["age_days"] / 365.25
#-- 日期字段:SAS 日期数字 -> 日期
SAS_EPOCH = pd.Timestamp("1960-01-01")
num = pd.to_numeric(df["dtobito"], errors="coerce")
df["death_date"] = SAS_EPOCH + pd.to_timedelta(num, unit="D")
#-- 市代码补零到七位
df["codmunres"] = df["codmunres"].astype(str).str.zfill(7)
#-- 根本死因只看前三位做章级汇总,第四位留给细分
df["cid_chapter"] = df["causabas"].astype(str).str[0]
print(df[["age_years", "death_date", "codmunres", "cid_chapter"]].head())
print("记录数", len(df), "死亡日期缺失", df["death_date"].isna().sum())
这段代码里有三个需要说明的取舍。第一,年龄单位码里的 5 代表百岁,这种编码在 1970–1980 年代的记录里才会成群出现,1990 年代以后基本不再使用,但保留映射能避免早期年份静默出错。第二,char_decode_errors="replace" 是必需的,因为部分州的文件在拉丁编码里混入了非标准字节,严格解码会整表失败。第三,死因只取首位字符做章级汇总,是为了先看宏观分布;如果要按三位或四位细分,需要先对照巴西本地 CID-10 扩展表确认码位含义。
2.4 数据规模与切分方式
规模这一层不用精确到条,因为各子系统差异太大,精确数还会随版本更新。更有用的是「切分逻辑」,它决定了你下载下来的到底是几个文件。
| 子系统 | 切分维度 | 典型文件形态 | 对使用者的实际影响 |
|---|---|---|---|
| SIM | 年 × 州 | 每州每年一个 DBC | 全国十年数据要下几百个文件 |
| SINASC | 年 × 州 | 每州每年一个 DBC | 同上,且早期年份部分州缺册 |
| SIH | 年 × 月(或年 × 州) | 月度或年度包 | 跨年住院要拼接两个文件 |
| SIA | 年 × 月 × 子系统 | 按月分的生产量包 | 文件数最多,须先合再筛 |
| SINAN | 年 × 病种 | 每病种每年一包 | 研究单个病种时文件数少 |
按州切分带来一个直接的工程后果:任何全国分析都要先做一次「多文件合并」。一千个左右的输入文件在 Pandas 里逐个数读会很慢,需要先转 Parquet 再做分区表。这个转换步骤不是可选的,它是使用这套数据的标准前置工序。
另有一个容易忽略的细节:早期年份的州文件字段数比近年少。1990 年代初的死亡登记可能只有二十来个字段,而近年超过六十个。直接 pd.concat 会得到大量空列,看起来像是「近年新增字段在早期全缺失」,实际是这些字段当年根本不存在。
2.5 与其他国家级卫生数据的字段差异
把 DATASUS 放到国际比较的坐标系里,它的字段体系有三个明显的不同。
| 对比项 | DATASUS | 国际通行做法(如 ICD 标准报送) | 差异后果 |
|---|---|---|---|
| 字段命名语言 | 葡萄牙语缩写 | 英文或标准化缩写 | 无法直接套用现成代码 |
| 疾病分类 | CID-10 巴西扩展 | WHO ICD-10 或 ICD-11 | 部分码位需映射,不能直接比 |
| 操作码体系 | SIGTAP 本地表 | 国际操作分类 | 手术类研究须另配 SIGTAP |
| 地理编码 | IBGE 七位市码 | ISO 3166 或行政区码 | 与国际边界数据对不上 |
| 种族字段 | 五分类(白黑黄棕原住民) | 多数国家无此字段 | 可做巴西特有的公平性分析 |
| 年龄编码 | 数值与单位复合 | 单一数值或分箱 | 必拆,否则全错 |
| 分发单位 | 个体级文件 | 多为聚合指标 | 自由度更高,责任也更大 |
| 更新节奏 | 年更,前版与最终版并存 | 一次性定稿 | 必须锁定版本 |
最后一行值得单独说。多数国际数据库发布即定稿,DATASUS 的部分子系统会在年度结束后先出一个版本,过一段时间再出修订版。这两套文件在文件名上有区分,但命名规则不是全系统一致的,有的用年份后缀,有的用目录层级区分。拿到文件后第一件事是确认它是哪一版,而不是立刻开始统计。
§3 它是谁的、按什么规矩开放
3.1 归属与管理链条
DATASUS 是巴西卫生部下属的信息技术部门,不是一个独立机构。这个隶属关系决定了三件事:数据的采集义务由卫生系统的规章制度赋予,数据的发布由部门内的技术团队执行,数据口径的最终解释权在卫生部而不在使用者社区。
管理链条可以这样理解:市与州的卫生机构负责填报,州卫生厅做一级汇总与质控,联邦卫生部通过 DATASUS 做汇总、发布与在线查询。这条链条上的每一环都会引入自己的处理规则,而这些规则不总是书面化。研究者看到的一个字段缺失,可能来自填报单位没填、州里清洗时丢了、或者联邦发布时做了隐私处理,三者性质完全不同,但从文件里看不出来。
3.2 开放的法律基础与边界
巴西在 2011 年通过信息获取法,确立了公共机构主动公开数据的义务。卫生数据在这个框架下被归为应当开放的一类,DATASUS 的下载入口不需要注册、不需要申请、不需要签署使用协议,这在国际比较中是相当宽松的。
宽松不等于没有边界。个体级文件虽然去掉了姓名与详细地址,但保留了出生日期、居住市、性别、种族等组合维度,理论上存在重识别风险,因此部分字段在发布时做了处理:极小的市可能被合并,罕见病种可能被隐去细分,某些年份的特定字段可能整列空缺。
另有一条边界值得提醒:开放数据条款的具体文本不在每个文件页上。下载一个 DBC 文件时,你不会看到随附的许可声明。要确认使用范围,需要去看巴西政府开放数据的通用条款页,并留意卫生部自己的补充说明。商用场景下这一点必须做过,因为「政府数据默认开放」与「可用于任何商业目的」不是同一句话。
3.3 谁在维护、维护到什么程度
维护强度在不同子系统之间差别很大。死亡与出生登记作为法定义务,有明确的报送时限与考核,维护相对稳定;住院与门诊作为付费依据,数据完整度受支付规则驱动,通常质量较高但覆盖范围受限于付费方;传染病通报的质量则直接与疫情压力挂钩,平稳年份漏报多,疫情年份补报多。
这种「维护强度不均衡」对使用者的含义是:不要假设五个子系统的可靠性是同一个水平。用 SIM 得出的结论可以用 SIH 交叉验证,但如果两个库结论冲突,通常不是其中一个错了,而是它们本来就测量不同的东西。
3.4 版本状态:前版与最终版
这是使用 DATASUS 时最容易出错的一环,值得单独立一节。以死亡登记为例,某一年度的数据通常会在年度结束后先发布一个版本,过几个月到一年再发布更新版本,两版之间可能有数万条记录的差异——新增的迟报记录、修正的死因编码、补全的缺失字段。
两版各自的用途是清楚的:前版用于快速掌握趋势,最终版用于正式分析。问题在于文件名对「这是哪一版」的表达方式不统一,有的年度用目录区分,有的在文件名里加后缀,有的干脆只有发布日期能区分。如果按年份命名习惯批量下载,很可能一半文件是前版、一半是最终版,合并后得到一套没人说得清口径的数据。
规避方法很朴素:下载时记录每个文件的发布路径与日期,把版本信息写进文件名,并在分析脚本里显式声明用了哪一版。这件事在团队协作中要写成规范,否则换个人接手就会重新踩一遍。
§4 质量与特色
4.1 质量的三层结构
评价这套数据的质量,不能用一个分数概括,因为它的质量分三层,每层的问题性质不同。
第一层是登记完整性。 巴西的死亡与出生登记覆盖率在近二十年有显著提升,但在北部与东北部的部分市,早期年份的漏报是已知问题。这一层的问题不在文件本身,而在文件之外——没有登记的死亡不会出现在任何文件里。检测这类问题需要外部基准,比如人口普查推算的死亡率或国际机构的估计值。
第二层是字段填报质量。 即使记录登记了,字段也可能空着或填错。年龄、种族、教育、孕周这些字段的完整度在州际之间差别明显。根本死因的编码质量则依赖当地有无受过训练的编码员,未明确死因的比例是一个常用代理指标。
第三层是文件处理质量。 编码转换、日期格式、字段增减、版本差异,这些是拿到文件之后才遇到的问题,与登记质量无关,但同样会让分析出错。
三层里,第一层最难处理(需要外部数据),第二层需要统计手段(需要敏感性分析),第三层最容易处理(需要一张对照表和一段固定脚本)。多数返工发生在第三层,因为它看起来只是技术细节,实际上决定了后面所有统计的可信度。
4.2 特色一:种族字段带来的公平性分析空间
巴西的卫生登记普遍带一个种族肤色字段,五分类为白、黑、黄、棕、原住民。这在全球国家级卫生数据里并不常见,它让基于种族的健康不平等分析可以在个体级展开,而不必依赖调查抽样。
这个字段的用法有讲究。它的填报是自报或由登记人员判断,不同地区的分类习惯不同,同一个人在不同登记场景下可能被归入不同类别。用它做趋势分析时,需要先看各年的分类分布是否稳定;用它做州际比较时,需要先确认各州的填报习惯是否可比。把它当成分组变量直接做回归,容易把分类习惯的差异读成健康差异。
4.3 特色二:费用字段的可得性
住院与门诊子系统都带金额字段,这在国际比较中相对少见。研究者可以直接算人均住院费用、单次住院费用、某病种的费用负担,而不必另找成本数据。
费用字段的坑在于它是名义值。巴西经历过高通胀时期,跨年份比较费用必须做通胀调整,官方没有一个内置的调整列。常用的做法是用全国消费者价格指数折算到某一年,但卫生费用的价格变动快于总体物价,所以这个调整是近似的。任何跨越十年以上的费用趋势,都要在方法里说明用了哪个指数、折算到哪一年。
4.4 特色三:编码体系的本地化
巴西使用 CID-10 作为疾病分类,但采用的是本地扩展版,即在 WHO 标准版基础上增加了适用于本国报告习惯的细分码。这意味着两件事:一是从国际文献里找到的 ICD-10 码不一定能在 DATASUS 里精确匹配;二是把 DATASUS 的码直接报给国际期刊时,可能对应不上标准码表。
处理办法是维护一张双向映射表,把研究中用到的码逐个核对,在附录里列出映射关系。工作量不大,但漏掉会让审稿环节出问题。
4.5 案例:圣保罗州低出生体重预测的那次返工
用一个具体案例把上面几层问题串起来。有一项针对圣保罗州 2019–2023 年活产的回顾性研究,用 SINASC 数据建低出生体重预测模型,纳入母亲社会人口学特征、产科史、产检指标与新生儿特征,最终纳入约两百五十万条活产记录,用逻辑回归与随机森林做对比。这个研究的设计本身是标准的,但沿着它的流程走一遍,能看到三个必踩的点。
第一个点在样本界定。 研究在建模前剔除了关键字段缺失或取值不明的记录。这个动作在论文里是一句话,在实现里是一连串判断:出生体重的 0 与空白要不要都算缺失,孕周的 1 与 2 要不要算有效值,母亲年龄的极端值要不要截断。每一步的选择都会改变最终样本量,也都会改变结论的方向,尤其是当缺失本身与低出生体重相关时,剔除缺失等于剔除了高风险人群。
第二个点在时间跨度。 2019–2023 跨越了疫情年份,而疫情对产检次数与分娩方式的影响是结构性的。把五年数据当成一个平稳总体来训练,模型会学到「年份」这个隐含特征,而不是生理规律。稳妥的做法是按年分层检查分布漂移,必要时把疫情年单独建模或作为协变量。
第三个点在字段语义。 SINASC 里孕周有两个相关字段,一个是连续周数,一个是分箱后的分类。两者都填的情况下可能互相矛盾。如果模型同时用了这两个字段,等于把同一个信息喂了两遍,还会把矛盾本身当成信号学进去。
这个案例的教训不是「这项研究做错了」,而是「这套数据的可用性取决于你如何处理它的三个特性:缺失的系统性、时间的非平稳、字段的冗余与矛盾」。这三件事在同一个研究里同时出现并非巧合:生命登记类数据的样本界定、时间跨度与字段语义,本来就是三个互相牵连的决策点,改一个会牵动另外两个。以孕周为例,如果把估算标记当成真实周数保留,缺失率下降但测量误差上升;如果剔除,测量质量上升但样本偏向足月;如果分年分层处理,能缓解时间非平稳但对样本量的消耗最大。三条路各有代价,没有一条是免费的。
§4.5 的案例会在后文被反复引用,因为这三个特性会在不同面貌下重复出现:在取数环节表现为「哪些文件要下」与「下哪一版」,在质量评估环节表现为「哪些偏差可枚举」与「哪些只能敏感性分析」。
还有一个容易被忽略的细节值得在这里补上。这类研究在论文里通常只用一句话交代样本界定,看到的是「剔除缺失后纳入某某条记录」,看不到剔除的具体规则组合。这意味着即使两项研究用了同一年的同一套数据,最终样本也可能不同。做同类研究的复现时,先复现样本量再复现结果,是更省时间的顺序。
§5 怎么把数据取出来
5.1 四条渠道怎么选
DATASUS 的数据可以从四条路径进来,各自的适用场景不同。
| 渠道 | 形态 | 适合 | 不适合 |
|---|---|---|---|
| 文件传输页 | 按年按州的 DBC 包 | 需要个体级数据做建模 | 想快速看一个数 |
| TabNet 在线聚合 | 网页表单生成聚合表 | 快速验证方向、出教学样例 | 需要个体级记录 |
| 开放数据门户 | CKAN 风格的目录 | 找特定主题的现成包 | 找全量历史数据 |
| FTP | 目录树直连 | 批量下载、脚本化 | 网络环境受限时 |
选择逻辑很简单:先问自己需不需要个体级。不需要,就用 TabNet,几秒钟出表;需要,就走文件传输页或 FTP,然后接受「要下很多文件」这个现实。
TabNet 的具体用法是选四样东西:行变量(比如居住市)、列变量(比如年份)、内容变量(比如死亡数),再叠一两个筛选条件(比如性别、年龄段)。提交后界面会返回一张交叉表,可以导出为 CSV 或复制粘贴。用它核对数字时,关键是让自己算的口径与界面选的口径完全一致:行变量选了「居住市」,自己在原库里就必须用 MUNIC_RES 而不是 MUNIC_MOV,这两个字段的差别足以让两个数字差出十几个百分点。
#-- 用命令行把 TabNet 已导出的聚合表读进来做二次核对
python3.11 - <<'PY'
import pandas as pd
#-- TabNet 导出文件常带 BOM 与分号分隔,且数字列用逗号做小数点
t = pd.read_csv("tabnet_mortalidade_sp_2019.csv", sep=";", encoding="latin-1",
skiprows=3, thousands=".", decimal=",")
t.columns = [c.strip().lower() for c in t.columns]
t = t.rename(columns={t.columns[0]: "municipio", t.columns[-1]: "obitos"})
t["obitos"] = pd.to_numeric(t["obitos"], errors="coerce")
print(t.dropna(subset=["obitos"]).sort_values("obitos", ascending=False).head())
PY
这段脚本处理的三个问题都是 TabNet 导出文件的常态:文件开头有若干行说明文字,需要跳过;分隔符是分号而不是逗号;数字里的千位分隔符是点、小数点是逗号,与英文习惯完全相反。不处理这三点,读进来的表里金额与计数全是字符串。
5.2 TabNet 的用法与边界
TabNet 是一个在线制表界面,选子系统、选年份、选行变量与列变量、选筛选条件,提交后生成一张聚合表,可导出为 CSV 或复制。
它的价值在于把「聚合」这一步从使用者手里拿走,用官方的口径算什么。这在需要核对数字时非常有用:你自己算的某市某年死亡数如果和 TabNet 对不上,问题一定出在你的处理链上。
它的边界也很清楚:只能出聚合表,不能下明细;维度选择受界面限制,不能自由组合;部分地区或年份因样本量小会被抑制(显示为符号或空白),这个抑制规则不公开,所以「TabNet 显示为空」不等于「该地该年零事件」。
5.3 下载与解压:DBC 到 DBF
官方分发的压缩格式是 DBC,一种巴西国家信息技术研究所开发的 DBF 压缩格式。它不能用通用的 zip 工具解开,需要专门的解压程序。常见的做法有两种:用官方的 blast 工具批量解压,或用 Python 的 datasus-dbc 库在脚本里解压。
#-- 安装解压库
pip install datasus-dbc
#-- 单个文件解压
python3.11 -c "import datasus_dbc as d; open('DOBR2019.dbf','wb').write(d.decompress('DOBR2019.dbc'))"
#-- 检查解压结果的头几行
python3.11 -c "
from dbfread import DBF
t = DBF('DOBR2019.dbf', encoding='latin-1')
print(len(t), t.field_names[:8])
for i, r in enumerate(t):
print(r)
if i == 2:
break
"
解压失败最常见的原因是文件本身没下完整。DBC 文件动辄几百 MB,网络中断会留下一个能解压出前半部分的残包,读出来的记录数比预期少一大截,而且不报错。校验办法是解压后确认记录数与官方文件页标注的规模在同一量级,或者至少确认字段数符合该年份的字典。
5.4 批量下载与目录组织
做全国多年度分析时,文件数会迅速膨胀。一个可行的做法是把下载与整理分成两步:先用脚本按固定命名规则把原始文件落到磁盘,再统一解压与转换。
import os
import pathlib
import subprocess
#-- 原始文件落盘目录按 子系统/年 两级组织
RAW = pathlib.Path("raw/datasus/sim")
OUT = pathlib.Path("work/sim")
#-- 需要下载的 联邦单位 两位代码(27 个)
ufs = ["AC", "AL", "AM", "AP", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MS",
"MT", "PA", "PB", "PE", "PI", "PR", "RJ", "RN", "RO", "RR", "RS", "SC",
"SE", "SP", "TO"]
for year in range(2015, 2023):
for uf in ufs:
src = RAW / str(year) / f"DO{uf}{year}.dbc"
if not src.exists():
print("缺文件,检查下载", src)
continue
dst = OUT / str(year) / f"{uf}.parquet"
dst.parent.mkdir(parents=True, exist_ok=True)
if dst.exists():
continue
dbf = src.with_suffix(".dbf")
if not dbf.exists():
subprocess.run(
["python3.11", "-c",
f"import datasus_dbc as d; open(r'{dbf}','wb').write(d.decompress(r'{src}'))"],
check=True,
)
subprocess.run(
["python3.11", "scripts/dbf_to_parquet.py", str(dbf), str(dst)],
check=True,
)
这段脚本的关键不是代码本身,而是两个设计决定:一是把「下载」和「转换」解耦,下载失败可以重跑而不影响已转换的部分;二是输出按 年/州 分区,后面用数据集扫描时可以直接按分区裁剪,不必全量读入。
5.5 合并多文件时要注意的三件事
第一,字段集合不一致。 早年文件的列比近年少。合并前应先取当年官方字典的字段清单,只保留共有列,或者给缺失列补空值并记录这是在补结构而不是补数据。
第二,编码不一致。 不同州、不同年份的文件可能混用拉丁编码与 UTF-8。统一按拉丁读入再转 UTF-8 是稳妥的做法,因为原始数据以拉丁编码为主。
第三,主键在合并后失效。 死亡证明书编号在单州内唯一,跨州可能重复。合并全国数据后如果要按记录去重,必须用「州 + 编号」的组合键,或改用出生日期加死亡日期加市代码的组合。
5.6 从个体级到分析表的固定流程
把上面几步串成一条固定流程,是团队协作中最值得做的一件事。流程应当包含:下载清单记录(含版本与日期)、解压校验、字段白名单提取、编码与日期标准化、地理编码补零、文档化的剔除规则、输出 Parquet。
其中「字段白名单提取」常被跳过,但它是控制文件体积最有效的一步。SIM 一个州一年的 DBF 有六十多个字段,实际分析常用的不到二十个。先白名单再合并,内存占用和后续处理时间都能降一个数量级。
§6 与库内条目的关系
6.1 关系图谱
DATASUS 在库内的位置比较特殊:它不是一个经过处理的发布数据集,而是一个国家级数据仓库,库内与它相关的条目分三类。
| 关系类型 | 库内条目 | 关系说明 |
|---|---|---|
| 上游来源 | SINAN-Dengue | 该数据集的原始通报记录即出自 DATASUS 的 SINAN 子系统,经第三方清洗后重新发布 |
| 同域对照 | WHO 全球卫生观察 | 提供国家层面的聚合指标,可与 DATASUS 算出的率做交叉核对 |
| 同域对照 | UNICEF MICS | 住户调查口径,可校验生命登记与自报数据的差距 |
| 方法参照 | NHIS-NHID(韩国) | 另一个把全民健保理赔全量开放的国家,可对比处理模式 |
| 结构参照 | 各类登记库条目 | 生命登记类数据集的字段设计可与 SIM / SINASC 对照 |
最重要的关系是第一条。SINAN-Dengue 这类条目证明了一件事:DATASUS 的原始数据足够大、足够有价值,值得有人花力气清洗后重新发布。反过来说,如果你要用登革热通报数据做研究,直接下 SINAN 原库和用清洗版是两条不同的路,前者自由度高但要自己做全部清洗,后者省事但受制于他人的处理选择。
6.2 检索路径
在库内查找与 DATASUS 相关的条目,可以按三条线索走。
按子系统名检索。 直接搜 SIM、SINASC、SIH、SIA、SINAN 这些缩写,能找到以单个子系统为对象的数据集条目。这类条目通常比 DATASUS 本身更聚焦,适合已经确定要用哪个子系统的使用者。
按地理与人群检索。 搜巴西、拉美、LMIC、中低收入国家,能找到同区域的其他数据源。做跨国比较时这条线索比子系统名更有用。
按方法检索。 搜生命登记、死亡登记、医院行政数据、真实世界数据,能找到不同国家的同类数据,用于对照字段设计与处理流程。做流程设计时看别人怎么处理同类数据,比看官方文档更省时间。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在打分之前必须先做一个校正:不要把 DATASUS 当成一个「数据集」来评价,它的质量指标与典型机器学习数据集不是同一个坐标系。
典型数据集的评价维度是标注准确性、标签一致性、划分合理性;DATASUS 的评价维度是登记覆盖、字段完整、口径稳定、可复现。用前一套标准去评它,会得出「字段命名不规范、缺失多、无标签」这类结论,这些结论都对,但没有信息量,因为它的设计目标从来不是给模型训练用。
更具体地说,有三个常见的误判需要在读下面的分数之前先纠正。第一个误判是把文件处理问题当成数据质量问题:编码错乱、日期格式、年龄复合编码,这些是使用者在处理链上可以完全解决的问题,不该计入数据质量分。第二个误判是把覆盖范围当成缺陷:SIH 不包含私立医院不是遗漏,是它的定义边界,评价它时应问「在它的定义范围内是否准确」,而不是「为什么不全」。第三个误判是把版本并存当成混乱:前版与最终版各有明确用途,混乱来自使用者没有锁定版本,不来自发布机制。
做完这个校正,下面的分数才有意义:它衡量的是「在明确定义范围内,这套数据支撑分析的可靠程度」,不是「它能不能直接喂给模型」。
7.1 五维评分
| 维度 | 分数 | 依据 |
|---|---|---|
| 覆盖广度 | 4.5 / 5 | 全国人口、数十年跨度、五个子系统互补,LMIC 中罕见 |
| 字段完整度 | 3.5 / 5 | 核心字段齐备,但种族、教育、孕周等填报完整度州际差异大 |
| 口径稳定性 | 3.0 / 5 | 字段逐年增减、编码有本地扩展、前版与最终版并存 |
| 工程友好度 | 2.0 / 5 | DBF/DBC 格式、葡语字段、无官方英文文档、必须自建转换链 |
| 可复现性 | 3.5 / 5 | 文件可追溯,但版本标识不统一,复现需显式记录版本与日期 |
| 综合 | 3.3 / 5 | 数据价值高,使用成本高,适合有工程能力的团队 |
7.2 使用成本的构成
上表里分数最低的是工程友好度,这一项值得展开,因为它决定了团队要不要投入。
成本主要有四块:格式转换(DBC 解压、DBF 读取、编码处理)、字段翻译(葡语缩写到含义的对照表)、口径对齐(本地 CID-10 与操作码体系的映射)、版本管理(前版与最终版的区分与记录)。前两块是一次性投入,做完可以复用;后两块是持续性投入,每换一个子系统或每跨几年都要重新核对。
对一次性研究,这笔投入可能不划算,除非研究问题本身必须用这套数据。对长期做拉美研究或做卫生系统比较的团队,这笔投入会在第二个项目上就回本。
7.3 已知的、可枚举的偏差
| 偏差 | 机制 | 检测办法 | 缓解办法 |
|---|---|---|---|
| 登记漏报 | 偏远地区死亡未进入登记系统 | 与人口普查推算死亡率比对 | 用捕获再捕获或外部基准校正 |
| 死因不明比例高 | 编码能力不足或尸检率低 | 看 R 码(症状体征类)占比 | 分析时单列未明确死因 |
| 私立人群缺失 | SIH/SIA 只含 SUS 付费 | 与补充保险覆盖数据比对 | 结论限定在公立系统 |
| 门诊量重复 | 生产量按次上报不绑定病人 | 看人均次数是否异常偏高 | 改用「量」而非「人次」解读 |
| 种族分类不稳定 | 自报与登记判断混杂 | 看各年各州分类分布 | 合并为少数类别或做敏感性分析 |
| 费用未平减 | 金额为名义值 | 跨年比较时金额趋势异常 | 用价格指数折算到基准年 |
| 迟报集中 | 补报在次年集中入账 | 看同一年的两版记录数差 | 只使用最终版 |
| 州际标准不一 | 各州自定义细则 | 同指标州际离散度过大 | 州内分析或加州固定效应 |
7.4 DAIMS 二十四项评估
下表按可机械判定的方式逐项核对,结论只针对「在一套明确定义范围内是否能支撑分析」,不作为机器学习就绪度的判定。
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式可用 | ✅ | DBF 天然是宽表,一行一条事件 |
| 2 | 唯一标识 | ⚠️ | SIM 与 SIH 有单表主键,但跨州或跨年不保证唯一 |
| 3 | 特殊字符处理 | ⚠️ | 葡语字段名含下划线,取值含重音字符,编码须统一 |
| 4 | 重复行 | ⚠️ | 按主键去重前需先构造「州 + 编号」组合键 |
| 5 | 缺失编码 | ⚠️ | 空白、0、9 系列三种含义并存,无统一缺失码 |
| 6 | 标签标识 | ⚠️ | 单字符编码的含义写在字典里,文件内无标签表 |
| 7 | 罕见类分组 | ❌ | 罕见病在市级会因隐私抑制不可见 |
| 8 | 偏倚评估 | ✅ | 漏报与死因不明可用 R 码占比等指标自行检测 |
| 9 | 数据字典 | ⚠️ | 有,但按子系统分散且只有葡语版 |
| 10 | 信息性缺失解释 | ❌ | 缺失机制与就医可及性相关,官方不提供说明 |
| 11 | 设备记录 | ❌ | 无采集设备或软件字段 |
| 12 | 共线性 | ⚠️ | 孕周、孕周分组、Apgar 等字段互相高度相关 |
| 13 | 编码映射 | ⚠️ | 本地 CID-10 需自建映射,操作码需配 SIGTAP |
| 14 | 时间戳处理 | ⚠️ | 日期有 SAS 数字与文本两种形态,需分别处理 |
| 15 | 划分建议 | ❌ | 无官方划分,按年划分会引入时间泄漏 |
| 16 | 泄漏讨论 | ⚠️ | 出院诊断与住院日互相关联,作为特征会泄漏结局 |
| 17 | 标签分布 | ✅ | 分布可由原库直接重算,TabNet 可交叉核对 |
| 18 | 测量偏倚 | ❌ | 编码员判断、填报能力差异无法从数据内部识别 |
| 19 | 外部验证建议 | ✅ | 人口普查、卫生统计年鉴、国际机构估计三条路径明确 |
| 20 | 版本记录 | ⚠️ | 有前版与最终版,但版本标识方式不统一 |
| 21 | 预处理脚本 | ⚠️ | 无官方脚本,社区工具可用但需自行校验 |
| 22 | 合规要求 | ⚠️ | 开放数据,但许可文本不在文件页上 |
| 23 | 多模态对齐 | ❌ | 纯结构化编码,无文本、影像、波形 |
| 24 | 去标识化 | ✅ | 公开个体级文件已去掉姓名与详细地址 |
计分:✅ 五项、⚠️ 十三项、❌ 六项;按 ✅ 计 1 分、⚠️ 计 0.5 分折算,得 11.5 / 24。
解读:失分集中在前置工程(标识、缺失码、编码映射)与建模可用性(划分建议、多模态)两块,这两块正是「把档案系统当数据集用」时会卡住的地方。得分较高的几项——分布可重算、外部可验证、去标识彻底——说明它的可靠性基础是扎实的,只是这份可靠性需要通过一层转换才能释放出来。
7.5 外部验证矩阵
要判断一份从 DATASUS 算出来的数字是否可信,可以找四类外部基准对照。
| 验证对象 | 外部基准 | 对照方式 | 预期一致度 |
|---|---|---|---|
| 全国死亡率 | 人口普查推算的生命表 | 分年龄组比较 | 中高,早年差异大 |
| 婴儿死亡率 | 国际机构估计值 | 直接比较年度值 | 中,口径差异需说明 |
| 住院总量 | 卫生统计年鉴 | 按州比较 | 高,同源但汇编方式不同 |
| 出生数 | 民政出生登记 | 按年比较 | 高,近年趋同 |
| 传染病发病 | 国际通报系统 | 按病种比较 | 低到中,通报口径差异大 |
| 医疗费用 | 卫生账户 | 按年度总额比较 | 中,覆盖范围不同 |
对照时的原则是:同源数据一致是正常的,不一致才需要解释;跨源数据不一致是正常的,一致才需要解释。很多返工源于把第二条当成了第一条。
7.6 它为何能持续:法定义务驱动,而非市场需求驱动
这套数据能持续三十年不断更新,原因不在使用者,而在法律。死亡证明、出生登记、住院授权、传染病通报,这四件事在巴西都是卫生系统运行的必需环节,数据是这些环节的副产品。即使没有一个人下载,系统照样会产生这些记录。DATASUS 的角色只是把这些副产品收拢并公开。
这个生存逻辑决定了它的两个特征:一是核心子系统不会因为需求下降而停更,二是边缘子系统的维护强度取决于其业务必要性而不是使用热度。理解这一点,对判断某个子系统的数据是否值得依赖很有帮助——越接近「系统运行必需」的环节,数据越可靠。
再往下说一层:义务驱动也解释了它为什么长期不改善工程体验。如果一个数据库的存续依赖使用量,它会有动力去做 API、做英文文档、做 CSV 导出;但如果它的存续依赖的是卫生系统自身的运行,那么工程师的优先级永远排在业务系统后面。这不是能力问题,是激励结构问题。对使用者而言,这意味着「等官方改善格式」不是一个可执行的计划,转换层必须由自己维护。
7.7 三方评分口径的差异
同一套数据,在公共卫生、数据工程、机器学习三个视角下会得到相当不同的分数,理解差异比看单一总分更有用。
| 视角 | 最看重什么 | 给分倾向 | 主要扣分点 |
|---|---|---|---|
| 公共卫生 | 覆盖、代表性、时间连续性 | 高 | 漏报与死因编码质量 |
| 数据工程 | 格式规范、文档、可自动化 | 低 | DBF 格式、无 API、葡语字典 |
| 机器学习 | 标签质量、划分、特征可用性 | 很低 | 无标签定义、时间泄漏风险、字段冗余 |
| 卫生政策 | 与制度运行的贴合度 | 很高 | 几乎没有,因为它就是制度副产品 |
把三个视角放进同一张表,能看清一件事:这套数据的价值几乎全部在「公共卫生」和「卫生政策」两栏,而使用成本几乎全部压在「数据工程」那一栏。所以合理的做法是让工程能力强的角色承担转换,让领域角色直接使用转换后的表,而不是要求每个人都会解压 DBC。§4.5 的案例里,三个坑点分别落在三个人头上就能各自解决,落在一个人头上就会互相挤占时间。
§8 生态位与历史
8.1 三十年的制度铺垫
DATASUS 成立于 1990 年代初,与巴西统一卫生系统的建立同期。SUS 的核心制度安排是全民覆盖、公立提供、联邦统一筹资,这套安排要求中央必须掌握各地的服务量与健康结局,否则无法做预算分配。数据系统因此不是附属品,而是制度运行的基础设施。
在 SUS 建立之前,巴西的卫生数据分散在各州与各社会保险机构手中,口径互不相通。统一系统的建立带来了统一表单、统一编码、统一报送时限,这是 DATASUS 能存在的前提。
8.2 从纸质到在线的三段演进
第一阶段是纸质表单与集中录入,数据以年度汇总的形式存在,个体级记录的可获得性有限。第二阶段是联邦统一系统与网络传输,各州通过专线上报,个体级数据开始系统化沉淀。第三阶段是网络发布与在线查询,TabNet 这类工具把聚合查询开放给公众,文件服务器把个体级数据开放给研究者。
三段演进留下了一个后果:早期年份的数据结构与近年不同,字段更少、格式更土、缺失更多。做长时段分析时,早年数据的处理成本远高于近年,这是必须预先计入的工作量。
8.3 在 LMIC 中的位置
在中低收入国家里,把行政卫生数据开放到这个程度的案例并不多。多数国家或是不公开个体级数据,或是公开但只覆盖抽样地区,或是公开但需要逐项申请。巴西的独特性在于三件事同时成立:系统是全民公立主导、数据是系统运行必需品、法律要求主动公开。
这个组合不常见,也让巴西成为卫生系统比较研究里一个反复被引用的案例。研究者在讨论「全民覆盖国家的数据可得性」时,巴西往往是被拿来当基准的那个。
8.4 开放数据门户与渠道分化
近年巴西建立了统一政府开放数据门户,卫生部的部分数据也迁入其中。这在便利性上是进步,但也带来了渠道分化:同一个数据可能同时存在于旧的文件服务器、新的开放数据门户、以及各子系统的独立页面,三处的版本与更新节奏未必同步。
渠道分化对使用者的实际影响是:找数据时要多试几个入口,找到后要确认它是不是最新版,不要假设「在一个入口看到的就是全部」。
§9 使用指引
9.1 三种角色的路径
公共卫生研究者。 你的路径是先 TabNet 后原库。先用 TabNet 确认目标指标的宏观形态,判断这个数据里有没有你要的信号;确认有之后,再下个体级文件做分层分析。这样能避免下了一堆文件才发现指标本身不可用。
用 TabNet 出第一张表时,建议从最粗的维度开始:先看全国按年的死亡总数,再看分大区的分布,最后才下到州。这样做的理由是粗维度能最快暴露口径问题——如果全国死亡数比人口推算值低了一大截,说明登记覆盖率有问题,此时下到州级只会把一个系统性问题拆成一堆看不出规律的数字。
医学 AI 工程师。 你的路径是先定任务再定子系统。这套数据适合做表格类任务,比如住院费用预测、住院日预测、低出生体重预测、死亡风险分层。不适合做文本与影像任务。确定任务后,只下与该任务相关的子系统与年份,不要贪全量。
政策与卫生服务研究者。 你的路径是先定比较单元。如果比较单元是州,可以只用按州切分的文件;如果是市,需要处理市代码合并与隐私抑制;如果跨年比较,必须先解决版本与字段增减的问题。
9.2 一条最短的可用流程
从零到一张能用的分析表,最短路径是五步:确认子系统、下载一年一州、解压读入、标准化字段、核对总量。下面这条流程用 2019 年圣保罗州的死亡数据走一遍。
import pandas as pd
import datasus_dbc
#-- 第一步:解压与读入
raw = "DOESP2019.dbc"
open("DOESP2019.dbf", "wb").write(datasus_dbc.decompress(raw))
from dbfread import DBF
df = pd.DataFrame(list(DBF("DOESP2019.dbf", encoding="latin-1", char_decode_errors="replace")))
#-- 第二步:字段标准化
df["sexo"] = df["sexo"].map({"1": "M", "2": "F"})
df["codmunres"] = df["codmunres"].astype(str).str.zfill(7)
df["cid3"] = df["causabas"].astype(str).str[:3]
#-- 第三步:年龄复合编码拆分
code = pd.to_numeric(df["idade"], errors="coerce").fillna(0).astype(int)
df["age_years"] = (code // 10) * (code % 10).map({0: 0, 1: 0, 2: 1/365, 3: 30.4/365,
4: 1, 5: 100})
#-- 第四步:算一个可核对的指标——循环系统疾病死亡占比
total = len(df)
circ = df["cid3"].str.startswith("I").sum()
print(f"2019 圣保罗州死亡 {total} 例,循环系统疾病占 {circ/total:.1%}")
#-- 第五步:与 TabNet 同口径数字核对后再进入分析
df.to_parquet("sp_2019.parquet", index=False)
第四步的核对是整条流程的关键。任何从 DATASUS 算出的第一个数字,都应该与 TabNet 同口径结果对一遍。对上了,说明处理链没问题;对不上,说明编码、日期或剔除规则有问题,此时继续往下建模等于在错误的基础上叠加分析。
9.3 引用方式
引用这类数据时,需要交代四个要素:子系统名称、年份范围、版本状态、访问日期。缺任何一个,复现都会出问题。
推荐写法:Ministério da Saúde do Brasil. Sistema de Informação sobre Mortalidade (SIM), 2015–2022, versão final. Acesso em 26 out. 2026, via DATASUS. 其中版本状态与访问日期是必须的,因为同一年的文件在不同时间下载可能不是同一份。
如果研究使用了多个子系统,应分别引用,不要合并成一个笼统的「DATASUS 数据库」引用,因为各子系统的发布方、年份与版本各不相同。
批量研究时,建议把引用信息写成结构化记录,随数据一起归档。下面这段把常用元信息落成一份 BibTeX 条目,便于论文直接引用。
cat >> refs/datasus.bib <<'BIB'
@misc{datasus_sim_2026,
title = {Sistema de Informacao sobre Mortalidade (SIM), 2015--2022, versao final},
author = {{Ministerio da Saude do Brasil}},
year = {2026},
howpublished = {DATASUS, Ministerio da Saude},
url = {https://datasus.saude.gov.br/transferencia-de-arquivos/},
note = {Acesso em 26 out. 2026}
}
BIB
#-- 检查条目是否落盘
grep -c "^@" refs/datasus.bib
把版本状态写进 title、把访问日期写进 note,是这类数据引用最容易被漏掉的两项。前者决定别人能否复现同一批记录,后者决定别人能否复现同一份文件。
§10 AI 使用声明
| 项 | 内容 |
|---|---|
| 文本生成 | 由 AI 写作助手起草,编辑审核后定稿 |
| 事实来源 | 官方页面与论文摘要两类,具体见附录 B |
| 可核实数字 | 仅收录有来源支撑的规模、结构、边界三类数字 |
| 未核实内容 | 站点受限无法访问的部分,已在正文标注「未核实」 |
| 代码示例 | 为说明处理逻辑而写,未在真实全国数据上完整运行 |
| 医学判断 | 无诊断或治疗建议,仅讨论数据可用性 |
| 责任边界 | 使用前请以官方最新文档为准 |
| 更新方式 | 随官方渠道变化与来源补充定期修订 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 巴西的公开卫生数据可以直接下成 CSV | 官方分发的是按年按州的 DBC 压缩包,解压后是 DBF,必须自行转换 | 文件传输页只提供 DBC,无 CSV 导出 |
| 同一年的数据只有一份 | 部分子系统有前版与最终版并存,记录数与字段不同 | 同一年度存在两个发布路径,记录数不同 |
| 字段名是英文缩写 | 全部是葡语缩写,如 CAUSABAS、DTOBITO、MUNIC_RES | 各子系统字典均为葡语 |
| 疾病编码就是 WHO 的 ICD-10 | 是 CID-10 巴西本地扩展版,部分码位与标准版不一致 | 本地扩展表与 WHO 码表存在差异码位 |
| SIH 住院数等于全国住院数 | 只覆盖 SUS 付费的住院授权,私立与补充保险人群不在其中 | 住院授权的付款方为 SUS |
| SIA 的门诊数就是就诊人次 | 记录的是生产量上报,同一个人多次就诊会被重复计 | 字段以量计,无个体标识 |
| 数据是实时的 | 年度数据,滞后半年到一年半,且会出修订版 | 发布路径按年度归档 |
| 不用注册就可以商用 | 免注册下载不等于无限制商用,许可条款不在文件页上 | 政府开放数据通用条款须另行核对 |
| 各州文件结构完全一样 | 早年字段更少,各州填报细则不同 | 早期文件列数明显少于近年 |
| 有官方的英文数据字典 | 没有成体系的英文版,须自建对照表 | 字典以葡语发布 |
FAQ
Q1:这套数据需要伦理审批才能用吗?
不需要额外审批即可下载,因为它是公开发布的二级数据。但如果研究涉及人群层面的结论,所在机构的伦理委员会仍可能要求备案,具体按本地规范办。
Q2:应该用 TabNet 还是下原库?
看你要不要个体级。只要聚合数字,TabNet 更快且口径由官方保证;要做分层、建模、链接,就必须下原库。
Q3:DBC 文件解压后记录数比预期少很多,怎么办?
先怀疑文件没下完整。DBC 体积大,网络中断会留下残包且解压不报错,重新下载并核对文件大小与官方标注的规模。
Q4:为什么我的年龄分布图上出现了几百岁的人?
年龄字段是复合编码,前三位是数值、末位是单位,没拆开就直接当数字用了。按 §2.3 的方法拆分即可。
Q5:能把 SIM 和 SIH 链接到同一个人吗?
没有官方链接键。可用概率链接,但公开文件里姓名等强标识已被处理,链接成功率有限,且会引入选择偏倚。
Q6:前版和最终版差多少?
因年份与子系统而异,迟报多的年份差异大。差异构成官方未逐项说明,稳妥做法是只用最终版并在方法里注明。
Q7:为什么某个市某年在 TabNet 里是空白?
可能是真的没有事件,也可能是样本量小被抑制。抑制规则不公开,需要用原库核对后判断。
Q8:SINAN 的通报数能当发病率用吗?
不能直接当。通报数受就医行为、诊断能力、上报积极性影响,只能作为监测强度的指标,做发病率需要额外校正。
Q9:费用字段跨年比较要注意什么?
金额是名义值,跨年比较必须做通胀调整,且要用卫生领域的价格指数而非总体物价指数,折算基准年要写清。
Q10:字段每年都在变,怎么保证脚本不会崩?
按年份维护一份字段白名单,读入时只取共有列,缺列补空并记录。不要假设某列一定存在。
Q11:数据能商用吗?
巴西政府将卫生数据列为开放数据,但文件页不逐条标注许可。商用前应按政府开放数据通用条款逐项核对,并保留来源标注。
Q12:如果只用一句话概括这套数据的用法?
先想清楚你要的是哪一类事件,再决定下哪个子系统;下完之后第一件事是锁定版本,第二件事是核对总量。
术语表
| 术语 | 解释 |
|---|---|
| DATASUS | 巴西卫生部统一卫生系统信息技术司,国家卫生数据的总出口 |
| SUS | Sistema Único de Saúde,巴西统一卫生系统,全民公立医疗体系 |
| SIM | 死亡登记信息系统,记录每一次死亡及根本死因 |
| SINASC | 活产登记信息系统,记录每一次活产及出生结局 |
| SIH | 住院信息系统,以住院授权单为单位 |
| SIA | 门诊信息系统,以生产量上报为单位 |
| SINAN | 法定传染病通报信息系统,按病种分库 |
| AIH | Autorização de Internação Hospitalar,住院授权单,SIH 的主键 |
| CID-10 | 国际疾病分类第十版,巴西使用本地扩展版本 |
| SIGTAP | 巴西统一的操作、产品与器械代码表,用于 SIH 与 SIA |
| DBC | 巴西开发的 DBF 压缩格式,需专用工具解压 |
| DBF | 一种早期的桌面数据库表格式,字段与类型有限 |
| TabNet | 官方在线聚合查询工具,可生成聚合表 |
| IBGE | 巴西地理与统计研究所,市代码的发布方 |
| UF | Unidade Federativa,联邦单位,两字母缩写 |
| CAUSABAS | 根本死因字段,SIM 中最关键的字段 |
| DTOBITO | 死亡日期字段 |
| DTNASC | 出生日期字段 |
| MUNIC_RES | 居住地市代码字段,决定归因地区 |
| MUNIC_MOV | 机构所在地市代码字段,与居住地不同 |
| NU_IDADE_N | 年龄复合编码,数值与单位压在同一数字 |
| preliminar | 前版,先发布的早期数据 |
| versão final | 最终版,修订后发布的版本 |
| LMIC | 中低收入国家,世界银行的收入分组 |
| 名义值 | 未做通胀调整的金额,跨年不可直接比较 |
| 生产量 | 服务的数量单位,与就诊人次不是同一概念 |
| 概率链接 | 用多个准标识字段按相似度匹配两个库的记录 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 典型研究使用的住院记录量级 | 数十万至百万条 | 论文摘要(手外科研究纳入约一百零二万条) | 论文摘要 |
| 典型研究使用的活产记录量级 | 百万条级 | 论文摘要(圣保罗州五年约两百五十万条) | 论文摘要 |
| SIM 起始年份 | 1979 | 官方发布路径的年度起点 | 官方页面 |
| SINASC 起始年份 | 1994 | 官方发布路径的年度起点 | 官方页面 |
| 联邦单位数量 | 27 | 按州切分的文件命名 | 官方页面 |
| 子系统核心数量 | 5 | 官方目录结构 | 官方页面 |
| 市代码位数 | 7 | 字段字典 | 官方页面 |
| 种族分类数 | 5 | 字段字典 | 官方页面 |
| 年龄复合编码位数 | 4 | 字段字典 | 官方页面 |
| 住院授权覆盖率 | 仅 SUS 付费 | 论文摘要与字段定义 | 论文摘要 |
| 数据滞后 | 6–18 个月 | 官方发布节奏的历史观察 | 未核实 |
| 站点可用性 | 本稿件准备期多次超时 | 本次访问记录的返回码 | 未核实 |
附录 B:数字的来源分层
第一层,官方页面。 包括以 DATASUS 域名为入口的文件传输页、TabNet 页面、开放数据门户。本稿件准备期这些入口多次返回超时或被前置验证页拦截(返回码 000 与 302 跳转),因此本层只采信了结构信息(目录命名、文件格式、字段名),未采信任何精确记录数。
第二层,论文摘要。 通过欧洲 PubMed Central 检索接口获得的多篇摘要,提供了规模量级的独立参照,包括住院授权量、活产量、子系统缩写与使用方式。凡是能从摘要直接读出的数字,正文均以「约」「量级」表述,不做精确到个位的引用。
第三层,未核实。 包括精确的记录总数、各子系统的准确起始月份、滞后时长的官方口径、许可条款的具体版本。正文中凡涉及这些内容,均标注为「未核实」或以「通常」「多为」这类限定词表达。
附录 C:完整参考文献
- Ministério da Saúde do Brasil, DATASUS. 门户首页。https://datasus.saude.gov.br/
- Ministério da Saúde do Brasil, DATASUS. 文件传输入口。https://datasus.saude.gov.br/transferencia-de-arquivos/
- Ministério da Saúde do Brasil, DATASUS. TabNet 在线查询入口。https://datasus.saude.gov.br/informacoes-de-saude-tabnet/
- Ministério da Saúde do Brasil. 开放数据门户(由旧域名跳转)。https://opendatasus.saude.gov.br/
- Brazil Ministry of Health. Open data portal(CKAN 风格目录)。https://dadosabertos.saude.gov.br/
- Europe PMC. 检索式 DATASUS Brazil health information system,共命中两千余条记录。https://www.ebi.ac.uk/[europepmc](https://www.qianfanghub.com/ai-ready-dataset/europepmc/1353)/webservices/rest/search?query=DATASUS Brazil health information system
- European PMC. Demographic and economic disparities in hand surgical procedures in Brazil: Analysis of DATASUS data. Einstein (São Paulo), 2026. DOI 10.31744/einstein_journal/2026gs2322
- Cureus. Hospital Expenditure for Microsurgical Peripheral Nerve Repair and the Broader Social Security Burden of Hand and Wrist Trauma in Brazil (2014–2024). 2026. DOI 10.7759/cureus.114777
- Cureus. Hospital Indicators for the Management of Native and Prosthetic Valve Infective Endocarditis Across Brazilian Regions From 2015 to 2024. 2026. DOI 10.7759/cureus.117169
- The Lancet Regional Health – Americas. Burden of cardiovascular disease in Brazil, 1996–2023. 2027. DOI 10.1016/j.lana.2026.101674
- Europe PMC. Predictive modeling with machine learning for low birth weight in the state of São Paulo(SINASC 2019–2023). 2026.
- Europe PMC. Scientific production on health inequalities using the Brazilian Information System on Live Births: a scoping review. 2026.
- Europe PMC. Underreporting of oral cleft cases: a descriptive study, western Paraná, 2015–2019(SINASC 漏报). 2026.
附录 D:字段对照速查
| 葡语字段 | 中文含义 | 所属子系统 | 处理要点 |
|---|---|---|---|
| DTOBITO | 死亡日期 | SIM | SAS 日期数字或文本 |
| CAUSABAS | 根本死因 | SIM | 本地 CID-10 |
| LOCOCOR | 死亡发生场所 | SIM | 单字符编码 |
| DTNASC | 出生日期 | SIM / SINASC | 两库含义相同 |
| SEMAGESTAC | 孕周 | SINASC | 1–2 为估算标记 |
| PESO | 出生体重 | SINASC | 0 与空白含义不同 |
| ESCMAE | 母亲教育 | SINASC | 分类与 SIM 不同套 |
| N_AIH | 住院授权单号 | SIH | 一单可多行 |
| DIAG_PRINC | 主诊断 | SIH | 出院诊断 |
| PROC_REA | 主操作 | SIH | 须配 SIGTAP |
| VAL_TOT | 总金额 | SIH | 名义值 |
| MORTE | 住院死亡 | SIH | 与 SIM 两套口径 |
| PA_PROC_ID | 门诊操作码 | SIA | 生产量口径 |
| ID_AGRAVO | 通报病种码 | SINAN | 按病种分库 |
| DT_NOTIFIC | 通报日期 | SINAN | 与症状日期不同 |
| NU_IDADE_N | 年龄复合码 | 多库 | 必须拆 |
| RACACOR | 种族肤色 | SIM / SINASC | 五分类 |
| CODMUNRES | 居住地市码 | 多库 | 补零到七位 |
附录 E:如果只记五件事
第一件,它不是一张表,是五个记录单位完全不同的子系统,先定事件再定库。
第二件,官方发的是按年按州切的 DBC,解压后是 DBF,转换与编码处理是必做工序而非可选优化。
第三件,字段名是葡语缩写,疾病编码是本地扩展版,两件事都不能靠英文直觉猜。§4.5 的案例里,那项研究之所以能顺利跑完,很大程度上是因为作者所在团队已经在前面几个项目里把这张对照表建好了。
第四件,同一年的数据可能有两套版本,下载后第一件事是锁定版本并记录访问日期。
第五件,SIH 与 SIA 只覆盖公立系统,任何「全国」结论都必须先说明这一点。§4.5 的案例提醒的另一层是:即使是在覆盖范围内,剔除缺失规则的选择也会改变结论方向。
编辑说明
本篇的核验时间截至 2026 年 10 月 26 日。核验方式是按派发纪律只取两类来源:DATASUS 官方入口与欧洲 PubMed Central 的论文摘要。官方入口在本次访问中多次返回超时(返回码 000)或前置验证页拦截(开放数据门户的 302 跳转),因此未取得任何官方页面正文,仅依据公开的目录命名惯例与论文摘要中的字段名、子系统缩写完成结构描述。凡涉及精确记录总数、滞后时长的官方口径、许可条款的具体版本,均在正文标注为未核实,未做推断填充。
代码示例为说明处理逻辑而写,覆盖了解压、读入、年龄复合编码拆分、日期还原、市代码补零与多文件合并六类操作,未在真实全国数据集上完整运行;其中用到的第三方库名称为公开可查的开源工具。医学内容仅讨论数据可用性,不涉及诊断或治疗建议。术语表中的葡语字段名按官方字典的通行写法保留原拼写,不做简化。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- seer-nci — 共享标签:公共卫生与流行病学 / 医疗登记
- ices-ontario — 共享标签:公共卫生与流行病学 / 医疗登记
- sinan-dengue — 共享标签:公共卫生与流行病学 / 医疗登记
- hmd — 共享标签:公共卫生与流行病学 / 死亡登记
- isaric-ccp — 共享标签:公共卫生与流行病学 / 医疗登记
- anzics-apd — 共享标签:死亡登记 / 医疗登记
- swedish-npr — 共享标签:公共卫生与流行病学 / 医疗登记
- ncdb — 共享标签:公共卫生与流行病学 / 医疗登记
- seer-medicare — 共享标签:公共卫生与流行病学 / 医疗登记
- eudravigilance — 共享标签:公共卫生与流行病学 / 医疗登记
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

