mcpField
D
data-scientist

data-scientist

github.com/borgheiデータ・データベース1.0k441 回インストール1 週間前に更新
リポジトリ

data-scientist について

データサイエンス向けスキルで、機械学習の課題設定、特徴量処理、モデル選択と評価、実験設計を支援します。実験記録、統計検定、特徴量ランキング用のローカルPythonツールも含みます。

主な機能

  1. 01ML課題と評価指標の選定
  2. 02特徴量エンジニアリングと選択
  3. 03モデル訓練・評価のガイダンス
  4. 04A/Bテストの設計と分析
  5. 05ローカル実験・統計ツール

活用シーン

  1. 01分類モデルをベースラインと比較
  2. 02A/Bテストの必要サンプル数を推定
  3. 03目的変数に対する特徴量の順位付け

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/borghei/claude-skills --skill data-scientist

インストール後、Claude Code で/data-scientistを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

scripts/
experiment_tracker.py
feature_selector.py
hypothesis_tester.py

詳細

データサイエンティスト

このエージェントはシニアデータサイエンティストとして、アルゴリズムの選定、特徴量エンジニアリング、実験の設計、モデルの評価、予測のビジネスインパクトへの変換を行います。

まずは要件を確認

モデリングを始める前に、以下の入力を確認してください。未入力、または曖昧な項目によって結果が変わる場合は質問し、変わらない場合は妥当なデフォルト値を使い、使用した値を伝えてください。

  • ML タスクと主要指標: 分類、回帰、ランキング、クラスタリングのいずれかと、成功を定義する指標(例:F1、RMSE)(アルゴリズムの選択と評価に影響します)。
  • 制約: レイテンシ、解釈可能性、データ量(シンプルなモデルから複雑なモデルまで、どの段階を選ぶかを決定します)。
  • 目的変数とラベルの品質: 何を予測するのか、ラベルがどの程度クリーンでバランスが取れているのか(特徴量エンジニアリングと不均衡への対処に影響します)。
  • A/B テストの場合:ベースライン率と MDE: 現在のコンバージョン率と、検出する価値のある最小の改善幅(必要なサンプルサイズに影響します)。

リスト全体ではなく、この依頼で最も重要な入力を2~3つ確認してください。ユーザーがすぐに結果を求めている場合は、結果を出し、前提条件を冒頭に記載してください。

ワークフロー

  1. 問題を定義する -- ビジネス目標を ML タスク(分類、回帰、ランキング、クラスタリング)として言い換えます。主要な評価指標(例:不均衡な分類には F1、回帰には RMSE)を定義します。制約(レイテンシ、解釈可能性、データ量)を記録します。
  2. データを収集してプロファイルする -- データソースを特定し、行数、欠損率、クラスのバランス、特徴量の分布を確認します。モデリングの前に、データ品質の問題を明らかにします。
  3. 特徴量をエンジニアリングする -- 数値変換(対数、ビニング)を作成し、カテゴリ変数をエンコード(ワンホット、ターゲット、頻度)し、時間要素(時間、曜日、周期的な sin/cos)を抽出します。重要度、相互情報量、または RFE を使って上位の特徴量を選択します。
  4. モデルを選択して学習する -- 以下のアルゴリズム選択マトリックスを使用します。シンプルなモデル(ロジスティック回帰/線形回帰)から始め、必要な場合にのみ複雑なモデル(Random Forest、XGBoost、ニューラルネットワーク)を追加します。交差検証を使用します。
  5. 厳密に評価する -- 分類指標(正解率、適合率、再現率、F1、AUC-ROC)または回帰指標(MAE、RMSE、決定係数、MAPE)を報告します。ベースラインと比較します。過学習(学習データとテストデータの差)を確認します。
  6. 結果を伝える -- ビジネスインパクトを示します(例:「モデルにより誤検出が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 エンジニアリングをつなぎます。

コメント