Media > AI活用ユースケース > 経営企画 > EV充電スポットの運営会社が拠点ごとの充電の記録から Python で翌月の利用を幅付きで予測し、混雑する時間帯と増設の候補を出す

EV充電スポットの運営会社が拠点ごとの充電の記録から Python で翌月の利用を幅付きで予測し、混雑する時間帯と増設の候補を出す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

充電器ごとの充電の記録から、拠点・時間帯ごとの翌月の利用回数と埋まり具合を Python で予測します。下振れ・中央・上振れの幅で出し、混雑しそうな時間帯と、増設や案内の見直しを検討する拠点の候補を会議の資料にします。

サマリー
生成AI
ChatGPT/Claude
連携・自動化
Google Apps Script/Python
対象業界
その他/不動産/小売
対象部門
経営企画
対象業務
集計・分析
主な課題
データ分析に時間がかかる/判断に時間がかかる/属人化している
AIで行う処理
予測
主な効果
判断支援/工数削減/機会損失防止
導入難易度
★★★★☆
実装レベル
本格構成
費用感
個別開発(大)
人間の確認
条件付き
現在工数
80h/月
AI導入後
20h/月
想定削減
75%
年間削減
720h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 月初に、担当が充電の管理システムから前月の充電の記録を CSV で書き出す
  2. 表計算で、拠点と充電器の種類ごとに利用回数・充電量・平均の充電時間を集計する
  3. 時間帯ごとに、口が埋まっていた時間の割合(埋まり具合)を、つないだ時刻と外した時刻から手で計算する
  4. 前年の同じ月と前月の数字を並べ、連休の数や天気を思い出しながら翌月の見込みを決める
  5. 埋まり具合の高い時間帯の多い拠点を、増設や案内の見直しの候補として書き出す
  6. 会議の資料にまとめ、拠点ごとに一言の説明を書く
導入後(After)
  1. 人担当が月初に前月の充電の記録を CSV で書き出し、決まったフォルダに置く
  2. 自動毎月3日の朝に Python のプログラムが動き、記録の形と件数を確かめる
  3. 自動1回の充電を時間帯に分け、拠点・充電器の種類・日・時間帯ごとの利用回数と埋まり具合を集計する。故障で止まっていた時間は分母から外す
  4. 自動祝日・連休・曜日・季節と過去の利用から、翌月の日ごと・時間帯ごとの利用を、下振れ・中央・上振れの3つで予測する
  5. 自動過去の月で同じ手順の予測をやり直し、前年の同じ月を使った単純な見込みと比べて、外れ方を拠点ごとに出す
  6. 自動決まりの基準で、混雑する時間帯、上限に張り付いている時間帯、増設・案内の見直しの候補に印を付ける
  7. 自動拠点ごとの予測の表と印を Claude API に渡し、会議の資料の説明の文を JSON で受け取る。文の数字は表と照らす
  8. 人経営企画の担当が予測と候補を読み、設置先との協議の予定や近くの競合の情報を書き足す
  9. 人会議で、増設・案内の見直しをどの拠点で検討するかを決める
各工程の詳しい説明を読む
  1. 月初に、担当が充電の管理システムから前月の充電の記録を CSV で書き出す
  2. 表計算で、拠点と充電器の種類ごとに利用回数・充電量・平均の充電時間を集計する
  3. 時間帯ごとに、口が埋まっていた時間の割合(埋まり具合)を、つないだ時刻と外した時刻から手で計算する
  4. 前年の同じ月と前月の数字を並べ、連休の数や天気を思い出しながら翌月の見込みを決める
  5. 埋まり具合の高い時間帯の多い拠点を、増設や案内の見直しの候補として書き出す
  6. 会議の資料にまとめ、拠点ごとに一言の説明を書く

(a)時間帯の集計に時間がかかる。 3番目は、1回の充電がどの時間帯にまたがったかを分けて足す作業です。夜の10時につないで翌朝に外した充電は、10時間分の時間帯にまたがります。 表計算でやると式が複雑になり、月によって式が壊れます。

