跳到主要内容
AI教程

使用 Python 审核并预测 DHIS2 免疫接种数据

学习如何运行 Python 和 Jupyter 工作流,审核 DHIS2 月度免疫接种数据,估算缺失报告,识别重复或调换的数值,并在不泄露未来信息的情况下比较季节性朴素法、SARIMA 和梯度提升预测结果。

使用 Python 审核并预测 DHIS2 免疫接种数据

本项目的作用

本项目提供了一个端到端工作流,用于从 DHIS2 提取、审计、补全和预测月度免疫接种数据。数据涵盖 13 个地区在 60 个已完成月份内报告的麻疹、BCG 和 OPV1 接种剂次,时间范围为 2021 年 9 月至 2026 年 8 月。

所含数据集来自运行 2.43.1 版本的公开 DHIS2 演示实例。这些是示例数据,不包含任何个人或工作场所信息。因此,结果用于展示分析方法和数据质量问题,不得解读为真实健康趋势的研究发现。

该工作流包含四个主要阶段:

  1. 通过 DHIS2 分析 API 获取月度汇总数据,或加载已保存的 CSV 快照。
  2. 审计报告完整性、同比重复、大幅变化以及可能的相邻月份错位。
  3. 估算用于模型训练的缺失值,同时保留用于标识估算值的标记。
  4. 检验预测模型是否优于重复上一年度数值的季节性基线。

主要功能

  • DHIS2 API 数据提取:pull_dhis2_data.py 中的函数用于查找并获取所需指标。
  • 离线可复现:笔记本默认读取 dhis2_raw_data.csv,因此无需联网或登录即可运行。
  • 完整性审计:分析会检查每个指标是否为每个地区和月份提供一个数值。
  • 重复检测:测量某地区的数值与上一年度同月数值完全一致的频率。
  • 错位检测:标记数值顺序与上一年度相反的相邻月份。
  • 结构化缺口填补:使用其他年份的同一日历月份,或地区层面和跨地区的季节性来估算缺失值。
  • 防止数据泄漏的预测:按时间顺序划分训练集和测试集,并且仅使用训练数据填补训练集中的缺口。
  • 模型比较:使用 MAE 和 WAPE 评估季节性朴素模型、SARIMA 和梯度提升模型。

了解项目文件

  • DHIS2_Immunisation_Audit_and_Forecast.ipynb:完整分析,包括图表、审计逻辑、缺口填补和预测。
  • pull_dhis2_data.py:用于定位指标并从 DHIS2 获取数据的函数。
  • dhis2_raw_data.csv:用于默认离线运行的已保存快照。
  • requirements.txt:Python 软件包依赖项。
  • README.md:项目文档和研究结果摘要。

安装与设置

1. 获取代码仓库

克隆或下载代码仓库,然后在其根目录中打开终端。建议使用虚拟环境,以便将项目所需的软件包与其他 Python 项目隔离。

python -m venv .venv

使用适用于操作系统的命令激活环境,然后安装所需软件包:

pip install -r requirements.txt

2. 启动 Jupyter Notebook

jupyter notebook DHIS2_Immunisation_Audit_and_Forecast.ipynb

从上到下运行笔记本单元格。默认情况下,分析会加载 dhis2_raw_data.csv。这是探索该工作流最简单、最具可复现性的方式,因为既不需要网络连接,也不需要 DHIS2 凭据。

3. 可选:配置实时 DHIS2 访问

如需获取最新数据,请在笔记本的第一个代码单元格中设置 REFRESH = True。服务器地址和登录信息可通过 DHIS2_URL、DHIS2_USER 和 DHIS2_PASSWORD 环境变量提供。

DHIS2_URL=https://your-dhis2-server.example
DHIS2_USER=your_username
DHIS2_PASSWORD=your_password

设置环境变量的确切语法取决于所使用的 shell 和操作系统。将凭据保存在环境变量中,可以避免将其嵌入笔记本或提交到源代码管理系统。

只有在数据所有者批准后,才能连接到实时 DHIS2 实例。请使用去标识化的汇总数据,并遵守组织的安全与治理要求。

运行基本工作流

步骤 1:加载或获取月度数据

