mcpField
D
data-scientist

data-scientist

github.com/404kidwizデータ・データベース143 回インストール
リポジトリ

data-scientist について

統計分析と予測モデリングに取り組むデータ分析担当者向けのスキルです。データ探索、実験設計、因果推論、モデル検証に加え、不確実性を含む結果の業務向け説明を扱います。

主な機能

  1. 01探索的データ分析とクリーニング
  2. 02予測モデリングと時系列予測
  3. 03A/Bテストと実験の分析
  4. 04因果推論の手法
  5. 05モデル検証と不確実性の報告

活用シーン

  1. 01データセットの傾向や異常の発見
  2. 02プロダクト実験の結果測定
  3. 03売上や需要の予測
  4. 04観察データからの影響推定

インストール

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

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill data-scientist

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

詳細

データサイエンティスト

目的

機械学習、実験計画法、因果推論を専門とする統計分析と予測モデリングの知識を提供します。厳密なモデルを構築し、適切な検証と不確実性の定量化に基づいて、複雑な統計的知見を実行可能なビジネス上の洞察へと変換します。

使用する場面

  • パターンや異常を見つけるための探索的データ分析(EDA)
  • 予測モデル(分類、回帰、予測)の構築
  • A/B テストや実験の設計と分析
  • 厳密な統計的仮説検定の実施
  • 高度な可視化とデータに基づくストーリーの作成
  • ビジネス課題に関する指標と KPI の定義


主な機能

統計モデリング
  • 回帰、分類、クラスタリングを使った予測モデルの構築
  • 時系列予測と因果推論の実装
  • A/B テストや実験の設計と分析
  • 特徴量エンジニアリングと特徴量選択の実施
機械学習
  • 教師あり学習モデルと教師なし学習モデルのトレーニングと評価
  • 複雑なパターンに対応するディープラーニングモデルの実装
  • ハイパーパラメーターのチューニングとモデルの最適化
  • 交差検証とホールドアウトセットによるモデルの検証
データ探索
  • パターンを発見するための探索的データ分析(EDA)の実施
  • データセット内の異常や外れ値の特定
  • 洞察を発見するための高度な可視化の作成
  • データ探索からの仮説の生成
コミュニケーションとストーリーテリング
  • 統計的知見をビジネス向けの表現に変換
  • 関係者に向けた説得力のあるデータストーリーの作成
  • インタラクティブなノートブックとレポートの構築
  • 不確実性を定量化したうえでの知見の提示


3. 主なワークフロー

ワークフロー 1:探索的データ分析(EDA)とクリーニング

目標: モデリングの前に、データの分布、品質、関係性を把握します。

手順:

  1. データの読み込みとプロファイリング

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # Load data
    df = pd.read_csv("customer_data.csv")
    
    # Basic profiling
    print(df.info())
    print(df.describe())
    
    # Missing values analysis
    missing = df.isnull().sum() / len(df)
    print(missing[missing > 0].sort_values(ascending=False))
    
  2. 単変量分析(分布)

    # Numerical features
    num_cols = df.select_dtypes(include=[np.number]).columns
    for col in num_cols:
        plt.figure(figsize=(10, 4))
        plt.subplot(1, 2, 1)
        sns.histplot(df[col], kde=True)
        plt.subplot(1, 2, 2)
        sns.boxplot(x=df[col])
        plt.show()
    
    # Categorical features
    cat_cols = df.select_dtypes(exclude=[np.number]).columns
    for col in cat_cols:
        print(df[col].value_counts(normalize=True))
    
  3. 二変量分析(関係性)

    # Correlation matrix
    corr = df.corr()
    sns.heatmap(corr, annot=True, cmap='coolwarm')
    
    # Target vs Features
    target = 'churn'
    sns.boxplot(x=target, y='tenure', data=df)
    
  4. データクリーニング

    # Impute missing values
    df['age'].fillna(df['age'].median(), inplace=True)
    df['category'].fillna('Unknown', inplace=True)
    
    # Handle outliers (Example: Cap at 99th percentile)
    cap = df['income'].quantile(0.99)
    df['income'] = np.where(df['income'] > cap, cap, df['income'])
    

検証:

  • 重要な列に欠損値がないこと。
  • 分布(正規分布か、歪んでいるか)を把握していること。
  • 目的変数のバランスを確認していること。


ワークフロー 3:A/B テスト分析

目標: ウェブサイトのコンバージョン実験の結果を分析します。

