受注残と商談の進み具合から、今月と来月の売上の着地を見込む
受注残と商談管理の案件、過去の実績から、事業部・製品群ごとに今月と来月の売上の着地を機械的に計算します。確定分と見込み分を分け、着地を幅で示し、営業部門の見込みとの差から会議で聞く案件を挙げます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- IT・SaaS/商社/製造
- 対象部門
- 経営企画/財務
- 対象業務
- 比較検討/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 販売管理システムから受注残の一覧を書き出し、計上予定月ごとに事業部と製品群で振り分ける
- 商談管理から商談の一覧を書き出し、事業部ごとに段階と完了予定日を確かめる
- 各事業部の営業企画から、今月と来月の見込みのExcelを受け取る
- 受け取った見込みを全社の表に転記し、受注残と商談の一覧と突き合わせる
- 前月の見込みと比べて差の大きい事業部に、理由を問い合わせる
- 返ってきた理由をまとめ、経営会議の資料に説明文を書く
- 自動月末の夜に、販売管理から受注残と売上実績、商談管理から商談の一覧をCSVで書き出す
- 自動商談の一覧を日付付きで保管する(毎月末の状態を残す)
- 自動Python が過去の記録から、段階ごとの受注率、見込み日のずれ、受注から計上までの日数を集計する
- 自動案件ごとに確率をかけ、確定分・商談からの見込み分・商談に載らない売上に分けて、着地のレンジを出す
- 自動前月の見込みとの差を、案件ごとの寄与に分解する
- 人各事業部の営業企画が、これまでどおり見込みのExcelを提出する
- 自動営業部門の見込みと機械の見込みを並べ、差の大きい組み合わせと、会議で聞く案件を規則で選ぶ
- 自動Claude API が、差の説明文と聞く案件への質問文を書く。Python が文中の数字を計算結果と照合する
- 人経営企画が、差の大きい組み合わせだけを開いて説明文を直し、会議の資料にする
- 人経営会議で、聞く案件を事業部に確かめる
各工程の詳しい説明を読む
- 販売管理システムから受注残の一覧を書き出し、計上予定月ごとに事業部と製品群で振り分ける
- 商談管理から商談の一覧を書き出し、事業部ごとに段階と完了予定日を確かめる
- 各事業部の営業企画から、今月と来月の見込みのExcelを受け取る
- 受け取った見込みを全社の表に転記し、受注残と商談の一覧と突き合わせる
- 前月の見込みと比べて差の大きい事業部に、理由を問い合わせる
- 返ってきた理由をまとめ、経営会議の資料に説明文を書く
(a)数字の根拠が営業の申告しかない。 営業部門の見込みは、担当者が「今月いける」と言った案件の積み上げです。経営企画には、その申告が過去にどれだけ当たってきたかを確かめる手段がありません。 見込みが甘いと感じても、代わりに示せる数字が無いので、そのまま会議に出ます。
(b)確定分と見込み分が混ざる。 受注残の中にある計上予定の分と、まだ受注していない商談の分が、1つの数字にまとめられて届きます。どこまでが固い数字で、どこからが期待なのかが、表からは読めません。
(c)ずれの理由を聞いて回る。 前月の見込みから下がった事業部には、問い合わせるしかありません。返ってくる理由は「顧客の都合で延期」のような1行で、どの案件がいくら動いたのかを確かめるには、商談の一覧を1件ずつ見直すことになります。
(d)見込み日は、たいてい遅れる。 完了予定日は、営業が入れた希望の日付です。予定より遅れて受注する案件が多くても、その遅れ方を数えた人がいません。 月末に近づくほど、今月の見込みが翌月へ流れます。
- 【自動】 月末の夜に、販売管理から受注残と売上実績、商談管理から商談の一覧をCSVで書き出す
- 【自動】 商談の一覧を日付付きで保管する(毎月末の状態を残す)
- 【自動】 Python が過去の記録から、段階ごとの受注率、見込み日のずれ、受注から計上までの日数を集計する
- 【自動】 案件ごとに確率をかけ、確定分・商談からの見込み分・商談に載らない売上に分けて、着地のレンジを出す
- 【自動】 前月の見込みとの差を、案件ごとの寄与に分解する
- 【人】 各事業部の営業企画が、これまでどおり見込みのExcelを提出する
- 【自動】 営業部門の見込みと機械の見込みを並べ、差の大きい組み合わせと、会議で聞く案件を規則で選ぶ
- 【自動】 Claude API が、差の説明文と聞く案件への質問文を書く。Python が文中の数字を計算結果と照合する
- 【人】 経営企画が、差の大きい組み合わせだけを開いて説明文を直し、会議の資料にする
- 【人】 経営会議で、聞く案件を事業部に確かめる
3番目と4番目が、この設計の中心です。 見込みの数字はここで決まり、生成AIは一切関わりません。 同じデータを入れれば、何度計算しても同じ結果になります。
7番目を規則で決めているのも、意図してのことです。 どの案件を会議で取り上げるかをAIに選ばせると、選んだ理由を後から確かめられません。金額と確率と日付の条件で機械的に選び、AIには選ばれた案件について書かせるだけにします。
02今回想定するシステム構成
販売管理(受注残・売上実績) 商談管理(Salesforce の商談レポート) │ CSVを書き出す │ CSVを書き出す ▼【トリガー】月末の夜の定時実行(今月分)と、月初の第2営業日の再計算 Python(pandas) ├──▶ 商談一覧を日付付きで保管(月末ごとのスナップショット) ├──▶ 段階ごとの受注率/見込み日のずれ/受注から計上までの日数を集計 ├──▶ 案件ごとに確率をかけ、くり返し計算で着地のレンジを出す │ 確定分 + 商談からの見込み分 + 商談に載らない売上 └──▶ 前月の見込みとの差を、案件ごとの寄与に分解 ▼ 営業部門の見込み(事業部ごとのExcel)と並べる → 聞く案件を規則で選ぶ ▼ Claude API ── 差の説明文と、聞く案件への質問文だけを書く(構造化出力) ▼ Python ── 文中の数字が計算結果と一致するかを照合 ▼ 【経営企画が差の大きい組み合わせを確認】 ▼ 着地見込み表(事業部と製品群ごと)→ 経営会議の資料
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python | Google Apps Script |
| 生成AI | Claude API | OpenAI API、Gemini API |
| 商談管理 | Salesforce(商談レポートのCSV書き出し) | HubSpot、Microsoft Dynamics 365 Sales |
| 販売管理 | 既存の販売管理システム(受注残と売上実績の書き出し) | 基幹システムの受注データ |
| 保管 | 社内の共有ストレージ(スナップショットと計算結果) | データベース |
商談管理と販売管理は、新しく足すものではありません。 使うのは書き出したCSVだけで、この構成からどちらのシステムにも書き込みません。 商談の段階や完了予定日を直すのは営業で、機械の見込みで上書きすることはしません。
集計の土台は pandas の groupby です。 公式の説明では、groupby はデータを条件でグループに分け、グループごとに関数を当て、結果を1つにまとめる処理とされています。「事業部と段階ごとに、過去の商談のうち受注した割合を出す」は、この分けて集計してまとめる形そのものです。
注意したいのは鍵の欠けです。 groupby は既定で、鍵が欠けた行をグループから外します。製品群が空欄の商談は、黙って集計から落ちます。 dropna=False で欠けも1つのグループとして数え、件数を出します。
着地のレンジは、Series.quantile で取ります。 指定した分位点の値を返す関数で、q は0から1の範囲で指定し、既定は0.5(中央値)です。くり返し計算の結果から下側・中央・上側の3点を取り出します。
生成AIの出力は、Claude API の構造化出力で受け取ります。 JSONスキーマに沿った応答を、制約付きのデコードで保証する機能です。説明文の欄が欠けたり、型が崩れたりして後段の照合が止まることを防ぎます。
03どうやって実装するのか
処理の起点を決める
月末の夜に1回、月初の第2営業日に1回動かします。 月末の夜は、その月の最後の状態を保管するためです。翌朝になると営業が完了予定日を更新し始め、月末時点の見込みが残りません。 この保管が、翌月以降の「見込み日のずれ」の材料になります。
月初の第2営業日の実行は、前月の売上実績が締まった後の再計算です。営業部門のExcelが届くのはこの後なので、機械の見込みのほうが先にそろいます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 受注残 | 受注番号、事業部、製品群、金額、計上予定日、出荷・検収の状態 | 販売管理 |
| 売上実績 | 月・事業部・製品群ごとの計上額と、受注番号との対応 | 販売管理 |
| 商談の一覧 | 商談ID、事業部、製品群、金額、段階、完了予定日、作成日、最終更新日、受注・失注の結果 | 商談管理 |
| 商談の月末スナップショット | 過去の各月末時点の段階・金額・完了予定日 | 自社で保管したもの |
| 営業部門の見込み | 事業部ごと・製品群ごとの今月と来月の見込み額と、見込みに入れた商談ID | 各事業部のExcel |
質を決めるのは、下から2つ目のスナップショットです。 商談管理に残っているのは「今の状態」だけで、先月末にその商談がどの段階にあり、完了予定日がいつだったかは、上書きされて消えています。 段階ごとの受注率も見込み日のずれも、過去の月末時点の状態と、その後の結果を突き合わせて初めて数えられます。
まだ保管していなければ、今月から始めてください。 段階の変更履歴が残っていれば、過去の月末時点の状態を組み立て直せます。無ければ半年ほど保管をためる間、受注率だけを使います。
営業部門の見込みには、商談IDの列を足してもらいます。 金額だけのExcelでは、どの案件が機械と営業で扱いが違うのかを突き合わせられません。
データの取得方法を決める
CSVは pandas.read_csv で読み込みます。公式の説明では、encoding で読み込みの文字コード(例として 'utf-8')を、dtype で列ごとの型を指定できます。商談IDや受注番号は、dtype で文字列として読みます。 数値として読むと、先頭の0が消えて突き合わせに失敗します。
日付の列は、読み込んだ後に確かめます。 parse_dates で日付として読む列を指定できますが、解釈できない値や時差の混在があると、その列は変換されずに文字列のまま返ると説明されています。エラーにならずに型だけが違う状態で進むので、読み込み直後に型を確かめ、日付でなければ止めます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 計上予定が今月・来月の受注残 | 受注残のCSV | 確定分 |
| 受注から計上までの日数 | 売上実績と受注番号の対応 | 商談が受注してから売上になる時期 |
| 過去24か月の月末スナップショット | 保管したCSV | 段階ごとの受注率と、見込み日のずれ |
| 現在の未完了の商談 | 商談のCSV | 見込み分の対象 |
| 商談を経ない売上の過去実績 | 売上実績のうち受注番号が商談に結び付かないもの | 保守・部品などの売上 |
いちばん下の行を忘れがちです。 保守や部品の売上は、商談管理に載らないまま立ちます。入れないと、機械の見込みは毎月同じ額だけ低く出ます。 過去の同じ月と直近3か月の実績から、製品群ごとに別枠で置きます。
AIへ渡す前に整形する
- 型と件数の確認 … 日付・金額・IDの型を確かめ、前月と比べて件数が大きく変わっていないかを見ます
- 重複の除去 … 同じ商談IDの行が複数あれば、最終更新日が新しいほうを残します
- 受注残と商談の重なりの除去 … 受注済みで受注残に移った商談は、見込み分から外します。二重に数えると着地が膨らみます
- 完了予定日が過去の商談の扱い … 月末時点で完了予定日を過ぎたまま未完了の商談は、「放置」として別に数えます
- 段階の名前のそろえ … 事業部ごとに段階の名前が違えば、対応表で共通の段階に置き換えます
- 通貨の換算 … 外貨建ての商談と受注残は、社内の換算レートで円にします。レートは計算結果と一緒に残します
集計は3つの数字だけです。 次のように、事業部と段階ごとに過去の月末時点の商談を分けて数えます。
# 過去24か月の月末スナップショット(未完了だった商談)と、その後の結果を結合したもの
hist = snap.merge(outcome, on="opp_id", how="left")
# ① 段階ごとの受注率:その段階にあった商談のうち、後で受注したものの割合
win = hist.groupby(["division", "stage"], dropna=False).agg(
n=("opp_id", "size"), won=("is_won", "sum"))
win["rate"] = win["won"] / win["n"]
# ② 見込み日のずれ:受注した商談の「受注日 − その月末時点の完了予定日」(日数)
hist["slip_days"] = (hist["won_date"] - hist["close_date_at_snap"]).dt.days
# ③ 受注から計上までの日数:製品群ごと
lag = sales.groupby("product_group")["lag_days"]
件数が少ないグループは、全社の同じ段階の値に置き換えます。 件数が30件に満たない組み合わせでは、1件の受注で受注率が大きく動きます。置き換えたことは fallback の印で結果に残します。
着地のレンジは、くり返し計算で出します。 未完了の商談ごとに、受注するかを受注率で、いつ受注するかを見込み日のずれの過去の分布から、いつ計上されるかを受注から計上までの日数の分布から、それぞれ抽選します。これを2,000回くり返し、月ごとに合計した2,000通りの着地から、quantile で下側10%点・中央値・上側90%点を取ります。 確定分と商談に載らない売上は、その上に足します。
前月の見込みとの差は、案件ごとに分解します。 前月末と今月末のスナップショットを商談IDで突き合わせ、案件ごとの期待値(金額に受注率と月内に計上される確率をかけたもの)の変化を、「新規」「段階が進んだ」「段階が戻った」「完了予定日が延びた」「金額が変わった」「受注」「失注」の7つに振り分けます。説明文の材料は、この表だけです。
AIに処理させる
させるのは、計算済みの数字を読んで、差の説明文と、会議で聞く案件への質問文を書くことだけです。
| 見るもの | 書くこと | 書き方の決まり |
|---|---|---|
| 前月の見込みとの差の内訳(7つの区分) | 見込みがなぜ動いたかの説明文 | 寄与の大きい順に3件まで。案件IDと区分と金額を入れる |
| 営業部門の見込みとの差 | 差がどこから来ているかの説明文 | 営業が今月に入れ、機械では今月の確率が低い案件を名指しする |
| 規則で選ばれた聞く案件 | 事業部への質問文 | 1案件1問。はい・いいえか日付で答えられる形 |
| 確定分と見込み分の割合 | 数字の固さについての一言 | 確定分の割合が小さい組み合わせだけ |
| させないこと | 理由 |
|---|---|
| 見込みの数字を出す・直す | 数字は統計で決める。AIが書いた数字は根拠を追えない |
| 聞く案件を選ぶ | 規則で選ぶ。選んだ理由を後から確かめられるようにする |
| 案件が延びた理由を推測する | 理由は営業しか知らない。質問文にして事業部に聞く |
| 営業部門の見込みが甘いと評価する | 差を示すだけ。どちらが正しいかは会議で決める |
| 担当者名を書く | 見込みの差を人の評価に結び付けない |
3行目がいちばん起きやすい失敗です。 完了予定日が延びた案件について、何も言わなければ「顧客側の予算承認が遅れたため」のような、もっともらしい理由を書きます。入力には理由が無いので、それは作文です。 経営会議でその一文が事実として扱われると、事業部は存在しない理由に答えることになります。
指示内容を固定する
あなたは経営企画部で、月次の売上着地見込みの資料を作る立場です。
渡すのは、統計の計算で出した見込みと、その内訳です。
数字はすべて計算済みです。あなたは説明文と質問文だけを書いてください。
【書くもの】
1. change_summary:前月の見込みから今回の見込みへの変化の説明(3〜5文)
- 内訳表の寄与の絶対値が大きい順に、3件までの案件を取り上げる
- 各案件について、案件ID、区分、寄与額を書く
2. gap_summary:営業部門の見込みと機械の見込みの差の説明(2〜4文)
- 営業部門が今月に入れ、機械の月内確率が低い案件を、案件IDで挙げる
3. questions:聞く案件ごとの質問文(1案件につき1問)
- はい・いいえ、または日付で答えられる形にする
- 例:「案件A-1024の検収は今月中に完了する予定ですか」
4. firmness_note:確定分の割合が0.5未満の場合だけ、数字の固さについて1文
【厳守事項】
- 数字は、入力にある値だけをそのまま使ってください。
足し算・引き算・割合の計算をして新しい数字を作らないでください。
- 金額は入力と同じ単位(百万円)で、同じ桁で書いてください。丸めないでください。
- 案件が動いた理由を推測しないでください。入力の reason 欄が空なら、
理由は書かず、questions で事業部に聞いてください。
- 営業部門の見込みを「甘い」「楽観的」などと評価しないでください。
差があるという事実と、その差を生んでいる案件だけを書いてください。
- 担当者の名前、顧客の名前を書かないでください。案件IDだけを使ってください。
- 「受注できる」「失注する」と断定しないでください。確率は入力の値のまま示してください。
- fallback が true の段階を使っている案件は、「過去の件数が少ないため全社の値で計算」と添えてください。
- 入力に無い案件を取り上げないでください。
【対象】{division} / {product_group} / 対象月 {target_month}
【今回の見込み】{forecast}
【前月時点の見込み】{prev_forecast}
【差の内訳表】{bridge}
【営業部門の見込み】{sales_forecast}
【規則で選ばれた聞く案件】{ask_list}
「計算をして新しい数字を作らない」を明記しないと、差額を自分で計算して書きます。 計算が合っていても、入力に無い数字は後段の照合で見分けられません。照合できる状態を保つために、使ってよい数字を入力の値に限ります。
出力形式を固定する
次の形のJSONで受け取ります。 数字の欄は Python が埋め、文章の欄だけを Claude API が埋めます。
{
"division": "搬送機器事業部",
"product_group": "コンベヤ",
"target_month": "2026-10",
"forecast": {
"committed": 182.4,
"pipeline_p10": 21.0,
"pipeline_p50": 48.6,
"pipeline_p90": 77.3,
"non_pipeline": 35.2,
"landing_p10": 238.6,
"landing_p50": 266.2,
"landing_p90": 294.9
},
"prev_landing_p50": 291.5,
"sales_forecast": 305.0,
"bridge": [
{ "opp_id": "A-1024", "category": "close_date_pushed", "impact": -18.2,
"win_rate": 0.62, "in_month_prob": 0.35, "fallback": false, "reason": "" }
],
"ask_list": ["A-1024", "A-0987"],
"text": {
"change_summary": "",
"gap_summary": "",
"questions": [ { "opp_id": "A-1024", "question": "" } ],
"firmness_note": ""
}
}
1つ目の理由は、数字と文章を別の層に置けることです。 Claude API に渡すスキーマは text の部分だけです。 公式の説明では、構造化出力のスキーマはオブジェクトの additionalProperties を false にする必要があり、数値の範囲や文字列の長さの制約は対応していません。文の数や長さの上限は、スキーマではなく受け取った後の Python の検査で見ます。
| 欄 | 誰が埋めるか | 後で確かめること |
|---|---|---|
forecast | Python の集計とくり返し計算 | 前月末のスナップショットで計算し直すと同じ値になるか |
bridge | Python の突き合わせ | 寄与の合計が前月との差に一致するか |
ask_list | Python の規則 | 選ばれた条件が記録に残っているか |
text | Claude API | 文中の数字と案件IDが、上の3つの欄に存在するか |
2つ目は、表のいちばん下の行の照合ができることです。 説明文から数字と案件IDを正規表現で抜き出し、forecast と bridge の値と1つずつ突き合わせます。1つでも見つからない数字があれば、その組み合わせの説明文は差し戻して書き直させます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 商談管理(Salesforce) | 商談レポートのCSV書き出し | 月末時点の商談の一覧を取る |
| 販売管理 | 既存の書き出し機能 | 受注残と売上実績を取る |
| 共有ストレージ | ファイルの読み書き | スナップショットと計算結果を置く |
| 各事業部の見込みExcel | 共有フォルダへの提出 | 営業部門の見込みを読む |
| Claude API | API呼び出し(構造化出力) | 説明文と質問文だけを書く |
| 着地見込み表 | Python が書き出すExcel | 経営会議の資料の元になる |
商談管理にも販売管理にも書き込みません。 機械の見込みを商談の確度の欄に書き戻すと、営業が入れた確度と区別がつかなくなります。営業の見込みと機械の見込みは、別々に残すから比べられます。
人が確認する
経営企画が開くのは、差の大きい組み合わせだけです。 40の組み合わせのうち、次のどれかに当たるものを先頭に並べます。
- 営業部門の見込みが、機械の見込みの下側10%点から上側90%点の外にある … 差の理由を会議で確かめます
- 前月の見込みからの差が大きい … 内訳表の上位の案件を見ます
- 確定分の割合が小さい … 数字が商談しだいで、幅も広い組み合わせです
fallbackの案件が見込みの多くを占める … 過去の件数が足りず、全社の値で代用しています
残りの組み合わせは、表で数字を流し見て終わりにします。 全部を開く設計にすると、第10章の14.0時間には収まりません。
説明文で確かめるのは、推測が入っていないかです。 数字の照合は機械が済ませていますが、「顧客の事情により」のような理由の作文は、数字の照合では捕まりません。入力の reason が空の案件について、理由らしい言葉が書かれていれば消します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 月末のスナップショットを取り損ねた | 翌朝の状態で代用し、snapshot_late の印を付ける。完了予定日が更新された商談は数から外す |
| 事業部が段階の定義を変えた | 変更前と後の段階を対応表でつなぐ。つなげない段階は、変更後の件数がたまるまで全社の値で代用 |
| 新しい製品群で過去の記録が無い | 全社の同じ段階の値を使い、fallback と表示する |
| 1件で見込みの大半を占める大口案件 | 確率をかけずに「大口」として別の行に出し、受注した場合としない場合の2つの着地を示す |
| 完了予定日が過去のまま未完了の商談 | 「放置」として見込み分から外し、件数と金額を別に表示する |
| 営業部門のExcelに商談IDが無い | 金額の比較だけを出し、案件の突き合わせは行わない。事業部に列の追加を頼む |
| 説明文の数字が照合に通らない | 2回まで書き直させ、通らなければ説明文を空欄にして人が書く |
| Claude API が応答しない | 数字の表だけを先に出す。見込みの数字はAIが無くてもそろう |
4行目の大口案件を、確率で割り引いて混ぜないでください。 1件の受注で着地が大きく動く組み合わせでは、期待値はどちらの結果にも当たらない数字になります。「受注すればこの額、しなければこの額」と2つ示すほうが、会議での判断に使えます。
記録を残す
- 月末ごとの商談スナップショットと、受注残・売上実績の書き出しの原本
- 集計に使った期間、件数の下限、段階の対応表、換算レート、くり返し計算の回数と乱数の種
- 組み合わせごとの
forecastとbridge、ask_listを選んだ条件 - Claude API に渡した入力と、返ってきた
text、照合の結果 - 経営企画が説明文を直した記録 … どの文を、どう直したか
- 月が締まった後の実績と、各時点の見込みの差 … 機械と営業の両方について
2つ目で乱数の種まで残すのは、同じ数字を再現するためです。 種が無いと、会議の後に「あのときの見込み」を出し直せません。
最後の行が、この構成を直していく材料です。 実績が締まるたびに、機械の見込みの中央値が実績からどれだけ外れ、実績が下側10%点から上側90%点の幅に入ったかを数えます。幅に入る月が少なければ、受注率か見込み日のずれの集計期間が合っていません。
04実装レベルの3段階
最小構成では、40の組み合わせに広げられません。 手でピボットを組むので、確かめるための段階です。 半自動化で、第4章の①と②の大半が手を離れます。 受注残の振り分けと商談の集計は自動になりますが、前月との差の理由を探し、説明文を書く作業が残ります。本格構成で③と④が変わり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の間にスナップショットがたまり、見込み日のずれの分布が安定します。ずれの材料が数か月分しか無いうちに差の分解まで作ると、分解の根拠が薄いまま会議に出ることになります。
05工数削減シミュレーション
導入後 40件 × 21分 ÷ 60 = 14 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 事業部と製品群が多く、経営企画や財務が毎月、営業部門から売上の着地見込みを集めてまとめている企業。受注から売上の計上までに出荷や検収の期間がある製造業・商社・IT企業。商談管理システムに段階・金額・完了予定日が入っており、過去2年程度の商談と受注の記録が残っている場合。営業部門の見込みが毎月外れ、どこで外れたかを説明するのに時間がかかっている場合。
- 売上の大半が数件の大口案件で決まり、統計で見込む意味が薄い場合。商談管理に段階や完了予定日がほとんど入っておらず、過去の記録から受注率を出せない場合。売上が毎月ほぼ一定の継続課金で、受注残だけで着地が決まる場合。なお、この構成は営業部門の見込みを置き換えるものではなく、業績予想の開示に使う数字を決めるものでもありません。
07最小構成で試す方法
- 1つの事業部を選び、過去12か月の完了した商談(受注と失注)を商談管理から書き出す
- 表計算のピボットで、段階ごとに受注した割合を出す(段階は完了時点ではなく、各月末時点のものを使う。無ければ作成時点の段階で代用する)
- 先月末の未完了の商談に、段階ごとの割合をかけて合計し、受注残と足して先月の着地を見込む
- 先月の実績と、先月の営業部門の見込みを並べる
- 3つの数字と差の大きい案件を手元のAIサービスに貼り付け、「この数字だけを使って、差がどの案件から来ているかを3文で説明してください。数字を計算し直さず、理由を推測しないでください」と指示する
数字は表計算で出し、AIには説明文だけを書かせます。 ここで数字の計算までAIに頼むと、最小構成で確かめたいことが確かめられません。
| 出てきた内容 | 判断 |
|---|---|
| 機械の見込みが、営業部門の見込みより実績に近い月がある | Python の集計とスナップショットの保管に進む |
| 機械の見込みが毎月同じ向きに外れる | 商談に載らない売上の抜けか、見込み日のずれが入っていない。集計を足せば直る見込みがある |
| 段階や完了予定日の空欄が多く、割合が出せない | 商談管理の入力の見直しが先。 AIの問題ではない |
2行目が出ることは珍しくありません。 多くは見込み日のずれを入れていないためで、それこそが営業部門の見込みが外れてきた理由の1つです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 過去の月末時点の商談の状態が残っていない | 今月から保管を始める。 段階の変更履歴があれば組み立て直す |
| 完了時点の段階で受注率を出してしまう | 受注した商談は最後に受注の段階にいる。必ず過去の月末時点の段階で数える |
| 製品群が空欄の商談が集計から消える | groupby は既定で鍵の欠けを外す。dropna=False で数えて件数を出す |
| IDの先頭の0が消えて突き合わせに失敗する | dtype で文字列として読む |
| 日付の列が文字列のまま進む | 解釈できない値があると変換されずに返る。読み込み直後に型を確かめる |
| 受注済みの商談を受注残と見込みで二重に数える | 受注残に移った商談を見込み分から外す |
| 保守・部品の売上が抜けて毎月低く出る | 商談を経ない売上を別枠で置く |
| 大口案件が確率で割り引かれて混ざる | 別の行に出し、受注する場合としない場合の2つを示す |
| 説明文に推測の理由が入る | 理由の欄が空なら書かせず、質問文にする |
| 機械の見込みを営業の成績に使い始める | 第13章の取り決めを先に文書にする |
上の2行が、この構成の失敗のほとんどです。 どちらも、商談管理が「今の状態」しか持っていないことから出ています。スナップショットを取っているかどうかで、この構成が成り立つかが決まります。
いちばん下の行も、早く効いてきます。 機械の見込みと営業の見込みの差が担当者の評価に使われると、営業は完了予定日を遠めに入れるようになり、見込み日のずれの集計そのものが崩れます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客名、商談の金額と段階、受注残、事業部ごとの売上実績と着地見込みです。社内でも閲覧を限っている業績の情報です。
- 見込みを人の評価に使わない … 機械の見込みとの差を、営業担当者や事業部長の評価の材料にしないことを、導入の前に文書で決めます。評価に使われると、営業は数字を守るために商談の入力を変え、見込みの材料そのものが歪みます
- 機械の見込みは、営業部門の見込みを置き換えない … 顧客の事情を知っているのは営業です。機械が示すのは過去の傾向で、両者の差を議論する材料です。 会議の資料では必ず両方を並べます
- 生成AIに渡すのは、計算済みの数字と案件IDまで … 顧客名と担当者名は渡しません。説明文を受け取った後に、社内の処理で名前を差し込みます。 データの保持の条件は、利用する契約とモデルの条件で確かめてください
- 数字を生成AIに作らせない … 見込みの数字は統計の計算で決め、同じ入力から同じ結果が出る状態を保ちます。AIが書いた数字が1つでも資料に混ざると、どの数字が計算で、どれが作文かを誰も区別できなくなります
- 業績予想の開示に使わない … 上場している場合、社外に示す業績予想は、この構成とは別の手続きで決めるものです。着地見込みの表の扱いは、自社の規程に従ってください
- 閲覧できる人を限る … 着地見込み表と商談のスナップショットは、全社の売上の先行きがまとまった資料です。保管場所の権限を経営企画と財務に限り、事業部には自部門の分だけを返します
誤りが起きた場合のリスクは、見込みを信じて投資や人員の判断を誤ることと、機械の数字が独り歩きして営業との関係が壊れることの2つです。 前者は幅を示さず中央値だけを載せると起き、後者は差を評価に使うと起きます。どちらも「差を議論する材料」という位置づけを守れば防げます。
10まず何から始めるか
1週目:月末のスナップショットを取り始める
今月末の夜に、商談管理から商談の一覧を書き出して、日付を付けて保管します。これだけは、他の準備を待たずに始めてください。 1か月遅れるごとに、見込み日のずれの材料が1か月分減ります。段階の変更履歴が残っているかも、あわせて確かめます。
2週目:1つの事業部で試す
過去12か月の完了した商談を書き出し、表計算で段階ごとの受注率を出します。先月の着地を見込み、実績と営業部門の見込みと並べます。 説明文だけを手元のAIに書かせ、推測の理由が入らないかを見ます。
3週目:取り決めを決める
機械の見込みを人の評価に使わないこと、会議の資料には両方を並べることを、経営企画と各事業部長で決めます。 ここが決まらないうちに見込みを出すと、営業部門が数字を警戒し、商談の入力が変わります。あわせて、営業部門のExcelに商談IDの列を足してもらいます。
4週目:Python で集計を組む
CSVを読み込み、段階ごとの受注率、受注から計上までの日数、商談に載らない売上を集計して、全組み合わせの着地を出すところまで作ります。この時点では幅を出さず、中央値に当たる期待値だけを見ます。
2か月目: 見込み日のずれとくり返し計算を足し、幅を出します。前月との差の分解を作ります。3か月目以降: Claude API の説明文と数字の照合を足し、月が締まるたびに実績が幅に入ったかを数えます。幅に入る月が続き、会議で聞く案件が見込みの前にそろうようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
groupby が、条件でグループに分ける・グループごとに関数を当てる・結果をまとめる、の手順を指すこと。集計の例として合計・平均・件数が挙げられ、sum() mean() size() count()(欠けていない値の数)があること。既定で鍵の欠けた行がグループから外され、dropna=False で含められること。件数の少ないグループを外すような絞り込みができること | pandas: Group by: split-apply-combine | 2026-09-29 |
Series.quantile が指定した分位点の値を返すこと。q は0から1の範囲で、既定が0.5であること | pandas: pandas.Series.quantile | 2026-09-29 |
read_csv がCSVを DataFrame に読み込むこと。encoding で文字コード、dtype で列ごとの型を指定できること。parse_dates で日付として読む列を指定でき、解釈できない値や時差の混在があるとその列は変換されずに返ること | pandas: pandas.read_csv | 2026-09-29 |
構造化出力が、制約付きのデコードでJSONスキーマに沿った応答を保証すること。パラメータが output_config.format であること。オブジェクトの additionalProperties を false にする必要があり、数値の範囲や文字列の長さの制約は対応していないこと | Claude API Docs: Structured outputs | 2026-09-29 |
商談管理からの書き出し方は、利用している製品と権限の設定で確かめてください。 本記事では Salesforce のヘルプの本文を確認できなかったため、書き出しの具体的な手順と形式には触れていません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0286)についてのご相談はこちらから。
