はじめに
こんにちは、株式会社NeurestXの友倉です。
背景
病院では受付や診察、検査、会計など複数の工程があり、それぞれの待ち時間が患者満足度や医療スタッフの負荷に大きく影響します。
実際の現場で新しい運営方法を実験することは容易ではないため、近年では『離散イベントシミュレーション(Discrete Event Simulation:DES)』を利用した患者フロー分析が注目されています。
DESは、システム内で発生したイベントを離散的に取り扱い、状態を変化させながらシステムを再現するため、『プロセス』『工程』のシミュレーションに強い分析です。
目的
本記事では、
- GitHubで公開されている病院患者フローシミュレーションを動かす
- SimPyによるイベント駆動シミュレーションの仕組みを理解する
- パラメータを変更し、待ち時間の変化を確認する
の大きく3つを目的として取り組みます。
利用したgithubについて
概要
今回、参考資料に載せている【Patient-Flow-Modeling-in-Hospital-Emergency-Departments-with-DES】を利用しました。
ここでは
- SimPy
- Python
- DES
を用いて救急外来の患者フローをモデル化しています。
患者フローについて、各フローを下記のように分け、どのフローに待ち時間が多く人手・設備が不足しているのか可視化します。
| 来院 | → トリアージ | → 医師 | → 検査(必要な患者) | → 治療(必要な患者) | → 退院または入院 |
|---|
使用ライブラリ
ライブラリについて、下記の4つを使用しました。
- SimPy
- NumPy
- Pandas
- Matplotlib
環境構築
- まず、githubからクローンします。
git clone https://github.com/BeatriceBon/Patient-Flow-Modeling-in-Hospital-Emergency-Departments-with-DES
- 必要なライブラリをインストールします。
python -m pip install simpy matplotlib numpy jupyter
- PC内でJupyterサーバーを起動します。
→ブラウザで『ED_Descrete_Event_Simulation.ipynb』を開く
→ノートブック内のPythonコードをセル単位で実行できる状態にする
jupyter notebook ED_Descrete_Event_Simulation.ipynb
再現
パラメータ概要
今回のプログラムで用いるパラメータは以下になります。
| 入力 | 意味 |
|---|---|
| num_triage_nurses | トリアージ担当者数 |
| num_doctors | 医師数 |
| num_diagnostic_stations | 検査設備・検査担当数 |
| num_treatment_stations | 治療設備・治療担当数 |
| num_discharge_stations | 退院処理担当数 |
| num_admission_stations | 入院処理担当数 |
| warmup_days | 統計に含めない準備期間 |
| total_days | 統計を収集するシミュレーション日数 |
結果の見方
実行すると、次の結果がグラフやテキストで出力されます。
- 時間帯別の平均待ち時間
- トリアージ、診察、検査などの平均待ち行列長
- 救急部門内の総滞在時間
- 各サービスの平均・最大待ち時間
- 処理された患者数
- 各従業員の稼働率
これらの結果から、
待ち時間が長い
→どの部門の行列が長いか
→人員・設備不足なのか確認
→パラメータを変えてシミュレーションする
という流れで検証していきます。
デフォルト設定
では、まずデフォルトの設定でシミュレーションしてみます。デフォルト設定は以下になります。
| 設定項目 | 設定値 | 説明 |
|---|---|---|
| トリアージ担当者 | 1人 | 患者の緊急度を判定する担当者 |
| 医師 | 2人 | 患者を診察する医師 |
| 検査設備 | 3台 | 診断・検査を行う設備または担当部門 |
| 治療設備 | 3台 | 患者の治療を行う設備または担当部門 |
| 退院処理担当 | 2人 | 退院手続きを処理する担当者 |
| 入院処理担当 | 1人 | 入院手続きを処理する担当者 |
| ウォームアップ期間 | 10日間 | 初期状態の影響を除くため、統計に含めずに稼働させる期間 |
| データ収集期間 | 30日間 | 待ち時間や稼働率などを集計する期間 |
患者の時間帯別来院数は、深夜・早朝は患者が少なく、午前中から増加し、昼から夕方にかけて混雑する来院パターンを想定したモデル設定になっており、以下のグラフのように示されました。総患者数は2331人です。
①デフォルト設定の検証
実行するとグラフとテキストで出てきますが、今回は5つのフロー待ち時間と稼働率に省略して記載します。
| フロー | 平均待ち時間 | 最大待ち時間 | 最大待ち時間の目安 | 稼働率 |
|---|---|---|---|---|
| 医師の診察 | 23.43分 | 410.94分 | 約6時間51分 | 51.65% |
| 検査 | 0.75分 | 63.61分 | 約1時間4分 | 28.40% |
| 治療 | 12.27分 | 486.48分 | 約8時間6分 | 53.94% |
| 退院処理 | 8.77分 | 129.72分 | 約2時間10分 | 47.36% |
| 入院処理 | 7.07分 | 148.26分 | 約2時間28分 | 21.97% |
結果をみると、『医師の診察』と『治療』の平均待ち時間の値が大きいことに加えて、最大待ち時間がそれぞれ6時間を超えており、非常に長いことから、ボトルネックであることが分かります。
次は、医者数を増やして比較してみましょう。
②医者数2人→3人
| フロー | 平均待ち時間 | 最大待ち時間 | 最大待ち時間の目安 | 稼働率 |
|---|---|---|---|---|
| 医師の診察 | 14.17分 | 104.55分 | 約1時間45分 | 36.12% |
| 検査 | 0.61分 | 63.46分 | 約1時間3分 | 28.37% |
| 治療 | 13.90分 | 483.91分 | 約8時間4分 | 55.77% |
| 退院処理 | 9.13分 | 193.74分 | 約3時間14分 | 45.77% |
| 入院処理 | 8.50分 | 163.19分 | 約2時間43分 | 21.79% |
医師を2人から3人に増やしたことで、診察の平均待ち時間は23.43分から14.17分へ約40%短縮されました。最大待ち時間も410.94分から104.55分へ大幅に短縮されており、医師の増員は診察工程の混雑解消に大きな効果があります。
一方、治療の平均待ち時間は12.27分から13.90分へ増加し、稼働率も55.77%へ上昇しました。診察を早く終えた患者が治療工程へ流れやすくなり、ボトルネックが医師の診察から治療へ移動している可能性があります。治療の最大待ち時間も約8時間と非常に長いままです。
以上の結果から、医師を3人に増やすことで診察待ち時間は大きく改善しましたが、次のボトルネックとして治療工程が明確になりました。治療設備不足が患者の総滞在時間を延ばしている可能性があるため、次は医師3人体制を維持したまま、治療設備を増やしてシミュレーションし、待ち時間がどの程度改善するかを確認します。
③治療設備3つ→4つ
| フロー | 平均待ち時間 | 最大待ち時間 | 最大待ち時間の目安 | 稼働率 |
|---|---|---|---|---|
| 医師の診察 | 13.93分 | 70.28分 | 約1時間10分 | 36.07% |
| 検査 | 0.69分 | 80.96分 | 約1時間21分 | 27.66% |
| 治療 | 2.41分 | 106.28分 | 約1時間46分 | 39.79% |
| 退院処理 | 9.11分 | 143.47分 | 約2時間23分 | 46.53% |
| 入院処理 | 8.69分 | 216.47分 | 約3時間36分 | 19.19% |
治療設備を3台から4台へ増やしたことで、治療の平均待ち時間は13.90分から2.41分へ約83%短縮されました。最大待ち時間も約8時間4分から約1時間46分へ大幅に短縮されています。治療の稼働率は55.77%から39.79%へ低下しており、患者が集中する時間帯にも対応できる余裕が生まれました。
医師の診察も、平均待ち時間13.93分、最大待ち時間約1時間10分まで改善しています。医師3人・治療設備4台の構成により、これまで主要なボトルネックだった診察と治療の両方が改善されました。
一方、5つのフローの中では退院処理の稼働率が46.53%と最も高くなりました。ただし、平均待ち時間は9.11分であり、現時点では治療設備増設前ほど深刻なボトルネックではありません。入院処理では最大約3時間36分の待ち時間が発生していますが、稼働率は19.19%と低いため、恒常的な能力不足よりも患者到着や処理時間の一時的な偏りが影響した可能性があります。
以上から、医師3人・治療設備4台の構成は、待ち時間の短縮と処理能力の余裕を両立できる設定と考えられます。ただし、増員・増設によるコストも大きくなるため、患者サービスを重視する場合に適した構成です。
考察
3つの設定の中では、医師3人・治療設備4台の設定③が、患者の待ち時間を最も効果的に短縮できる構成です。特に、医師の診察と治療で発生していた極端に長い待ち時間が大きく改善されました。
一方で、医師と治療設備の稼働率は低下するため、設定③は人員・設備効率よりも患者サービスを優先した構成といえます。コストを抑える場合はデフォルト設定、診察待ちだけを改善する場合は設定②、患者フロー全体の待ち時間を改善する場合は設定③が適していると考えられます。
おわりに
分かったこと
今回、離散事象シミュレーションを使うことで、患者の来院からトリアージ、診察、検査、治療、退院・入院までの流れを仮想的に再現できました。
シミュレーションから、医師の増員は診察待ちの短縮に大きな効果があり、治療設備の増設も治療の平均待ち時間を改善することが確認できました。一方で、リソースを増やすと稼働率が下がることや、ボトルネックが別の工程へ移る可能性も確認できました。
つまり、単純にすべての人員や設備を増やせばよいわけではなく、患者の待ち時間、職員・設備の稼働率、運用コストのバランスを考えながら、適切な配置を検討する必要があります。
他にもやってみたい条件
より最適な条件を見つけるために、次のような条件でもシミュレーションを行うことで改善できると考えました。
- 乱数シードを固定し、各配置を同じ患者条件で比較する
- シミュレーションを複数回実行し、結果の平均や信頼区間を求める
- 時間帯によって医師や看護師の人数を変更する
- 平日、休日、夜間で異なる患者到着率を設定する
- 患者の緊急度別に待ち時間を集計する
今回試した静的なリソース配置だけでなく、患者数や待ち行列に応じて人員を増減させる動的配置も比較すると、より現実的な運用方法を検討できると考えられます。
さらに、より多くの配置条件を効率的に比較するために、AIや最適化アルゴリズムの活用も考えられます。例えば、医師、看護師、検査設備、治療設備などの配置数を最適化アルゴリズムによって変更しながらシミュレーションを繰り返すことで、待ち時間が短く、過剰な人員配置も抑えられる条件を探索できます。
候補となる配置数が少ない場合は、すべての組み合わせを調べるグリッドサーチが適しています。組み合わせが多い場合は、ベイズ最適化や遺伝的アルゴリズムを利用することで、少ない試行回数から有望な配置を見つけられる可能性があります。
DESの利用例
離散事象シミュレーションは、救急部門以外にも「人や物が順番に処理され、待ち行列が発生する場面」で活用できます。
例えば、次のような利用例があります。
- 病院の外来受付、診察室、検査室、薬局の混雑分析
- コールセンターのオペレーター配置
- 銀行や行政窓口の待ち時間分析
- スーパーや飲食店のレジ配置
- 空港の保安検査場や搭乗手続き
実際の現場で人員や設備を変更するには、費用や安全上のリスクが伴います。シミュレーションを利用すれば、現実の運用を変更する前に複数の案を仮想環境で比較できます。今回の取り組みを通じて、離散事象シミュレーションが、限られたリソースを効果的に配置するための有効な判断材料になることが分かりました。
参考文献