手順:

  1. 仮説を定義する

    • H0:コンバージョン率 B <= コンバージョン率 A
    • H1:コンバージョン率 B > コンバージョン率 A
    • アルファ:0.05
  2. データを読み込み、集計する

    # data: ['user_id', 'group', 'converted']
    results = df.groupby('group')['converted'].agg(['count', 'sum', 'mean'])
    results.columns = ['n_users', 'conversions', 'conversion_rate']
    print(results)
    
  3. 統計的検定(比率の Z 検定)

    from statsmodels.stats.proportion import proportions_ztest
    
    control = results.loc['A']
    treatment = results.loc['B']
    
    count = np.array([treatment['conversions'], control['conversions']])
    nobs = np.array([treatment['n_users'], control['n_users']])
    
    stat, p_value = proportions_ztest(count, nobs, alternative='larger')
    
    print(f"Z-statistic: {stat:.4f}")
    print(f"P-value: {p_value:.4f}")
    
  4. 信頼区間

    from statsmodels.stats.proportion import proportion_confint
    
    (lower_con, lower_treat), (upper_con, upper_treat) = proportion_confint(count, nobs, alpha=0.05)
    
    print(f"Control CI: [{lower_con:.4f}, {upper_con:.4f}]")
    print(f"Treatment CI: [{lower_treat:.4f}, {upper_treat:.4f}]")
    
  5. 結論

    • p-value < 0.05 の場合:H0 を棄却します。バリエーション B は統計的に有意に優れています。
    • 実用上の有意性(向上幅)を確認します。


ワークフロー 5:因果推論(傾向スコアマッチング)

目標: A/B テストが実施できない場合に、観察データを用いて「プレミアム会員」が「支出」に与える影響を推定します。

手順:

  1. 問題を設定する

    • 処置:プレミアム会員(1)対無料会員(0)
    • 結果:年間支出($)
    • 交絡因子:年齢、収入、所在地、利用期間(会員資格と支出の両方に影響する要因)
  2. 傾向スコアを計算する

    from sklearn.linear_model import LogisticRegression
    
    # P(Treatment=1 | Confounders)
    confounders = ['age', 'income', 'tenure']
    logit = LogisticRegression()
    logit.fit(df[confounders], df['is_premium'])
    
    df['propensity_score'] = logit.predict_proba(df[confounders])[:, 1]
    
    # Check overlap (Common Support)
    sns.histplot(data=df, x='propensity_score', hue='is_premium', element='step')
    
  3. マッチング(最近傍法)

    from sklearn.neighbors import NearestNeighbors
    
    # Separate groups
    treatment = df[df['is_premium'] == 1]
    control = df[df['is_premium'] == 0]
    
    # Find neighbors for treatment group in control group
    nn = NearestNeighbors(n_neighbors=1, algorithm='ball_tree')
    nn.fit(control[['propensity_score']])
    
    distances, indices = nn.kneighbors(treatment[['propensity_score']])
    
    # Create matched dataframe
    matched_control = control.iloc[indices.flatten()]
    
    # Compare outcomes
    ate = treatment['spend'].mean() - matched_control['spend'].mean()
    print(f"Average Treatment Effect (ATE): ${ate:.2f}")
    
  4. 検証(バランスチェック)

    • マッチング後に交絡因子のバランスが取れているか確認します(例:処置群とマッチした対照群の平均年齢が近いこと)。
    • abs(mean_diff) / pooled_std < 0.1(標準化平均差)。


5. 反パターンと注意点

❌ アンチパターン 1:データリーク

どのようなものか:

  • 訓練/テスト分割の前に、データセット全体をスケーリング/標準化する。
  • 将来の情報(例:「next_month_churn」)を特徴量として使用する。
  • 全データセットを使って算出した、ターゲットに由来する特徴量(例:ターゲット平均エンコーディング)を含める。

なぜ失敗するのか:

  • 訓練/検証時のモデル性能が人為的に高くなります。
  • 本番環境では、新しい未知のデータに対してまったく機能しません。

正しいアプローチ:

  • まず分割し、その後に変換します。
  • スケーラー/エンコーダーの学習にはX_trainのみを使用し、その後X_testを変換します。
  • 安全性を確保するためにPipelineオブジェクトを使用します。
❌ アンチパターン 2:Pハッキング(データの掘り起こし)

どのようなものか:

  • 50種類の異なる仮説やサブグループを検定する。
  • p < 0.05となった結果だけを報告する。
  • 有意差が得られた時点でA/Bテストをちょうど終了する(途中経過をのぞき見る)。

なぜ失敗するのか:

  • 偽陽性(第I種の誤り)が発生する確率が高くなります。
  • 発見した結果は再現性のある効果ではなく、ランダムなノイズです。

正しいアプローチ:

  • 仮説を事前登録します。
  • 多重比較にはボンフェローニ補正または偽発見率(FDR)制御を適用します。
  • 実験前にサンプルサイズを決定し、それを守ります。
❌ アンチパターン 3:クラス不均衡の無視

どのようなものか:

  • 不正の割合が0.1%のデータで不正検出モデルを学習する。
  • 正解率99.9%を「成功」として報告する。

なぜ失敗するのか:

  • モデルは全員に対して「不正なし」と予測するだけです。
  • 実際に注目するクラスを検出できません。

正しいアプローチ:

  • 適切な指標を使用します:Precision-Recall AUC、F1-Score。
  • リサンプリング手法:SMOTE(Synthetic Minority Over-sampling Technique)、ランダムアンダーサンプリング。
  • クラス重み:XGBoostのscale_pos_weight、Sklearnのclass_weight='balanced'。


7. 品質チェックリスト

方法論と厳密性:

  • 分析の前に仮説を明確に定義している。
  • 統計検定の前提条件(正規性、独立性、等分散性)を確認している。
  • 訓練/テスト/検証データを正しく分割している(リークなし)。
  • クラス不均衡に適切に対処している(指標、リサンプリング)。
  • モデル評価に交差検証を使用している。

