保険会社のコールセンターで、過去の入電と曜日・発送物・請求の時期から翌月の30分ごとの入電数を見込み、必要な席数とシフトの枠の案を出す
コールセンターの過去の入電と、曜日・祝日・発送物の予定・口座振替日から、翌月の30分ごとの入電数を窓口別に見込みます。見込みを必要な席数に直し、シフトの枠の案まで出して、運用管理の担当の確認に回します。
- 連携・自動化
- Python
- 対象業界
- EC/IT・SaaS/保険/金融
- 対象部門
- カスタマーサポート
- 対象業務
- 集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 電話の仕組みから、前年の同じ月と前月の30分ごとの入電数を表計算に書き出す
- 曜日と祝日がずれるので、前年の日付を今年の同じ曜日に合わせて並べ直す
- 契約サービス部に発送物の予定を問い合わせ、発送の多い週に担当の勘で割り増しをかける
- 窓口ごと・30分ごとの入電数に、平均の通話時間をかけて必要な時間を出し、席数に直す
- 休憩や研修で席を離れる分を足し、シフトの枠(9時〜18時、10時〜15時など)の人数に割り振る
- 管理者に見せて直し、シフトの作成に回す
- 自動毎月10日の朝、電話の仕組みから前月までの30分ごとの入電数・通話時間を取り込む
- 自動契約サービス部の発送物の予定表と、口座振替日、祝日の一覧を読み込む
- 自動窓口ごとに、翌月の営業日の30分ごとの入電数を、中央と上下の幅で予測する
- 自動予測した入電数と通話時間から、サービスレベルの目標を満たす席数を30分ごとに計算する
- 自動休憩・研修・離席の分を足し、シフトの枠ごとの人数の案を出す
- 自動前月の予測と実績を比べた外れ方の一覧を作る
- 人運用管理の担当が、予測の山と谷、外れ方の一覧を確かめ、予定外の事情(新商品、制度の変更、システムの切り替え)を書き足す
- 人担当が、幅のどこに席数を合わせるかを窓口ごとに決める
- 人管理者が枠の案を承認し、個人ごとのシフトの作成に回す
- 自動予測、採った席数、担当が書き足した事情を記録に残す
各工程の詳しい説明を読む
- 電話の仕組みから、前年の同じ月と前月の30分ごとの入電数を表計算に書き出す
- 曜日と祝日がずれるので、前年の日付を今年の同じ曜日に合わせて並べ直す
- 契約サービス部に発送物の予定を問い合わせ、発送の多い週に担当の勘で割り増しをかける
- 窓口ごと・30分ごとの入電数に、平均の通話時間をかけて必要な時間を出し、席数に直す
- 休憩や研修で席を離れる分を足し、シフトの枠(9時〜18時、10時〜15時など)の人数に割り振る
- 管理者に見せて直し、シフトの作成に回す
(a)見込みを作るのに時間がかかる。 2番の並べ直しと3番の割り増しは、窓口ごと・日ごとの手作業です。6窓口×20営業日の見込みを、毎月3名で作っています。
(b)作り方が担当の経験頼み。 割り増しを何割にするかは、その担当が去年どう感じたかで決まります。担当が替わると、見込みの癖が変わります。 誰の見込みが当たっていたかも、記録に残っていません。
(c)発送物の山を取り逃がす。 契約サービス部の発送の予定が変わったことを知らずにシフトを組むと、山の日に席が足りず、放棄呼が増えます。 電話がつながらなかった契約者は、翌日にかけ直してくるので、翌日の山も大きくなります。
(d)枠の割り振りが毎月の手作業。 30分ごとの席数が出ても、それを4種類の枠の人数に直すのは担当の試行錯誤です。昼の山を短い枠で埋めるか、フルタイムを増やすかで、毎月同じ議論をくり返しています。
(e)見込みに幅が無い。 1つの数で出すので、外れたときにどれくらい外れうるものだったのかが分かりません。 管理者は「多めに見ておいて」と言い、担当は根拠の無い上乗せをすることになります。
- 【自動】 毎月10日の朝、電話の仕組みから前月までの30分ごとの入電数・通話時間を取り込む
- 【自動】 契約サービス部の発送物の予定表と、口座振替日、祝日の一覧を読み込む
- 【自動】 窓口ごとに、翌月の営業日の30分ごとの入電数を、中央と上下の幅で予測する
- 【自動】 予測した入電数と通話時間から、サービスレベルの目標を満たす席数を30分ごとに計算する
- 【自動】 休憩・研修・離席の分を足し、シフトの枠ごとの人数の案を出す
- 【自動】 前月の予測と実績を比べた外れ方の一覧を作る
- 【人】 運用管理の担当が、予測の山と谷、外れ方の一覧を確かめ、予定外の事情(新商品、制度の変更、システムの切り替え)を書き足す
- 【人】 担当が、幅のどこに席数を合わせるかを窓口ごとに決める
- 【人】 管理者が枠の案を承認し、個人ごとのシフトの作成に回す
- 【自動】 予測、採った席数、担当が書き足した事情を記録に残す
6番目を毎月出すことが、この設計の要です。 予測は外れます。どの窓口のどの時間帯で、どちら向きに外れたかが分かれば、次の月の幅の取り方を決められます。これまでの手作業では、この比べ方ができていませんでした。
7番目で人が書き足す事情は、予測に入らない情報です。 新商品の発売や、手続きの書類の様式の変更は、過去のデータにありません。機械が知らないことを、人が足す場所を最初から作っておきます。
02今回想定するシステム構成
【入力】電話の仕組みの30分ごとの実績(入電・応答・放棄・通話時間)
発送物の予定表/口座振替日/祝日の一覧(内閣府のCSV)
▼【トリガー】毎月10日 朝
Python(pandas で整形 → scikit-learn で予測)
├── 窓口×30分ごとの入電数:中央(poisson)と上下の幅(quantile)
├── 席数の計算(待ち行列の計算式で、サービスレベルの目標を満たす数)
├── 離席の分を足し、シフトの枠ごとの人数の案
└── 前月の予測と実績の比較
▼
シフトの管理表へ書き出し(窓口×日×30分の表、枠の案、外れ方の一覧)
▼
【人】運用管理の担当が事情を書き足し、幅のどこに合わせるかを決める
▼
【人】管理者の承認 → 個人ごとのシフトの作成へ| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理エンジン | Python(pandas、scikit-learn の HistGradientBoostingRegressor) | R、BigQuery ML |
| 定時実行 | サーバーのタスクスケジューラ | クラウドのジョブ実行のサービス |
| データの取得元 | 電話の仕組みの実績の出力(CSV) | 電話の仕組みの API |
| 出力先 | シフトの管理表(共有フォルダの表計算) | Google スプレッドシート |
生成AIは使いません。 入電数は数の並びで、予測に要るのは過去の数と、曜日・祝日・発送物のような説明の材料です。説明の文を書かせる場面も無いので、構成に入れていません。
予測には、scikit-learn の HistGradientBoostingRegressor を使います。 scikit-learn の文書では、loss に squared_error・absolute_error・gamma・poisson・quantile を選べ、quantile を選んだときは推定する分位点を quantile に0から1の値で指定するとされています。入電数は0以上の件数なので、中央の予測には poisson を使い、幅には quantile で0.1と0.9の2つのモデルを作ります。 欠損値(NaN)をそのまま扱えることと、n_samples が1万を超えるような大きなデータでは GradientBoostingRegressor よりかなり速いとされていることも、30分ごとのデータに向いています。2年分の30分ごとの記録は、窓口ごとに数千行から1万行を超えます。
祝日は、内閣府が公開している「国民の祝日」のCSVを使います。 内閣府のページでは、昭和30年(1955年)から令和9年(2027年)までの国民の祝日をCSV形式で掲載し、令和10年(2028年)の国民の祝日は前年の2月に掲載するとしています。年に1回、2月にCSVを取り直す作業を運用の手順に入れます。
03どうやって実装するのか
処理の起点を決める
毎月10日の朝、サーバーのタスクスケジューラで動かします。 シフトの締め切りが前月の20日ごろなので、担当が確かめて管理者に回すまでに10日の余裕を取ります。
10日に動かすのは、契約サービス部の発送物の予定表が、そのころに翌月分まで固まるためです。早く動かしすぎると、発送の予定が入っていない見込みになります。
月の途中でも動かし直せるようにします。 発送の予定が大きく変わった、新しい手続きの案内を急に送ることになった、といったときに、担当が手で動かせば、その時点の予定で見込みを作り直します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 入電の実績 | 窓口・日付・30分の枠ごとの入電数、応答数、放棄数、平均の通話時間と後処理の時間 | 電話の仕組みの出力(CSV) |
| 発送物の予定 | 発送物の種類、発送日、通数、対象の契約の種類 | 契約サービス部の予定表 |
| 口座振替日 | 保険料の振替日と、振替の結果の通知の発送日 | 契約サービス部 |
| 祝日 | 国民の祝日と休日 | 内閣府のCSV |
| 事情のメモ | 新商品、制度の変更、システムの切り替え、障害など | 運用管理の担当が書く表 |
質を決めるのは、発送物の予定です。 入電の山の多くは発送物の後に来ます。過去の発送の実績(いつ、何を、何通)も2年分そろえて、予測の学習に使います。今の予定表だけでは、過去の山と発送を結び付けられません。
入電の数は、応答した数ではなく入電した数を使います。 応答した数だけを使うと、席が足りずにつながらなかった分が消えて、山が実際より低く見えます。 放棄した呼も入電に含めます。ただし、同じ番号からの短時間のかけ直しが多い場合は、電話の仕組みで「1時間以内の同じ番号の再入電」を分けて出せるかを確かめ、出せるなら差し引きます。
事情のメモは、過去の外れの説明に使います。 去年の10月にシステムの障害で入電が跳ねたことを知らずに学習させると、今年の10月にも同じ山を見込みます。 障害の日にはメモで印を付け、学習から外すか、印の列として入れます。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 30分ごとの実績 | 電話の仕組みの実績の出力をCSVで取り出す | 学習と、前月の外れ方の比較 |
| 発送物の予定と実績 | 契約サービス部の予定表(共有フォルダ)を読む | 発送日からの経過日数と通数の列 |
| 口座振替日 | 契約サービス部から毎月受け取る日程 | 振替日からの経過営業日数の列 |
| 祝日 | 内閣府のCSVを年に1回取り込む | 祝日、連休の長さ、連休明けの列 |
| 事情のメモ | 運用管理の担当の表 | 学習から外す日、印の列 |
電話の仕組みからは、30分ごとの集計の形で取り出します。 1件ずつの通話の記録は要りません。発信元の電話番号などの個人の情報を、この構成に持ち込まないためです。
発送物の予定表は、書き方をそろえてもらいます。 発送日が「10月上旬」のように幅で書かれていると、経過日数が計算できません。契約サービス部と相談し、日付と通数の列を必ず埋める形に変えてもらうのが、最初の準備作業になります。
AIへ渡す前に整形する
- 営業時間外の枠を落とす … 9時より前と18時以降の枠は、留守番電話の件数などが混ざるので外します
- 営業日の番号を付ける … 月の何営業日目か、月の最終営業日まで何営業日かの列を作ります
- 祝日と連休の列を作る … 祝日、連休の長さ、連休明けの何営業日目かを列にします
- 発送物の列を作る … 発送物の種類ごとに、発送日からの経過営業日数と通数を列にします(発送後10営業日まで)
- 振替日の列を作る … 口座振替日と、振替の結果の通知の発送日からの経過営業日数を列にします
- 障害などの日に印を付ける … 事情のメモにある日は、学習から外すか、印の列を立てます
- 窓口ごとに分ける … 窓口ごとに入電の傾向が違うため、窓口ごとに別のモデルにします
4番目が、この構成でいちばん効く列です。 発送物が届くのは発送の1〜3営業日後で、電話はそこから数日続きます。「何営業日前に何通送ったか」を列にすると、モデルは発送と山の関係を過去のデータから学びます。 割り増しを何割にするかを人が決める必要がなくなります。
6番目を省くと、過去の特別な日を毎年くり返して見込みます。 障害や大規模な災害の日は、学習に入れると翌年の同じ時期の見込みを押し上げます。
AIに処理させる
させるのは、窓口ごとに、翌月の営業日の30分ごとの入電数を、中央と上下の幅で予測することです。 席数とシフトの枠は、その予測から計算式で出します。
| 段階 | 中身 | 使うもの |
|---|---|---|
| 中央の予測 | 30分ごとの入電数の中央の見込み | HistGradientBoostingRegressor(loss="poisson") |
| 幅の予測 | 下側(0.1)と上側(0.9)の見込み | HistGradientBoostingRegressor(loss="quantile"、quantile=0.1 と 0.9) |
| 席数の計算 | 入電数と平均の処理時間から、目標の応答率を満たす席数 | 待ち行列の計算式(アーランC式)を Python で書く |
| 離席の加算 | 休憩・研修・後処理以外の離席の割合を足す | 運用管理の担当が決めた割合 |
| 枠の案 | シフトの枠ごとの人数の組み合わせ | 30分ごとの必要数を上回るまで枠を足していく計算 |
学習と予測の流れは、窓口ごとに次のようになります。
from sklearn.ensemble import HistGradientBoostingRegressor
cols = ["曜日", "時刻枠", "営業日番号", "月末まで営業日", "祝日翌営業日",
"連休明け営業日", "振替日からの営業日", "発送A_経過", "発送A_通数",
"発送B_経過", "発送B_通数", "除外印"]
mid = HistGradientBoostingRegressor(loss="poisson").fit(X[cols], y)
low = HistGradientBoostingRegressor(loss="quantile", quantile=0.1).fit(X[cols], y)
high = HistGradientBoostingRegressor(loss="quantile", quantile=0.9).fit(X[cols], y)
# 翌月の営業日×30分の枠について、同じ列を作って3つの予測を並べる
3つのモデルは別々に学習するので、まれに下側が中央を上回る枠が出ます。 そのときは下側・中央・上側を小さい順に並べ直してから書き出します。並べ直した枠の数は、外れ方の一覧に出しておきます。
席数の計算は、次の手順で行います。
- 30分の枠の入電数(中央または上側)と、平均の処理時間(通話時間+後処理の時間)から、その枠に必要な通話の量を出します
- 席数を1つずつ増やしながら、アーランC式で「20秒以内に応答できる割合」を計算します
- 割合が目標の80%を初めて超えた席数を、その枠の席数とします
- 席数に離席の割合(15%)を足して、その枠に出勤している必要がある人数にします
アーランC式は、電話が待ち行列に並ぶことを前提にした計算式です。 入電数が少ない枠では、席数を1つ増やしたときの応答の割合の変わり方が大きく、中央と上側の席数の差が数席になることがあります。 この差を一覧で見せることで、担当は「上側に合わせると何席増えるか」を枠ごとに知ることができます。
枠の割り振りは、30分ごとの必要な人数を上から覆っていく計算です。 まず9時〜18時の枠で1日を通して必要な人数の下限を埋め、残りの山を短い枠で埋めます。休憩の時間帯は、各枠の人数を半分ずつに分けてずらす前提で計算します。 最適な組み合わせを解くことはせず、担当が直しやすい素直な案を出すことを優先します。
予測の確かさは、過去のデータを時間の順に分けて測ります。 scikit-learn の TimeSeriesSplit は、訓練のデータが常にテストのデータより前になるように分け、分けるたびに訓練のデータが前のものを含んで大きくなるとされています。未来のデータで過去を当てる測り方をしないために使います。テストの期間は1か月ずつにし、直近の6か月で6回測ります。
幅の確かさは、mean_pinball_loss で測ります。 scikit-learn の文書では、この指標は分位点回帰のモデルを評価するためのもので、alpha で推定する分位点を指定するとされています。0.1と0.9のモデルを、それぞれの alpha で測ります。 あわせて、実績が幅の中に入った割合(8割前後が目安)を窓口ごとに数えます。
| させないこと | 理由 |
|---|---|
| 幅のどこに席数を合わせるかを決める | サービスレベルと人件費の兼ね合いは人が決める |
| 予定に無い出来事を見込む | 新商品や障害は過去のデータに無い。人がメモで足す |
| 個人ごとのシフトを割り当てる | 希望、スキル、勤務の条件は既存の手順で扱う |
| 窓口をまたいで席を融通させる | スキルの違う窓口は埋め合わせられない |
1行目が、この構成で一番守りたい線です。 上側の0.9に合わせれば電話はつながりやすくなりますが、人件費は増えます。どちらを取るかは経営の判断で、予測の仕事ではありません。
指示内容を固定する
この構成は生成AIを使わないため、プロンプトはありません。代わりに、予測と席数の計算に渡す設定を、運用管理の担当が読める形の設定ファイルにします。
# 予測の設定(窓口ごと)
窓口: 給付金・保険金の請求
学習に使う期間: 直近24か月
予測する期間: 翌月の営業日(9:00〜18:00、30分ごと)
中央の予測: loss=poisson
幅の予測: loss=quantile, quantile=0.1 / 0.9
学習から外す日: 事情のメモで「除外」と印を付けた日
# 席数の計算
サービスレベルの目標: 20秒以内の応答 80%
平均の処理時間: 直近3か月の同じ曜日・時間帯の通話時間+後処理の時間
席数を合わせる予測: 中央(担当が窓口ごとに「上側」へ切り替えられる)
離席の割合: 休憩を除き 15%
# シフトの枠
枠: 9:00-18:00(休憩60分)/9:00-15:00(休憩45分)/12:00-18:00(休憩45分)
10:00-14:00(休憩なし)
数値の目標と割合は、担当が書き換える場所です。 コードの中に埋め込むと、目標を変えるたびに開発者を呼ぶことになります。
休憩の長さは、労働基準法の休憩の規定に合わせます。 労働基準法第34条は、労働時間が6時間を超える場合は少なくとも45分、8時間を超える場合は少なくとも1時間の休憩を労働時間の途中に与えなければならないとしています。枠の長さと休憩の組み合わせは、人事部と確かめたうえで設定に書きます。 休憩を何時に取るかで30分ごとの席数が変わるため、枠の案では休憩の時間帯を分散させた前提で計算します。
出力形式を固定する
30分ごとの見込みは、次の形の表でシフトの管理表に書き出します。
| 窓口 | 日付 | 時刻 | 入電の下側 | 入電の中央 | 入電の上側 | 処理時間(秒) | 席数(中央) | 席数(上側) | 離席を足した人数 |
|---|---|---|---|---|---|---|---|---|---|
| 請求 | 11/2 | 10:00 | 38 | 46 | 57 | 420 | 13 | 16 | 15 |
| 請求 | 11/2 | 10:30 | 41 | 50 | 62 | 420 | 14 | 17 | 17 |
前月の外れ方の一覧は、窓口ごとに次のようにまとめます。
【外れ方の一覧】10月(前月)
窓口: 給付金・保険金の請求
実績が幅の中に入った割合: 78%(目安 80%前後)
上に外れた枠: 10/5(月)9:30-11:00 ── 連休明け+発送物A の到着
下に外れた枠: 10/23(金)15:00-17:00
中央の予測の平均の外れ: 1枠あたり 4.1件
事情のメモと照らす: 10/5 は発送物A の通数が予定より 2割多かった
表で出す理由は、担当が並べ替えて山を探せることです。 入電の上側から席数を引いた差が大きい枠を上から並べれば、どこが一番危ないかが一目で分かります。
下側・中央・上側を並べる理由は、席数を合わせる位置を担当が選べるようにするためです。 中央に合わせた場合と上側に合わせた場合の席数を並べ、その差が人件費の差になることを、管理者に説明できます。
外れ方の一覧を毎月出す理由は、幅の取り方を直すためです。 実績が幅に入る割合が8割を大きく下回る窓口は、学習の材料が足りていません。多くは、発送物の予定表に載っていない発送があるか、事情のメモが抜けています。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 電話の仕組み | 実績の出力(CSV) | 窓口・30分ごとの入電、応答、放棄、通話時間 |
| 契約サービス部の予定表 | 共有フォルダの表の読み取り | 発送物の種類・発送日・通数 |
| 内閣府のCSV | 年に1回の取り込み | 祝日と休日 |
| シフトの管理表 | 表の書き出し | 30分ごとの見込み、席数、枠の案、外れ方の一覧 |
シフトの管理表へは、新しいシートに書き出します。 担当が作業しているシートを上書きしません。採った席数を担当が別のシートに写した時点で、それが正式な見込みになります。
電話の仕組みの設定は変えません。 呼の振り分けや窓口の構成は、この構成の外にあります。
人が確認する
運用管理の担当が、毎月10日から1週間のうちに確かめます。
- 外れ方の一覧を先に読む … 前月にどの窓口がどちらに外れたかを見て、今月の幅の取り方を決める材料にします
- 山の日を確かめる … 上側の入電が大きい日を並べ、発送物と振替日で説明がつくかを見ます。説明のつかない山は、予定表の誤りか、予測の誤りです
- 事情を書き足す … 新商品、手続きの変更、システムの切り替えなど、過去のデータに無い出来事を事情のメモに書き、その日の席数を手で上乗せします
- 合わせる位置を決める … 窓口ごとに、中央に合わせるか、上側に合わせるかを決めます。請求の窓口のように、つながらないことの影響が大きい窓口は上側に寄せます
- 管理者に回す … 枠の案と、中央と上側の席数の差を添えて承認を求めます
3番目を省かないでください。 予測は過去のことしか知りません。来月に新しい案内を送ることを知っているのは、人だけです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 電話の仕組みの出力が欠けている日がある | その日を学習から外し、外れ方の一覧に「実績欠け」と出す |
| 発送物の予定表に日付が無い行がある | その発送物を列に入れず、担当に知らせる |
| 祝日のCSVが翌年分を含まない | 2月の取り直しまで、翌年の祝日を担当が手で入れる |
| 新しい窓口ができた | 過去のデータが無いため予測しない。担当が近い窓口の見込みを参考に決める |
| 大規模な災害や障害が起きた | 予測を使わず、担当が席数を決める。その期間を事情のメモで「除外」にする |
| 実績が幅に入る割合が6割を下回る | その窓口の予測を「参考」扱いにし、学習の材料を見直す |
| 席数の計算が目標を満たせない(人数の上限を超える) | 上限で止め、満たせない枠を一覧に出す |
| 処理が途中で止まる | 前月の見込みの表を残したまま、担当に知らせる |
5行目を決めておくことが大事です。 災害の直後は、過去のどの月とも違う入電になります。予測の数を信じて席を減らすと、一番つながってほしい時期につながらなくなります。
記録を残す
- 毎月の予測(窓口×日×30分の下側・中央・上側)と、使った設定ファイル
- 学習に使った期間と、学習から外した日
- 担当が採った席数と、合わせた位置(中央か上側か)、書き足した事情
- 翌月に入った実績と、外れ方の一覧
- モデルを作り直した日と、そのときの TimeSeriesSplit での測定の結果
3つ目の「合わせた位置」を残すのは、結果を説明するためです。 中央に合わせた月に電話がつながりにくかったなら、それは予測の外れではなく、合わせる位置の判断の結果です。 分けて残しておかないと、予測が悪かったのか判断が悪かったのかが分かりません。
04実装レベルの3段階
最小構成では、シフトは組めません。 1つの窓口の1か月分を試すだけです。手作業の見込みと比べて、続ける価値があるかを確かめる段階です。 半自動化で、1件25分が14分程度になります。 予測と席数は自動になりますが、発送物の予定を問い合わせて手で入れる作業と、枠への割り振りが残ります。本格構成で8分になり、この段階が本記事の想定です。 残る8分は、外れ方の一覧を読み、事情を書き足し、合わせる位置を決める時間です。 段階を飛ばさないでください。 半自動化を3か月回すと、どの窓口の予測が当たりやすく、どの窓口が外れやすいかが分かります。外れやすい窓口は、本格構成に進む前に学習の材料を見直します。
05工数削減シミュレーション
導入後 120件 × 8分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 契約者からの照会・手続き・請求の電話を受けるコールセンターを持ち、オペレーターが数十名から百名を超える生命保険・損害保険の会社。翌月のシフトを、前年の同じ月の実績を表計算で引き写して決めていて、発送物の多い週や連休明けに電話がつながりにくくなる場合。電話の仕組みから30分ごとの入電数と通話時間を2年分以上取り出せ、契約者への発送物の予定表が手に入る場合。
- オペレーターが数名で、全員がほぼ同じ時間帯に出勤している場合。過去の入電の記録が30分ごとに残っておらず、1日の合計しか分からない場合。入電の大半が予定の無い事故・災害の連絡で、過去の傾向から見込めない場合(大規模な災害の直後など)。なお、シフトを確定させる判断と、個人ごとの勤務の割り当ては、この構成では代替できません。
07最小構成で試す方法
- 6つの窓口のうち、入電の多い1つ(たとえば契約内容の照会)を選ぶ
- 電話の仕組みから、その窓口の2年分の30分ごとの入電数を取り出す
- 契約サービス部から、同じ2年分の発送物の実績(発送日・種類・通数)をもらう
- Python で、曜日・時刻・祝日・発送物の列を作り、直近の1か月を除いて学習させ、直近の1か月を予測する
- 予測と実績、そして当時の担当の手作業の見込みを、30分ごとに並べて比べる
手作業の見込みと比べるのが、この試しの目的です。 予測が当たっているかどうかより、手作業より外れが小さいか、外れる場所が違うかを見ます。
| 出てきた内容 | 判断 |
|---|---|
| 手作業より外れが小さい | 窓口を増やし、席数の計算に進む |
| 発送物の後の山を取り逃がしている | 発送物の列の作り方を直す。構成は有効 |
| 実績が幅に入る割合が極端に低い | 発送物の実績が欠けているか、障害の日が混ざっている。 データを先に整える |
3行目が出たときは、データを疑ってください。 予測の手法を変えるより先に、発送物の実績が全部そろっているかを確かめるほうが効きます。 障害の日や、電話の仕組みの入れ替えで記録が途切れた日が混ざっていないかも、同じときに見ます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 応答した数で学習して山が低く出る | 入電した数(放棄を含む)で学習する |
| 発送物の後の山を取り逃がす | 発送日からの経過営業日数と通数を列にする |
| 発送物の予定表の日付が幅で書かれている | 日付と通数の列を必ず埋めてもらう |
| 過去の障害の日を毎年くり返して見込む | 事情のメモで印を付け、学習から外す |
| 未来のデータで過去を当てる測り方をする | TimeSeriesSplit で時間の順に分ける |
| 幅の確かさを測らない | pinball loss と、幅に入る割合を窓口ごとに数える |
| 予測の数をそのまま席数にする | 処理時間とサービスレベルから席数を計算し、離席を足す |
| 窓口をまとめて1つのモデルにする | 窓口ごとに傾向が違うので分ける |
| 祝日のCSVの更新を忘れる | 毎年2月に取り直す手順を入れる |
| 休憩の長さが法令に合わない枠ができる | 枠と休憩の組み合わせを人事部と決め、設定に書く |
| 合わせる位置を残さない | 中央か上側かを毎月記録し、外れと判断を分ける |
| 災害の直後も予測を使う | 予測を使わない期間を決めておく |
| 下側が中央を上回る枠が出る | 3つの予測を小さい順に並べ直し、件数を記録する |
| かけ直しが二重に数えられる | 同じ番号の短時間の再入電を分けて出せるか、電話の仕組みで確かめる |
上の2行が、この構成の失敗のほとんどです。 どちらも、入電の山がどこから来るかを取り違えたときに起きます。放棄を含めた入電と、発送物の列の2つがそろえば、山の多くは過去のデータから説明できます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 窓口・30分ごとの入電数と通話時間、発送物の種類・日付・通数、口座振替日、シフトの枠と人数です。個人を特定する情報は扱いません。
- 電話の記録を集計の形で取り出す … 1件ずつの通話の記録には発信元の電話番号が入っています。30分ごとに集計したものだけを取り出し、この構成に個人の情報を持ち込まないでください
- 発送物の予定を外へ出さない … 発送物の予定には、新商品の案内や制度の変更の時期が含まれることがあります。社内の環境で処理し、外部のサービスへ送らない構成にしています
- 席数の判断は人が行う … この構成が出すのは、入電の幅と、それに合わせた席数の案までです。どこまで備えるか、何名を採用・派遣で手当てするかは、管理者が決めます
- オペレーター個人の評価に使わない … 30分ごとの席数は、窓口全体の見込みです。個人の応答件数や処理時間の評価に流用しないでください
- 法令に関わる設定は人事部と決める … 休憩の長さと与え方は、労働基準法第34条に従います。一斉に与えない場合の取り扱いを含め、枠の組み方は人事部と確かめてください
誤りが起きた場合のリスクは、席が足りずに契約者の電話がつながらないことと、席が余って人件費がかさむことの2つです。 前者は発送物の山を取り逃がすと、後者は上側に合わせすぎると起きます。どちらも、外れ方の一覧と合わせた位置の記録を毎月見ることで、早く気づけます。 予測を入れた後も、放棄率と応答率を窓口ごとに毎週見る運用は続けてください。予測が外れたときに最初に気づけるのは、その数字です。
10まず何から始めるか
1週目:データを取り出す
電話の仕組みから、6つの窓口の2年分の30分ごとの入電・応答・放棄・通話時間を取り出します。放棄を含めた入電の数が取り出せるかを、最初に確かめます。
2週目:発送物の実績をそろえる
契約サービス部と相談し、過去2年分の発送物の種類・発送日・通数を表にしてもらいます。今後の予定表の書き方も、この時点で決めます。
3週目:1つの窓口で試す
入電の多い窓口を1つ選び、直近の1か月を除いて学習させ、その1か月を予測します。当時の手作業の見込みと、30分ごとに並べて比べます。
4週目:席数の計算をつなぐ
予測から席数を出し、離席の分を足すところまで作ります。サービスレベルの目標と離席の割合は、設定ファイルにして担当が書き換えられるようにします。
2か月目: 6つの窓口すべてに広げ、毎月10日に動かします。手作業の見込みと並行して作り、どちらが当たったかを外れ方の一覧で比べます。3か月目以降: 枠の案と事情のメモを足し、手作業の見込みをやめます。1件25分が何分になったかを実測し、実績が幅に入る割合がどの窓口でも8割前後に落ち着いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
loss に squared_error・absolute_error・gamma・poisson・quantile を選べること。quantile で推定する分位点を0から1で指定すること。欠損値(NaN)をそのまま扱えること。n_samples が1万以上の大きなデータで GradientBoostingRegressor よりかなり速いこと | scikit-learn: HistGradientBoostingRegressor | 2026-10-07 |
訓練のデータが常にテストのデータより前になるように分けること。分けるたびに訓練のデータが前のものを含むこと。n_splits(既定5)、test_size、gap | scikit-learn: TimeSeriesSplit | 2026-10-07 |
分位点回帰のモデルの評価に使う指標で、alpha で分位点を指定すること(既定0.5) | scikit-learn: mean_pinball_loss | 2026-10-07 |
| 昭和30年(1955年)から令和9年(2027年)までの国民の祝日をCSV形式で掲載していること。令和10年(2028年)の国民の祝日は前年の2月に掲載すること | 内閣府: 国民の祝日について | 2026-10-07 |
| 労働基準法第34条(労働時間が6時間を超える場合は少なくとも45分、8時間を超える場合は少なくとも1時間の休憩を労働時間の途中に与えること。一斉に与えることと、その例外) | e-Gov 法令API: 労働基準法 | 2026-10-07 |
席数をどこまで備えるか、シフトをどう確定させるかは、コールセンターの管理者と人事部で決めてください。 本記事は公開されている仕様と法令で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0736)についてのご相談はこちらから。