(b)翌月の見込みが担当の感覚で決まる。 4番目で、「先月より連休が1日多いから1割増」のように決めています。担当が替わると、同じ拠点でも見込みの出し方が変わります。 外れたときに、何が外れたのかを振り返る手がかりもありません。

(c)満車の拠点を少なく見る。 5番目で、利用回数の伸びが止まった拠点は「頭打ち」と見られがちです。実際には口がすべて埋まっていて、それ以上は記録のしようがないことがあります。増設すべき拠点が、候補から外れます。

(d)故障の時間が混ざる。 充電器が止まっていた日の利用の少なさが、需要の落ち込みとして見込みに入ってしまうことがあります。

  1. 【人】 担当が月初に前月の充電の記録を CSV で書き出し、決まったフォルダに置く
  2. 【自動】 毎月3日の朝に Python のプログラムが動き、記録の形と件数を確かめる
  3. 【自動】 1回の充電を時間帯に分け、拠点・充電器の種類・日・時間帯ごとの利用回数と埋まり具合を集計する。故障で止まっていた時間は分母から外す
  4. 【自動】 祝日・連休・曜日・季節と過去の利用から、翌月の日ごと・時間帯ごとの利用を、下振れ・中央・上振れの3つで予測する
  5. 【自動】 過去の月で同じ手順の予測をやり直し、前年の同じ月を使った単純な見込みと比べて、外れ方を拠点ごとに出す
  6. 【自動】 決まりの基準で、混雑する時間帯、上限に張り付いている時間帯、増設・案内の見直しの候補に印を付ける
  7. 【自動】 拠点ごとの予測の表と印を Claude API に渡し、会議の資料の説明の文を JSON で受け取る。文の数字は表と照らす
  8. 【人】 経営企画の担当が予測と候補を読み、設置先との協議の予定や近くの競合の情報を書き足す
  9. 【人】 会議で、増設・案内の見直しをどの拠点で検討するかを決める

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
生成AIClaude 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どうやって実装するのか

Step1

処理の起点を決める

毎月3日の朝に、定期実行で動かします。 月末の最終日の夜につないだ充電は翌日に終わるので、記録が出そろうのは2日以降です。プログラムは最初に、決まったフォルダに前月の CSV が置かれているかを見ます。無ければ何も作らず、担当へ知らせて止まります。 翌日の同じ時刻にもう一度見に行きます。

CSV があっても、すぐには予測しません。 前月の件数を前年の同じ月・前月と比べ、極端に少なければ書き出しの漏れを疑って止めます。 書き出しの期間の指定を誤ると、月の後半が欠けた CSV ができます。欠けたまま学ばせると、翌月の予測がまるごと下にずれます。

会議の1週間前までに資料がそろうように、実行の日を決めます。 経営企画の担当が予測を読み、設置先との協議の予定を書き足す時間が要るからです。

Step2

入力データを集める

データ中身取得元
充電の記録拠点、充電器、口の番号、つないだ時刻・外した時刻、充電の開始と終了、電力量、終わり方充電の管理システムの CSV
拠点の一覧拠点、種類(急速・普通)、口の数、設置先の種類(商業施設・ホテル・駐車場・道路沿い)、開業日、増設の履歴拠点の一覧のファイル
故障の記録拠点、充電器、止まっていた時間の始まりと終わり、理由保守の記録
祝日国民の祝日・休日の月日と名称内閣府の国民の祝日の CSV
決まり混雑とみなす埋まり具合、上限に張り付いたとみなす条件、増設の候補の条件決まりのファイル

質を決めるのは、「つないだ時刻」と「外した時刻」です。 充電の開始と終了だけでは、充電が終わったあとも車が口をふさいでいた時間が分かりません。埋まり具合は、充電していた時間ではなく、口がふさがっていた時間で数えます。普通充電の拠点では、この差が大きく出ます。

祝日は内閣府の CSV を使います。 内閣府のページでは、昭和30年(1955年)から令和9年(2027年)までの国民の祝日を CSV で公開しています。文字コードは Shift_JIS 系なので、読むときに指定します。 翌年の祝日が載っていない時期は、予測の対象の月が範囲に入っているかを確かめ、入っていなければ止めます。

