メインコンテンツへ移動
AIチュートリアル

PythonでDHIS2の予防接種データを監査・予測する

月次のDHIS2予防接種データを監査し、未報告データを推定し、重複値や入れ替わった値を特定し、将来の情報を漏洩させずに季節性ナイーブ法、SARIMA、勾配ブースティングによる予測を比較するPython・Jupyterワークフローの実行方法を学びます。

PythonでDHIS2の予防接種データを監査・予測する

このプロジェクトの概要

このプロジェクトは、DHIS2から月次の予防接種データを抽出、監査、補完し、予測するためのエンドツーエンドのワークフローを提供します。2021年9月から2026年8月までの完了した60か月間に、13地区から報告された麻疹、BCG、OPV1の接種回数を扱います。

付属のデータセットは、バージョン2.43.1で稼働している公開DHIS2デモインスタンスから取得したものです。サンプルデータであり、個人情報や勤務先情報は含まれていません。そのため、結果は分析手法とデータ品質上の問題を示すものであり、実際の保健動向に関する知見として解釈してはなりません。

ワークフローは、次の4つの主な段階で構成されています。

  1. DHIS2分析APIを通じて月次集計データを取得するか、保存済みのCSVスナップショットを読み込む。
  2. 報告の完全性、前年同月との繰り返し、大きな変化、隣接月の入れ替わりの可能性を監査する。
  3. モデル学習用に欠損値を推定し、推定値であることを示すフラグを保持する。
  4. 予測モデルが、前年の値を繰り返す季節ベースラインを上回るかを検証する。

主な機能

  • DHIS2 APIからの抽出: pull_dhis2_data.py内の関数が、必要な指標を検索して取得します。
  • オフラインでの再現性: ノートブックはデフォルトでdhis2_raw_data.csvを読み込むため、インターネット接続やログインなしで実行できます。
  • 完全性の監査: 各指標について、すべての地区と月に1つずつ値があるかを確認します。
  • 繰り返しの検出: 地区の値が、1年前の同じ月の値と完全に一致する頻度を測定します。
  • 入れ替わりの検出: 前年と比べて値の順序が逆になっているように見える隣接月にフラグを付けます。
  • 構造化された欠損値補完: 他の年の同じ暦月の値、または地区内および地区間の季節性から欠損値を推定します。
  • リーケージに強い予測: 学習とテストを時系列順に分離し、学習期間の欠損値は学習データのみを使って補完します。
  • モデル比較: Seasonal naive、SARIMA、勾配ブースティングをMAEとWAPEで評価します。

プロジェクトファイルの説明

  • 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

環境変数を設定する正確な構文は、使用するシェルとオペレーティングシステムによって異なります。認証情報を環境変数で管理すると、ノートブックに埋め込まれたり、ソース管理にコミットされたりするのを防げます。

ライブDHIS2インスタンスには、データ所有者の承認を得た場合にのみ接続してください。匿名化された集計データを使用し、組織のセキュリティおよびガバナンス要件に従ってください。

基本ワークフローの実行

ステップ1: 月次データを読み込む、または取得する

各行は、1つの指標、1つの地区、1か月を表します。完全な分析では、各予防接種指標について13地区と60か月を使用します。麻疹は監査と予測の両方の段階に含まれ、BCGとOPV1は監査対象となります。ANC指標は利用可能な期間が20か月しかなく、このワークフローで年次パターンを調べるには短すぎるため除外されます。

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:大きな変化と月の入れ替わりの可能性を確認する

前年比で大きく変化している値は有用な警告 संकेतですが、必ずしも誤りとは限りません。このノートブックでは、前年と比べて隣接する2つの値の位置が入れ替わっていないかも確認します。

入れ替わりの可能性は、2024年3月と4月、2024年10月と11月、2026年3月と4月に見られます。たとえばPort Lokoでは、3月と4月に535と313という値があり、その順序が年によって変わっています。このような入れ替わりによって月ごとには2つの大きな誤差が生じますが、2か月分の合計は変わりません。

このワークフローは入れ替わりの可能性を検出しますが、補正は行いません。どちらの順序が正しいかはデータだけでは判断できないため、変更する前に原資料を確認する必要があります。

ステップ5:学習用データの欠損値を補完する

このプロジェクトでは、各欠損を2段階の方法で補完します。

  1. その地区で他の年に同じ暦月の報告がある場合は、利用可能な値の平均を使う。
  2. その地区でその暦月を一度も報告していない場合は、地区の平均水準に、全地区におけるその月の典型的な季節パターンを掛けて推定する。

2番目の方法は、利用可能なすべての年で10月から12月が欠損しているPujehunのようなケースに必要です。

この方法を検証するため、既知の10月から12月の値の15%を隠して補完し、推定値を実際の観測値と比較します。隠した21個の値全体では、平均誤差は8.2%、中央値の誤差は7.9%でした。ただし、これは小規模な検証サンプルに基づく結果であるため、確定的な精度推定ではなく、おおよその目安として扱うべきです。

推定値は観測値として扱いません。推定値はモデルの学習データとラグ特徴量を作成するためだけに使います。テスト期間の欠損観測値は補完せず、評価時には除外します。

麻疹ワクチン接種量を予測する

時系列に沿って学習データとテストデータを分割する

予測の問いは、各地区の今後12か月の麻疹接種量を、前年の値を繰り返すよりも正確に予測できるかどうかです。

  • 学習期間:2021年9月から2025年8月までの48か月。
  • テスト期間:2025年9月から2026年8月までの12か月。
  • 評価対象の観測値:報告されたテスト値145件。

ランダム分割では、将来の観測値が過去の月の予測に影響してしまいます。時系列に基づく分割によって、この情報漏洩を防ぎます。学習期間の欠損は学習期間内の情報だけで補完し、2025年10月から12月のテスト期間に報告されていない値は評価から除外します。

