メインコンテンツへ移動
,

【実践】AIでデータ分析を自動化する方法:PythonとClaude APIで売上データを分析

この記事にはアフィリエイトリンクが含まれる場合があります。

JupyterノートブックでpandasとClaudeを使ってデータ分析を自動化するイラスト

「毎月の売上CSVを集計し、コメント付きレポートとして共有する」という作業は、ほとんどの組織で定型化しているはずです。pandasで集計し、Claude APIにEDAナラティブと改善仮説を語らせ、matplotlibでチャートを描き、Slackや社内ポータルへ流す。この一連の流れは、2026年5月時点のスタックなら数十行のPythonで現実的に組めます。

本記事では、anthropic 0.100.0とClaude Sonnet 4.6を中心に、ノートブック風のサンプルでEDAナラティブ・異常検知・可視化コード生成の3パターンを解説します。同じデータセットへ何度も質問するときのPrompt Caching、数万行を捌くBatch API、深い因果仮説を引き出すAdaptive Thinkingまで、運用前提で触れていきます。

PythonとClaude APIでデータ分析を自動化する全体像

自動化パイプラインは次のステップで構成します。各ステップを独立した関数に分けると、後から差し替えやテストがしやすくなります。

  1. データソース(CSV / DB / DWH)から取得
  2. pandasで前処理(型変換、欠損処理、集計)
  3. 集計結果をClaude Sonnet 4.6へ渡してEDAナラティブと示唆を生成
  4. matplotlibまたはplotlyで可視化コードを生成・実行
  5. HTML/PDF/Slackへレポート配信

Claudeは「集計済みの数字を読んで言葉にする」役割が最も得意です。生データを丸投げするより、まずpandasで縮約してから渡したほうが、コストも品質も両立します。

2026年5月のスタック

本記事は次の構成を前提に書きます。料金やモデル仕様はAnthropic PricingModels overviewを確認した内容です。

  • Python 3.11以降
  • anthropic 0.100.0(2026年5月6日リリース)
  • pandas 2.2系、matplotlib 3.9
  • Claude Sonnet 4.6(主役)、Haiku 4.5(分類)、Opus 4.7(複雑な仮説のみ)
python -m pip install -U "anthropic>=0.100.0" pandas matplotlib python-dotenv

ノートブックでの最小サンプル

まずは月次売上CSVに対する最小構成のEDAコードです。Jupyterで上から実行してください。

# cell 1: 読み込み
import pandas as pd
df = pd.read_csv("sales_2026.csv", parse_dates=["date"])
df["month"] = df["date"].dt.to_period("M")

# cell 2: 集計
monthly = (
    df.groupby(["month", "category"])["amount"]
      .agg(sum="sum", mean="mean", count="count")
      .reset_index()
)
summary = monthly.to_string(index=False)
print(summary[:1000])

パターンA:pandasの集計をEDAナラティブとして語らせる

pandasの集計結果をClaudeに渡してナラティブとグラフコードを生成するフロー図

集計済みテーブルを渡し、伸びたカテゴリ・落ちたカテゴリ・季節性の3観点で簡潔に語らせるのが定番です。Claude Sonnet 4.6はテーブル読解と日本語の説明文生成の両方が得意で、毎月のレポートコメントを置き換える用途に向きます。

from anthropic import Anthropic
client = Anthropic()

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system="あなたはBIアナリストです。事実に基づき、断定しすぎず、数値根拠を明示します。",
    messages=[{
        "role": "user",
        "content": (
            "次の月次×カテゴリ集計表から、伸びた要素・落ちた要素・季節性の3観点で"
            "それぞれ2文ずつ日本語コメントを生成してください。\n\n" + summary
        ),
    }],
)
print(resp.content[0].text)

Claudeの出力をマークダウンや辞書として返させる場合は、systemに「コードフェンスは付けない」「JSONのみ」など強い制約を入れると後処理が安定します。

パターンB:異常検知と理由解説

pandas側でz-scoreやIQRベースの簡易異常検知をしたあと、検出された行だけClaudeに「なぜ異常か」「業務的に説明できる仮説は何か」を考えさせると、分析者の負担が大きく下がります。

import numpy as np
g = df.groupby("category")["amount"]
df["z"] = (df["amount"] - g.transform("mean")) / g.transform("std")
anomalies = df[df["z"].abs() > 3]

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": (
            "次の異常値候補について、考えられる業務的な原因仮説をそれぞれ最大3つ、"
            "確認すべきデータと併せて日本語で返してください。\n\n"
            + anomalies.head(20).to_string(index=False)
        ),
    }],
)
print(resp.content[0].text)

