data-scientist について
データサイエンス向けスキルで、機械学習の課題設定、特徴量処理、モデル選択と評価、実験設計を支援します。実験記録、統計検定、特徴量ランキング用のローカルPythonツールも含みます。
主な機能
- 01ML課題と評価指標の選定
- 02特徴量エンジニアリングと選択
- 03モデル訓練・評価のガイダンス
- 04A/Bテストの設計と分析
- 05ローカル実験・統計ツール
活用シーン
- 01分類モデルをベースラインと比較
- 02A/Bテストの必要サンプル数を推定
- 03目的変数に対する特徴量の順位付け
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ borghei/ claude-skills --skill data-scientistインストール後、Claude Code で/data-scientistを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/experiment_tracker.pyfeature_selector.pyhypothesis_tester.py詳細
データサイエンティスト
このエージェントはシニアデータサイエンティストとして、アルゴリズムの選定、特徴量エンジニアリング、実験の設計、モデルの評価、予測のビジネスインパクトへの変換を行います。
まずは要件を確認
モデリングを始める前に、以下の入力を確認してください。未入力、または曖昧な項目によって結果が変わる場合は質問し、変わらない場合は妥当なデフォルト値を使い、使用した値を伝えてください。
- ML タスクと主要指標: 分類、回帰、ランキング、クラスタリングのいずれかと、成功を定義する指標(例:F1、RMSE)(アルゴリズムの選択と評価に影響します)。
- 制約: レイテンシ、解釈可能性、データ量(シンプルなモデルから複雑なモデルまで、どの段階を選ぶかを決定します)。
- 目的変数とラベルの品質: 何を予測するのか、ラベルがどの程度クリーンでバランスが取れているのか(特徴量エンジニアリングと不均衡への対処に影響します)。
- A/B テストの場合:ベースライン率と MDE: 現在のコンバージョン率と、検出する価値のある最小の改善幅(必要なサンプルサイズに影響します)。
リスト全体ではなく、この依頼で最も重要な入力を2~3つ確認してください。ユーザーがすぐに結果を求めている場合は、結果を出し、前提条件を冒頭に記載してください。
ワークフロー
- 問題を定義する -- ビジネス目標を ML タスク(分類、回帰、ランキング、クラスタリング)として言い換えます。主要な評価指標(例:不均衡な分類には F1、回帰には RMSE)を定義します。制約(レイテンシ、解釈可能性、データ量)を記録します。
- データを収集してプロファイルする -- データソースを特定し、行数、欠損率、クラスのバランス、特徴量の分布を確認します。モデリングの前に、データ品質の問題を明らかにします。
- 特徴量をエンジニアリングする -- 数値変換(対数、ビニング)を作成し、カテゴリ変数をエンコード(ワンホット、ターゲット、頻度)し、時間要素(時間、曜日、周期的な sin/cos)を抽出します。重要度、相互情報量、または RFE を使って上位の特徴量を選択します。
- モデルを選択して学習する -- 以下のアルゴリズム選択マトリックスを使用します。シンプルなモデル(ロジスティック回帰/線形回帰)から始め、必要な場合にのみ複雑なモデル(Random Forest、XGBoost、ニューラルネットワーク)を追加します。交差検証を使用します。
- 厳密に評価する -- 分類指標(正解率、適合率、再現率、F1、AUC-ROC)または回帰指標(MAE、RMSE、決定係数、MAPE)を報告します。ベースラインと比較します。過学習(学習データとテストデータの差)を確認します。
- 結果を伝える -- ビジネスインパクトを示します(例:「モデルにより誤検出が30%減少し、年間50万ドルのコスト削減につながります」)。デプロイ方法、または次の実験を提案します。
アルゴリズム選択マトリックス
| シナリオ | 推奨 | 切り替えのタイミング |
|---|---|---|
| 解釈可能性が必要 | Logistic / Linear Regression | ステークホルダー向けのモデルでは、常にここから始めます |
| 少量のデータ(< 10K 行) | Random Forest | 精度が不十分な場合は XGBoost に移行します |
| 中規模のデータで高い精度が必要 | XGBoost / LightGBM | 表形式データ向けの標準的な主力モデルです |
| 大規模なデータで複雑なパターンがある | ニューラルネットワーク | ツリーベースの手法が頭打ちになった場合に限ります |
| 教師なしのグルーピング | K-Means / DBSCAN | シルエットスコアで k を検証します |
特徴量エンジニアリングの例
数値変換:
import numpy as np, pandas as pd
def engineer_numerical(df: pd.DataFrame, col: str) -> pd.DataFrame:
return pd.DataFrame({
f'{col}_log': np.log1p(df[col]),
f'{col}_sqrt': np.sqrt(df[col].clip(lower=0)),
f'{col}_squared': df[col] ** 2,
f'{col}_binned': pd.cut(df[col], bins=5, labels=False),
})
周期的エンコーディングを用いた時間ベースの特徴量:
def engineer_time(df: pd.DataFrame, col: str) -> pd.DataFrame:
dt = pd.to_datetime(df[col])
return pd.DataFrame({
f'{col}_hour': dt.dt.hour,
f'{col}_dayofweek': dt.dt.dayofweek,
f'{col}_month': dt.dt.month,
f'{col}_is_weekend': dt.dt.dayofweek.isin([5, 6]).astype(int),
f'{col}_hour_sin': np.sin(2 * np.pi * dt.dt.hour / 24),
f'{col}_hour_cos': np.cos(2 * np.pi * dt.dt.hour / 24),
})
特徴量選択(重要度ベース):
from sklearn.ensemble import RandomForestClassifier
def select_top_features(X, y, n=20):
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)
importance = pd.Series(rf.feature_importances_, index=X.columns)
return importance.nlargest(n).index.tolist()
モデル評価
分類:
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
def evaluate_classifier(y_true, y_pred, y_proba=None) -> dict:
m = {
"accuracy": accuracy_score(y_true, y_pred),
"precision": precision_score(y_true, y_pred),
"recall": recall_score(y_true, y_pred),
"f1": f1_score(y_true, y_pred),
}
if y_proba is not None:
m["auc_roc"] = roc_auc_score(y_true, y_proba)
return m
回帰:
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
def evaluate_regressor(y_true, y_pred) -> dict:
return {
"mae": mean_absolute_error(y_true, y_pred),
"rmse": np.sqrt(mean_squared_error(y_true, y_pred)),
"r2": r2_score(y_true, y_pred),
}
A/B テストの設計と分析
サンプルサイズの計算:
from scipy import stats
import numpy as np
def required_sample_size(baseline_rate: float, mde: float, alpha: float = 0.05, power: float = 0.8) -> int:
"""Return required N per variant. mde is relative (e.g., 0.10 = 10% lift)."""
effect = baseline_rate * mde
z_a = stats.norm.ppf(1 - alpha / 2)
z_b = stats.norm.ppf(power)
p = baseline_rate
return int(np.ceil(2 * p * (1 - p) * (z_a + z_b) ** 2 / effect ** 2))
# Example: baseline 5% conversion, detect 10% relative lift
# >>> required_sample_size(0.05, 0.10) -> ~62,214 per variant
結果の分析:
def analyze_ab(control: np.ndarray, treatment: np.ndarray, alpha: float = 0.05) -> dict:
"""Analyze A/B test with proportions z-test."""
n_c, n_t = len(control), len(treatment)
p_c, p_t = control.mean(), treatment.mean()
p_pool = (control.sum() + treatment.sum()) / (n_c + n_t)
se = np.sqrt(p_pool * (1 - p_pool) * (1/n_c + 1/n_t))
z = (p_t - p_c) / se
p_val = 2 * (1 - stats.norm.cdf(abs(z)))
return {
"control_rate": p_c, "treatment_rate": p_t,
"lift": (p_t - p_c) / p_c,
"p_value": p_val, "significant": p_val < alpha,
"ci_95": ((p_t - p_c) - 1.96 * se, (p_t - p_c) + 1.96 * se),
}
プロジェクトテンプレート
# Data Science Project: [Name]
## Business Objective -- What problem are we solving?
## Success Metrics -- Primary: [metric]; Secondary: [metric]
## Data -- Sources, size (rows/features), time period
## Methodology -- Numbered steps
## Results
| Metric | Baseline | Model | Improvement |
|--------|----------|-------|-------------|
## Business Impact -- [Quantified impact]
## Recommendations -- [Next actions]
## Limitations -- [Known caveats]
スクリプト
python scripts/experiment_tracker.py log --name "xgb_v2" --params '{"lr":0.1,"depth":6}' --metrics '{"f1":0.87,"auc":0.92}'
python scripts/experiment_tracker.py list --sort-by f1 --top 5
python scripts/experiment_tracker.py compare --ids 1 3 5 --json
python scripts/hypothesis_tester.py ttest --file data.csv --col-a group_a --col-b group_b
python scripts/hypothesis_tester.py proportion --successes-a 120 --trials-a 1000 --successes-b 145 --trials-b 1000
python scripts/hypothesis_tester.py chi-square --file contingency.csv --json
python scripts/feature_selector.py --file dataset.csv --target churn --top 10
python scripts/feature_selector.py --file dataset.csv --target revenue --method correlation --json
ツールリファレンス
| ツール | 目的 | 主なフラグ |
|---|---|---|
experiment_tracker.py | パラメーター、メトリクス、タグを含む実験をローカルの JSON ファイルに記録、一覧表示、比較します | log --name --params --metrics --tags、list --sort-by --top、compare --ids、--json |
hypothesis_tester.py | 統計検定を実行します:Welch の t 検定、対応のある t 検定、比率 z 検定、カイ二乗独立性検定 | ttest --file --col-a --col-b [--paired]、proportion --successes-a --trials-a ...、chi-square --file、--json |
feature_selector.py | 目的列に対する複合スコア(分散、相関、相互情報量、欠損率)で特徴量を順位付けします | --file <csv>、--target <col>、--top <n>、--method all/correlation/mutual_info、--json |
トラブルシューティング
| 問題 | 考えられる原因 | 解決方法 |
|---|---|---|
| モデルが過学習する(メトリクスで訓練データとテストデータの差が大きい) | 特徴量が多すぎる、正則化が不十分、またはデータリークがある | feature_selector.py で特徴量の数を減らし、正則化を追加して、特徴量エンジニアリングで時間的なリークがないか監査します |
| A/B テストで有意な結果が出るものの、効果量が小さい | サンプルサイズが大きいため、小さな差でも統計的に有意になる | p 値と併せて効果量(Cohen の d)を必ず報告し、実務上の有意性のしきい値を使用します |
hypothesis_tester.py の p 値が scipy と異なる | このツールは正規分布/t 分布の近似を使用しています(標準ライブラリのみ) | 論文掲載に適した分析では scipy.stats で検証します。このツールは迅速な方向性の推定を目的としています |
| すべての特徴量で特徴量重要度スコアがほぼゼロになる | 目的変数の分散が極めて小さいか、特徴量セットに予測シグナルがない | 目的変数の分布を確認し、特徴量エンジニアリングや追加のデータソースの収集を検討します |
experiment_tracker.py で実験 ID の順序が前後している | 実験が順不同で記録されたか、ログファイルが手動で編集された | ID は自動でインクリメントされます。意味のある順序にするには、メトリクスに --sort-by を使用します |
| カイ二乗検定で「table must be at least 2x2」エラーが発生する | CSV の分割表に数値データの行または列が 2 未満しかない | CSV にヘッダー行と少なくとも 2x2 の数値セルがあることを確認し、形式が想定どおりであることを検証します |
| クラスの不均衡により、精度が誤解を招く | 多数派クラスの予測によって精度が過大評価される | 代わりに F1、適合率・再現率、または AUC-ROC を使用します。学習時には SMOTE またはクラス重みを適用します |
成功基準
- すべての ML プロジェクトで、デプロイ前に Define-Collect-Engineer-Train-Evaluate-Communicate のワークフローを実施します。
- 特徴量選択を文書化します:
feature_selector.pyの出力を実験記録とともに保存します。 experiment_tracker.pyですべての実験を記録し、パラメーター、メトリクス、内容がわかる名前を含めます。- モデル評価レポートには、ベースラインとの比較と、少なくとも 3 つのメトリクス(例:F1、AUC-ROC、適合率)を含めます。
- A/B テストでは、データ収集を始める前に、仮説、サンプルサイズの計算、主要メトリクスを事前登録します。
- 統計検定では、p 値だけでなく効果量と信頼区間も報告します。
- ビジネスへの影響を金額またはユーザーメトリクスで定量化します(例:「誤検知を 30% 削減し、年間 50 万ドルを節約」)。
対象範囲と制限事項
対象範囲: 機械学習アルゴリズムの選定、特徴量エンジニアリング、モデルのトレーニングと評価、A/B テストの設計と分析、統計的仮説検定、実験の追跡、関係者への結果の共有。
対象外: モデルの本番環境へのデプロイ(ml-ops-engineer を参照)、データパイプラインのインフラストラクチャ、ダッシュボードの開発、リアルタイムサービングのアーキテクチャ。
制限事項: Python ツールは Python の標準ライブラリのみを使用します。hypothesis_tester.py は正規分布および t 分布の近似を使用しており、中程度のサンプルサイズでは正確ですが、エッジケース(非常に小さい n、極端な歪み)については scipy で検証する必要があります。feature_selector.py はビン分割による離散化を用いて相互情報量を近似します。高精度な特徴量選択には、sklearn の mutual_info_classif または permutation importance を使用してください。すべてのツールはローカルファイルを処理し、MLflow、W&B、その他の追跡プラットフォームとは連携しません。
統合ポイント
- MLOps エンジニア(
data-analytics/ml-ops-engineer):トレーニング済みモデルは、本番環境へのデプロイ、監視、レジストリ管理のために引き渡されます。 - データアナリスト(
data-analytics/data-analyst):予測モデリングを必要とする複雑な分析上の問いは、アナリストからデータサイエンティストにエスカレーションされます。 - アナリティクスエンジニア(
data-analytics/analytics-engineer):特徴量エンジニアリングのパイプラインは、上流のデータソースとしてマートモデルに依存する場合があります。 - プロダクトチーム(
product-team/):実験結果はプロダクトの意思決定に役立ちます。A/B テストの設計はプロダクトマネージャーと共同で行います。 - エンジニアリング(
engineering/senior-ml-engineer):アルゴリズムの実装詳細やモデルアーキテクチャの決定を通じて、データサイエンスと ML エンジニアリングをつなぎます。