Step3

データの取得方法を決める

取るものどう取るか何に使うか
時間帯ごとの占有の分1回の充電を、つないだ時刻から外した時刻まで1時間ごとに分け、時間帯ごとの分数を足す埋まり具合の元
使える分口の数 × 60分から、故障で止まっていた分を引く埋まり具合の分母
埋まり具合占有の分 ÷ 使える分混雑の判定と予測の対象
利用回数時間帯ごとに、つないだ回数を数える予測の対象
張り付きの印埋まり具合が決まりの値以上の時間帯需要を少なく見る恐れの印
暦の特徴曜日、祝日、連休の何日目か、月、学校の長期休みの時期予測の手がかり

1回の充電を時間帯に分ける処理が、Before の②の15分を置き換える部分です。 日をまたぐ充電、月をまたぐ充電は、月の境目で切り、前月の分は前月の集計に入れます。 時刻は充電の管理システムが出す時間帯の扱いを確かめ、日本時間にそろえます。

Step4

AIへ渡す前に整形する

  1. 形を確かめる … 列の名前と並び、時刻の形、件数を確かめます。合わなければ止めます
  2. おかしな行を除く … 外した時刻がつないだ時刻より前の行、48時間を超える行、同じ口で時間が重なる行を除き、件数を残します
  3. 時間帯に分ける … 上の表のとおりに集計します
  4. 故障の時間を外す … 故障の記録の時間を、使える分から引きます。口がすべて止まっていた時間帯は、予測の学習から外します
  5. 張り付きの印を付ける … 埋まり具合が決まりの値以上の時間帯に印を付けます
  6. 暦の特徴を作る … 祝日の CSV から祝日と連休の何日目かを作ります
  7. 過去の利用の特徴を作る … 前年の同じ月の同じ曜日・時間帯の平均、直近8週の同じ曜日・時間帯の平均。予測する月より前に分かっている値だけを使います
  8. 開業の日数を付ける … 開業から日の浅い拠点は、伸びている途中なので、開業からの月数を特徴に入れます

7番目の「前に分かっている値だけ」を守らないと、過去の月でやり直した成績が良く見えすぎます。 予測する月の中の値が特徴に混ざると、答えを見ながら答えていることになります。直近8週の平均は、予測する月の前日までで切ります。

3番目の分け方は、例で確かめておきます。 21時40分につないで翌朝6時10分に外した普通充電は、21時台に20分、22時台から5時台に各60分、6時台に10分として足します。この1回が、9つの時間帯の埋まり具合に入ります。 表計算でつまずいていたのはここで、Python では1回の充電を分単位の区間として持ち、時間帯の境目で切って足すだけで済みます。

Step5

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行目がいちばん大事です。 張り付いた時間帯の本当の需要は、記録からは分かりません。モデルはそこを「上限まで使われた」としか学べないので、予測の上振れも上限で止まります。増設の候補は予測の数字の大きさではなく、張り付きの日数で出します。

Step6

指示内容を固定する

あなたは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つの数字に寄ります。会議で読まれるのは文のほうなので、幅を文にも残します。

Step7

出力形式を固定する

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 の側で並べ替えて順をそろえ、そろえた件数をログに残します。 件数が多い拠点は、特徴かデータを見直します。

Step8

システムへ連携する

つなぎ先方式内容
充電の管理システムCSV の書き出し(人)前月の充電の記録
内閣府の祝日の CSVダウンロード祝日と連休の特徴
拠点の一覧・故障の記録ファイルの読み取り口の数、開業日、止まっていた時間
Claude APIPython からの API 呼び出し拠点ごとの説明の文
ファイル共有ファイルの書き出し予測の表、候補の一覧、説明の文、処理ログ

充電の管理システムには書き込みません。 予測の結果で料金や時間の上限を自動で変えることもしません。この構成が出すのは、会議の材料までです。

