株式会社プレラナ
難易度 介護・福祉総務・人事属人化している

人員配置基準と労働時間を満たすシフト表の自動生成

資格、雇用区分、夜勤明けの扱い、希望休といった条件を表として書き出し、その条件を満たす勤務表の候補をプログラムに生成させます。職員の組み合わせと最終決定は管理者が行います。

介護・福祉の現場で、人員配置基準と労働時間を満たすシフト表の自動生成に取り組んでいる様子
対象部署
施設運営(施設長・ユニットリーダー)
使う技術
Googleスプレッドシートによる職員マスタと制約条件の管理 / Python と OR-Tools(制約充足ソルバー)による勤務表の生成 / ChatGPT または Claude によるソルバー用スクリプトの作成と修正 / 生成後の検証スクリプト(人員配置基準と労働時間の条件を機械的に照合) / 既存の勤怠管理システム(CSV取り込みで連携)
必要な入力データ
職員マスタ(.csv・職員ID、職種、資格、雇用区分、常勤換算数、対応可能な勤務帯) / 希望休と勤務不可日(.csv・職員IDと日付) / 制約ルール表(.csv・法令由来の条件と施設独自の条件を分けて記載) / 当月の利用者数とユニット構成 / 前月末の勤務実績(月をまたぐ連続勤務日数と夜勤明けの判定に使用)

Before / After

人がやる場合と、AIを使った場合

効果だけを並べても判断できません。まず「今どうやっているか」を具体的に書きます。タブを切り替えて読み比べてください。

前月の中旬から、施設長がA3の方眼用紙かExcelを開いて手で埋め始めます。まず夜勤から置きます。夜勤に入れる職員は限られ、夜勤明けの翌日は公休にする必要があります。次に希望休の紙を集め、重なった日は誰かに取り下げてもらう相談をします。そのうえで、各ユニットに介護福祉士が入る日を確認し、常勤換算での人員配置基準を満たすかを電卓で計算します。1か所を直すと別の日が崩れ、消しゴムで消して書き直します。ここまでで10時間から15時間かかります。作り終えた後も、職員の急な休みが出るたびに組み直します。この作業ができるのは施設長1人で、休暇中は前月の写しで回しています。

人がやる場合とAIを使った場合を、軸ごとに並べた表です。
比較する軸人がやる場合AIを使った場合
所要時間月あたり10〜15時間かかります(作成後の組み直しは含みません)。制約表の更新が月あたり30分、生成と検証が数分、人による調整が2〜4時間です(自社での実測が必要です)。
関わる人数施設長1名のみで、休暇中は誰も作れません。制約表を更新できる職員が2〜3名になり、生成はその全員が実行できます。最終確定は管理者が担当します。
起きるミス常勤換算の計算違い、夜勤明けの翌日に勤務を入れてしまう、資格者の配置漏れ、希望休の見落としが起きます。制約表に書き忘れた条件が反映されない、ソルバーが解を見つけられず生成が止まる、生成結果を検証せずに掲示する、といった誤りが起きます。
必要なスキル配置基準と労働時間の知識に加え、職員個々の事情を記憶している経験が要ります。条件を表の行として書き出す力と、生成結果を検証結果と突き合わせて調整する判断力が要ります。

効果の見込み

介護分野の専門媒体である介護ニュースJointは、2026年2月の記事で、ある特別養護老人ホームがシフト作成に毎月14時間から15時間を要していた状態から、シフト自動作成の仕組みの導入によって約7時間へ短縮したと報じています(媒体報告値)。削減幅は、ユニット数、職員数、制約条件の複雑さで大きく変わります。自社では、制約表の作成に要した時間と、導入後3か月分の作成時間を記録して比較してください(要実測)。あわせて、作成できる職員が何名に増えたかを見ると、属人化の解消を測れます。

Steps

実際にやること

