Speee DEVELOPER BLOG

Speee開発陣による技術情報発信ブログです。 メディア開発・運用、スマートフォンアプリ開発、Webマーケティング、アドテクなどで培った技術ノウハウを発信していきます!

新型コロナワクチン・職域接種のスケジュール調整を自動化した話

こんにちは、経営企画・戦略推進室の布施です。 当社内では、ビジネス上の課題に対して技術的解決を橋渡しする「ビジネストランスレーター」という役割を主に担っています。

今回は、コロナワクチンの職域接種をいかにうまくスケジューリングするか、というテーマに関しての投稿になります。

技術的な内容がメインですが、今まさにお困りの企業さんもいらっしゃるかと思ったので、なるべくそういった方のご参考にもなるように、周辺的な情報もシェアしていきたいと思います。

(最後にソースコードも公開しています)

概要

  • 短期間で、多数の従業員やご家族の接種希望日時を、機械的にマッチングするには?

  • 職域接種における、他の手段(予約システムなど)とのメリデメ比較、およびTips

状況および課題

職域接種について

弊社では、6/29,30に、第一回の職域接種を実施することになりました。

もちろん、その実施に向けては、総務部門を中心として情報収集や接種希望人数の調査、ワクチンの必要ロット数の集計、会場や医療従事者の確保、申請、打ち合わせ、リハーサルなど、短期間の中で数多くのタスクを正確にこなす必要がありました。

ただ、行政に確認しても分からないことも多く、一緒に試行錯誤を繰り返して下さった医療機関の方々含め、関係者の皆さま本当にありがとうございます。

今回の課題

その中でも、社員及び同居人の一人一人に対して、接種可能な時間帯を元に接種時間枠を確定させる日程調整が必要だ、という問題がありました。

予約システムで各人に登録してもらう、というアプローチも考えられたのですが、

  • 導入に時間がかかる
  • 早いもの勝ちになるため、日時の都合がつかない事で接種出来ない人が出てきてしまう
  • さらにその場合、ワクチンが余ってしまう事を回避するために追加で募集をかけたり、個別に日程調整をお願いしていく必要が出てきてしまう

こういった理由から望ましくないと考え、「各人の可能日時を聞き、その要件に最大限応えるスケジューリングを行う」というアプローチを模索しました。

要件

  1. 混雑防止の観点で、どの時間帯の接種人数も均す必要がある
  2. ワクチン数と接種人数がほぼ同じであり、できる限り余剰を出さないように一人ずつ接種可能な時間に割り振る必要がある
  3. 接種人数は同居人を含めて数百人単位の数

このような要件を満たす必要があり、短納期のスケジュールの中でどう日程調整を行うのか頭を悩ませました。

(一般的な予約システムでは、2の条件が厳しくなってしまいます。)

課題へのアプローチ

今回は最適化問題の一つであるナーススケジューリング問題として扱えるのではないかと考え、こんな困りごとがあると弊社のデータサイエンス関連の雑談channelで軽く相談してみました

するとありがたいことに、エンジニアのyoppiさん、mrknさんがすぐに反応してくださり、すぐにコードも実装してくださいました、本当に感謝感激です😭😭😭

f:id:tfuse:20210625184315p:plain

今回は「どの時間帯でも接種が可能」と回答してくださった人も多く制約条件が厳しくなかったため、最適化問題ではなくナイーブに探索して割り振ってくださいました。

改めて、解きたい問題を整理してみましょう。

目的
  • 接種者一人一人に、参加可能な接種時間枠を割り当てる
制約条件
  • 接種時間帯、及び時間帯ごとの枠数が決められている
  • 接種者ごとに、接種不可能な時間帯が決められている
  • 時間帯ごとの接種人数を極力均等にする
実装したアルゴリズム
  1. 各時間帯ごとに、接種人数の上限を設定する
  2. 制約の厳しい(接種可能な時間枠が少ない)人から順に、時間枠を割り当てる

というシンプルなものです。

もちろん、接種可能な時間帯が限られている人が多いなど制約条件が厳しい場合は、必ずしも全員の希望通りにならないことも考えられますので、

その場合に備えて、「希望に添えないこともある」ことと、「その場合は抽選フォーム登録が早い順で割り当てを行う」などを事前にルールを定め、入力フォームに明記しておいた方が親切です。

これで割り当てが完了したら、GASを利用して社員それぞれのGoogleカレンダーに予定を登録し、日程調整は完了です!

さらなる改良案

今回は時間の都合で実装はできませんでしたが、実際に起こりうる制約条件なども踏まえて、

  • 予約可能な枠が複数存在する場合、残りの枠数やその時間帯の人気度などを考慮して割り当てルールを設定する
  • 複数の同居人が接種する場合、その2人は同一の時間帯に割り当てる
  • 同じ部署の人は、接種日がなるべく分散するように割り当てる

などを考慮できるようになると、よりロバストなモデルになりそうですね。

ソースコード

今回は実装してくださったお二人のソースコードを公開します!

お二人のコードの実装内容は、大きな違いはありません。

README.md · GitHub

speee_vaccine_assignment.ipynb · GitHub

※本ソースコードは自己責任でご使用ください。また、動作しないなどの個別の対応はいたしかねます。

まとめ

今回は関係各所の皆さまのご尽力により、初動から3週間程度の短い期間で職域接種が実現できることになりました。

その中でも、ワクチンの余剰在庫を出さないように数百〜数千人の接種者の日程調整は、

  • 一人一人の接種不可能な時間をアンケートで集計する
  • アンケートを元にデータドリブンに自動で割り振りを行う

という方法がベストプラクティスではないかと思います。

職域接種の準備に尽力してくださった皆さんには本当に感謝の気持ちでいっぱいです😭😭😭

接種当日を無事に迎えられますように!