API キーは環境変数に置き、プログラムに書きません。 定期実行のアカウントだけが読めるようにします。

Step9

人が確認する

  1. 止まった理由を見る … CSV が無い、件数が少ない、祝日の CSV に対象の月が無い、のどれかです
  2. model_worse の拠点を見る … 単純な見込みに負けている拠点は、改装・周辺の工事・料金の変更など、記録に無い変化があったかを確かめます
  3. 増設の候補を読む … 張り付きの日数と予測の幅を見て、設置先との協議の予定を書き足します
  4. 説明の文を直す … 表に無い事情(近くの充電器の開業、施設の営業時間の変更)を書き足します
  5. 会議で決める … どの拠点で増設・案内の見直しを検討するかを決め、記録します

候補の一覧は、拠点ごとに1枚の表にまとめて渡します。 時間帯の予測の行は1拠点で月に数百行になるので、人が読むのは、混雑の印のある時間帯と張り付きの日数、過去の月の外れ方の3つに絞った要約の表です。細かい行は、疑問が出たときに開きます。

目標は、1件あたり10分です。 多くの拠点は予測の表と文を流し見て数分で済み、増設の候補と model_worse の拠点に時間を使います。

Step10

例外に対処する

起きること対応
CSV が無い・件数が極端に少ない予測せずに止め、担当へ知らせる
列の名前・時刻の形が変わった止める。管理システムの更新を疑う
祝日の CSV に対象の月が無い止める。新しい版を取り直す
開業から3か月未満の拠点予測の表には出すが「参考」の印を付け、候補の判定に使わない
増設したばかりの拠点口の数が変わった月より前の埋まり具合を、新しい口の数で読み替えない。印を付ける
口がすべて止まっていた時間帯学習から外し、故障の時間として別に示す
分位点の順が逆になる並べ替えてそろえ、件数をログに残す
単純な見込みに負ける文を作らず、needs_review で人に回す
refusal や max_tokens で文が返らない表だけを出し、文は人が書く

どの行で止まったかは、処理ログの1行目に書きます。 担当が最初に開くのはログで、止まった理由がすぐ分かれば、CSV を取り直すか、管理システムの提供元に聞くかがその場で決まります。

増設したばかりの拠点の行は、見落としやすいところです。 口が2つから4つに増えた拠点で、前の月の埋まり具合をそのまま学ばせると、混雑が続くように予測します。 拠点の一覧の増設の履歴から、口の数が変わった月を特徴に入れます。

撤去や長い休止の拠点も同じです。 設置先の改装で2か月止まっていた拠点は、その期間を学習から外し、再開した月を「開業」と同じように扱って「参考」の印を付けます。 止まっていた理由と期間は、故障の記録とは別に拠点の一覧に残しておきます。

Step11

記録を残す

  • 実行の日時、使った CSV のファイル名と件数、除いた行の件数と理由
  • 学習に使った期間と特徴の一覧、モデルの設定、scikit-learn の版
  • 過去の月でのやり直しの結果(拠点ごとのピンボール損失と、単純な見込みとの比較)
  • 予測の表、候補の一覧、AIに渡した表とAIが返した JSON、照合の結果
  • 会議の決定と、翌月の実際の利用との差

最後の行を毎月残すことで、予測が役に立っているかが分かります。 半年分たまれば、どの種類の拠点で外れやすいか、上振れの90%点を超える月がどれくらいあるかが見えます。90%点を超える月が1割を大きく超えるなら、幅が狭すぎます。

04実装レベルの3段階

最小構成:8拠点で集計と予測を手で回し、単純な見込みと比べる / 予測の当たり外れの確かめ
半自動化:上記+全拠点の集計と予測を毎月のプログラムで回し、予測の表を出す / 集計、予測、過去の月でのやり直し
本格構成:上記+印と候補の判定、Claude API による説明の文、照合、翌月の実績との突き合わせまで / 会議の資料の下書きまで