3つのモデルを比較する

  • 季節ナイーブ:1年前の同じ月に観測された値を予測値とする。
  • SARIMA:各地区について、SARIMA(0,1,1)(0,1,1,12)を個別に適合する。この設定はテスト結果を見る前に選択され、チューニングは行っていない。
  • 勾配ブースティング:12か月前と24か月前の値、暦月、地区を使い、全地区で共有する1つのモデルを学習する。地区ごとの平均値でスケーリングするため、規模の異なる地区を同じモデルで扱える。

勾配ブースティングの特徴量には、少なくとも12か月前までの観測値だけを使います。これは、12か月先までの予測を作成する時点で利用できる情報を反映しています。

MAEとWAPEを解釈する

このノートブックでは、2つの評価指標を報告します。

  • MAE:地区・月あたりの接種量における絶対誤差の平均。
  • WAPE:絶対誤差の合計を実際の接種量の合計で割った値。たとえば、0.036は3.6%の誤差を表す。

季節ナイーブモデルのMAEは16.1、WAPEは3.6%でした。SARIMAはMAE30.0、WAPE6.6%、勾配ブースティングはMAE32.9、WAPE7.3%でした。

2026年3月と4月を除外すると、季節ナイーブのWAPEは0.8%に低下します。SARIMAは5.4%、勾配ブースティングは5.7%でした。したがって、ベースラインの誤差の大部分は、見かけ上の3月と4月の入れ替わりに起因しています。

単純なベースラインが勝つ理由

季節ナイーブの手法が最も高い性能を示すのは、テスト期間の大半の値が前年の値をそのままコピーしたものだからです。前年の観測値を繰り返すモデルは、この条件ではほぼ完全な予測になります。

一方、SARIMAと勾配ブースティングは、わずか4年分の周期から、より広範なパターンを推定します。そのため系列を平滑化し、コピーされた値を同じ精度で再現できません。また、過去の観測値から隣接月の入れ替わりを予測することもできません。

この結果から、季節ナイーブ予測が一般に優れているとは言えません。これは、このデモデータセットが通常とは異なる構造を持つことを反映しています。実際のデータに年ごとの真の変動がある場合、より高度なモデルがベースラインを改善できる可能性は、より意味のある形で現れるでしょう。

ワークフローを適応させるための高度なヒント

観測値と推定値を分けて管理する

入力されたすべての観測値に、明示的なフラグを追加または保持します。完全なトレーニング系列が技術的に必要な場合は推定値を使用しますが、報告値であるかのように暗黙的に提示してはいけません。スコアリングは、実際に報告された観測値に基づいて行う必要があります。

異常を自動的に修正せず調査する

報告の欠落、同じ値の反復、大きな変化、入れ替わりの可能性には、それぞれ異なる対応が必要です。欠損値はモデリング用に推定できますが、月の入れ替わりが疑われる場合は、原資料と照合して確認すべきです。自動修正によって、目に見える警告が隠れたエラーに置き換わる可能性があります。

ローリングオリジン評価を使用する

このリポジトリでは、12か月のテスト期間を1つ使用しています。より堅牢に評価するには、時系列順の複数の期間で評価を繰り返します。各実行では、予測期間より前に利用可能だったデータだけで学習する必要があります。これにより、モデル性能が時間を通じて安定しているのか、それとも特異な1年に依存しているのかを確認できます。

複雑なモデルは必ずベンチマークする

調整済みSARIMAモデル、新しい特徴量、その他の機械学習アルゴリズムを追加する場合でも、季節ナイーブ予測を残します。複雑な手法が有用なのは、未知の期間において、単純で運用上信頼できるベースラインを一貫して上回る場合だけです。

実データを扱う場合は不確実性を加える

次のステップとして、予測区間の追加が提案されています。点予測だけでは、通常の変動、限られた過去データ、推定で補完した学習上の欠損から生じる不確実性を伝えられません。

定期的な監査を自動化する

同じチェックを、各報告サイクルの後に実行されるようスケジュールできます。定期的なプロセスにより、新たに欠落した地区・月、予期しない前年比の反復、大きな変化、入れ替わりが疑われる月を報告し、確認に回せます。

他の指標へ拡張する場合は注意する

別の指標を予測する前に、その指標が季節周期に対して十分な履歴を持っていることを確認します。利用可能なANC指標は2025年1月から始まる20か月分しかないため、このプロジェクトでは年次パターンの分析には使用していません。

重要な制限事項

  • データソースはデモサーバーであるため、この分析から実際の予防接種動向について判断することはできません。
  • 予測比較では、12か月のテスト期間を1つだけ使用しています。
  • 予測対象はMeaslesのみです。
  • SARIMAの設定は調整されておらず、固定されています。
  • 欠損補完の検証に含まれる非表示の観測値は21件だけです。
  • Pujehunの10月から12月までの推定値は、他の地区の季節パターンに依存しています。
  • 月の入れ替わりが疑われる箇所にはフラグを付けますが、修正は行いません。

結論

このプロジェクトは、予測に先立ってデータ品質を監査すべきであることを示しています。チェックにより、構造的な欠損、広範な前年比の反復、隣接月の入れ替わりの可能性が明らかになります。これらは合計値とモデル評価に大きな影響を与えます。

まず、保存済みスナップショットに対してノートブックを実行し、各監査段階を確認します。その後、承認済みのDHIS2ソースを使用する準備ができた時点で、API更新を有効にしてください。ワークフローを適応させる際は、時系列順の評価を維持し、推定値にラベルを付け、異常を原資料と照合して確認し、すべてのモデルを単純な季節ベースラインと比較してください。