EV充電スポットの運営会社が拠点ごとの充電の記録から Python で翌月の利用を幅付きで予測し、混雑する時間帯と増設の候補を出す
充電器ごとの充電の記録から、拠点・時間帯ごとの翌月の利用回数と埋まり具合を Python で予測します。下振れ・中央・上振れの幅で出し、混雑しそうな時間帯と、増設や案内の見直しを検討する拠点の候補を会議の資料にします。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/不動産/小売
- 対象部門
- 経営企画
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、担当が充電の管理システムから前月の充電の記録を CSV で書き出す
- 表計算で、拠点と充電器の種類ごとに利用回数・充電量・平均の充電時間を集計する
- 時間帯ごとに、口が埋まっていた時間の割合(埋まり具合)を、つないだ時刻と外した時刻から手で計算する
- 前年の同じ月と前月の数字を並べ、連休の数や天気を思い出しながら翌月の見込みを決める
- 埋まり具合の高い時間帯の多い拠点を、増設や案内の見直しの候補として書き出す
- 会議の資料にまとめ、拠点ごとに一言の説明を書く
- 人担当が月初に前月の充電の記録を CSV で書き出し、決まったフォルダに置く
- 自動毎月3日の朝に Python のプログラムが動き、記録の形と件数を確かめる
- 自動1回の充電を時間帯に分け、拠点・充電器の種類・日・時間帯ごとの利用回数と埋まり具合を集計する。故障で止まっていた時間は分母から外す
- 自動祝日・連休・曜日・季節と過去の利用から、翌月の日ごと・時間帯ごとの利用を、下振れ・中央・上振れの3つで予測する
- 自動過去の月で同じ手順の予測をやり直し、前年の同じ月を使った単純な見込みと比べて、外れ方を拠点ごとに出す
- 自動決まりの基準で、混雑する時間帯、上限に張り付いている時間帯、増設・案内の見直しの候補に印を付ける
- 自動拠点ごとの予測の表と印を Claude API に渡し、会議の資料の説明の文を JSON で受け取る。文の数字は表と照らす
- 人経営企画の担当が予測と候補を読み、設置先との協議の予定や近くの競合の情報を書き足す
- 人会議で、増設・案内の見直しをどの拠点で検討するかを決める
各工程の詳しい説明を読む
- 月初に、担当が充電の管理システムから前月の充電の記録を CSV で書き出す
- 表計算で、拠点と充電器の種類ごとに利用回数・充電量・平均の充電時間を集計する
- 時間帯ごとに、口が埋まっていた時間の割合(埋まり具合)を、つないだ時刻と外した時刻から手で計算する
- 前年の同じ月と前月の数字を並べ、連休の数や天気を思い出しながら翌月の見込みを決める
- 埋まり具合の高い時間帯の多い拠点を、増設や案内の見直しの候補として書き出す
- 会議の資料にまとめ、拠点ごとに一言の説明を書く
(a)時間帯の集計に時間がかかる。 3番目は、1回の充電がどの時間帯にまたがったかを分けて足す作業です。夜の10時につないで翌朝に外した充電は、10時間分の時間帯にまたがります。 表計算でやると式が複雑になり、月によって式が壊れます。
(b)翌月の見込みが担当の感覚で決まる。 4番目で、「先月より連休が1日多いから1割増」のように決めています。担当が替わると、同じ拠点でも見込みの出し方が変わります。 外れたときに、何が外れたのかを振り返る手がかりもありません。
(c)満車の拠点を少なく見る。 5番目で、利用回数の伸びが止まった拠点は「頭打ち」と見られがちです。実際には口がすべて埋まっていて、それ以上は記録のしようがないことがあります。増設すべき拠点が、候補から外れます。
(d)故障の時間が混ざる。 充電器が止まっていた日の利用の少なさが、需要の落ち込みとして見込みに入ってしまうことがあります。
- 【人】 担当が月初に前月の充電の記録を CSV で書き出し、決まったフォルダに置く
- 【自動】 毎月3日の朝に Python のプログラムが動き、記録の形と件数を確かめる
- 【自動】 1回の充電を時間帯に分け、拠点・充電器の種類・日・時間帯ごとの利用回数と埋まり具合を集計する。故障で止まっていた時間は分母から外す
- 【自動】 祝日・連休・曜日・季節と過去の利用から、翌月の日ごと・時間帯ごとの利用を、下振れ・中央・上振れの3つで予測する
- 【自動】 過去の月で同じ手順の予測をやり直し、前年の同じ月を使った単純な見込みと比べて、外れ方を拠点ごとに出す
- 【自動】 決まりの基準で、混雑する時間帯、上限に張り付いている時間帯、増設・案内の見直しの候補に印を付ける
- 【自動】 拠点ごとの予測の表と印を Claude API に渡し、会議の資料の説明の文を JSON で受け取る。文の数字は表と照らす
- 【人】 経営企画の担当が予測と候補を読み、設置先との協議の予定や近くの競合の情報を書き足す
- 【人】 会議で、増設・案内の見直しをどの拠点で検討するかを決める
5番目を毎月行うことが、この設計の要です。 予測が当たっているかは、翌月にならないと分かりません。過去の月で同じ手順をやり直し、単純な見込みより外れが小さいかを毎月確かめます。 単純な見込みに負けている拠点は、その拠点の予測を資料に出さず、理由を調べます。
9番目の決定は、会議で行います。 増設は設置先の施設との協議、電力の契約、工事の費用が絡み、予測の数字だけで決められることではありません。
02今回想定するシステム構成
充電の管理システム ── 充電の記録(CSV、月ごと) 内閣府の国民の祝日の CSV / 拠点の一覧(口の数、種類、開業日) / 故障の記録 │ ▼【トリガー】毎月3日の朝(定期実行) Python ├──▶ 記録の形と件数を確かめる ├──▶ 1回の充電を時間帯に分け、利用回数と埋まり具合を集計する ├──▶ 故障の時間を分母から外し、上限に張り付いた時間帯に印を付ける ├──▶ scikit-learn で翌月を10%点・50%点・90%点で予測する ├──▶ 過去の月でやり直し、単純な見込みと外れ方を比べる ▼ Claude API ── 予測の表と印から、説明の文を JSON で返す(数字は照合) ▼ 予測の表・候補の一覧(ファイル共有) ──▶【人】経営企画が読み、会議で決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Python(pandas、scikit-learn の HistGradientBoostingRegressor) | R、Google Apps Script |
| 生成AI | Claude API(説明の文の下書き、構造化出力) | OpenAI API |
| 定期実行 | Windows のタスク スケジューラー、または Linux の cron | - |
| 保管 | 社内のファイル共有(記録の CSV、予測の表、候補の一覧、処理ログ) | - |
| 記録 | いまの充電の管理システム(CSV の書き出し) | - |
新しく足すのは、Python のプログラムと、その出力を置くフォルダだけです。 充電の管理システムとはつながず、CSV の書き出しは人が行います。 管理システムが API を持っていても、最初は CSV で始めるほうが、どの月の記録で予測したかがはっきりします。
予測の中心は、scikit-learn の HistGradientBoostingRegressor です。 公式のページでは、損失に quantile を選ぶとピンボール損失を使い、quantile の値で推定する分位点を0から1のあいだで指定するとされています。10%点・50%点・90%点の3つのモデルを作り、幅を出します。 公式のページでは、欠損値(NaN)をそのまま扱えるとされており、開業して日の浅い拠点の前年の値が無くても学習に入れられます。
生成AIは、説明の文を書くためだけに使います。 予測と印はすべて Python が出し、Claude API には表を渡して文を書かせます。AIが予測の数字を作ることはありません。
03どうやって実装するのか
処理の起点を決める
毎月3日の朝に、定期実行で動かします。 月末の最終日の夜につないだ充電は翌日に終わるので、記録が出そろうのは2日以降です。プログラムは最初に、決まったフォルダに前月の CSV が置かれているかを見ます。無ければ何も作らず、担当へ知らせて止まります。 翌日の同じ時刻にもう一度見に行きます。
CSV があっても、すぐには予測しません。 前月の件数を前年の同じ月・前月と比べ、極端に少なければ書き出しの漏れを疑って止めます。 書き出しの期間の指定を誤ると、月の後半が欠けた CSV ができます。欠けたまま学ばせると、翌月の予測がまるごと下にずれます。
会議の1週間前までに資料がそろうように、実行の日を決めます。 経営企画の担当が予測を読み、設置先との協議の予定を書き足す時間が要るからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 充電の記録 | 拠点、充電器、口の番号、つないだ時刻・外した時刻、充電の開始と終了、電力量、終わり方 | 充電の管理システムの CSV |
| 拠点の一覧 | 拠点、種類(急速・普通)、口の数、設置先の種類(商業施設・ホテル・駐車場・道路沿い)、開業日、増設の履歴 | 拠点の一覧のファイル |
| 故障の記録 | 拠点、充電器、止まっていた時間の始まりと終わり、理由 | 保守の記録 |
| 祝日 | 国民の祝日・休日の月日と名称 | 内閣府の国民の祝日の CSV |
| 決まり | 混雑とみなす埋まり具合、上限に張り付いたとみなす条件、増設の候補の条件 | 決まりのファイル |
質を決めるのは、「つないだ時刻」と「外した時刻」です。 充電の開始と終了だけでは、充電が終わったあとも車が口をふさいでいた時間が分かりません。埋まり具合は、充電していた時間ではなく、口がふさがっていた時間で数えます。普通充電の拠点では、この差が大きく出ます。
祝日は内閣府の CSV を使います。 内閣府のページでは、昭和30年(1955年)から令和9年(2027年)までの国民の祝日を CSV で公開しています。文字コードは Shift_JIS 系なので、読むときに指定します。 翌年の祝日が載っていない時期は、予測の対象の月が範囲に入っているかを確かめ、入っていなければ止めます。
データの取得方法を決める
| 取るもの | どう取るか | 何に使うか |
|---|---|---|
| 時間帯ごとの占有の分 | 1回の充電を、つないだ時刻から外した時刻まで1時間ごとに分け、時間帯ごとの分数を足す | 埋まり具合の元 |
| 使える分 | 口の数 × 60分から、故障で止まっていた分を引く | 埋まり具合の分母 |
| 埋まり具合 | 占有の分 ÷ 使える分 | 混雑の判定と予測の対象 |
| 利用回数 | 時間帯ごとに、つないだ回数を数える | 予測の対象 |
| 張り付きの印 | 埋まり具合が決まりの値以上の時間帯 | 需要を少なく見る恐れの印 |
| 暦の特徴 | 曜日、祝日、連休の何日目か、月、学校の長期休みの時期 | 予測の手がかり |
1回の充電を時間帯に分ける処理が、Before の②の15分を置き換える部分です。 日をまたぐ充電、月をまたぐ充電は、月の境目で切り、前月の分は前月の集計に入れます。 時刻は充電の管理システムが出す時間帯の扱いを確かめ、日本時間にそろえます。
AIへ渡す前に整形する
- 形を確かめる … 列の名前と並び、時刻の形、件数を確かめます。合わなければ止めます
- おかしな行を除く … 外した時刻がつないだ時刻より前の行、48時間を超える行、同じ口で時間が重なる行を除き、件数を残します
- 時間帯に分ける … 上の表のとおりに集計します
- 故障の時間を外す … 故障の記録の時間を、使える分から引きます。口がすべて止まっていた時間帯は、予測の学習から外します
- 張り付きの印を付ける … 埋まり具合が決まりの値以上の時間帯に印を付けます
- 暦の特徴を作る … 祝日の CSV から祝日と連休の何日目かを作ります
- 過去の利用の特徴を作る … 前年の同じ月の同じ曜日・時間帯の平均、直近8週の同じ曜日・時間帯の平均。予測する月より前に分かっている値だけを使います
- 開業の日数を付ける … 開業から日の浅い拠点は、伸びている途中なので、開業からの月数を特徴に入れます
7番目の「前に分かっている値だけ」を守らないと、過去の月でやり直した成績が良く見えすぎます。 予測する月の中の値が特徴に混ざると、答えを見ながら答えていることになります。直近8週の平均は、予測する月の前日までで切ります。
3番目の分け方は、例で確かめておきます。 21時40分につないで翌朝6時10分に外した普通充電は、21時台に20分、22時台から5時台に各60分、6時台に10分として足します。この1回が、9つの時間帯の埋まり具合に入ります。 表計算でつまずいていたのはここで、Python では1回の充電を分単位の区間として持ち、時間帯の境目で切って足すだけで済みます。
AIに処理させる
予測をするのは、Python の機械学習のモデルです。 生成AIは、その結果を会議の資料の文にするだけです。
| 出力 | 中身 | 作るもの |
|---|---|---|
| 日ごと・時間帯ごとの利用回数 | 10%点・50%点・90%点 | HistGradientBoostingRegressor(分位点の損失) |
| 時間帯ごとの埋まり具合 | 10%点・50%点・90%点 | 同上 |
| 混雑する時間帯 | 90%点の埋まり具合が決まりの値を超える時間帯 | 決まりの基準 |
| 増設の候補 | 張り付きの印が月の決まりの日数を超え、50%点の埋まり具合も高い拠点 | 決まりの基準 |
| 案内の見直しの候補 | 普通充電で、充電を終えたあとの占有が長い拠点 | 決まりの基準 |
| 説明の文 | 拠点ごとに2〜3文 | Claude API |
学習は、すべての拠点をまとめた1つのモデルで行います。 拠点ごとに分けると、記録の少ない拠点のモデルが作れません。拠点の種類・設置先の種類・口の数を特徴に入れ、 似た拠点の動きから学ばせます。公式のページでは、categorical_features で区分の特徴を指定でき、区分ごとの値の数は max_bins 以下である必要があるとされています。拠点の番号そのものを区分の特徴に入れるかは、拠点の数が増えたときに見直します。
学習に使う期間は、直近2年を基本にします。 それより古い記録は、EVの台数や周辺の充電器の数がいまと大きく違い、いまの動きを学ぶ邪魔になることがあります。 期間を変えたときは、過去の月でのやり直しの成績を比べてから切り替えます。モデルの設定(木の深さ、学習の回数)は最初は既定のままにし、データの扱いが固まるまで細かく詰めません。
過去の月でのやり直しには、TimeSeriesSplit を使います。 公式のページでは、時間の順に並んだデータで、未来のデータで学んで過去を評価することを避けるための分け方とされ、学習の期間とテストの期間のあいだを空ける gap を指定できます。外れ方は mean_pinball_loss で測ります。 公式のページでは、分位点の回帰のためのピンボール損失で、alpha で狙う分位点を指定し、0.5のときは平均絶対誤差と同じになるとされています。
| させないこと | 理由 |
|---|---|
| 増設を決める | 設置先との協議と投資の判断。会議で決める |
| 張り付いた時間帯の需要を推し量る | 記録に無い。印として示し、人が読む |
| 予測の数字を生成AIに作らせる | 予測はモデル、文は生成AI、と分ける |
| 説明の文で理由を作る | 「近くに競合ができた」などは表に無い |
2行目がいちばん大事です。 張り付いた時間帯の本当の需要は、記録からは分かりません。モデルはそこを「上限まで使われた」としか学べないので、予測の上振れも上限で止まります。増設の候補は予測の数字の大きさではなく、張り付きの日数で出します。
指示内容を固定する
あなたはEV充電スポットの運営会社の経営企画の担当です。
拠点ごとの翌月の利用の予測の表と印をもとに、会議の資料の説明の文を書いてください。
【書き方】
- summary:その拠点の翌月の見通しを2〜3文で。
- busy_hours:混雑する時間帯を、表のとおりに並べる。
- flags_explained:付いている印の意味を1文ずつ。
【数字の使い方】
- 数字は、表にある値だけを、表のとおりの形で書いてください。
- 割合・差・合計を計算して新しい数字を作らないでください。
- 文で使った数字は、numbers_used にすべて並べてください。
- 予測は「10%点〜90%点」の幅で書き、中央の値だけを書かないでください。
【厳守事項】
- 増設すべき・すべきでない、と書かないでください。候補であることだけを書いてください。
- 利用が増えた・減った理由を推測して書かないでください(競合、景気、EVの普及など)。
- 「張り付き」の印のある拠点では、「記録上の利用は上限に達しており、
実際の需要は記録より多い可能性がある」旨を必ず書いてください。
- 単純な見込みより外れが大きい拠点(model_worse が true)は、
summary を空にし、needs_review に理由を書いてください。
【拠点】{site_name}({site_type}、{charger_type}、口の数 {ports})
【予測の表】{forecast_table}
【過去の月の外れ方】{backtest}
【印】{flags}
「中央の値だけを書かない」は、幅で出す意味を守るためです。 何も言わなければ、文は「来月は約1,240回の見込み」と1つの数字に寄ります。会議で読まれるのは文のほうなので、幅を文にも残します。
出力形式を固定する
Claude API の構造化出力で、次の形の JSON を受け取ります。 公式のページでは、output_config.format に json_schema を指定し、オブジェクトには additionalProperties: false を付けることとされています。数値の minimum・maximum には対応しないとされているので、値の範囲は Python の側で確かめます。
{
"site_id": "S-031",
"summary": "",
"busy_hours": ["土 12時台", "土 13時台", "日 12時台"],
"flags_explained": [""],
"numbers_used": ["410", "520", "640"],
"needs_review": null
}
Python の側の予測の表は、次の形で保存します。 こちらが会議の資料の本体で、文は添え物です。
| 列 | 中身 |
|---|---|
site_id・charger_type・date・hour | 拠点、種類、日、時間帯 |
sessions_p10・sessions_p50・sessions_p90 | 利用回数の10%点・50%点・90%点 |
occ_p10・occ_p50・occ_p90 | 埋まり具合の10%点・50%点・90%点 |
saturated_last_month | 前月の同じ曜日・時間帯で張り付いていた日数 |
model_worse | 過去の月で、単純な見込みより外れが大きかったか |
照合は次のとおりです。
| 検査 | 合わないとき |
|---|---|
numbers_used の数字がすべて予測の表にある | 「要確認」(表にない数字) |
busy_hours が、表で混雑の印のある時間帯と同じ | 「要確認」(取り違え) |
| 張り付きの印のある拠点の文に、需要が多い可能性の旨がある | 「要確認」(書き漏れ) |
| 文に「増設すべき」「競合」「普及」がない | 「要確認」(禁じた内容) |
10%点が50%点を上回る、50%点が90%点を上回ることが、分位点を別々のモデルで出すと起こりえます。Python の側で並べ替えて順をそろえ、そろえた件数をログに残します。 件数が多い拠点は、特徴かデータを見直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 充電の管理システム | CSV の書き出し(人) | 前月の充電の記録 |
| 内閣府の祝日の CSV | ダウンロード | 祝日と連休の特徴 |
| 拠点の一覧・故障の記録 | ファイルの読み取り | 口の数、開業日、止まっていた時間 |
| Claude API | Python からの API 呼び出し | 拠点ごとの説明の文 |
| ファイル共有 | ファイルの書き出し | 予測の表、候補の一覧、説明の文、処理ログ |
充電の管理システムには書き込みません。 予測の結果で料金や時間の上限を自動で変えることもしません。この構成が出すのは、会議の材料までです。
API キーは環境変数に置き、プログラムに書きません。 定期実行のアカウントだけが読めるようにします。
人が確認する
- 止まった理由を見る … CSV が無い、件数が少ない、祝日の CSV に対象の月が無い、のどれかです
model_worseの拠点を見る … 単純な見込みに負けている拠点は、改装・周辺の工事・料金の変更など、記録に無い変化があったかを確かめます- 増設の候補を読む … 張り付きの日数と予測の幅を見て、設置先との協議の予定を書き足します
- 説明の文を直す … 表に無い事情(近くの充電器の開業、施設の営業時間の変更)を書き足します
- 会議で決める … どの拠点で増設・案内の見直しを検討するかを決め、記録します
候補の一覧は、拠点ごとに1枚の表にまとめて渡します。 時間帯の予測の行は1拠点で月に数百行になるので、人が読むのは、混雑の印のある時間帯と張り付きの日数、過去の月の外れ方の3つに絞った要約の表です。細かい行は、疑問が出たときに開きます。
目標は、1件あたり10分です。 多くの拠点は予測の表と文を流し見て数分で済み、増設の候補と model_worse の拠点に時間を使います。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSV が無い・件数が極端に少ない | 予測せずに止め、担当へ知らせる |
| 列の名前・時刻の形が変わった | 止める。管理システムの更新を疑う |
| 祝日の CSV に対象の月が無い | 止める。新しい版を取り直す |
| 開業から3か月未満の拠点 | 予測の表には出すが「参考」の印を付け、候補の判定に使わない |
| 増設したばかりの拠点 | 口の数が変わった月より前の埋まり具合を、新しい口の数で読み替えない。印を付ける |
| 口がすべて止まっていた時間帯 | 学習から外し、故障の時間として別に示す |
| 分位点の順が逆になる | 並べ替えてそろえ、件数をログに残す |
| 単純な見込みに負ける | 文を作らず、needs_review で人に回す |
refusal や max_tokens で文が返らない | 表だけを出し、文は人が書く |
どの行で止まったかは、処理ログの1行目に書きます。 担当が最初に開くのはログで、止まった理由がすぐ分かれば、CSV を取り直すか、管理システムの提供元に聞くかがその場で決まります。
増設したばかりの拠点の行は、見落としやすいところです。 口が2つから4つに増えた拠点で、前の月の埋まり具合をそのまま学ばせると、混雑が続くように予測します。 拠点の一覧の増設の履歴から、口の数が変わった月を特徴に入れます。
撤去や長い休止の拠点も同じです。 設置先の改装で2か月止まっていた拠点は、その期間を学習から外し、再開した月を「開業」と同じように扱って「参考」の印を付けます。 止まっていた理由と期間は、故障の記録とは別に拠点の一覧に残しておきます。
記録を残す
- 実行の日時、使った CSV のファイル名と件数、除いた行の件数と理由
- 学習に使った期間と特徴の一覧、モデルの設定、scikit-learn の版
- 過去の月でのやり直しの結果(拠点ごとのピンボール損失と、単純な見込みとの比較)
- 予測の表、候補の一覧、AIに渡した表とAIが返した JSON、照合の結果
- 会議の決定と、翌月の実際の利用との差
最後の行を毎月残すことで、予測が役に立っているかが分かります。 半年分たまれば、どの種類の拠点で外れやすいか、上振れの90%点を超える月がどれくらいあるかが見えます。90%点を超える月が1割を大きく超えるなら、幅が狭すぎます。
04実装レベルの3段階
半自動化で、Before の①②③の35分がほぼプログラムに移ります。 ただし、候補の書き出しと説明の文が手で残ります。 本記事の想定は本格構成です。 1件40分が10分になるのはこの段階です。残る10分は、増設の候補と単純な見込みに負けた拠点を人が読む時間です。 予測の質を上げることより、この10分を削らないことのほうが大事です。
05工数削減シミュレーション
導入後 120件 × 10分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 商業施設・宿泊施設・駐車場などに急速と普通の充電器を数十拠点で運営し、充電の管理システムから充電の記録を CSV で書き出せる会社。拠点ごとの月の利用を表計算で集計し、増設や料金・案内の見直しを担当者の経験で決めている場合。社内に Python を書ける人がいるか、外部に頼める場合。
- 拠点が数か所で、月の利用を目で見れば足りる事業者。充電の記録を書き出せず、月の合計の利用回数しか持っていない場合(時間帯の予測ができません)。開業して数か月の拠点ばかりで、季節の動きを学べるだけの記録が無い場合。なお、増設の投資の判断と、設置先との契約の判断はこの構成の対象外です。
07最小構成で試す方法
- 性質の違う8拠点を選ぶ(道路沿いの急速、ホテルの普通、商業施設、開業1年未満、いつも満車の拠点を混ぜる)
- 8拠点の過去2年分の充電の記録を CSV で書き出す
- Python で、時間帯ごとの埋まり具合の集計だけを作り、いつもの表計算の結果と合うかを確かめる
- 前年の同じ月の値を「単純な見込み」として、過去6か月分の当たり外れを出す
- 同じ6か月を HistGradientBoostingRegressor で予測し、単純な見込みと外れ方を比べる
3番目を必ず先に行ってください。 集計が合わなければ、予測はすべて崩れます。つないだ時刻と外した時刻の扱い、日をまたぐ充電の分け方で、表計算と食い違うことが多くあります。
| 出てきた内容 | 判断 |
|---|---|
| 多くの拠点で単純な見込みより外れが小さい | 全拠点に広げる段階に進む |
| 満車の拠点の予測が上限で止まる | 想定どおり。張り付きの印で読む |
| 開業1年未満の拠点で外れが大きい | 開業からの月数を特徴に入れ、「参考」の扱いにする |
| どの拠点でも単純な見込みに負ける | 特徴とデータの期間を見直す。負けたままなら導入しない |
最後の行の判断を、最初に決めておいてください。 単純な見込みに勝てない予測を資料に載せると、手間をかけて精度の低い数字を出すことになります。
いつも満車の拠点は、試す前から結果の読み方を決めておきます。 予測が上限で止まるのは誤りではなく、記録の性質です。ここで「予測が当たらない」と判断して導入をやめないでください。 満車の拠点で見るのは予測の精度ではなく、張り付きの日数が月ごとにどう動いているかです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 満車の拠点の需要を少なく見る | 張り付きの印で読む。 増設の候補は印の日数で出す |
| 充電の時間だけで埋まり具合を数える | つないだ時刻から外した時刻で数える |
| 故障の日を需要の落ち込みと学ぶ | 使える分から故障の時間を引き、全停止の時間帯を外す |
| 過去の月でのやり直しの成績が良すぎる | 予測する月の値が特徴に混ざっていないかを見る |
| 単純な見込みに負けているのに資料に載る | 毎月比べ、負けた拠点は文を作らない |
| 中央の値だけが会議で一人歩きする | 表も文も幅で書く |
| 分位点の順が逆になる | 並べ替えてそろえ、件数を見る |
| 祝日の CSV が翌年に対応していない | 対象の月が範囲にあるかを見て、無ければ止める |
| 増設したばかりの拠点の予測が崩れる | 口の数が変わった月を特徴に入れる |
| 書き出しの期間の誤りで月の後半が欠ける | 件数を前年・前月と比べて止める |
上の2行が、この構成の失敗のほとんどです。 どちらも、記録に残った数を、そのまま需要として読むことから来ています。記録が何を数えているのかを、最初に決めてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 拠点ごとの充電の記録、料金、故障の記録、拠点の契約に関わる情報です。充電の記録には、会員の番号や車の識別の情報が含まれていることがあります。
- 予測に要らない列を最初に落とす … 会員の番号、カードの情報、車の識別の情報は、予測に使いません。CSV を読んだ直後に落とし、集計の後のデータには残しません
- 外部へ渡す範囲を、拠点ごとの予測の表に限る … Claude API に渡すのは、拠点の名前を番号に置き換えた予測の表と印だけです
- 増設を AI に決めさせない … 予測と印は材料で、決めるのは会議です
- 料金や時間の上限を自動で変えない … 利用者に直接ひびく変更は、人が決めて案内します
- 設置先に見せる資料と社内の資料を分ける … 予測の数字は社内の判断の材料で、設置先との協議に出すときは、出す範囲を担当が決めます
- API キーをプログラムに書かない … 環境変数に置き、定期実行のアカウントだけが読めるようにします
誤りが起きた場合のリスクは、増設すべき拠点を見落とすことと、外れた予測を根拠に投資を決めることの2つです。前者は張り付きの印で、後者は幅と単純な見込みとの比較で防ぎ、最後は会議で、設置先との協議と投資の判断として決めます。
10まず何から始めるか
1週目:CSV の中身を確かめる
充電の管理システムの CSV に、つないだ時刻と外した時刻が出るかを確かめます。出なければ、管理システムの設定か提供元に確かめます。あわせて、故障の記録を拠点・充電器・時間の形でそろえます。
2週目:8拠点で集計を作る
性質の違う8拠点の2年分の記録で、時間帯ごとの埋まり具合を Python で集計し、いつもの表計算の結果と合うまで直します。
3週目:単純な見込みと比べる
前年の同じ月を単純な見込みとし、HistGradientBoostingRegressor の予測と過去6か月分で外れ方を比べます。勝てなければ、ここで特徴とデータを見直します。
4週目:張り付きの印と候補の基準を決める
混雑とみなす埋まり具合、張り付きとみなす条件、増設の候補の条件を、経営企画で決めます。基準は数字で書き、決まりのファイルに置きます。
2か月目: 全拠点に広げ、毎月の定期実行に乗せます。3か月目以降: 説明の文と照合を足し、会議の資料の下書きまで出します。翌月の実際の利用と予測の幅を毎月並べ、増設の候補が同じ物差しで出せるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の損失に quantile(ピンボール損失)があり、quantile で0〜1の分位点を指定すること。欠損値(NaN)を扱えること。categorical_features で区分の特徴を指定でき、区分ごとの値の数が max_bins 以下であること(ページは scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingRegressor | 2026-10-27 |
TimeSeriesSplit が、未来のデータで学んで過去を評価することを避けるための分け方であること。gap で学習とテストのあいだを空けられること | scikit-learn: TimeSeriesSplit | 2026-10-27 |
mean_pinball_loss が分位点の回帰のためのピンボール損失で、alpha で分位点を指定し、0.5のときは平均絶対誤差と同じになること | scikit-learn: mean_pinball_loss | 2026-10-27 |
| 昭和30年(1955年)から令和9年(2027年)までの国民の祝日が CSV で公開されていること(CSV の文字コードは Shift_JIS 系) | 内閣府: 国民の祝日について | 2026-10-27 |
構造化出力を output_config.format の json_schema で指定すること。オブジェクトに additionalProperties: false が要ること。数値の minimum・maximum に対応しないこと | Anthropic: Structured outputs | 2026-10-27 |
増設の投資の判断と、設置先・電力の契約の条件は、関係する契約と社内の決裁の手続きで確かめてください。 本記事は、充電の記録からの利用の予測と候補の洗い出しに絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1985)についてのご相談はこちらから。
