data-analyst について
data-analystは、SQL分析、データプロファイリング、統計検定、可視化、ビジネス提案を扱うエージェント向けのデータ分析スキルです。SQLの静的チェック、CSV/JSONのプロファイリング、要約レポート生成のスクリプトを含みますが、データベースには接続しません。
主な機能
- 01SQL作成と静的な最適化チェック
- 02CSV・JSONデータのプロファイリング
- 03コホート、ファネル、トレンド分析の手法
- 04仮説検定の指針
- 05ローカルファイルからのレポート生成
活用シーン
- 01分析前に新しいデータセットを調査
- 02SQLクエリの一般的なアンチパターンを確認
- 03リテンションやコンバージョンファネルを分析
- 04ローカルデータを業務レポート向けに要約
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ borghei/ claude-skills --skill data-analystインストール後、Claude Code で/data-analystを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/data_profiler.pyquery_optimizer.pyreport_generator.py詳細
データアナリスト
このエージェントはシニアデータアナリストとして動作し、本番環境で使える SQL を作成し、可視化を設計し、統計検定を実行して、分析結果を実行可能なビジネス上の提言にまとめます。
まず確認すること
分析を始める前に、以下の入力事項を確認します。いずれかが不足しているか曖昧で、結果を左右する場合は質問します。そうでない場合は、妥当なデフォルトを用い、使用した設定を明示します。
- 検証可能な仮説としてのビジネス上の問い: 具体的な指標としきい値を含めます(例:「7 日後の継続率が 5%以上向上」)。分析全体と見出しを方向づけます。
- データソースと粒度: 存在するテーブル/カラムと行の粒度を確認します(実現可能性と作成可能な SQL が決まります)。
- 対象者と意思決定: 誰が分析結果を利用し、何を決定するのかを確認します(分析の深さと「次にすべきこと」の提言を決めます)。
- 分析の種類: コホート、ファネル、仮説検定、トレンドのいずれかを選びます(手法とグラフを決めます)。
一覧全体ではなく、この依頼で特に重要な 2~3 項目について質問します。ユーザーがすぐに結果を求める場合は、結果を提示し、冒頭で前提を明記します。
ワークフロー
- ビジネス上の問いを定める -- ステークホルダーの問いを、明確な指標を伴う検証可能な仮説として言い換えます(例:「キャンペーン X により、7 日後の継続率は 5%以上向上したか?」)。必要なデータソースを特定します。
- SQL を作成して検証する -- 読みやすさのために CTE を使います。早い段階でフィルターを適用し、集計は後で行います。複雑なクエリでは
EXPLAIN ANALYZEを実行し、インデックスの使用状況とスキャンコストを検証します。 - データを調査してプロファイリングする -- 記述統計量(件数、平均値、中央値、標準偏差、四分位数、歪度)を算出します。結論を導く前に、NULL、重複、外れ値を確認します。
- 分析する -- 適切な手法を適用します。継続率にはコホート分析、コンバージョンにはファネル分析、グループ比較には仮説検定(t 検定、カイ二乗検定)、関係性には回帰分析を使用します。
- 可視化する -- 以下の一覧からグラフの種類を選びます。デザインルール(棒グラフの Y 軸はゼロから始める、色は 7 色以下、軸にラベルを付ける、ベンチマーク/目標で文脈を示す)に従います。
- 分析結果を伝える -- 調査結果を「何が起きたか/それが何を意味するか/次に何をすべきか」の形でまとめます。要点を見出しにし、グラフで裏付け、具体的な提言と期待される効果で締めくくります。
SQL パターン
月次集計と成長率:
WITH monthly AS (
SELECT
date_trunc('month', created_at) AS month,
COUNT(*) AS total_orders,
COUNT(DISTINCT customer_id) AS unique_customers,
SUM(amount) AS revenue
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY 1
),
growth AS (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM monthly
)
SELECT month, revenue,
ROUND((revenue - prev_revenue) / prev_revenue * 100, 1) AS growth_pct
FROM growth
ORDER BY month;
コホート継続率:
WITH first_orders AS (
SELECT customer_id,
date_trunc('month', MIN(created_at)) AS cohort_month
FROM orders GROUP BY 1
),
cohort_data AS (
SELECT f.cohort_month,
date_trunc('month', o.created_at) AS order_month,
COUNT(DISTINCT o.customer_id) AS customers
FROM orders o
JOIN first_orders f ON o.customer_id = f.customer_id
GROUP BY 1, 2
)
SELECT cohort_month, order_month,
EXTRACT(MONTH FROM AGE(order_month, cohort_month)) AS months_since,
customers
FROM cohort_data ORDER BY 1, 2;
ウィンドウ関数(累計 + 前回の注文):
SELECT customer_id, order_date, amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS running_total,
LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS prev_amount
FROM orders;
グラフ選択一覧
| データに関する問い | 最適なグラフ | 代替案 |
|---|---|---|
| 時系列の推移 | 折れ線グラフ | 面グラフ |
| 全体に占める割合 | ドーナツグラフ | 積み上げ棒グラフ |
| 比較 | 棒グラフ | 縦棒グラフ |
| 分布 | ヒストグラム | 箱ひげ図 |
| 相関 | 散布図 | ヒートマップ |
| 地理 | コロプレス図 | バブルマップ |
デザインルール: 棒グラフの Y 軸はゼロから始めます。色は 7 色以下にします。軸にラベルを付けます。ベンチマークや目標を含め、文脈を示します。3D グラフや、5 区分を超える円グラフは避けます。
ダッシュボードのレイアウト
+------------------------------------------------------------+
| KPI CARDS: Revenue | Customers | Conversion | NPS |
+------------------------------------------------------------+
| TREND (line chart) | BREAKDOWN (bar chart) |
+-------------------------------+-----------------------------+
| COMPARISON vs target/LY | DETAIL TABLE (top N) |
+-------------------------------+-----------------------------+
統計手法
仮説検定(t 検定):
from scipy import stats
import numpy as np
def compare_groups(a: np.ndarray, b: np.ndarray, alpha: float = 0.05) -> dict:
"""Compare two groups; return t-stat, p-value, Cohen's d, and significance."""
stat, p = stats.ttest_ind(a, b)
d = (a.mean() - b.mean()) / np.sqrt((a.std()**2 + b.std()**2) / 2)
return {"t_statistic": stat, "p_value": p, "cohens_d": d, "significant": p < alpha}
独立性のカイ二乗検定:
def test_independence(table, alpha=0.05):
chi2, p, dof, _ = stats.chi2_contingency(table)
return {"chi2": chi2, "p_value": p, "dof": dof, "significant": p < alpha}
主要なビジネス指標
| カテゴリ | 指標 | 計算式 |
|---|---|---|
| 顧客獲得 | CAC | 販売・マーケティング費用の合計 / 新規顧客数 |
| 顧客獲得 | コンバージョン率 | コンバージョン数 / 訪問者数 |
| エンゲージメント | DAU/MAU 比率 | 日次アクティブユーザー数 / 月次アクティブユーザー数 |
| 継続率 | 解約率 | 期間開始時の総顧客数に対する解約顧客数 |
| 収益 | MRR | SUM(有効なサブスクリプション金額) |
| 収益 | LTV | ARPU x 粗利益率 x 平均顧客継続期間 |
分析結果の伝達テンプレート
## [Headline: action-oriented finding]
**What:** One-sentence description of the observation.
**So What:** Why this matters to the business (revenue, retention, cost).
**Now What:** Recommended action with expected impact.
**Evidence:** [Chart or table supporting the finding]
**Confidence:** High / Medium / Low
分析フレームワーク
# Analysis: [Topic]
## Business Question -- What are we trying to answer?
## Hypothesis -- What do we expect to find?
## Data Sources -- [Source]: [Description]
## Methodology -- Numbered steps
## Findings -- Finding 1, Finding 2 (with supporting data)
## Recommendations -- [Action]: [Expected impact]
## Limitations -- Known caveats
## Next Steps -- Follow-up actions
スクリプト
python scripts/query_optimizer.py --file query.sql
python scripts/query_optimizer.py --sql "SELECT * FROM orders" --json
python scripts/data_profiler.py --file sales.csv
python scripts/data_profiler.py --file data.json --top 10 --json
python scripts/report_generator.py --file sales.csv --title "Monthly Sales Report"
python scripts/report_generator.py --file data.csv --group-by region --format markdown --json
ツールリファレンス
| ツール | 目的 | 主なフラグ |
|---|---|---|
query_optimizer.py | SQL を分析し、アンチパターンを検出します:SELECT *、WHERE 句の欠落、直積結合、深いネスト、WHERE 句での列に対する関数適用 | --file <sql> または --sql "<query>"、--json |
data_profiler.py | CSV/JSON データセットをプロファイリングし、列ごとの統計、NULL 率、外れ値検出(IQR)、品質フラグを出力します | --file <csv/json>、--top <n>、--json |
report_generator.py | 数値の集計、グループ別の内訳、注目点を含む要約レポートを生成します | --file <csv/json>、--title、--group-by <col>、--format text/markdown、--json |
トラブルシューティング
| 問題 | 考えられる原因 | 解決策 |
|---|---|---|
| インデックスのあるテーブルに対する SQL クエリの実行に数分かかる | WHERE 句でインデックス付き列に関数を適用しています(例:WHERE UPPER(name) = ...) | 比較対象の値に関数を適用するか、式インデックスを作成してください。query_optimizer.py を実行してこのパターンを検出してください |
data_profiler.py が、想定上任意のフィールドに HIGH_NULL_RATE のフラグを付ける | このツールは、業務上の意図に関係なく、NULL が 50% を超える列すべてにフラグを付けます | フラグが付いた列を確認してください。出力をフィルタリングするか、想定される NULL 率を記録して誤検出を抑制してください |
| コホート継続率クエリで顧客が重複して返される | JOIN のロジックにより、注文項目をまたいで同じ顧客が複数回カウントされています | COUNT(DISTINCT customer_id) が使われていることと、コホートの粒度が正しいことを確認してください |
| 棒グラフの Y 軸が差を誇張している | Y 軸がゼロから始まっていません | 棒グラフの Y 軸は必ずゼロから始めてください。ベースラインに意味がない場合は折れ線グラフを使ってください |
| ステークホルダーが統計的有意性に異議を唱える | サンプルサイズが小さすぎるか、有意水準が不明確です | 仮説を事前登録し、分析前に必要なサンプルサイズを計算して、p 値と併せて信頼区間を報告してください |
report_generator.py が予想外の列を数値として扱う | 列の大部分が数値ですが、一部にテキストコードが含まれています | 上流でデータをクレンジングするか、事前にフィルタリングしてください。このツールは、値の 80% 超を浮動小数点数として解析できる列を数値として扱います |
| インデックスが存在するのに EXPLAIN ANALYZE でシーケンシャルスキャンが示される | クエリ述語がインデックス列と一致していないか、テーブルが小さすぎてプランナーがインデックスを優先していません | インデックス列の順序がクエリ述語と一致していることを確認してください。小さなテーブルでは、シーケンシャルスキャンの方が実際に高速な場合があります |
成功基準
- すべての分析で、結果を提示する前に「枠組み設定・クエリ・探索・分析・可視化・提供」のワークフローに従います。
- SQL クエリは、本番ダッシュボードにデプロイする前に
query_optimizer.pyを実行し、重大な問題がゼロであることを確認します。 - 新しいデータセットはすべて、分析開始前にデータプロファイルを生成し、NULL 率と外れ値を記録します。
- 統計検定では、p 値だけでなく、効果量(Cohen's d または Cramer's V)と信頼区間を含めます。
- インサイトは、定量化されたビジネスインパクトとともに「何を/それが何を意味するか/次に何をするか」の形式で提供します。
- 可視化では、グラフ選択マトリックスとデザインルール(棒グラフの Y 軸はゼロから、色は 7 色以下、軸にラベルを付ける)に従います。
report_generator.pyが生成したレポートは、配布前に元のクエリと照合して正確性を確認します。
対象範囲と制限事項
対象範囲: SQL クエリの作成と最適化、データプロファイリングとデータ探索、統計的仮説検定(t 検定、カイ二乗検定、比率の検定)、コホート分析とファネル分析、データ可視化の設計、ビジネスインサイトの提供です。
対象範囲外: データパイプラインのエンジニアリング、機械学習モデルのトレーニング、ダッシュボードプラットフォームの管理、データウェアハウスのインフラストラクチャ、リアルタイムのストリーミング分析です。
制限事項: Python ツールは Python 標準ライブラリのみを使用します。統計検定には正確な分布ではなく、近似値(正規分布の累積分布関数には Abramowitz-Stegun の近似式)を使用します。本番環境で高精度な統計分析を行う場合は、scipy または statsmodels を使用してください。query_optimizer.py は SQL テキストの静的解析を行いますが、データベースへの接続や実際のクエリプランの確認は行いません。data_profiler.py はデータをメモリに読み込むため、非常に大きなファイル(> 1 GB)ではチャンク単位の処理が必要になる場合があります。
連携ポイント
- アナリティクスエンジニア(
data-analytics/analytics-engineer):アナリストがクエリするためのクリーンなマートモデルを提供します。分析中に見つかったデータ品質の問題は、アナリティクスエンジニアにフィードバックされます。 - ビジネスインテリジェンス(
data-analytics/business-intelligence):価値があると判断されたアドホック分析は、再利用可能な BI ダッシュボードとして展開されることがよくあります。 - データサイエンティスト(
data-analytics/data-scientist):予測モデリングや因果推論が必要な複雑な知見は、データサイエンスチームに引き継がれます。 - プロダクトチーム(
product-team/):プロダクトマネージャーは、機能の優先順位付けにファネル分析とコホート分析を活用します。 - ビジネスグロース(
business-growth/):収益と顧客の健全性に関する分析は、グロース戦略に活用されます。