每一行代表一个指标、一个地区和一个月份。完整分析针对每个免疫接种指标使用 13 个地区和 60 个月的数据。麻疹数据同时用于审计和预测阶段,而 BCG 和 OPV1 仅用于审计。由于只有 20 个月的数据,ANC 指标不纳入分析,因为对于本工作流而言,这一时长不足以研究年度模式。

当 REFRESH = False 时,笔记本会读取已保存的快照。当 REFRESH = True 时,笔记本会使用 API 辅助函数从已配置的服务器获取当前结果。

步骤 2:检查报告完整性

对于每个指标,预期观测数按以下方式计算:

13 个地区 × 60 个月 = 780 个地区-月份

样本中每个免疫接种指标包含 725 个已报告数值,因此缺少 55 个数值,占 7.1%。缺失并非随机发生,而是具有明显的结构性:

  • 所有缺口都出现在 10 月、11 月或 12 月。
  • 2021 年至 2025 年的每一年都缺少 11 个数值。
  • 受影响的地区为 Pujehun、Bonthe、Koinadugu、Kono、Bombali 和 Port Loko。
  • Pujehun 在所有可用年份的 10 月至 12 月均没有报告。
  • 2026 年没有缺失数值。

这很重要,因为只把已报告的地区相加,会让全国总量看起来人为偏低。在受影响的15个月中,未经校正的总量平均低估了14.3%,最高低估达17.1%。

第3步:检测逐年完全重复的数据

该笔记本将每个地区-月份与12个月前的对应月份进行比较。完全匹配可能自然发生,但在真实的月度健康数据中,大范围重复并不常见。

在演示数据中,2024年有65.5%的麻疹地区-月份数据、2025年有92.4%的数据,以及2026年1月至8月有71.2%的数据,均与上一年完全匹配。BCG和OPV1也呈现出几乎相同的模式。

这一模式对于解读结果很重要。它看起来像是由模板生成或复制而来的样本数据,也使得基于上一年数值的预测基线获得了异常明显的优势。

第4步:检查大幅变化和可能的月份互换

同比大幅变化是有用的预警信号,但并不一定代表错误。该笔记本还会检查相邻月份的两个数值是否相对于上一年发生了位置互换。

2024年3月和4月、2024年10月和11月,以及2026年3月和4月出现了可能的互换。例如,Port Loko在3月和4月的数值为535和313,但这两个数值在不同年份中的顺序发生了变化。这样的互换会造成两个较大的月度误差,尽管这两个月的合计值保持不变。

该流程会标记可能的互换,但不会进行校正。仅凭数据无法确定哪个顺序才是正确的,因此在修改前应核查原始报告。

第5步:填补训练数据中的缺失值

该项目采用两阶段方法填补每个缺口:

  1. 如果该地区在其他年份报告过同一日历月份,则使用这些可用数值的平均值。
  2. 如果该地区从未报告过该日历月份,则将该地区的平均水平乘以所有地区在该月份的典型季节性模式,以此进行估算。

对于Pujehun等所有可用年份中10月至12月均缺失的情况,必须使用第二种方法。

为了检验该方法,分析会隐藏15%的已知10月至12月数值,填补这些数值,然后将估算值与实际观测值进行比较。在隐藏的21个数值中,平均误差为8.2%,中位数误差为7.9%。由于验证样本较小,这些数据只能作为大致参考,不应视为确定性的准确率估计。

估算值不会被视为观测值。它们仅用于构建模型训练数据和滞后特征。在评分时,缺失的测试观测值会被跳过,而不是进行填补。

预测麻疹疫苗剂次

使用按时间顺序划分的训练集和测试集

预测问题是:与重复上一年的数值相比,模型能否更准确地预测每个地区未来12个月的麻疹疫苗剂次。

  • 训练期:2021年9月至2025年8月,共48个月。
  • 测试期:2025年9月至2026年8月,共12个月。
  • 参与评分的观测值:145个已报告的测试值。

随机划分会使未来观测值影响对更早月份的预测。基于时间的划分可以防止这种信息泄漏。训练集中的缺口仅使用训练期信息进行填补,而2025年10月至12月未报告的测试值则不纳入评估。

比较三个模型

  • 季节性朴素模型:预测一年前同一月份观测到的数值。
  • SARIMA:为每个地区分别拟合SARIMA(0,1,1)(0,1,1,12)。该配置在查看测试结果前选定,且未进行调参。
  • 梯度提升:使用12个月和24个月前的数值、日历月份及地区,为所有地区训练一个共享模型。模型按各地区的平均值对数值进行缩放,使不同规模的地区能够共享同一模型。