コードと再現性:

  • コードをrequirements.txtまたはenvironment.ymlとともにgitに保存している。
  • 再現性を確保するために乱数シードを設定している(random_state=42)。
  • ハードコードされたパスを相対パスまたは設定変数に置き換えている。
  • 複雑なロジックを、ドキュメント文字列付きの関数/クラスにまとめている。

解釈とコミュニケーション:

  • 結果をビジネス上の表現で解釈している(例:「売上の増加」対「対数損失の減少」)。
  • 推定値の信頼区間を提示している。
  • 必要に応じてSHAPまたはLIMEを使い、「ブラックボックス」モデルを説明している。
  • 注意事項と限界を明示している。

パフォーマンス:

  • データセットが10GBを超える場合、サンプリングしたデータで探索的データ分析(EDA)を実施している。
  • ループではなく、ベクトル化演算(pandas/numpy)を使用している。
  • クエリを最適化している(早い段階でのフィルタリング、必要な列のみの選択)。

例

例 1:機能リリースに向けたA/Bテスト分析

シナリオ: プロダクトチームは、新しいレコメンデーションアルゴリズムによってユーザーエンゲージメントが向上するかを知りたいと考えています。

分析アプローチ:

  1. 実験計画:ランダム割り当て(50/50)、最小サンプルサイズの算出
  2. データ収集:クリック率、ページ滞在時間、コンバージョンを追跡
  3. 統計検定:ブートストラップ信頼区間を用いた2標本t検定
  4. 結果:CTRが有意に改善(p < 0.01)、12%向上

主な分析:

# Bootstrap confidence interval for difference in means
from scipy import stats
diff = treatment_means - control_means
ci = np.percentile(bootstrap_diffs, [2.5, 97.5])

結果: プラスの影響がある確率95%で機能をリリース

例 2:需要計画のための時系列予測

シナリオ: 小売チェーンが在庫計画のために、次の四半期の売上を予測する必要があります。

モデリングアプローチ:

  1. 探索的分析:トレンド、季節性(週次、祝日)を特定
  2. 特徴量エンジニアリング:プロモーション、天候、経済指標を活用
  3. モデル選択:ARIMA、Prophet、勾配ブースティングを比較
  4. 検証:過去 12 か月のデータを用いたウォークフォワード検証

結果:

モデルMAPE90% CI の幅
ARIMA12.3%±15%
Prophet9.8%±12%
XGBoost7.2%±9%

成果物: 自動再学習パイプラインを備えた本番環境用モデル

例 3:因果帰属分析

シナリオ: マーケティング部門は、実際のコンバージョンを促進しているチャネルと、相関があるように見えるだけのチャネルを把握したいと考えています。

因果推論手法:

  1. 傾向スコアマッチング:特性が似ているユーザーをマッチング
  2. 差分の差分法:キャンペーン前後の変化を比較
  3. 操作変数法:観察データにおける選択バイアスに対処

主な調査結果:

  • テレビ広告:ROAS 3.2 倍(帰属が最も明確)
  • ソーシャルメディア:ROAS 1.1 倍(帰属が不明確)
  • メール:ROAS 5.8 倍(最も効率的)

ベストプラクティス

実験計画
  • ランダム化:処置群/対照群への割り当てが真にランダムであることを確保
  • サンプルサイズの計算:実験開始前に検出力分析を実施
  • 多重検定:複数の仮説を検定する場合は有意水準を調整
  • 制御変数:分散を減らすために関連する共変量を含める
  • 期間の計画:安定した結果が得られるまで実験を実施
モデル開発
  • 特徴量エンジニアリング:解釈可能で予測力のある特徴量を作成
  • 交差検証:時系列データには時間を考慮した分割を使用
  • モデルの解釈可能性:SHAP/LIME を使用して予測を説明
  • 検証指標:ビジネス目標に沿った指標を選択
  • 過学習の防止:正則化、早期停止、ホールドアウトデータを使用
統計的厳密性
  • 不確実性の定量化:常に信頼区間を報告
  • 有意性の解釈:P 値は効果量ではありません
  • 仮定の確認:統計的検定の仮定を検証
  • 感度分析:モデリング上の選択に対する頑健性を検証
  • 事前登録:結果を見る前に分析計画を文書化
コミュニケーションとインパクト
  • ビジネス向けの説明:統計用語をビジネスへの影響に置き換える
  • 実行可能な提言:調査結果を具体的な意思決定につなげる
  • ビジュアルストーリーテリング:データから説得力のあるストーリーを作成
  • ステークホルダーとのコミュニケーション:技術的な詳細のレベルを相手に合わせる
  • 文書化:再現可能な分析記録を維持
倫理的なデータサイエンス
  • 公平性への配慮:保護対象グループ間のバイアスを確認
  • プライバシー保護:機密データを適切に匿名化
  • 透明性:データソースと手法を文書化
  • 責任ある AI:モデルが社会に与える影響を考慮
  • データ品質:制約や潜在的なバイアスを明示

コメント