病院の病床管理の担当が入退院の記録から Python で病棟ごとの4日先までの空床を見込み、毎朝の入院の受入れの調整に使う
入院中の患者の記録と過去の入退院の記録から、病棟ごとに当日から4日先までの空床の数を見込みます。退院の見込み、緊急入院の見込み、予約済みの予定入院を合わせ、毎朝の病床調整の資料として病床管理の担当に渡します。
- 連携・自動化
- Python
- 対象業界
- 医療
- 対象部門
- 経営企画
- 対象業務
- 集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 朝7時半ごろ、電子カルテの病床の一覧を開き、病棟ごとの在院の患者数と空床を数える
- 入院予約の台帳から、今日から4日先までの予定入院を病棟ごとに数える
- 各病棟の看護師長に電話し、今日と明日以降に退院しそうな患者の数を聞く
- 過去の同じ曜日の緊急入院の数を思い出し、病棟ごとに何床残しておくかを決める
- ホワイトボードと表計算に、病棟ごとの空床の見込みを書く
- 8時半の病床調整の会議で、予定入院の病棟の振り分けと、緊急入院を受ける病棟の順を決める
- 日中に退院や緊急入院があるたびに、ホワイトボードを書き直す
- 自動毎朝6時に、電子カルテと入院予約の台帳から前日までの記録を書き出したファイルをプログラムが読み込む
- 自動入院中の患者ごとに、今日から4日先までの各日に「その日の終わりまでに退院または転棟している確からしさ」を出す
- 自動病棟ごと・曜日ごとに、緊急入院の数の平均を見込む
- 自動入院予約の台帳から、病棟ごと・日ごとの予定入院を数える
- 自動2〜4番目を合わせて1万回の抽選を行い、病棟ごと・日ごとの空床の真ん中と少なめの数を出す
- 自動空床が少なめの側で0を下回りそうな病棟と日、見込みが前日から大きく動いた病棟に印を付ける
- 人病床管理の担当が、印の付いた病棟だけ看護師長に確かめる
- 人8時半の病床調整の会議で、空床の見込みを見ながら予定入院の振り分けと緊急入院の受入れの順を決める
- 人日中の入退院は、これまでどおり電子カルテとホワイトボードで追う
各工程の詳しい説明を読む
- 朝7時半ごろ、電子カルテの病床の一覧を開き、病棟ごとの在院の患者数と空床を数える
- 入院予約の台帳から、今日から4日先までの予定入院を病棟ごとに数える
- 各病棟の看護師長に電話し、今日と明日以降に退院しそうな患者の数を聞く
- 過去の同じ曜日の緊急入院の数を思い出し、病棟ごとに何床残しておくかを決める
- ホワイトボードと表計算に、病棟ごとの空床の見込みを書く
- 8時半の病床調整の会議で、予定入院の病棟の振り分けと、緊急入院を受ける病棟の順を決める
- 日中に退院や緊急入院があるたびに、ホワイトボードを書き直す
(a)電話の聞き取りに時間がかかる。 3番目の電話は8病棟分で、つながらなければかけ直します。看護師長の側も、申し送りの最中に手を止めて答えています。 聞き取った数は「たぶん2人」のような幅のある答えで、それを1つの数に丸めて書いています。
(b)緊急入院の残し方が経験に頼る。 4番目の「何床残すか」は、月曜の朝は多めに、連休明けは多めに、という経験で決めています。長く担当している1名が休むと、残す床が少なすぎて午後に断る日と、残しすぎて予定入院を待たせる日が出ます。
(c)退院予定日が入っていない患者の見立てが人によって違う。 同じ術後5日目の患者でも、看護師長によって「明日退院」「まだ数日」と答えが分かれます。見立てのくせが、病棟ごとの空床の見込みのずれになります。
(d)4日先が見えない。 聞き取りは今日と明日の分が中心で、3日先・4日先の空き方は誰も数えていません。 紹介元の診療所から「来週の月曜に入院させたい」と聞かれても、その場で答えられません。
- 【自動】 毎朝6時に、電子カルテと入院予約の台帳から前日までの記録を書き出したファイルをプログラムが読み込む
- 【自動】 入院中の患者ごとに、今日から4日先までの各日に「その日の終わりまでに退院または転棟している確からしさ」を出す
- 【自動】 病棟ごと・曜日ごとに、緊急入院の数の平均を見込む
- 【自動】 入院予約の台帳から、病棟ごと・日ごとの予定入院を数える
- 【自動】 2〜4番目を合わせて1万回の抽選を行い、病棟ごと・日ごとの空床の真ん中と少なめの数を出す
- 【自動】 空床が少なめの側で0を下回りそうな病棟と日、見込みが前日から大きく動いた病棟に印を付ける
- 【人】 病床管理の担当が、印の付いた病棟だけ看護師長に確かめる
- 【人】 8時半の病床調整の会議で、空床の見込みを見ながら予定入院の振り分けと緊急入院の受入れの順を決める
- 【人】 日中の入退院は、これまでどおり電子カルテとホワイトボードで追う
7番目が、この設計の分かれ目です。 8病棟すべてに電話するのではなく、空き方が厳しい病棟と、見込みが大きく動いた病棟だけに電話します。 全病棟への電話を残すと、時間はほとんど減りません。
9番目を自動にしないのも、意図してのことです。 日中の入退院は分単位で動き、朝の見込みを日中に何度も出し直すより、目の前の入退院を追うほうが確かです。 この構成が受け持つのは、朝の時点の数日先の見通しです。
02今回想定するシステム構成
電子カルテ(入院・退院・転棟の記録、在院の患者の情報、退院予定日の書き出し) 入院予約の台帳 │ ▼【トリガー】毎朝6時 Python(pandas) ├──▶ 在院の患者ごとに、入院からの日数・術後の日数などの項目を作る ▼ scikit-learn(HistGradientBoostingClassifier) │ 患者ごと・日ごとの「その日までに退院・転棟している確からしさ」 ▼ statsmodels(GLM、ポアソン分布) │ 病棟ごと・日ごとの緊急入院の数の平均 ▼ NumPy ── 1万回の抽選で、病棟ごと・日ごとの空床の真ん中と少なめの数 ▼ 【人が印の付いた病棟だけ確認】── 病床管理の担当 ▼ 病床調整の会議の資料(病棟 × 4日分の空床)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn・statsmodels・NumPy) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingClassifier(退院の確からしさ) | LightGBM、statsmodels のロジスティック回帰 |
| 集計 | Python(statsmodels の GLM による緊急入院の見込みと、NumPy による抽選と空床の集計) | 病床管理の表 |
| データの取得元 | 電子カルテと入院予約の台帳の書き出し | 電子カルテの二次利用のデータベース |
| 結果の出力先 | 院内の共有フォルダの病床調整の資料 | 病床管理の画面 |
電子カルテと入院予約の台帳は、新しく足すものではありません。 どちらからも書き出すだけで、この構成から記録を書き換えることはしません。病室の割り当ても行いません。 出すのは病棟ごとの空床の見込みまでです。
退院の確からしさには、scikit-learn の HistGradientBoostingClassifier を使います。 損失は 'log_loss' で、2つの区分の場合はロジスティックの関数で正の区分の確からしさを出します。predict_proba で区分ごとの確からしさが取れます。 欠けた値をそのまま扱え、学習の際に分かれ目ごとに左右どちらへ送るかを改善の大きさから学ぶとされています。退院予定日が入力されていない患者の「退院予定日までの日数」を、埋めずに渡せます。 入力が無いこと自体が、見込みの材料になります。
緊急入院の数には、statsmodels の GLM を使います。 一般化線形モデルで、family にポアソン分布を選べます。切片は既定では入らず、自分で足す必要があります。 exposure を渡すと、その対数が線形の予測に係数1で加わり、対数の結び付けのときだけ使えます。 病棟ごとの病床の数を exposure に入れ、病床の数が違う病棟を同じモデルで扱います。
抽選には、NumPy の Generator.binomial と Generator.poisson を使います。 binomial は確からしさ p を配列で渡せ、患者ごとの確からしさをまとめて抽選できます。
03どうやって実装するのか
処理の起点を決める
毎朝6時に動かします。 夜間の緊急入院と早朝の死亡退院が電子カルテに入り終わる時間で、8時半の病床調整の会議までに、病床管理の担当が印の付いた病棟に電話する時間を残せます。 7時半では、申し送りの時間と重なって電話がつながりません。
夜間に電子カルテの書き出しが失敗していたら、前日の見込みを使わず、資料の冒頭に「本日は見込みなし」と出します。 前日の見込みは、夜間の入退院が入っていないので、病床管理の担当を誤らせます。
日中の出し直しはしません。ただし、大きな事故などで緊急入院がまとまって来た日は、病床管理の担当が手で動かせるようにしておきます。 その場合も、出し直した時刻を資料に書きます。
モデルの学ばせ直しは、毎月の初めに1回行います。 毎朝動かすのは、学ばせ済みのモデルで在院の患者の確からしさを出す部分だけです。学ばせ直した月は、前の版と新しい版の見込みを1週間並べ、 外れ方が悪くなっていないかを確かめてから切り替えます。診療科の新設や病棟の再編があった月は、切り替えを1か月遅らせます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 在院の患者 | 患者の番号(仮の番号に置き換える)、病棟、診療科、入院日、入院の経路(予定・緊急・紹介)、手術日、退院予定日の入力の有無と日付、転院の調整中の印、年齢の帯 | 電子カルテ |
| 過去の入退院 | 過去3年の入院ごとの入院日・退院日・転棟日、退院の区分(自宅・転院・死亡など)、上と同じ項目 | 電子カルテ |
| 予定入院 | 入院予定日、病棟、診療科、予約の状態(確定・仮) | 入院予約の台帳 |
| 病棟の情報 | 病棟ごとの病床の数、閉鎖中の床、男女の病室の数 | 病床管理の表 |
| 暦 | 曜日、祝日、年末年始、連休の前後 | 院内の暦 |
質を決めるのは、退院予定日の入力です。 入力されている患者の退院は、確からしさが高く出ます。入力されている割合が病棟ごとに違うと、見込みの当たり方も病棟ごとに違います。 運用を始めると、看護師長から「入力を増やしたい」という声が出ることが多く、それ自体がこの構成の効き目の1つです。
病名や検査値は入れません。 見込みに効きそうに見えますが、入れる項目を増やすほど、外に出せない情報を扱う範囲が広がります。 入院からの日数、術後の日数、診療科、入院の経路だけで足りるかを、先に確かめます。
データの取得方法を決める
電子カルテから、決まった列の並びで表の形に書き出す設定を作り、院内のネットワークの決まったフォルダに毎朝5時半に置きます。多くの電子カルテには、帳票や二次利用のための書き出しの機能があります。定時の書き出しが作れるかは、電子カルテの提供元に確かめます。 作れないうちは、夜勤の担当が書き出す運用で始めることになります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 在院の患者の一覧 | 電子カルテの書き出し | 見込む対象 |
| 過去の入退院 | 電子カルテの書き出し(月に1回) | 学ばせる記録 |
| 予定入院 | 入院予約の台帳 | 確定した入院の数 |
| 病床の数・閉鎖中の床 | 病床管理の表 | 空床の上限 |
患者の番号は、書き出すときに仮の番号に置き換えます。 置き換えの対応表は電子カルテの側に残し、この構成の側には持ちません。看護師長に確かめるときは、病棟と仮の番号から電子カルテで本人を引きます。
AIへ渡す前に整形する
- 入院ごとの記録を日ごとに広げる … 過去の入院を「入院からの日数ごとの行」に広げ、その日のうちに退院・転棟したかの列(した 1、しない 0)を作ります
- 転棟の扱いを決める … 病棟の空床を見込むので、転棟もその病棟からの「退出」として数えます。 転棟先の病棟には、転棟を「入院」として数えます
- 死亡退院の扱いを決める … 空床の数としては退院と同じに数えますが、見込みの資料には区分を出しません
- 術後の日数を作る … 手術の無い患者は値なし(NaN)のまま渡します
- 退院予定日までの日数を作る … 入力の無い患者は値なしのまま渡します
- 閉鎖中の床を引く … 修理や感染対策で閉じている床は、病床の数から引きます
- 長く入院している患者を分ける … 入院から60日を超える患者は、学ばせる記録の数が少ないので
long_stayの印を付けます
2番目を軽く見ないでください。 集中治療室から一般病棟への転棟は、一般病棟の側から見ると緊急入院と同じように床を埋めます。転棟を数えないと、集中治療室を持つ病院ほど、一般病棟の空床を多めに見込みます。
AIに処理させる
させるのは、在院の患者ごとに「各日の終わりまでに退院・転棟している確からしさ」を出すことと、病棟ごと・日ごとの緊急入院の数の平均を出すことです。 予定入院の数え上げ、抽選、空床への換算、印付けは、決まった計算で行います。
| 見込むもの | 使うもの | 判断できないときの扱い |
|---|---|---|
| 患者ごとのその日の退院・転棟の確からしさ | 入院からの日数、術後の日数、退院予定日までの日数、診療科、入院の経路、曜日、転院の調整中の印、年齢の帯 | 入院から60日超は long_stay |
| 病棟ごとの緊急入院の数の平均 | 曜日、祝日、連休明け、月、病床の数(exposure) | 新しく開いた病棟は new_ward |
| 病棟ごと・日ごとの空床(真ん中と少なめ) | 上の2つと予定入院の数の抽選 | 少なめの側が0未満なら tight |
4日先の確からしさは、1日ずつ積み重ねて出します。 明日の退院の確からしさを出し、明日まで残っていたとした場合のあさっての確からしさを出し、と続けます。入院からの日数と術後の日数は、1日ずつ進めて渡します。 4日分の確からしさを一度に出すより、項目の意味がずれません。
空床の数は、1万回の抽選で出します。 患者ごとの確からしさに従って「退院する・しない」を抽選し、緊急入院の数をポアソン分布で抽選し、予定入院を足し引きして、病床の数から在院の数を引いた残りを数えることを1万回繰り返します。 その真ん中と1割の位置が、空床の真ん中と少なめの数です。
病棟の空床を直接見込むモデルにしないのは、意図してのことです。 病棟ごとの日々の空床だけを学ばせると、誰が入院しているかという顔ぶれの違いを映せません。 術後の患者が多い週と、転院を待つ患者が多い週の違いは、病棟の平均からは出てきません。
| させないこと | 理由 |
|---|---|
| 個々の患者の退院の判断 | 主治医と患者・家族が決める |
| 退院を促す患者の一覧づくり | 見込みが退院を急がせる圧力になる |
| 入院を受けるかどうかの判断 | 病床管理の担当と当直の医師が、その時点の状況で決める |
| 病室・病床の割り当て | 男女・感染対策・看護の必要度で看護師長が決める |
| 病名や検査値からの推測 | 入力に入れない。記録にある日付と区分だけを使う |
2行目がいちばん起きやすい失敗です。 患者ごとの確からしさが出ていると、「確からしさの高い順に退院の調整を急ぐ」使い方を思いつきます。それは見込みの使い方ではなく、退院の判断への介入です。 資料には病棟ごとの合計だけを出し、患者ごとの確からしさは出しません。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、モデルの設定と計算の規則を書いておきます。
【退院・転棟の確からしさ】
- HistGradientBoostingClassifier(loss="log_loss")
- 1行 = 1入院 × 入院からの日数
- 目的の値 = その日のうちに退院・転棟したら 1、しなければ 0
- categorical_features = ["ward", "dept", "route", "weekday", "age_band"]
- 値なしのまま渡す項目 = 術後の日数、退院予定日までの日数
- 学ばせ方と確かめ方は TimeSeriesSplit(入院日の順に並べ、gap = 7日分)
【緊急入院の数】
- statsmodels の GLM(family=Poisson)
- 1行 = 1病棟 × 1日、目的の値 = 緊急入院と転棟による入りの数
- 項目 = 曜日、祝日、連休明け、月、切片(自分で足す)
- exposure = その日の病床の数(閉鎖中の床を引いたもの)
【抽選】
- 1万回、乱数の種は日付から決めて記録する
- 患者ごと … 日ごとの確からしさで binomial(1, p) を引き、退院した日以降は数えない
- 緊急入院 … 病棟ごとの平均で poisson を引く
- 予定入院 … 確定の予約は全数、仮の予約は数えない
- 空床 = 病床の数 − 在院の数(抽選後)− 入った数
【出す数】
- 真ん中 = 1万回の空床の中央値
- 少なめ = 1万回の空床の 10%の位置(10回のうち9回はこれ以上空く)
- 空床が負になる回の割合 = 定員を超える入りが見込まれる割合
【印を付ける条件】
- tight … 少なめの空床が 0 未満
- long_stay … 入院から60日超の患者が病棟の2割以上
- new_ward … 開いてから半年未満の病棟
- shift … 前日の見込みから真ん中の空床が3床以上動いた
- no_plan … 退院予定日の入力が病棟の患者の3割未満
- 印の無い病棟は、看護師長への電話なしで資料に載せる
少なめを1割の位置にするのは、意図してのことです。 受入れを約束してから空床が足りなくなると、専門外の病棟に入院してもらうか、受入れを取り消すことになります。 少なめの側で約束し、空いたら追加で受けるほうが、患者にも紹介元にも負担が小さく済みます。
空床が負になる回の割合を出すのは、病室の定員を超えないためです。 医療法施行規則第10条は、病室には定員を超えて患者を入院させないことを求めています(臨時応急のため入院させるときを除く)。この割合が高い日は、前もって転棟や転院の調整を進めるかを会議で決めます。
出力形式を固定する
病棟・日ごとに、次の形のJSONを作り、表にして病床調整の会議の資料に載せます。
{
"ward": "",
"date": "",
"beds_available": 0,
"census_now": 0,
"expected_out": { "p50": 0 },
"expected_emergency_in": { "mean": 0 },
"scheduled_in": 0,
"empty_beds": { "p50": 0, "p10": 0 },
"over_capacity_ratio": 0,
"discharge_plan_coverage": 0,
"flags": ["tight | long_stay | new_ward | shift | no_plan"],
"model_version": "",
"manager_note": { "empty_beds": null, "reason": "" }
}
1つ目の理由は、空床を「出る・入る・予定」に分けて見せられることです。 空床の見込みが少ないとき、退院が少ないのか、緊急入院が多いのか、予定入院が集まっているのかで、打つ手が違います。 予定入院が集まっているなら、別の病棟に振り分ける相談ができます。
2つ目は、discharge_plan_coverage を出せることです。 退院予定日が入力されている患者の割合で、この割合が低い病棟の見込みは幅が広くなります。 看護師長に入力を頼む材料になります。
3つ目は、manager_note で直した記録が残ることです。 看護師長に確かめて空床の数を直したら、その値と理由を書きます。翌日に、どちらが当たったかを比べられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 電子カルテ | 定時の書き出しのファイルの読み込み | 在院の患者、過去の入退院 |
| 入院予約の台帳 | 院内の共有フォルダの表の読み込み | 予定入院 |
| 病床管理の表 | 院内の共有フォルダの表の読み込み | 病床の数、閉鎖中の床 |
| 病床調整の会議の資料 | 院内の共有フォルダへの書き出し | 病棟 × 4日分の空床 |
電子カルテへは書き込みません。 出すのは会議の資料までで、退院予定日を自動で入れる、病室を自動で割り当てる、といった書き込みはしません。 書き込みを足すと、見込みが診療の記録に混ざります。
この構成は、院内のネットワークの中だけで動かします。 外部のサービスとはつなぎません。ライブラリの更新も、院内の手順で取り込みます。
人が確認する
病床管理の担当が電話するのは、印の付いた病棟だけです。 印の無い病棟は、資料の空床の見込みをそのまま会議に出します。全病棟に電話する運用を残すと、第10章の12.0時間には収まりません。
tightを先に見る … 少なめの空床が0を下回る病棟です。看護師長に退院の予定を確かめ、予定入院の振り分けを考えますshiftを見る … 前日から大きく動いた病棟は、夜間に緊急入院が続いたか、転院が決まったかを確かめますno_planとlong_stayを見る … 見込みの幅が広い病棟は、看護師長の見立てを優先します- 直したら理由を書く …
manager_noteに値と理由を残します
1番目で、見込みより看護師長の見立てを優先する場面があって構いません。 見込みは過去の記録から出した数で、今朝の患者の様子は知りません。 直した記録を残せば、どちらが当たりやすいかが分かってきます。
会議では、今日の分より3日先・4日先の行を先に見ます。 今日の空床は、会議の後の退院でどうせ動きます。数日先に tight が続く病棟があれば、その日の予定入院を別の病棟に振り分けるか、転院の調整を早めるかを、余裕のあるうちに決められます。 第3章の(d)で誰も数えていなかった部分が、この構成でいちばん使われる部分になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 電子カルテの書き出しが届いていない | 資料に「本日は見込みなし」と出し、従来の電話の聞き取りに戻す。前日の見込みを使わない |
| 病棟の病床の数が変わった | 病床管理の表を直してから動かす。表と書き出しの病床の数が合わなければ止める |
| 感染症の流行で病棟を閉じた | 閉鎖中の床として引く。流行の期間の記録は学ばせる記録で印を付け、別に扱う |
| 大きな事故などで緊急入院がまとまった | 見込みは使わず、災害時の手順に切り替える |
| 新しい診療科・病棟が開いた | 半年は new_ward。病床管理の担当の見立てを優先する |
| 退院予定日の入力が一斉に増えた・減った | 入力の運用の変更として記録し、学ばせ直す |
| 仮の番号と電子カルテの番号が合わない | その患者を見込みから外し、病床管理の担当に知らせる |
| 予定入院の予約が前日に取り消された | 入院予約の台帳の状態で数える。取り消しが台帳に入るのが遅い病棟は、仮の予約と同じに扱う |
| 外泊中の患者がいる | 在院として数える。外泊中の床は空床に数えない |
上から3行目は、毎年の冬に起きます。 感染症の流行の時期の記録は、平時と退院の仕方も緊急入院の数も違います。平時の記録と同じに学ばせると、流行が終わった後も見込みがずれます。 流行の期間に印を付けておき、平時の見込みからは外すか、項目として持たせます。
記録を残す
- 読み込んだ書き出しのファイルと、書き出した日時
- 病棟・日ごとの見込み(出る・入る・予定・空床の真ん中と少なめ)
- 抽選の乱数の種と、そのときのモデルの版
- 看護師長に確かめて直した値と理由
- 翌日以降の実際の空床と、見込みとの差
- 受入れを断った件数と、その日の見込み(病床管理の記録から)
- 月ごとの学ばせ直しの版と、切り替え前後の1週間の外れ方の比べ
乱数の種を残すのは、同じ朝の資料を後から作り直せるようにするためです。 種が無いと、1万回の抽選の結果は動かすたびに少しずつ変わり、会議で見た数と後で確かめた数が合わなくなります。
最後の行が、この構成の効き目を測る材料になります。 少なめの空床が0以上と見込んだ日に受入れを断っていたなら、見込みが楽観的すぎたか、病棟の振り分けがうまくいかなかったかのどちらかです。 理由を分けて記録します。
04実装レベルの3段階
最小構成では、患者の顔ぶれの違いが出ません。 平均の退院の数は、術後の患者が多い週も少ない週も同じです。確かめるための段階です。 半自動化で、空床を数える時間はほぼ無くなります。 ただし、少なめの数が出ないので、全病棟への電話は残ります。本格構成で、電話するのは印の付いた病棟だけになり、この段階が本記事の想定です。 差が大きいのは、看護師長への電話が、1病棟ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の見込みを1か月並べると、外れやすい病棟と、退院予定日の入力の少ない病棟が先に分かります。そこを直してから本格構成に進むほうが、印の付く病棟が減ります。
05工数削減シミュレーション
導入後 240件 × 3分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 一般病床が数百床あり、病棟が6〜10ほどに分かれた急性期の病院。病床管理の看護師や入退院支援の担当が、毎朝各病棟に電話して退院の予定を聞き、ホワイトボードと表計算で空床を数えている場合。救急や紹介の入院を受けるかどうかの判断が、病床管理の担当の経験に頼っている場合。電子カルテや医事の仕組みから、過去2年以上の入院・退院・転棟の記録を書き出せる場合。
- 病床が数十床で、病棟が1つか2つの病院。入院の大半が予定入院で、緊急入院がほとんど無い場合。退院や転棟の記録が紙に残っていて、日時をデータとして取り出せない場合。なお、個々の患者の退院の判断、入院を受けるかどうかの判断、病室の割り当ては、この構成では代替できません。
07最小構成で試す方法
- 電子カルテから、過去1年の入院ごとの入院日・退院日・病棟・診療科を書き出す
- 表計算で、病棟ごと・曜日ごとの退院の数と緊急入院の数の平均を出す
- 過去の1か月について、毎朝の在院の数と予約済みの予定入院から「平均の退院 − 平均の緊急入院 − 予定入院」で翌日の空床を出す
- 実際の翌日の空床と並べ、当時の病床管理の担当の見込み(ホワイトボードの写真や記録)とも比べる
- 外れの大きかった日に、どの病棟で何が起きていたかを書き出す
4番目の「当時の担当の見込みとも比べる」を省かないでください。 平均で出した見込みが担当の見込みより外れるなら、担当の見立てには平均に無い情報が入っているということです。 それが退院予定日なのか、患者の様子なのかを聞き取り、項目に足せるかを考えます。
| 出てきた内容 | 判断 |
|---|---|
| 平均の見込みでも担当の見込みと大差ない | Python で患者ごとの見込みに進む |
| 平均の見込みは外れるが、退院予定日の入力がある病棟は当たる | 退院予定日の入力の運用を広げるのが先 |
| 入退院の日付が書き出せない | 電子カルテの書き出しの設定を作るのが先 |
2行目が出ることは珍しくありません。 失敗ではなく、見込みの精度を上げる近道が分かったということです。 退院予定日の入力を増やしてから、もう一度試してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 転棟を数えず、一般病棟の空床を多めに見込む | 転棟を病棟からの退出・入りとして数える |
| 退院予定日の入力の割合が病棟ごとに違う | discharge_plan_coverage を出し、入力を頼む材料にする |
| 感染症の流行の時期を平時と同じに学ばせる | 流行の期間に印を付けて分ける |
| 患者ごとの確からしさが退院の催促に使われる | 資料には病棟ごとの合計だけを出す |
| 真ん中の空床で受入れを約束する | 少なめの側で約束し、空いたら追加で受ける |
| 未来の記録で学ばせて過去を確かめてしまう | TimeSeriesSplit で入院日の順に分け、gap を空ける |
| GLM に切片を入れ忘れる | 切片は既定で入らない。自分で足す |
| 病床の数が違う病棟を同じに扱う | exposure に病床の数を入れる |
| 閉鎖中の床を引き忘れる | 病床管理の表と書き出しの病床の数を突き合わせる |
| 書き出しが失敗した日に前日の見込みを使う | 「本日は見込みなし」と出し、電話に戻す |
| 病名や検査値を足したくなる | まず日付と区分だけで足りるかを確かめる |
| 4日分の確からしさを一度に出し、日数の項目がずれる | 1日ずつ進めて積み重ねる |
上の2行が、この構成の外れのほとんどです。 どちらも「病棟から出る・入る」の数え方の問題で、モデルを凝らすより、数え方をそろえるほうが効きます。
4行目は、外れではなく使い方の失敗です。 最初の説明会で、この資料は退院を急がせるためのものではないことを看護師長と医師に伝えておいてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 入院中の患者の入院日・手術日・退院予定日・診療科・年齢の帯、過去の入退院の記録です。病名は使いませんが、入院の事実そのものが要配慮個人情報に当たる診療の情報です。
- 院内のネットワークの外に出さない … 計算は院内の環境で行い、外部のサービスとはつなぎません。生成AIのサービスに在院の患者の一覧を貼り付けて見込ませる使い方はしません
- 患者の番号を仮の番号に置き換える … 置き換えの対応表は電子カルテの側に残し、この構成の側には持ちません
- 資料に患者ごとの確からしさを出さない … 病棟ごとの合計だけを出します。患者ごとの値は、退院の判断への圧力になります
- 見られる人を絞る … 書き出しのファイルと学ばせる記録は、病床管理の担当と作る人に限ります
- 受入れを自動で断らない … 見込みが0を下回っても、受け入れるかどうかは病床管理の担当と当直の医師が決めます。病室の定員を超えない範囲で、臨時応急の判断は人に残します
- 院内の規程に沿って手続きをする … 診療の記録を診療以外の目的(病床の運用)に使うことを、院内の情報の管理の委員会などで確かめてから始めます
誤りが起きた場合のリスクは、空床を多めに見込んで受入れを約束し、病室が足りなくなることと、少なめに見込みすぎて受入れを断ることの2つです。 前者は転棟の数え忘れと真ん中での約束から起き、後者は流行の時期の記録が平時に混ざると起きます。
10まず何から始めるか
1週目:入退院の記録を書き出す
電子カルテから、過去1年の入院ごとの入院日・退院日・転棟日・病棟・診療科を書き出します。転棟の日付まで取れるかを最初に確かめます。取れなければ、提供元に書き出しの設定を相談します。
2週目:平均で翌日の空床を見込む
第8章の手順で、病棟ごと・曜日ごとの平均から翌日の空床を出し、当時の担当の見込みと実際の空床と並べます。どの病棟で外れが大きいかを見ます。
3週目:院内の手続きと退院予定日の運用
診療の記録を病床の運用に使うことを、院内の情報の管理の委員会に諮ります。あわせて、退院予定日の入力の割合を病棟ごとに数え、看護師長と入力の運用をそろえます。
4週目:Python で患者ごとの見込みを出す
HistGradientBoostingClassifier で退院・転棟の確からしさを学ばせ、病棟ごとの空床の真ん中を4日分出します。この時点では会議に出さず、毎朝の担当の見込みと並べて記録します。
2か月目: 緊急入院の見込みと抽選による少なめの数、印付けを足し、会議の資料に載せます。3か月目以降: 毎朝の定時実行にし、1件10分が何分になったかを実測します。電話する病棟が印の付いた病棟だけになり、紹介元への4日先の返事がその場でできるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
loss が 'log_loss' で、2つの区分ではロジスティックの関数で正の区分の確からしさを出すこと。predict_proba で区分ごとの確からしさを返すこと。欠けた値をそのまま扱い、分かれ目ごとに左右どちらへ送るかを改善の大きさから学ぶこと。categorical_features の既定が "from_dtype" であること | scikit-learn: HistGradientBoostingClassifier | 2026-10-15 |
一般化線形モデルで、family に分布を選べること。切片が既定では入らないこと。exposure の対数が線形の予測に係数1で加わり、対数の結び付けのときだけ使えること | statsmodels: GLM | 2026-10-15 |
二項分布から抽選し、n と p(0以上1以下)を配列で渡せること。size を省くと n と p の形に合わせて抽選されること | NumPy: Generator.binomial | 2026-10-15 |
時間の順に並んだデータを分けること。gap で学ばせる期間の末尾を確かめる期間との間で除けること | scikit-learn: TimeSeriesSplit | 2026-10-15 |
| 病院の管理者は、病室に定員を超えて患者を入院させないこと、病室でない場所に入院させないことなどを守らなければならず、臨時応急のため入院させるときはこの限りでないこと(第10条) | e-Gov 法令API: 医療法施行規則(昭和23年厚生省令第50号) | 2026-10-15 |
診療の記録を病床の運用に使えるかは、院内の情報の管理の規程と委員会の判断で確かめてください。 本記事は上記の公開資料で確認できた範囲だけを扱っており、診療報酬上の病床の扱いは扱っていません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1748)についてのご相談はこちらから。