読んだ方がそのまま試せる粒度で書いています。出し惜しみはしません。各手順の説明とプロンプト例は「くわしく見る」を開くと読めます。

  1. 01

    条件を法令由来と施設独自に分けて書き出す

    くわしく見る

    この工程が全体の成否を決めます。1枚の表に、条件を1行ずつ書きます。列は「ルールID/区分(法令・基準・施設独自)/条件の内容/判定方法/違反時の扱い(絶対に破れない・調整可)」の5列です。法令由来には、労働基準法上の労働時間と休憩、時間外労働に関する労使協定の範囲、夜勤明けの翌日の扱いが入ります。運営基準由来には、介護・看護職員の常勤換算で利用者3人に1人以上、ユニット型では夜間は2ユニットごとに1人以上といった条件が入ります。施設独自には、新人は夜勤に単独で入らない、特定の職員の組み合わせを避ける、といった条件が入ります。まず40〜60行を目安に書き出します。

  2. 02

    判定方法の列を、計算できる形に直す

    くわしく見る

    書き出した条件のうち、「新人は無理をさせない」のような曖昧な行を、計算できる形に直します。たとえば「入職6か月未満の職員は、夜勤帯に配置する場合、同じ勤務帯に入職3年以上の職員を1名以上配置する」と書き換えます。この書き換えができない条件は、プログラムに任せず人が調整する領域として、別の表に分けます。分けることが重要です。全部を自動化しようとすると、条件が矛盾してソルバーが解を出せなくなります。

  3. 03

    職員マスタと希望休のデータを整える

    くわしく見る

    職員マスタには、職員ID、職種、保有資格、雇用区分、常勤換算数、対応可能な勤務帯、入職年月を持たせます。常勤換算数は非常勤職員の週の勤務時間を常勤の勤務時間で割った値です。この値がそろっていないと、配置基準の判定ができません。希望休は紙で集めている場合もフォームに切り替え、職員IDと日付の2列のCSVになるようにします。前月末の勤務実績も必要です。月初の連続勤務日数と夜勤明けの判定に使います。

  4. 04

    ソルバー用のスクリプトをAIに書かせる

    くわしく見る

    プログラムを自分で書く必要はありません。制約表と職員マスタの列構成を伝えて、AIにスクリプトを書かせます。重要なのは、絶対に破れない条件と調整可の条件を分けて実装させることです。すべてを絶対条件にすると解が見つからず、生成が止まります。

    プロンプト例

    Python と OR-Tools の CP-SAT ソルバーを使って、介護施設の月間勤務表を生成するスクリプトを書いてください。
    
    入力ファイル:
    1. staff_master.csv(列:職員ID, 職種, 保有資格, 雇用区分, 常勤換算数, 対応可能勤務帯, 入職年月, 所属ユニット)
    2. requests.csv(列:職員ID, 日付, 種別)※種別は「希望休」または「勤務不可」
    3. rules.csv(列:ルールID, 区分, 条件の内容, 判定方法, 違反時の扱い)※違反時の扱いは「絶対」または「調整可」
    
    勤務記号:早番, 日勤, 遅番, 夜勤, 明け, 公休
    
    実装の条件:
    - rules.csv の「絶対」はハード制約、「調整可」はソフト制約(違反にペナルティを与えて最小化)として実装してください
    - 夜勤の翌日は必ず「明け」、明けの翌日は必ず「公休」としてください
    - 解が見つからない場合は、どのハード制約が競合しているかを出力してください。単に失敗と表示するだけにしないでください
    - 出力は shift_result.csv(行=職員ID、列=日付、値=勤務記号)としてください
    - あわせて、各日の勤務帯ごとの人数と有資格者数を集計した summary.csv も出力してください
    - コードには日本語のコメントを入れ、制約を追加する箇所が分かるようにしてください
  5. 05

    検証スクリプトを別に作り、生成結果を機械的に照合する

    くわしく見る

    生成したソルバーが正しく制約を実装しているかは、生成結果を別の目で検証しないと分かりません。生成用とは別に、検証専用のスクリプトを作ります。検証は、生成の過程を知らない状態で、出来上がった勤務表だけを見て条件を確認する形にします。実装の思い込みが両方に入るのを避けるためです。検証結果は違反一覧のCSVとして出させ、違反ゼロを確認してから人の調整に進みます。

    プロンプト例

    以下の shift_result.csv と staff_master.csv、rules.csv を読み込み、勤務表が制約を満たしているかを検証するスクリプトを Python で書いてください。生成用スクリプトのコードは参照せず、出力ファイルだけを見て検証してください。
    
    検証項目:
    1. 夜勤の翌日が「明け」、明けの翌日が「公休」になっているか
    2. 連続勤務日数が rules.csv で指定した上限を超えていないか
    3. 各日・各勤務帯の配置人数が必要数を満たしているか
    4. 各ユニットの各勤務帯に、指定した資格保有者が配置されているか
    5. 常勤換算での人員配置が、当月の利用者数に対する必要数を満たしているか
    6. requests.csv の「勤務不可」の日に勤務が入っていないか
    7. requests.csv の「希望休」が何件反映され、何件反映されなかったか
    
    出力:violations.csv(列:ルールID, 対象日, 対象職員ID, 違反内容, 深刻度)
    違反が1件も無い場合も、検証項目ごとに「確認済み」の行を出力してください。何も出力しないと、検証が動いたかどうか分からなくなるためです。
  6. 06

    人が調整する領域を、決まった手順にする

    くわしく見る

    検証を通った候補に対して、管理者が調整します。調整する観点は、あらかじめ3つに絞ります。新人と経験者の組み合わせ、職員間の相性、そして個別の家庭事情への配慮です。調整した箇所は、理由とともに記録に残します。同じ理由の調整が3か月続いたら、制約表に行として追加できないかを検討します。この往復を続けると、人の調整量が徐々に減ります。

  7. 07

    急な欠勤が出たときの差し替え手順を決める

    くわしく見る

    月の途中で欠勤が出たときに、毎回ゼロから組み直す必要はありません。欠勤日と欠勤者を指定して、その日だけの差し替え候補を出す使い方にします。検証スクリプトは差し替え後の勤務表全体に対して再実行し、連続勤務日数などが崩れていないかを確認します。ここでの判断も人が行います。誰に声をかけるかは、その職員の事情を知っている管理者にしか決められません。

