要件定義書:リハビリサービス運営ダッシュボード生成システム
v1.0 | 作成日: 2026年2月20日 | 対象: dashboard_generator.py + Cloudflare Pages デプロイ
1. システム概要
介護保険の訪問リハビリテーション・通所リハビリテーションの実績データ(Excel)から、年度別(4月~3月)の運営分析ダッシュボードを単体HTMLファイルとして自動生成するPythonスクリプト。生成されたHTMLをCloudflare Pagesにデプロイし、パスワード保護付きでWeb共有する。
主な特徴
- CSS/JS全て埋め込みの単体HTML(外部依存なし、オフライン閲覧可能)
- 複数年度のExcelを一括処理し、年度タブで切り替え表示
- 訪問リハ・通所リハを左右2カラムで常に並列比較
- 損益分岐点・人件費率のインタラクティブ計算
- 年度間比較・季節性分析(複数年度の場合)
- Basic認証付きCloudflare Pagesデプロイ
2. 前提条件・環境
| 項目 | 要件 |
| OS | Windows 10/11 |
| Python | 3.8以上 |
| 必須ライブラリ | pandas, openpyxl |
| E2Eテスト | playwright(オプション) |
| デプロイ | Node.js 18+, wrangler(npx経由), Cloudflareアカウント |
3. 入力データ仕様
介護保険の請求実績Excelファイル。1ファイル=1ヶ月分。複数ファイルを1フォルダに配置して一括処理。
必須列
| 列名 | 型 | 例 | 用途 |
ID番号 | 文字列/数値 | 12345 | 利用者識別(主キー) |
サービス内容 | 文字列 | 予防訪問リハ, 通所リハ | 4分類の判定 |
要介護度 | 文字列 | 要支援1, 要介護度3 | 要支援/要介護の区分 |
サービス提供年月 | 数値 | 202509 | 年月識別・年度判定 |
サービス実日数 | 数値 | 8 | 実利用日数 |
合計金額 | 数値 | 48520 | 請求額 |
オプション列
| 列名 | 用途 |
保険者番号 | 複合キーの一部(同一利用者の年度跨ぎ識別) |
被保険者番号 | 保険者番号が無い場合のフォールバック |
合計回数 | 訪問回数(加算分析用) |
サービス提供時間 | 提供時間(分) |
開始時間 / 終了時間 | 時間区分分析用(HH:MM形式) |
ファイル形式: .xlsx(openpyxl)または .csv(cp932/UTF-8自動判定)。サブフォルダ内のファイルも再帰的に検索。
4. サービス分類ロジック
4分類ルール
| 分類名 | サービス内容の条件 | 要介護度の条件 | 集約先 |
| 予防訪問 | 「予防訪問」を含む | 要支援のみ | houmon(訪問リハ) |
| 訪問 | 「訪問」を含む(「予防」を含まない) | 要介護のみ |
| 予防通所 | 「予防通所」を含む | 要支援のみ | tsusho(通所リハ) |
| 通所 | 「通所」を含む(「予防」を含まない) | 要介護のみ |
バリデーション: 分類結果を3回検証し、要支援なのに「訪問」、要介護なのに「予防訪問」等の矛盾がないかチェック。不整合があればコンソールに警告。
要介護度の正規化
# 「要介護度1」→「要介護1」に統一
# 「要支援1」「要支援2」はそのまま
# 区分: 「支援」を含む → 要支援、それ以外 → 要介護
5. ユーザー識別(複合キー)
同一利用者を年度を跨いで正確に追跡するための複合キー uid を生成。
# 優先順位:
1. 保険者番号 + ID番号 (保険者番号が存在し、1件でも非NaN)
2. 被保険者番号 + ID番号(被保険者番号が存在し、1件でも非NaN)
3. ID番号のみ (フォールバック)
# 生成例:
uid = "123456_12345" # 保険者番号_ID番号
# 前処理:
- ID番号がNaNの行は除外
- 文字列化してstrip()で空白除去
表示用ID: ダッシュボードの利用者一覧には元の ID番号(disp_id)を表示。uid は内部計算用。
6. 計算項目一覧
6-1. KPIカード(年度サマリー)
| # | 指標 | 計算式 | 色 |
| 1 | 年度 累計売上 | Σ 全月の合計金額(訪問+通所) | blue |
| 2 | 月平均 利用者数 | Σ 各月利用者数 ÷ 月数 | teal |
| 3 | 月平均 売上 | 年度累計売上 ÷ 月数 | green |
| 4 | 訪問 平均キャンセル率 | 年度通算キャンセル率 | amber |
| 5 | 通所 平均キャンセル率 | 年度通算キャンセル率 | red |
| 6 | 最新月 併用利用者数 | 訪問 ∩ 通所の利用者ID重複数 | purple |
6-2. キャンセル率
# 契約区分の推定(月の実日数から)
1~4日 → 週1契約(期待日数 = 4日/月)
5~8日 → 週2契約(期待日数 = 8日/月)
9~12日 → 週3契約(期待日数 = 12日/月)
13日以上 → 週4契約(期待日数 = 16日/月)
# キャンセル率
cancel_rate = (期待日数 - 実日数) / 期待日数 × 100
6-3. 加算分析
各加算(リハビリマネジメント加算、社会参加支援加算、移行支援加算など)について:
- 取得ユーザー数 / 全体ユーザー数
- 取得率(%)
- 加算収益額(¥)
6-4. 時間区分分析(訪問リハのみ)
# 連続セッションを1枠として判定
# 各ユーザーの最頻セッション数から推定:
1セッション連続 → 40分契約
2セッション以上 → 60分契約
6-5. 要介護・要支援別 売上分析
訪問・通所それぞれについて:
- 要介護 売上額 / 利用者数 / 平均単価
- 要支援 売上額 / 利用者数 / 平均単価
バーチャート表示: 要介護度別(要支援1~要介護5)の利用者分布。0名の介護度も「0名」と表示する。小さい割合(20%未満)はバー内テキスト非表示→下部ラベルに表記。
6-6. 利用期間・連続利用(全履歴ベース)
# 全利用期間(スパン)
duration = (最終月 - 初回月) の月数差 + 1
# 実利用月数
actual_months = 実際に利用があった月の数
# 連続利用月数(最長連続ストリーク)
月番号に変換 → 連続する月を検出 → 最長の連続区間
# 直近連続月数
最終利用月から遡って何ヶ月連続しているか
# 統計値
平均、中央値、最小、最大(スパン・連続利用それぞれ)
6-7. 利用継続率(年度内)
# 年度内で各ユーザーが何ヶ月利用したか
# 分布: 1ヶ月=N名, 2ヶ月=N名, ... 12ヶ月=N名
# 統計: 平均、最小、最大、中央値
6-8. 損益分岐点・利益計算 インタラクティブ
# 入力(JavaScriptで即時計算)
月額コスト(¥) ... 訪問・通所それぞれ
月額人件費(¥) ... 訪問・通所それぞれ
# 計算
年度利益 = 年度売上 - (月額コスト × 月数)
人件費率 = (月額人件費 × 月数) ÷ 年度売上 × 100
# 評価基準(色分け)
人件費率 ≤ 50% → 良好(緑)
50% < 人件費率 ≤ 70% → 注意(黄)
人件費率 > 70% → 要改善(赤)
6-9. 併用利用者
# 同一月内で訪問 ∩ 通所を利用した利用者
concurrent_users = houmon_user_ids ∩ tsusho_user_ids
# 年度サマリー
- 月平均 併用利用者数
- 年度内ユニーク併用利用者数
6-10. 年度間比較(複数年度の場合)
- 利用者数トレンド(年度別、訪問/通所別)
- 売上トレンド(年度別、訪問/通所別)
- 平均単価トレンド
- キャンセル率推移
- 季節性分析(月別平均、季節指数、変動係数)
7. ダッシュボードUI構造
┌─ ヘッダー (.hdr)
│ タイトル / サブタイトル / メタ情報(年度数・月数・生成日)
│
├─ タブバー (.tab-bar)
│ [2025年度(R7) 1ヶ月] [2024年度(R6) 12ヶ月] ... [年度間比較]
│
├─ 年度パネル (.tab-panel) × N年度
│ ├─ パネルヘッダー(年度名・集計期間)
│ ├─ KPI 6カード (.srow6) ← 3列グリッド
│ ├─ 損益分岐点・利益計算 (.bep-section)
│ ├─ 月別推移チャート (.dg) ← 訪問(左) / 通所(右) SVGバーチャート
│ ├─ 月別詳細比較表 (full-width テーブル)
│ ├─ 併用利用者セクション
│ ├─ 4分類別売上(予防訪問/訪問/予防通所/通所)
│ ├─ 利用期間・連続利用(全履歴ベース)
│ ├─ 最新月の詳細 (.dg)
│ │ ├─ 訪問リハ: 要介護度分布, 加算取得率, 時間契約, キャンセル
│ │ └─ 通所リハ: 同上
│ ├─ サービス種別 比較一覧テーブル
│ ├─ キャンセル率 比較
│ └─ 利用者一覧 (.dg) ← 訪問(左) / 通所(右)
│
├─ 年度間比較パネル(複数年度の場合のみ)
│ ├─ トレンド分析チャート
│ ├─ 年度比較チャート(利用者数/売上/キャンセル率)
│ └─ 季節性分析
│
└─ フッター (.ft)
レイアウト鉄則: .dg(2列グリッド)では必ず左=訪問リハ、右=通所リハ。E2Eテストで逆転を検出。
8. CSS設計仕様
カラーパレット(CSS変数)
| 変数名 | 値 | 用途 |
--bg | #f5f6fa | ページ背景 |
--card | #fff | カード背景 |
--border | #e8eaef | 境界線 |
--text-primary | #1a1d26 | 本文 |
--text-secondary | #6b7080 | 補助テキスト |
--houmon-primary | #2563eb | 訪問リハ(青) |
--houmon-light | #eff4ff | 訪問リハ背景 |
--tsusho-primary | #0d9488 | 通所リハ(ティール) |
--tsusho-light | #ecfdf5 | 通所リハ背景 |
--accent-warn | #f59e0b | 警告(琥珀) |
--accent-danger | #ef4444 | 危険(赤) |
--accent-success | #10b981 | 成功(緑) |
--radius | 14px | 角丸 |
主要CSSクラス
| クラス | 用途 |
.ctn | メインコンテナ(max-width: 1360px) |
.srow6 | KPIカード3列グリッド |
.dg | 2列グリッド(訪問/通所並列、align-items: start) |
.mg / .mg4 | 3列 / 4列メトリクスグリッド |
.sc | 統計カード(.bl/.tl/.gn/.am/.rd/.ppで色分け) |
.cd | コンテンツカード |
.cd.fw | 全幅カード |
.dt | データテーブル |
.bar-row | 要介護度バーチャート行 |
.stk | 積み重ねバー(要支援/要介護比率) |
.bep-section | 損益分岐点セクション |
.tg-h / .tg-t | 訪問タグ / 通所タグ |
KPIカード数値: font-size:24px; white-space:nowrap; overflow:visible で切れ防止。フォントは 'DM Sans'(Google Fonts埋め込み)。
9. JavaScript機能仕様
9-1. calcAll(el) — 損益・人件費率の即時計算
入力イベント: oninput で呼び出し
1. 入力値のカンマ除去 → 数値化 → カンマ再フォーマット
2. パネル内の年度売上(data-revenue)・月数(data-months)を取得
3. 利益計算: revenue - (cost × months)
4. 人件費率: (labor × months) / revenue × 100
5. 色分け表示(≤50%=green, 50-70%=yellow, >70%=red)
9-2. switchTab(id) — タブ切り替え
全パネルから .active 除去 → 指定パネルに .active 付与
利用者テーブルの遅延ロード(pop関数)も実行
9-3. pop(id) — 利用者テーブル遅延ロード
userData オブジェクトからデータを取得し、
tbodyが空のテーブルに行を動的挿入
(初期ロード高速化のため)
10. 出力ファイル仕様
| 項目 | 仕様 |
| 形式 | 単体HTMLファイル(CSS/JS全て埋め込み) |
| エンコーディング | UTF-8 |
| ファイル名 | ダッシュボード_[年度範囲]_[YYYYMMDD_HHMM].html |
| 出力先 | 出力/ ディレクトリ(自動作成) |
| サイズ目安 | 200~400KB(データ量による) |
| 閲覧環境 | モダンブラウザ(Chrome, Edge, Firefox, Safari) |
11. CLI・バッチ仕様
コマンドライン引数
python dashboard_generator.py [オプション] [ファイル...]
--data-dir, -d <DIR> 実績データフォルダ(再帰検索: *.xlsx, *.csv)
--output, -o <FILE> 出力先ファイルパス
files(位置引数) 個別ファイル指定
バッチファイル(ダッシュボード生成.bat)
1. chcp 65001(UTF-8設定)
2. Python存在確認
3. pandas/openpyxl ライブラリ確認 → なければ pip install
4. PowerShell select_folder.ps1 でフォルダ選択GUI表示
5. 選択フォルダを --data-dir に渡して実行
6. 完了後 pause で結果確認
select_folder.ps1
COM FileOpenDialog(モダンUI)でフォルダ選択
→ フォールバック: FolderBrowserDialog
→ 結果を %TEMP%\folder_result.txt に書き出し
12. Cloudflare Pagesデプロイ
デプロイ構成
dist/
├── index.html ← ダッシュボードHTML
└── _worker.js ← Basic認証ミドルウェア(Advanced Mode)
_worker.js(認証ミドルウェア)
export default {
async fetch(request, env) {
const AUTH_USER = 'admin';
const AUTH_PASS = '****'; // 設定したパスワード
const auth = request.headers.get('Authorization');
if (auth && auth.startsWith('Basic ')) {
const [user, pass] = atob(auth.slice(6)).split(':');
if (user === AUTH_USER && pass === AUTH_PASS) {
return env.ASSETS.fetch(request); // 静的アセット配信
}
}
return new Response('認証が必要です', {
status: 401,
headers: { 'WWW-Authenticate': 'Basic realm="Dashboard"' }
});
}
};
デプロイコマンド
# 初回: プロジェクト作成
npx wrangler pages project create dashboard-rehab --production-branch=main
# デプロイ(初回以降共通)
npx wrangler pages deploy dist --project-name=dashboard-rehab
# 削除
npx wrangler pages project delete dashboard-rehab
13. E2Eテスト仕様
テスト内容(Playwright)
| チェック項目 | 内容 |
| ヘッダー表示 | タイトルが正しく表示されるか |
| タブ切り替え | 各年度タブが正常に動作するか |
| レイアウト整合性 | .dg グリッドで左=訪問、右=通所が守られているか(座標ベース検証) |
| フルページキャプチャ | 各タブのフルページスクリーンショット |
| セクション別キャプチャ | ヘッダー、KPI、チャート、テーブル等の個別スクリーンショット |
出力先: 出力/e2e_screenshots/
14. フォルダ構成
dashboard_deploy/
├── dashboard_generator.py ← メインスクリプト(約1950行)
├── ダッシュボード生成.bat ← GUI実行用バッチ
├── select_folder.ps1 ← フォルダ選択ダイアログ
├── e2e_visual_test.py ← E2Eテスト(Playwright)
├── install.bat ← 環境セットアップ
├── dist/ ← デプロイ用
│ ├── index.html
│ └── _worker.js
├── 実績データ/ ← Excelデータ配置先
│ └── *.xlsx
├── 出力/ ← 生成HTML出力先
│ ├── ダッシュボード_*.html
│ └── e2e_screenshots/
├── ダッシュボード更新手順.html ← 操作手順書
└── 要件定義書_*.html ← 本ドキュメント
15. 再現用AIプロンプト
以下のプロンプトをAIに渡すことで、本システムをゼロから再構築できます。段階的に実行することを推奨します。
Phase 1: コアエンジン作成
# Phase 1: ダッシュボード生成スクリプト(Python)
## 目的
介護保険の訪問リハビリ・通所リハビリの実績データ(Excel)から、年度別(4月~3月)の
運営分析ダッシュボードを**単体HTMLファイル**として自動生成するPythonスクリプトを作成してください。
## 入力データ
- 形式: Excel(.xlsx) または CSV。1ファイル=1ヶ月分
- 必須列: ID番号, サービス内容, 要介護度, サービス提供年月(YYYYMM), サービス実日数, 合計金額
- オプション列: 保険者番号, 被保険者番号, 合計回数, サービス提供時間, 開始時間, 終了時間
- サブフォルダ内も再帰検索
## サービス4分類
「サービス内容」列から以下の4分類に振り分け:
- 予防訪問(「予防訪問」を含む)→ houmon として集約
- 訪問(「訪問」を含み「予防」を含まない)→ houmon として集約
- 予防通所(「予防通所」を含む)→ tsusho として集約
- 通所(「通所」を含み「予防」を含まない)→ tsusho として集約
分類結果を3回バリデーション(要支援なのに訪問、等の矛盾がないか)
## ユーザー識別(複合キー)
年度を跨いで同一利用者を追跡するため uid を生成:
1. 保険者番号 + "_" + ID番号(保険者番号が存在する場合)
2. 被保険者番号 + "_" + ID番号(フォールバック)
3. ID番号のみ(最終フォールバック)
ID番号がNaNの行は除外する。表示用には元のID番号を使う。
## 計算項目(全て訪問・通所それぞれに算出)
1. **KPI**: 年度累計売上、月平均利用者数、月平均売上、キャンセル率、併用利用者数
2. **キャンセル率**: 実日数から契約区分を推定(1-4日=週1,5-8日=週2,9-12日=週3,13日+=週4)
cancel_rate = (期待日数 - 実日数) / 期待日数 × 100
3. **加算分析**: 各加算の取得者数・取得率・収益額
4. **時間区分**(訪問のみ): 連続セッション数から40分/60分契約を推定
5. **要介護・要支援別**: 売上額・利用者数・平均単価
6. **利用期間(全履歴)**: スパン(初回~最終月)、連続利用月数(途切れない最長期間)、
実利用月数、直近連続月数。統計値: 平均・中央値・最小・最大
7. **利用継続率(年度内)**: 年度内で何ヶ月利用したかの分布
8. **併用利用者**: 訪問∩通所の重複利用者数
9. **年度間比較**(複数年度時): 利用者数/売上/単価のトレンド、季節性分析
## CLI引数
argparse で以下を実装:
- --data-dir, -d: データフォルダパス(再帰glob検索)
- --output, -o: 出力ファイルパス
- 位置引数: 個別ファイルリスト
出力デフォルト: 出力/ダッシュボード_[年度範囲]_[YYYYMMDD_HHMM].html
## 技術要件
- Python 3.8+, pandas, openpyxl
- 出力は単体HTML(CSS/JS全て埋め込み、外部依存なし)
- 年度 = 4月~翌3月(fiscal year)
- コメントは日本語で記述
Phase 2: ダッシュボードUI
# Phase 2: HTML/CSS/JS のUI設計
Phase 1で作成したスクリプトが生成するHTMLのUI仕様:
## レイアウト原則
- 最大幅1360px、中央配置
- 年度別タブ切り替え(複数年度の場合 + 年度間比較タブ)
- 2列グリッド(.dg)では必ず **左=訪問リハ(青)、右=通所リハ(ティール)**
- align-items: start(左右の高さが異なっても上揃え)
## カラーパレット
- 訪問リハ: --houmon-primary: #2563eb(青)/ --houmon-light: #eff4ff
- 通所リハ: --tsusho-primary: #0d9488(ティール)/ --tsusho-light: #ecfdf5
- 成功: #10b981 / 警告: #f59e0b / 危険: #ef4444
- 背景: #f5f6fa / カード: #fff / 角丸: 14px
## KPIカード(.srow6 = 3列グリッド)
6枚のカード。数値フォント: 'DM Sans'(Google Fonts埋め込み)
font-size:24px; white-space:nowrap; overflow:visible で数値切れ防止
## 損益分岐点セクション(インタラクティブ)
訪問・通所それぞれに:
- 月額コスト入力(¥、3桁カンマ自動フォーマット)
- 月額人件費入力(¥、3桁カンマ自動フォーマット)
- 年度利益表示(黒字=緑、赤字=赤)
- 人件費率表示(≤50%=緑, 50-70%=黄, >70%=赤)
JavaScript oninput で即時計算。各パネルのdata属性から年度売上・月数を取得。
## 要介護度バーチャート
- 要支援1~要介護5の7段階
- 0名の介護度も行を表示(「0名」と表記)
- 小さい割合(20%未満)はバー内テキスト非表示→バー下部にラベル表示
## 利用者テーブル(遅延ロード)
userData オブジェクトに全データを格納し、タブ切り替え時に
初回のみDOMに行を挿入(初期ロード高速化)
## 月次推移チャート
SVGバーチャートで月別利用者数を表示(2ヶ月以上の場合のみ)
## 印刷対応
@media print でタブバー非表示、全パネル表示、背景白
Phase 3: バッチファイル・フォルダ選択
# Phase 3: Windows バッチファイル + フォルダ選択GUI
## ダッシュボード生成.bat
1. chcp 65001 でUTF-8設定
2. Python 存在確認(python --version)
3. pandas, openpyxl 確認 → なければ pip install
4. PowerShell で select_folder.ps1 実行
5. 選択されたフォルダパスを %TEMP%\folder_result.txt から読み取り
6. dashboard_generator.py --data-dir "選択フォルダ" を実行
7. エラー時も pause でターミナルを閉じない
## select_folder.ps1
COM FileOpenDialog(モダンUI)でフォルダ選択ダイアログ表示
→ 失敗時は FolderBrowserDialog にフォールバック
→ 選択結果を $env:TEMP\folder_result.txt に書き出し
Phase 4: Cloudflare Pagesデプロイ + Basic認証
# Phase 4: Cloudflare Pages デプロイ(パスワード保護付き)
## 手順
1. dist/ フォルダを作成
2. 生成したHTMLを dist/index.html としてコピー
3. dist/_worker.js を作成(Cloudflare Pages Advanced Mode)
- HTTP Basic認証をサーバーサイドで実装
- env.ASSETS.fetch(request) で静的アセット配信
- 認証失敗時は 401 + WWW-Authenticate ヘッダ
4. プロジェクト作成: npx wrangler pages project create [name] --production-branch=main
5. デプロイ: npx wrangler pages deploy dist --project-name=[name]
## _worker.js テンプレート
export default {
async fetch(request, env) {
const AUTH_USER = 'admin';
const AUTH_PASS = '設定したパスワード';
const auth = request.headers.get('Authorization');
if (auth && auth.startsWith('Basic ')) {
const [user, pass] = atob(auth.slice(6)).split(':');
if (user === AUTH_USER && pass === AUTH_PASS) {
return env.ASSETS.fetch(request);
}
}
return new Response('認証が必要です', {
status: 401,
headers: { 'WWW-Authenticate': 'Basic realm="Dashboard"' }
});
}
};
Phase 5: E2Eテスト
# Phase 5: E2E ビジュアルテスト(Playwright)
## テスト内容
1. 出力フォルダから最新の ダッシュボード_*.html を自動検出
2. Playwright でヘッドレスブラウザを起動(1920x1080)
3. 以下のスクリーンショットを撮影:
- ヘッダー、KPI、月次チャート、テーブル、サービス詳細
- 各タブのフルページキャプチャ
4. レイアウト検証:
- 各 .dg グリッド内で左の子要素 = 訪問(.tg-h)、右 = 通所(.tg-t)
- getBoundingClientRect() の x座標で左右判定
- 逆転していればエラー報告
5. 結果を 出力/e2e_screenshots/ に保存
一括プロンプト(全フェーズ統合版)
上記Phase 1~5を全て統合した単一プロンプトです。コピーしてそのまま使えます。
## リハビリサービス運営ダッシュボード生成システム — 全体設計書
以下の仕様で、介護保険の訪問リハビリ・通所リハビリの実績データ(Excel)から
年度別(4月~3月)の運営ダッシュボードを自動生成するシステムを構築してください。
### 技術スタック
- Python 3.8+ (pandas, openpyxl)
- 出力: 単体HTML(CSS/JS埋め込み、外部依存なし)
- デプロイ: Cloudflare Pages + Basic認証(_worker.js)
- テスト: Playwright E2E
- 実行: Windows バッチファイル + PowerShellフォルダ選択
### 入力データ
Excel/CSV。1ファイル=1ヶ月分。サブフォルダ再帰検索対応。
必須列: ID番号, サービス内容, 要介護度, サービス提供年月(YYYYMM), サービス実日数, 合計金額
オプション列: 保険者番号, 被保険者番号, 合計回数, サービス提供時間, 開始時間, 終了時間
### 分類ロジック
サービス内容から4分類: 予防訪問/訪問/予防通所/通所
→ houmon(訪問リハ)と tsusho(通所リハ)に集約
要支援/要介護の矛盾を3回バリデーション
### ユーザー識別
uid = 保険者番号+"_"+ID番号(フォールバック: 被保険者番号→ID番号のみ)
NaN IDは除外。表示用はdisp_id(元ID番号)
### 計算項目(全て訪問・通所別に算出)
1. KPI 6項目: 累計売上, 月平均利用者数, 月平均売上, 訪問キャンセル率, 通所キャンセル率, 併用者数
2. キャンセル率: 実日数→契約区分推定→(期待-実)/期待×100
3. 加算分析: 各加算の取得者数/取得率/収益額
4. 時間区分(訪問のみ): 連続セッション数→40分/60分契約推定
5. 要介護・要支援別: 売上額/利用者数/平均単価
6. 利用期間(全履歴): スパン, 連続利用月数(最長streak), 実利用月数, 直近連続月数 + 統計値
7. 利用継続率(年度内): 何ヶ月利用したかの分布
8. 併用利用者: 訪問∩通所の重複
9. 年度間比較(複数年度時): トレンド, 季節性分析
### ダッシュボードUI構造
- 最大幅1360px, 年度別タブ切り替え
- 2列グリッド(.dg)は常に左=訪問(青#2563eb), 右=通所(ティール#0d9488)
- KPI 6カード(3列グリッド), 数値フォントDM Sans, 24px, nowrap
- 損益分岐点: 月額コスト/人件費入力→JS即時計算(利益+人件費率)
人件費率色分け: ≤50%=緑, 50-70%=黄, >70%=赤
- 要介護度バー: 0名も表示, 20%未満は下部ラベル
- 利用者テーブル: 遅延ロード(switchTab時にDOM挿入)
- 月次推移: SVGバーチャート(2ヶ月以上)
- 印刷対応: @media print
### CLI引数
--data-dir(-d): データフォルダ / --output(-o): 出力先 / 位置引数: 個別ファイル
### Windows バッチ
ダッシュボード生成.bat: chcp 65001→Python確認→pip install→PowerShellフォルダ選択→実行
select_folder.ps1: COM FileOpenDialog→FolderBrowserDialogフォールバック
### Cloudflare Pagesデプロイ
dist/index.html + dist/_worker.js(Basic認証, env.ASSETS.fetch)
npx wrangler pages deploy dist --project-name=dashboard-rehab
### E2Eテスト(Playwright)
最新HTML自動検出→スクリーンショット撮影→.dgグリッドの左訪問/右通所をx座標で検証
リハビリサービス運営ダッシュボード生成システム 要件定義書 v1.0
作成日: 2026年2月20日