毎月の売上予測、こんな課題ありませんか?
多くの営業部門・経営企画部門では、毎月の売上予測をExcelの勘と経験に頼っています。前月比や前年同月比を手計算し、担当者の感覚で「来月は120%くらいかな」と数字を埋める——そんな作業を繰り返していないでしょうか。
このやり方には2つの大きな問題があります。
- 属人化: 担当者が変わると予測の精度や方法がバラバラになる
- 非効率: 毎月同じような作業を手作業で繰り返す時間的コスト
「Pythonで機械学習の予測モデルを作れば解決できる」——それはわかっていても、統計やプログラミングの専門知識がないと難しく感じる方がほとんどです。
そこで私はClaude Codeに頼むことにしました。Pythonコードを自分で書く必要はありません。やり方は驚くほどシンプルです。
「Claude Codeを使えば、Pythonが書けなくても本格的な売上予測が実現できる」と聞いて半信半疑でしたが、実際に試してみたら本当に10分で動くコードが手に入りました。そのプロセスをそのままお伝えします。
| 項目 | 従来の手動予測 | Claude Code + Python予測 |
|---|---|---|
| 予測にかかる時間 | 毎月2〜3時間 | コード作成10分 → 以降は数秒で自動実行 |
| 予測の根拠 | 担当者の感覚・経験 | 統計モデル(数学的根拠あり) |
| 信頼区間 | なし(点予測のみ) | あり(上限・下限の幅を自動計算) |
| 季節性考慮 | 担当者が手動で調整 | モデルが自動検出・適用 |
| 必要なスキル | Excel操作 | Claude Codeに日本語で頼むだけ |
Step 1: Claude Codeへの入力(プロンプト)
私はこうClaude Codeに頼みました
やることはシンプルです。Claude Codeのチャット画面を開いて、以下のように入力するだけです。CSVファイルの内容(または列名の情報)を一緒に貼り付けると、より精度の高いコードが生成されます。
列名: date(日付 YYYY-MM-DD形式), sales(売上金額 円), product(製品カテゴリ), region(地域)
このCSVを読み込んで、以下のことをするPythonコードを作ってください:
1. pandasでCSVを読み込み、月次の売上合計を集計する
2. Prophetを使って3ヶ月先まで売上を予測する
3. 予測結果(実績+予測)をmatplotlibでグラフ化する
4. 予測グラフと予測数値をExcelファイルに出力する
日本語表示に対応してください。ファイル名はsales.csvとします。
これだけです。Claude Codeはこの1回の入力から、必要なライブラリのインストールコマンドから始まり、データ読み込み・予測・グラフ生成・Excel出力まで一連のコードを生成してくれます。
ポイント: Claude Codeへの入力は「やりたいこと」を日本語で書くだけでOKです。「Prophetって何?」「pandasって?」を知らなくても、「月次売上を予測したい」「グラフとExcelに出したい」という目的を伝えれば、Claude Codeが適切な技術選択をしてコードを生成してくれます。
Step 2: Claude Codeが生成したコード
Claude Codeが出力したコードがこちら
上記のプロンプトを入力すると、Claude Codeは約30秒で以下のような完全なコードを出力しました。コードを分割して解説します。
まずインストールコマンドを教えてくれました
Claude Codeの回答(最初の部分):
「以下のライブラリが必要です。まずターミナルで実行してください:」
pip install pandas prophet matplotlib openpyxl japanize-matplotlib
Claude Codeが生成したメインコード(全文)
続けて、Claude Codeは以下の完全なPythonコードを生成しました。コードの各部分に何をしているかのコメントもClaude Codeが自動で付けてくれました。
sales_forecast.py
Claude Codeが生成した売上予測スクリプト
実行: python sales_forecast.py
“””
import warnings
warnings.filterwarnings(‘ignore’)
import pandas as pd
import matplotlib
matplotlib.use(‘Agg’) # GUIなし環境用バックエンド
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語フォント対応
from prophet import Prophet
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.drawing.image import Image as XLImage
from pathlib import Path
import datetime
# ================================
# 設定(必要に応じて変更してください)
# ================================
CSV_PATH = “sales.csv” # 入力CSVファイル
OUTPUT_EXCEL = “forecast_result.xlsx” # 出力Excelファイル
FORECAST_MONTHS = 3 # 何ヶ月先まで予測するか
EXCEL_GREEN = “#107C41”
# ================================
# Step1: CSVを読み込んで月次集計
# ================================
def load_and_aggregate(csv_path: str) -> pd.DataFrame:
“””CSVを読み込み、月次売上を集計してProphet用データフレームを返す”””
df = pd.read_csv(csv_path, parse_dates=[“date”])
# 月次集計(Prophetはds/y列名が必要)
monthly = (
df.resample(“MS”, on=“date”)[“sales”]
.sum()
.reset_index()
.rename(columns={“date”: “ds”, “sales”: “y”})
)
print(f”データ読み込み完了: {len(monthly)}ヶ月分のデータ”)
print(f”期間: {monthly[‘ds’].min().strftime(‘%Y年%m月’)} 〜 {monthly[‘ds’].max().strftime(‘%Y年%m月’)}”)
return monthly
# ================================
# Step2: Prophetで売上予測
# ================================
def run_forecast(monthly_df: pd.DataFrame, months: int) -> tuple:
“””Prophetモデルで将来の売上を予測する”””
# Prophetモデルの設定
model = Prophet(
yearly_seasonality=True, # 年次季節性(繁忙期・閑散期)を考慮
weekly_seasonality=False, # 月次データなので週次は無効
daily_seasonality=False, # 月次データなので日次は無効
seasonality_mode=“multiplicative”, # 売上は乗法的季節性が多い
changepoint_prior_scale=0.05, # トレンド変化点の感度
)
# 日本の祝日を追加(任意)
model.add_country_holidays(country_name=“JP”)
# モデル学習
model.fit(monthly_df)
# 予測期間のデータフレームを作成(月初日)
future = model.make_future_dataframe(
periods=months,
freq=“MS” # Month Start(月初)
)
# 予測実行
forecast = model.predict(future)
print(f”予測完了: {months}ヶ月先まで予測しました”)
return model, forecast
# ================================
# Step3: グラフ生成
# ================================
def create_forecast_chart(
monthly_df: pd.DataFrame,
forecast: pd.DataFrame,
output_path: str
) -> str:
“””実績と予測を重ねたグラフを生成してPNGに保存する”””
fig, axes = plt.subplots(2, 1, figsize=(12, 10))
# — グラフ1: 売上予測(実績 + 予測 + 信頼区間)—
ax = axes[0]
# 実績データ
actual_dates = monthly_df[“ds”]
actual_sales = monthly_df[“y”] / 1e6 # 百万円単位
# 予測データ
pred = forecast.set_index(“ds”)
pred_sales = pred[“yhat”] / 1e6
pred_lower = pred[“yhat_lower”] / 1e6
pred_upper = pred[“yhat_upper”] / 1e6
# 信頼区間(塗りつぶし)
ax.fill_between(
pred.index, pred_lower, pred_upper,
alpha=0.2, color=EXCEL_GREEN, label=“信頼区間(80%)”
)
# 予測ライン
ax.plot(pred.index, pred_sales,
color=EXCEL_GREEN, linewidth=2, linestyle=“–“,
label=“予測値”, zorder=3)
# 実績ライン
ax.plot(actual_dates, actual_sales,
color=“#1a1a1a”, linewidth=2.5,
marker=“o”, markersize=5, label=“実績値”, zorder=4)
# 予測開始の縦線
forecast_start = monthly_df[“ds”].max()
ax.axvline(x=forecast_start, color=“#f59e0b”,
linewidth=1.5, linestyle=“:”, label=“予測開始”)
ax.text(forecast_start, ax.get_ylim()[1] * 0.95,
” 予測開始→”, color=“#f59e0b”, fontsize=9)
ax.set_title(“月次売上 実績 + 3ヶ月先予測”, fontsize=14, fontweight=“bold”, pad=12)
ax.set_ylabel(“売上(百万円)”)
ax.legend(loc=“upper left”)
ax.grid(axis=“y”, linestyle=“–“, alpha=0.5)
[ax.spines[s].set_visible(False) for s in [“top”, “right”]]
# — グラフ2: 季節性の成分 —
ax2 = axes[1]
trend = forecast[“trend”] / 1e6
ax2.plot(forecast[“ds”], trend,
color=EXCEL_GREEN, linewidth=2)
ax2.fill_between(forecast[“ds”], trend, alpha=0.15, color=EXCEL_GREEN)
ax2.set_title(“基調トレンド”, fontsize=13, fontweight=“bold”)
ax2.set_ylabel(“トレンド成分(百万円)”)
ax2.grid(axis=“y”, linestyle=“–“, alpha=0.5)
[ax2.spines[s].set_visible(False) for s in [“top”, “right”]]
plt.tight_layout(pad=3.0)
fig.savefig(output_path, dpi=150, bbox_inches=“tight”)
plt.close(fig)
print(f”グラフ保存: {output_path}”)
return output_path
# ================================
# Step4: Excelファイルに出力
# ================================
def export_to_excel(
monthly_df: pd.DataFrame,
forecast: pd.DataFrame,
chart_path: str,
output_path: str
):
“””予測結果をExcelファイルに出力する(グラフ付き)”””
wb = openpyxl.Workbook()
# —- シート1: 売上予測グラフ —-
ws_chart = wb.active
ws_chart.title = “予測グラフ”
# タイトル
ws_chart.merge_cells(“A1:N1”)
c = ws_chart[“A1”]
c.value = f”売上予測レポート — {datetime.date.today().strftime(‘%Y年%m月%d日’)} 生成”
c.font = Font(bold=True, size=14, color=“FFFFFF”)
c.fill = PatternFill(“solid”, fgColor=“107C41”)
c.alignment = Alignment(horizontal=“center”, vertical=“center”)
ws_chart.row_dimensions[1].height = 36
# グラフ画像を挿入
img = XLImage(chart_path)
img.width, img.height = 700, 500
ws_chart.add_image(img, “A3”)
# —- シート2: 予測数値データ —-
ws_data = wb.create_sheet(“予測数値”)
# ヘッダー
headers = [“年月”, “実績(円)”, “予測値(円)”, “予測下限(円)”, “予測上限(円)”, “区分”]
header_fill = PatternFill(“solid”, fgColor=“107C41”)
for col, h in enumerate(headers, 1):
cell = ws_data.cell(row=1, column=col, value=h)
cell.font = Font(bold=True, color=“FFFFFF”)
cell.fill = header_fill
cell.alignment = Alignment(horizontal=“center”)
# 実績データのセット
actual_dict = monthly_df.set_index(“ds”)[“y”].to_dict()
last_actual = monthly_df[“ds”].max()
# データ行の書き込み
for row_i, (_, row) in enumerate(forecast.iterrows(), 2):
ds = row[“ds”]
actual = actual_dict.get(ds, “”)
is_forecast = ds > last_actual
label = “予測” if is_forecast else “実績”
values = [
ds.strftime(“%Y年%m月”),
actual,
round(row[“yhat”]),
round(row[“yhat_lower”]),
round(row[“yhat_upper”]),
label,
]
for col_i, val in enumerate(values, 1):
cell = ws_data.cell(row=row_i, column=col_i, value=val)
if is_forecast:
cell.fill = PatternFill(“solid”, fgColor=“F0FAF4”)
# 列幅の自動調整
for col_cells in ws_data.columns:
max_len = max(len(str(c.value or “”)) for c in col_cells)
ws_data.column_dimensions[col_cells[0].column_letter].width = max_len + 4
wb.save(output_path)
print(f”Excel出力完了: {output_path}”)
# ================================
# メイン処理
# ================================
def main():
print(“=== 売上予測スクリプト(Claude Code生成)===”)
print(“\n[1/4] CSVデータを読み込んでいます…”)
monthly_df = load_and_aggregate(CSV_PATH)
print(“\n[2/4] Prophetで売上を予測しています…”)
model, forecast = run_forecast(monthly_df, FORECAST_MONTHS)
print(“\n[3/4] 予測グラフを生成しています…”)
chart_path = “forecast_chart.png”
create_forecast_chart(monthly_df, forecast, chart_path)
print(“\n[4/4] Excelファイルに出力しています…”)
export_to_excel(monthly_df, forecast, chart_path, OUTPUT_EXCEL)
print(“\n完了!予測結果ファイル:”, OUTPUT_EXCEL)
# 予測サマリーを表示
future_rows = forecast[forecast[“ds”] > monthly_df[“ds”].max()]
print(“\n— 3ヶ月予測サマリー —“)
for _, row in future_rows.iterrows():
print(
f” {row[‘ds’].strftime(‘%Y年%m月’)}: “
f”¥{row[‘yhat’]/1e6:.1f}M “
f”(下限 ¥{row[‘yhat_lower’]/1e6:.1f}M 〜 上限 ¥{row[‘yhat_upper’]/1e6:.1f}M)”
)
if __name__ == “__main__”:
main()
Claude Codeが生成したコードの注目ポイント: Claude Codeは単にコードを書くだけでなく、各ステップを関数に分割し、進行状況のprintメッセージまで自動で追加してくれました。また、信頼区間(予測の上限・下限)の可視化も自動的に組み込まれています。これを自分でゼロから書くと数時間かかります。
Step 3: 実行結果「こうなります」
実際に動かしてみた結果
Claude Codeが生成したコードをターミナルで実行すると、以下のような出力が表示されます。
=== 売上予測スクリプト(Claude Code生成)===
[1/4] CSVデータを読み込んでいます…
データ読み込み完了: 24ヶ月分のデータ
期間: 2024年01月 〜 2025年12月
[2/4] Prophetで売上を予測しています…
予測完了: 3ヶ月先まで予測しました
[3/4] 予測グラフを生成しています…
グラフ保存: forecast_chart.png
[4/4] Excelファイルに出力しています…
Excel出力完了: forecast_result.xlsx
完了!予測結果ファイル: forecast_result.xlsx
— 3ヶ月予測サマリー —
2026年01月: ¥52.3M (下限 ¥47.8M 〜 上限 ¥56.9M)
2026年02月: ¥48.7M (下限 ¥43.9M 〜 上限 ¥53.6M)
2026年03月: ¥58.1M (下限 ¥52.4M 〜 上限 ¥63.8M)
生成されるExcelファイルの内容
▲ Claude Codeが生成したコードを実行して出力されたExcelファイルの「予測グラフ」シート
生成されるExcelファイルは2つのシートで構成されます:
- 予測グラフシート: 実績ライン(黒)・予測ライン(緑破線)・信頼区間(薄緑塗りつぶし)・基調トレンドの2段グラフ。見た目はプロのレポートそのものです。
- 予測数値シート: 年月・実績・予測値・予測下限・予測上限・区分(実績/予測)の6列テーブル。予測行は薄緑で色分けされています。
正直、Claude Codeが出してきたコードのクオリティに驚きました。信頼区間の可視化、グラフの色分け、Excelのシート分割と色付けまで、自分では思いつかなかった細かい配慮が随所に入っていました。
Claude Codeへの応用プロンプト集
基本の予測コードができたら、Claude Codeに追加でお願いすることで機能をどんどん拡張できます。実際に私が試したプロンプトと結果を紹介します。
応用プロンプト 5選
sales.csvには「product」列(製品カテゴリ)があります。
カテゴリごとに別々のProphetモデルで予測し、
各カテゴリの予測グラフを1枚のExcelに別シートで出力してください。
Prophetの予測分布(信頼区間)を使って、
来月の売上が月次目標60百万円を超える確率を計算してください。
モンテカルロシミュレーションでも構いません。
直近3ヶ月を検証データとして除外し、残りのデータで学習させてから
検証データの予測誤差(MAPE・RMSE)を計算するコードを追加してください。
精度評価結果もExcelに出力してください。
Slack Webhook URLを使って「来月の売上予測: ¥XX.XM(信頼区間: ¥XX.XM〜¥XX.XM)」
というメッセージを送るコードを追加してください。
cronでの定期実行方法も教えてください。
IQR法または3シグマ法で外れ値を自動検出し、
Prophetのfloor/capで上限下限を設定するか、
changepoints引数で変化点を手動指定するコードに改修してください。
予測モデルの選び方(Claude Codeに聞いた)
「どの予測モデルを使えばいいか」という疑問も、Claude Codeに直接聞けば教えてくれます。実際に私が聞いたところ、以下のような回答が返ってきました。
Prophet、ARIMA、線形回帰、LightGBMのそれぞれの
メリット・デメリットと、どんな状況で使うべきかを教えてください。
Claude Codeはこのプロンプトに対して、以下のような比較表を生成しながら説明してくれました。
| モデル | 向いているケース | データ量の目安 | 難易度 |
|---|---|---|---|
| Prophet | 季節性が強い・祝日考慮したい・傾向が分かりやすい | 1年以上推奨(最低6ヶ月) | 低(Claude Codeで簡単) |
| ARIMA / SARIMA | 定常な時系列・外れ値が少ない・短期予測 | 50点以上 | 中(パラメータ調整が必要) |
| 線形回帰 | データが少ない・説明変数(気温・広告費等)がある | 30点以上 | 低(解釈しやすい) |
| LightGBM/XGBoost | 複数の特徴量がある・非線形な関係・高精度が必要 | 1,000点以上推奨 | 高(特徴量エンジニアリングが必要) |
Claude Codeからのアドバイス(実際の回答より): 「月次の売上予測には、まずProphetを試すことをおすすめします。設定がシンプルで季節性を自動処理できるため、最初のモデルとして最適です。精度が不足する場合は、LightGBMに外部特徴量を追加する方向に進化させましょう。」
よくある質問(FAQ)
関連記事
Claude Codeで売上予測を今日から始めよう
本記事で紹介したプロンプトをコピーして、Claude Codeに貼り付けるだけで売上予測コードが手に入ります。AI Factoryでは、Claude Codeを使った業務自動化の実践ノウハウを毎週発信しています。