Sample Data

この事例で使うサンプルデータ

実際に手を動かして試せるよう、サンプルを用意しています。すべて架空のデータです。お客様の実データは一切使用していません。

一式をまとめた形は、業界別レポートに同梱してお渡ししています。

Pitfalls

つまずきやすい点

精度が出ないときにどこを見るか。ここが分かるかどうかで、定着するかが決まります。見出しを開くと、確かめる箇所が読めます。

すべての条件を絶対条件にして、解が出なくなる
希望休を全件反映し、連続勤務も厳格にし、資格配置も完璧にすると、条件が競合して解が見つかりません。この状態でスクリプトが止まると、原因が分からず導入が止まります。最初から「絶対」と「調整可」を分け、解が出ないときはどの条件が競合しているかを表示させてください。実務では、調整可の条件を7割程度満たす候補を土台にして人が仕上げる形が現実的です。
生成用のスクリプトだけで検証を済ませてしまう
生成スクリプトが制約を正しく実装していない場合、そのスクリプト自身のチェックでは違反を見つけられません。実装の思い込みが両方に入るためです。検証は必ず別のスクリプトで、出来上がった勤務表だけを見て行ってください。検証で違反ゼロが出たときも、検証項目ごとに確認済みの行を出力させ、検証自体が動いたことを確かめてください。
配置基準の解釈を確認しないまま自動化する
常勤換算の計算方法、夜間配置の数え方、加算の要件は、サービス種別と施設類型によって異なります。地域密着型と広域型でも扱いが変わる項目があります。制約表を作る段階で、運営規程と指定申請時の書類、管轄の指定権者の手引きを確認してください。誤った基準を自動化すると、誤りが毎月正確に再生産されます。
職員の個別事情を制約表に書き込みすぎる
家庭の事情や体調に関する情報を制約表に詳しく書くと、その表が個人情報を含むファイルになります。閲覧できる人を絞る必要が生じ、更新できる職員を増やすという目的と衝突します。制約表には「この職員は特定曜日の夜勤不可」という結果だけを書き、理由は書かないでください。理由は管理者が別に管理します。

Related

介護・福祉の他の事例

次は「家族向けお知らせ・連絡文書の作成支援」を読んでください。シフトの自動化は準備に時間がかかるため、並行して着手できる軽い工程を1つ持っておくと、現場でAIに触れる機会が増えます。

介護・福祉のページに戻る

介護・福祉のAI活用レポートをお送りします

この事例を含む5つの活用事例と、サンプルデータをまとめた資料です。社内での共有にお使いいただけます。