09-05. ケース 5: データ分析の対話的ワークフロー
シチュエーション
手元の CSV / DB に対して、毎回: - import 一通り書く - データを読み込む - 集計クエリを書く - グラフを書く - 異常値を探す
を Jupyter で繰り返している。毎回 30 分〜1 時間 かかり、本来の「分析の意思決定」より 準備に時間を取られている。
Before (Claude Code を使わない場合)
# 毎回 Jupyter で
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("./data/sales.csv")
df["date"] = pd.to_datetime(df["date"])
monthly = df.groupby(df["date"].dt.to_period("M"))["amount"].sum()
plt.figure(figsize=(10,4))
monthly.plot()
plt.title("Monthly Sales")
...
→ パターン化できる作業を毎回手書き、準備 30 分 / 分析 30 分 / 結果整理 30 分。
After (Claude Code を使う場合)
$ cd ~/projects/data-analysis
$ claude
> ./data/sales.csv の月次推移を可視化して、外れ値があれば指摘して
→ Claude が:
1. CSV をスキャン (head 数行、dtype 推定)
2. pandas + matplotlib コードを生成
3. run_python ツールで実行 → グラフ画像 + 集計結果
4. 外れ値を統計的に検出して指摘
→ 5 分で結果。
必要な道具立て
| 機能 | 何のために |
|---|---|
| プロジェクト CLAUDE.md | データの場所・命名規約・よく使うクエリパターン |
| Skill: data-analysis | 分析手順(EDA → 可視化 → 異常検知)を強制 |
| Hook: PreToolUse (Bash) | pip install で重いライブラリを誤って入れるのを防ぐ |
| Python 環境 (uv/poetry/venv) | 自動で activate される設定 |
CLAUDE.md 例
# データ分析プロジェクト
## データの場所
- `./data/raw/` — 元データ (変更禁止)
- `./data/processed/` — 前処理済み
- `./data/output/` — 分析結果(グラフ・レポート)
## よく使うライブラリ
- pandas, numpy, matplotlib, seaborn, scikit-learn, scipy
- どれも uv 環境にインストール済み(.venv 自動 activate)
## 分析の流儀
1. **EDA は必ず最初**: shape, dtype, null 数, describe を確認
2. **可視化は必ず保存**: `data/output/<日付>-<内容>.png`
3. **異常値検出**: IQR 法 + Z-score の両方
4. **結論は 3 行**: ビジネスインパクトを優先
## 避けたいこと
- `display(df)` で巨大データを画面に出す
- グラフを表示するだけで保存しない
- 統計的根拠なしの "外れ値っぽい" 判定
Skill .claude/skills/data-analysis/SKILL.md
---
name: data-analysis
description: CSV / Parquet / DB データを集計・可視化・異常検知するタスクで使う
---
# 分析の標準手順
## 1. EDA (Exploratory Data Analysis)
```python
df.shape # 行列数
df.dtypes # 型
df.isnull().sum() # 欠損
df.describe() # 数値列の統計
df.head(3) # サンプル
↑ 必ず最初に実行。結果を回答に含める。
2. 可視化
- 時系列 → line plot
- カテゴリ別比較 → bar plot
- 分布 → histogram + boxplot
- 相関 → heatmap (matplotlib seaborn)
すべて data/output/<YYYY-MM-DD>-<内容>.png に保存。
3. 異常検知
- 数値列: IQR 法 (Q1 - 1.5IQR / Q3 + 1.5IQR の外)
- 時系列: rolling mean ± 3*rolling std を超えた点
4. 結論
- ビジネスインパクトの順に 3 行
- 根拠となる数値を必ず併記
## ワークフロー (例)
$ claude
data/raw/sales.csv を読んで、月次推移と異常値を出して
Claude (data-analysis Skill 発火): 1. EDA > Read data/raw/sales.csv (head 5 行) > Bash: python -c "import pandas; df=pandas.read_csv('data/raw/sales.csv'); print(df.shape, df.dtypes, df.isnull().sum())" > 結果: shape=(1247, 6), 欠損 amount 列に 3 件 2. 可視化 > Edit: data/processed/sales_monthly.py を作成 (集計コード) > Bash: python data/processed/sales_monthly.py > Read: data/output/2026-05-12-monthly-sales.png (確認) 3. 異常検知 > 月次合計に IQR 法を適用 > 2026-02 の売上が +2.3 IQR で外れ値検出 4. 結論 > Markdown レポートとして data/output/2026-05-12-report.md に保存 > 「① 月次は 2026-Q1 で +18%、② 2026-02 が異常 (システム障害復旧の反動か?)、③ 提案: 翌月の予算下方修正」 ```
注意点・限界
- 大規模データ (>1GB): メモリに乗らない → DuckDB / Polars / chunked read を CLAUDE.md で指定
- DB 直接アクセス: SQLite なら直接、Postgres/MySQL は MCP 経由 or Claude にクエリ書かせて手動実行
- 画像表示: ターミナルでは画像が見えない →
iTerm2/weztermの画像表示機能 ordata/output/を別ウィンドウで開く - コスト: 1 分析セッションあたり Haiku 4.5 で $0.05〜$0.50
応用
- A/B テスト分析: 「実験 X の結果を 7 日分集計、有意差検定して」
- 異常検知の自動化: cron で日次スキャン → 異常があれば Slack 通知 (08-05 Headless mode + Slack MCP)
- レポート定期生成: 月次のダッシュボードレポートを Claude に書かせる
- 競合データの取り込み: WebFetch で公開データ取得 → 自社データと比較
このケース後にできるようになること
- 分析の準備時間を 80% 削減
- 「データ分析 = コード書くこと」から「データ分析 = 仮説検証の意思決定」に視点が移る
- 自分用の「分析テンプレ Skills」が貯まる
関連
- 第5章 RAG — データに RAG を当てたいケース
- 08-02 CLAUDE.md — プロジェクト固有の分析規約