梯度提升特征仅使用至少12个月以前的观测值。这反映了在生成完整的未来12个月预测时可获得的信息。

解读MAE和WAPE

该笔记本报告了两个评估指标:

  • MAE:每个地区-月份的平均绝对误差,单位为疫苗剂次。
  • WAPE:绝对误差总和除以实际剂次总和。例如,0.036表示3.6%的误差。

季节性朴素模型的MAE为16.1,WAPE为3.6%。SARIMA的MAE为30.0,WAPE为6.6%;梯度提升的MAE为32.9,WAPE为7.3%。

排除2026年3月和4月后,季节性朴素模型的WAPE降至0.8%。SARIMA为5.4%,梯度提升为5.7%。因此,基线模型的大部分误差都来自明显的3月至4月互换。

简单基线为何胜出

季节性朴素方法表现最佳,是因为测试期的大多数数值都是上一年的精确复制。处于这种条件下,重复上一年观测值的模型几乎可以达到完美预测。

相比之下,SARIMA和梯度提升仅根据四个年度周期估计更广泛的模式。它们会对序列进行平滑,无法同样可靠地复现精确复制的数值,也无法根据更早的观测预测相邻月份的互换。

这一结果并不能证明季节性朴素预测通常更优。它反映的是该演示数据集不寻常的结构。在具有真实年度变化的数据中,更复杂的模型将拥有更有意义的机会来改进基线结果。

调整工作流程的高级技巧

将观测值与估计值分开

为每个已填入的观测值添加或保留明确的标记。在技术上需要完整训练序列时可以使用估计值,但不要将其不加说明地呈现为报告值。评分仍应基于实际报告的观测值。

调查异常,而不是自动修正

缺失报告、重复值、大幅变化和可能的月份错位需要采取不同的处理方式。缺失值可以用于建模估计,但疑似月份错位应与源文件进行核实。自动修正可能会把明显的警告变成隐藏的错误。

使用滚动起点评估

该存储库使用一个 12 个月的测试窗口。为了进行更稳健的评估,应在多个按时间顺序排列的窗口上重复评估。每次运行都只能使用预测期之前可获得的数据进行训练。这样可以显示模型性能是否随时间保持稳定,而不是仅仅依赖某个异常年份。

始终对复杂模型进行基准比较

即使加入经过调优的 SARIMA 模型、新特征或其他机器学习算法,也应保留季节性朴素预测。只有当复杂方法在未见过的时间段上持续优于简单且具有运营可信度的基线时,它才真正有用。

使用真实数据时加入不确定性

建议的后续步骤包括添加预测区间。仅提供点预测无法传达正常波动、有限历史数据或训练数据缺口估计所带来的不确定性。

自动执行定期审计

相同的检查可以安排在每个报告周期之后运行。定期流程可以报告新出现的缺失地区-月份、异常的同比重复、大幅变化以及疑似月份错位,供人工审核。

扩展到其他指标时应保持谨慎

在预测另一项指标之前,应确认其历史数据足以覆盖自身的季节周期。现有 ANC 指标仅包含从 2025 年 1 月开始的 20 个月数据,因此本项目不使用这些指标研究年度模式。

重要限制

  • 数据源是演示服务器,因此该分析无法说明真实的免疫接种趋势。
  • 预测比较仅使用一个 12 个月的测试窗口。
  • 仅对 Measles 进行预测。
  • SARIMA 配置是固定的,而非经过调优的。
  • 缺口填补验证仅包含 21 个隐藏观测值。
  • Pujehun 10 月至 12 月的估计值依赖其他地区的季节性模式。
  • 疑似月份错位会被标记,但不会被修正。

结论

该项目表明,数据质量审计应先于预测进行。其检查结果揭示了结构化缺失、大量同比重复,以及可能相邻月份错位的问题,这些问题会显著影响总量和模型评估。

首先使用已保存的快照运行笔记本,检查每个审计阶段;只有在准备好使用经过批准的 DHIS2 数据源时,才启用 API 刷新。调整工作流程时,应保留按时间顺序进行的评估,为估计值添加标记,根据源报告核实异常,并将每个模型与直接明了的季节性基线进行比较。