半自動化で、Before の①②③の35分がほぼプログラムに移ります。 ただし、候補の書き出しと説明の文が手で残ります。 本記事の想定は本格構成です。 1件40分が10分になるのはこの段階です。残る10分は、増設の候補と単純な見込みに負けた拠点を人が読む時間です。 予測の質を上げることより、この10分を削らないことのほうが大事です。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
3 名
月間件数
120 件
1件あたり現在時間
40 分
1件あたり導入後時間
10 分
現在  120件 × 40分 ÷ 60 = 80 時間/月
導入後 120件 × 10分 ÷ 60 = 20 時間/月
月間削減時間
60h
削減率
75%
年間削減時間
720h
年間金額換算(時間単価3,500円)
252万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 商業施設・宿泊施設・駐車場などに急速と普通の充電器を数十拠点で運営し、充電の管理システムから充電の記録を CSV で書き出せる会社。拠点ごとの月の利用を表計算で集計し、増設や料金・案内の見直しを担当者の経験で決めている場合。社内に Python を書ける人がいるか、外部に頼める場合。
向いていない
  1. 拠点が数か所で、月の利用を目で見れば足りる事業者。充電の記録を書き出せず、月の合計の利用回数しか持っていない場合(時間帯の予測ができません)。開業して数か月の拠点ばかりで、季節の動きを学べるだけの記録が無い場合。なお、増設の投資の判断と、設置先との契約の判断はこの構成の対象外です。

07最小構成で試す方法

  1. 性質の違う8拠点を選ぶ(道路沿いの急速、ホテルの普通、商業施設、開業1年未満、いつも満車の拠点を混ぜる)
  2. 8拠点の過去2年分の充電の記録を CSV で書き出す
  3. Python で、時間帯ごとの埋まり具合の集計だけを作り、いつもの表計算の結果と合うかを確かめる
  4. 前年の同じ月の値を「単純な見込み」として、過去6か月分の当たり外れを出す
  5. 同じ6か月を HistGradientBoostingRegressor で予測し、単純な見込みと外れ方を比べる

3番目を必ず先に行ってください。 集計が合わなければ、予測はすべて崩れます。つないだ時刻と外した時刻の扱い、日をまたぐ充電の分け方で、表計算と食い違うことが多くあります。

出てきた内容判断
多くの拠点で単純な見込みより外れが小さい全拠点に広げる段階に進む
満車の拠点の予測が上限で止まる想定どおり。張り付きの印で読む
開業1年未満の拠点で外れが大きい開業からの月数を特徴に入れ、「参考」の扱いにする
どの拠点でも単純な見込みに負ける特徴とデータの期間を見直す。負けたままなら導入しない

最後の行の判断を、最初に決めておいてください。 単純な見込みに勝てない予測を資料に載せると、手間をかけて精度の低い数字を出すことになります。

いつも満車の拠点は、試す前から結果の読み方を決めておきます。 予測が上限で止まるのは誤りではなく、記録の性質です。ここで「予測が当たらない」と判断して導入をやめないでください。 満車の拠点で見るのは予測の精度ではなく、張り付きの日数が月ごとにどう動いているかです。

08実装時につまずきやすいポイント

問題対策
満車の拠点の需要を少なく見る張り付きの印で読む。 増設の候補は印の日数で出す
充電の時間だけで埋まり具合を数えるつないだ時刻から外した時刻で数える
故障の日を需要の落ち込みと学ぶ使える分から故障の時間を引き、全停止の時間帯を外す
過去の月でのやり直しの成績が良すぎる予測する月の値が特徴に混ざっていないかを見る
単純な見込みに負けているのに資料に載る毎月比べ、負けた拠点は文を作らない
中央の値だけが会議で一人歩きする表も文も幅で書く
分位点の順が逆になる並べ替えてそろえ、件数を見る
祝日の CSV が翌年に対応していない対象の月が範囲にあるかを見て、無ければ止める
増設したばかりの拠点の予測が崩れる口の数が変わった月を特徴に入れる
書き出しの期間の誤りで月の後半が欠ける件数を前年・前月と比べて止める