「事実と仮説を分けて書く」「断定せず確認方法を併記する」とプロンプトに必ず入れます。AIに過信させない設計が重要です。

パターンC:可視化コードの自動生成

Claudeにグラフコードを書かせると、毎月微妙に違うフォーマット要件にも対応しやすくなります。生成コードはサンドボックスで実行し、必ずレビュー後に本番ノートブックへ取り込む運用が安全です。

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    system="あなたはPython可視化エンジニアです。matplotlibだけを使い、説明文は付けず、コードのみ返します。",
    messages=[{
        "role": "user",
        "content": (
            "DataFrame monthly(columns: month, category, sum)から、"
            "カテゴリ別の月次推移を1枚の折れ線グラフで描くコードを返してください。"
            "凡例は右外、日本語フォントは matplotlib.rcParams で IPAGothic に設定。"
        ),
    }],
)
code = resp.content[0].text

同じデータセットを何度も分析するならPrompt Caching

Prompt CachingとBatch APIのユースケース比較の概念図

同じ集計表に対して「カテゴリ別」「店舗別」「期間別」と質問を変える場面では、Prompt Cachingで共通コンテキストをキャッシュすると、2回目以降の入力単価が0.1倍まで下がります。Sonnet 4.6の通常入力$3 / MTokなら、キャッシュ読み取りは$0.30 / MTokです。

system_blocks = [
    {"type": "text", "text": "あなたはBIアナリストです。"},
    {"type": "text", "text": f"対象データ:\n{summary}", "cache_control": {"type": "ephemeral"}},
]

for q in ["伸びたカテゴリは?", "下げ止まりが見える月は?", "在庫を増やすべき品目は?"]:
    resp = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=512,
        system=system_blocks,
        messages=[{"role": "user", "content": q}],
    )
    print(q, "->", resp.content[0].text[:120])

キャッシュのデフォルトTTLは5分、追加コストで1時間TTLも選べます。同一ノートブック内で続けて問い合わせる場合は5分で十分なケースが多いです。

数万行を要約・分類するならBatch API

レビュー文の感情分類、問い合わせカテゴリ判定、商品名のクレンジングなど、行単位で独立した処理はMessage Batches APIが向きます。最大100,000リクエスト・256MBまで、標準価格の50%割引、多くは1時間未満に完了します。

requests = [
    {
        "custom_id": f"row-{i}",
        "params": {
            "model": "claude-haiku-4-5",
            "max_tokens": 64,
            "messages": [{"role": "user", "content": f"次のレビューを positive/neutral/negative で返答: {t}"}],
        },
    }
    for i, t in enumerate(reviews)
]
batch = client.messages.batches.create(requests=requests)

結果はclient.messages.batches.results(batch.id)でストリーミング取得し、pandas DataFrameの該当列にマージします。Haiku 4.5+Batchで、数万件のテキスト分類が数百円規模に収まることが多いです。

Adaptive Thinkingで因果仮説まで踏み込む

「なぜ4月の北日本だけ落ちたか」「広告費との相関が崩れた理由」のような踏み込んだ仮説検討では、Adaptive Thinkingを有効にすると推論が深くなります。日次の単純集計には不要ですが、月次レビューで一段深い示唆が欲しいときに使うと費用対効果が高くなります。

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=4096,
    thinking={"type": "adaptive"},
    effort="medium",
    messages=[{"role": "user", "content": "4月の北日本売上が前年同月比で落ちた要因を、データ表から仮説を3つ立てて。"}],
)

運用上の注意点

顧客名や決済情報を含むデータは、外部APIに送る前に列単位でマスキングします。Claudeが書いた数式やコードは必ず別環境で検算してから本番ノートブックに反映してください。出力にはrequest-idと入出力トークン数をログに残し、月次でコストを振り返ると暴走を防げます。

まとめ

2026年5月のデータ分析自動化は、pandasで縮約し、Claude Sonnet 4.6に語らせ、Haiku 4.5+Batchで量を捌き、Prompt Cachingで反復コストを下げる構成が基本形です。まずは1つの定型レポートを完全置換できる小さなパイプラインを作ると、横展開で大きな時間が浮きます。

PythonとClaude APIでデータ分析を学ぶ

pandasとClaude APIを組み合わせた業務分析自動化を実践形式で学べるUdemy講座を公開しています。

あわせて読みたい

Next Action

Python自動化を手元で動かす

メール、Excel、スクレイピング、定期実行まで、毎日の作業を小さく自動化する記事から始められます。

Python自動化を手元で動かす Python自動化の記事を読む