TL;DR
不是先買模型,而是先把 資料(Data) 做乾淨、做可追蹤,對齊 價值 = 病人重視的成果 / 提供該成果的成本。用「精實」消除浪費,讓 AI 只在最能放大價值的節點上場。
Value = Health outcomes that matter to patients ÷ Costs of delivering the outcomes。結論:AI ≠ 先訓練模型;AI = 先讓資料能量化價值(成果、成本、流程),再把 AI 放進最能創造價值的節點。
[層 1] 資料源頭(EHR/EMR、護理紀錄、藥品耗材、穿戴裝置、日照打卡) ↓ [層 2] 標準化與治理(時間戳、一人一碼、事件化、稽核、權限) ↓ [層 3] 價值資料集(Outcomes、Cost、Process、Satisfaction 四大主表) ↓ [層 4] 分析與AI(描述→診斷→預測→建議;含管控圖、風險分層、最適排程) ↓ [層 5] 臨床與營運應用(看板/KPI、提醒/路徑、成本對照、決策回饋)
tbl_outcomes(病人重視的成果)| 欄位 | 型別 | 說明 |
|---|---|---|
| person_id | string | 病人代碼(去識別化) |
| date | date | 評估日期 |
| outcome_code | string | 量表/指標(e.g., ADL、疼痛NRS、跌倒、返院) |
| outcome_value | numeric | 數值 |
| meaningful_change | boolean | 是否達到臨床顯著變化(MCID) |
tbl_costs(提供成果的成本)| 欄位 | 型別 | 說明 |
|---|---|---|
| cost_id | string | 成本記錄碼 |
| person_id | string | 病人代碼(可空) |
| activity_code | string | 活動/處置/耗材 |
| qty | numeric | 用量 |
| unit_cost | numeric | 單位成本 |
| total_cost | numeric | qty * unit_cost |
| cost_center | string | 單位/科別 |
tbl_process(流程事件)| 欄位 | 型別 | 說明 |
|---|---|---|
| event_id | string | 事件ID |
| person_id | string | 病人代碼 |
| step | string | 流程步驟(到院、評估、用藥、復能、轉銜…) |
| timestamp | datetime | 時間戳 |
| wait_sec | int | 等待秒數 |
| walk_steps | int | 走動步數(可由定位/計步推估) |
tbl_satisfaction(病人/家屬滿意)| 欄位 | 型別 | 說明 |
|---|---|---|
| survey_id | string | 問卷ID |
| person_id | string | 病人代碼 |
| domain | string | 面向(溝通、環境、尊重、等候…) |
| score | int | 1–5 |
person_id(去識別化)、timestamp(ISO 8601)、event_id。outcome_code、activity_code、cost_center 皆有版本與生效日期。Σ(達到MCID的人數) / Σ(總成本)
小訣竅:每個 KPI 都要能追溯到原始事件與成本來源,否則 AI 很難學到真實關係。
sql
-- 1) 找出「無法對應到任何病人」的成本(可能是共用耗材,應有分攤規則)
SELECT cost_id, activity_code, total_cost
FROM tbl_costs
WHERE person_id IS NULL;
-- 2) 以流程事件串成本:同日、同科別、同活動碼的對應率
SELECT p.person_id, p.step, c.activity_code, COUNT(*) AS join_cnt
FROM tbl_process p
LEFT JOIN tbl_costs c
ON p.person_id = c.person_id
AND DATE(p.timestamp) = DATE(c.created_at)
AND p.step = c.activity_code
GROUP BY 1,2,3;
-- 3) 產生「等待>15分」的瓶頸清單
SELECT step, AVG(wait_sec)/60.0 AS avg_wait_min, COUNT() AS cnt
FROM tbl_process
GROUP BY step
HAVING AVG(wait_sec) > 1560
ORDER BY avg_wait_min DESC;
從精實到 AI:先抓浪費,再上模型
紅字精神(精實重點)→ AI 任務對照
紅字重點 典型資料欄位 AI 任務
消除障礙/浪費 wait_sec, walk_steps, handoff_count 流程瓶頸偵測、排程建議
專注照護品質 outcome_value, meaningful_change 預測誰最可能受益、個人化路徑
破除各自為政 cost_center, step, timestamp 跨部門路徑圖、關聯規則
為病人創造價值 outcomes ÷ costs 價值貢獻度分析、策略模擬
Python 範例:用事件資料做「價值貢獻」粗估(可先跑在 Jupyter)
import pandas as pd
outcomes = pd.read_csv("tbl_outcomes.csv", parse_dates=["date"])
costs = pd.read_csv("tbl_costs.csv")
process = pd.read_csv("tbl_process.csv", parse_dates=["timestamp"])
sat = pd.read_csv("tbl_satisfaction.csv")
win = outcomes.query("meaningful_change == True").groupby("person_id")["outcome_code"].nunique().reset_index(name="n_wins")
cost_pm = costs.groupby("person_id", as_index=False)["total_cost"].sum().rename(columns={"total_cost":"cost_per_period"})
value_idx = win.merge(cost_pm, on="person_id", how="left")
value_idx["value_index"] = value_idx["n_wins"] / value_idx["cost_per_period"].clip(lower=1)
top20_cut = value_idx["value_index"].quantile(0.8)
top20 = value_idx[value_idx["value_index"] >= top20_cut]["person_id"]
feat = process[process["person_id"].isin(top20)]
print(feat.groupby("step")["wait_sec"].mean().sort_values())
目的:先用最小資料找「高價值模式」(例如同樣成本下,誰的 ADL/疼痛改善更快、等待更短),再設計 AI 任務與個管規則。
小型院所/日照的三週落地清單(不改核心系統也能做)
Week 1
訂 person_id 去識別規則,補 timestamp。
盤點 10 個最常見的 activity_code 與其單位成本。
建 4 張 Minimal 表(Outcomes/Costs/Process/Satisfaction),先 CSV。
Week 2
做 6 個 KPI:跌倒率、再住院、平均等待、報損率、每人成本、滿意度。
針對等待>15分的流程,畫出跨部門泳道圖,定義 3 個消除浪費行動。
Week 3
實施一項「等待時間」改善,紀錄前後數據。
建立 Value Index 看板;每週檢討一次(醫、護、社工、管考同桌)。
治理與合規(一定要做)
隱私:去識別(tokenize)、最小可用、用途告知、加密靜態/傳輸。
資料生命週期:保留年限、刪除流程、第三方存取審核。
模型治理:資料漂移監測、再訓練門檻、人工覆核、失效下線機制。
稽核軌跡:資料/特徵/模型/推論全程可追溯(誰、在何時、對誰、做了什麼)。
常見誤區 vs 正確做法
誤:先買 AI 方案 → 正:先把 Outcomes/Costs/Process 打通,算得出 Value。
誤:資料很多就夠 → 正:要對齊價值且可追溯。
誤:KPI 越多越好 → 正:先盯住 6 個核心,能週週改善最有用。
誤:AI 取代人 → 正:AI 支援醫護,讓專業時間用在真正有價值的照護。
結語:讓 AI 站在「價值」這一邊
當資料可以同時連結 患者重視的成果 與 提供該成果的成本,精實帶來的「減浪費」「專注品質」就能被量化,AI 也才能對準最該發力的地方。
先 Data、後 AI;先價值、後功能。
附錄:最小事件 JSON(給前端/裝置寫入用)
{
"event_id": "evt_2025_0001",
"person_id": "p_3f9c1f",
"step": "vitals_check",
"timestamp": "2025-10-30T09:12:33+08:00",
"attr": {
"wait_sec": 420,
"room": "D01",
"nurse_id": "n_12",
"walk_steps": 35
}
}