上の2行が、この構成の失敗のほとんどです。 どちらも、記録に残った数を、そのまま需要として読むことから来ています。記録が何を数えているのかを、最初に決めてください。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 拠点ごとの充電の記録、料金、故障の記録、拠点の契約に関わる情報です。充電の記録には、会員の番号や車の識別の情報が含まれていることがあります。

  1. 予測に要らない列を最初に落とす … 会員の番号、カードの情報、車の識別の情報は、予測に使いません。CSV を読んだ直後に落とし、集計の後のデータには残しません
  2. 外部へ渡す範囲を、拠点ごとの予測の表に限る … Claude API に渡すのは、拠点の名前を番号に置き換えた予測の表と印だけです
  3. 増設を AI に決めさせない … 予測と印は材料で、決めるのは会議です
  4. 料金や時間の上限を自動で変えない … 利用者に直接ひびく変更は、人が決めて案内します
  5. 設置先に見せる資料と社内の資料を分ける … 予測の数字は社内の判断の材料で、設置先との協議に出すときは、出す範囲を担当が決めます
  6. API キーをプログラムに書かない … 環境変数に置き、定期実行のアカウントだけが読めるようにします

誤りが起きた場合のリスクは、増設すべき拠点を見落とすことと、外れた予測を根拠に投資を決めることの2つです。前者は張り付きの印で、後者は幅と単純な見込みとの比較で防ぎ、最後は会議で、設置先との協議と投資の判断として決めます。

10まず何から始めるか

1週目:CSV の中身を確かめる

充電の管理システムの CSV に、つないだ時刻と外した時刻が出るかを確かめます。出なければ、管理システムの設定か提供元に確かめます。あわせて、故障の記録を拠点・充電器・時間の形でそろえます。

2週目:8拠点で集計を作る

性質の違う8拠点の2年分の記録で、時間帯ごとの埋まり具合を Python で集計し、いつもの表計算の結果と合うまで直します。

3週目:単純な見込みと比べる

前年の同じ月を単純な見込みとし、HistGradientBoostingRegressor の予測と過去6か月分で外れ方を比べます。勝てなければ、ここで特徴とデータを見直します。

4週目:張り付きの印と候補の基準を決める

混雑とみなす埋まり具合、張り付きとみなす条件、増設の候補の条件を、経営企画で決めます。基準は数字で書き、決まりのファイルに置きます。

2か月目: 全拠点に広げ、毎月の定期実行に乗せます。3か月目以降: 説明の文と照合を足し、会議の資料の下書きまで出します。翌月の実際の利用と予測の幅を毎月並べ、増設の候補が同じ物差しで出せるようになった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-27/最終更新:2026-10-27
確認した内容情報源確認日
HistGradientBoostingRegressor の損失に quantile(ピンボール損失)があり、quantile で0〜1の分位点を指定すること。欠損値(NaN)を扱えること。categorical_features で区分の特徴を指定でき、区分ごとの値の数が max_bins 以下であること(ページは scikit-learn 1.9.1)scikit-learn: HistGradientBoostingRegressor2026-10-27
TimeSeriesSplit が、未来のデータで学んで過去を評価することを避けるための分け方であること。gap で学習とテストのあいだを空けられることscikit-learn: TimeSeriesSplit2026-10-27
mean_pinball_loss が分位点の回帰のためのピンボール損失で、alpha で分位点を指定し、0.5のときは平均絶対誤差と同じになることscikit-learn: mean_pinball_loss2026-10-27
昭和30年(1955年)から令和9年(2027年)までの国民の祝日が CSV で公開されていること(CSV の文字コードは Shift_JIS 系)内閣府: 国民の祝日について2026-10-27
構造化出力を output_config.format の json_schema で指定すること。オブジェクトに additionalProperties: false が要ること。数値の minimum・maximum に対応しないことAnthropic: Structured outputs2026-10-27

増設の投資の判断と、設置先・電力の契約の条件は、関係する契約と社内の決裁の手続きで確かめてください。 本記事は、充電の記録からの利用の予測と候補の洗い出しに絞って、公式のページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1985)についてのご相談はこちらから。

AI活用について相談する
目次