シニアデータサイエンティスト
概要
データの探索からモデルのデプロイまで、エンドツーエンドのデータサイエンスワークフローを構築します。このスキルでは、データの前処理、特徴量エンジニアリング、モデル選択、ハイパーパラメーター調整、交差検証、MLflow/W&B による実験追跡、統計的検定、matplotlib/seaborn/plotly による可視化、Jupyter ノートブックのベストプラクティスを扱います。
開始時に次のように伝えてください:「データサイエンスワークフローのため、シニアデータサイエンティストのスキルを使用します。」
フェーズ 1:データの理解
目標: モデリングを始める前に、データセットのプロファイルを作成し、ベースラインを確立します。
実行項目
- データセットを読み込み、プロファイルを作成します(形状、型、分布)
- 欠損値、外れ値、データ品質の問題を特定します
- 探索的データ分析(EDA)を実施します
- 目的変数と成功指標を定義します
- ベースライン性能を確立します
ベースラインモデル(必ずここから開始)
| タスク | ベースラインモデル | 理由 |
|---|
| 分類 | 多数派クラス分類器 | 正解率の下限 |
| 分類 | ロジスティック回帰 | シンプルで解釈しやすい |
| 回帰 | 平均値予測器 | RMSE の下限 |
| 回帰 | 線形回帰 | シンプルで解釈しやすい |
| 時系列 | ナイーブ予測(前の値) | MAE の下限 |
| 時系列 | 季節ナイーブ予測 | 基本的な季節性を捉える |
停止 — 次の条件を満たすまでフェーズ 2 に進まないでください:
フェーズ 2:特徴量エンジニアリング
目標: 生データを、モデル性能を向上させる特徴量に変換します。
実行項目
- 欠損値を処理します(補完方法)
- カテゴリ変数をエンコードします
- 数値特徴量をスケーリング/正規化します
- 派生特徴量を作成します
- 特徴量選択を行います(冗長または無関係な特徴量を削除)
欠損値処理方法の判断表
| 方法 | 使用する状況 | 実装 |
|---|
| 行を削除 | 欠損率が 5% 未満、MCAR | df.dropna() |
| 平均値/中央値 | 数値データで外れ値がない | SimpleImputer(strategy='median') |
| 最頻値 | カテゴリデータ | SimpleImputer(strategy='most_frequent') |
| KNN 補完 | 構造的な欠損パターン | KNNImputer(n_neighbors=5) |
| 反復補完 | 複雑な関係性 | IterativeImputer() |
| フラグ付け+補完 | 欠損自体に情報がある | is_missing 列を追加して補完 |
カテゴリ変数のエンコード方法の判断表
| 方法 | 使用する場面 | カーディナリティ |
|---|
| ワンホット | 名義尺度、カーディナリティが低い | 10 カテゴリ未満 |
| ラベル/順序 | 順序特徴量 | 任意 |
| ターゲットエンコーディング | カーディナリティの高い名義尺度 | 10 カテゴリ超 |
| 頻度エンコーディング | 頻度が重要な場合 | 任意 |
| バイナリエンコーディング | カーディナリティが非常に高い | 50 カテゴリ超 |
スケーリング方法の判断表
| スケーラー | 使用する場面 | 外れ値への頑健性 |
|---|
| StandardScaler | デフォルトの選択肢(平均=0、標準偏差=1) | いいえ |
| RobustScaler | 外れ値がある(中央値/IQR) | はい |
| MinMaxScaler | ニューラルネットワーク、距離ベースの手法 [0,1] | いいえ |
特徴量の種類とエンジニアリング
| 特徴量の種類 | 手法 |
|---|
| 数値 | 対数変換、多項式変換、ビニング、交互作用(A*B、A/B) |
| 時間 | 時、曜日、週末フラグ、イベントからの経過時間、周期特徴量(sin/cos)、ラグ |
| テキスト | TF-IDF、単語数、感情スコア、固有表現、埋め込み |
| カテゴリ | エンコーディング(上記)、数値特徴量との交互作用 |
特徴量選択の判断表
| 方法 | 種類 | 使用する状況 |
|---|
| 相関行列 | フィルター | 初期探索 |
| 相互情報量 | フィルター | 非線形の関係 |
| 再帰的特徴量削減 | ラッパー | モデル固有の選択 |
| L1 正則化 | 埋め込み | 線形モデル |
| 特徴量重要度 | 埋め込み | 木ベースのモデル |
| 置換重要度 | モデル非依存 | 最終検証 |
停止 — 次の条件を満たすまでフェーズ 3 に進まないでください:
フェーズ 3:モデリング
目標: 候補モデルを選択、学習、評価します。
アクション
- 候補アルゴリズムを選択する
- 交差検証の戦略を設定する
- 候補モデルを学習し、評価する
- ハイパーパラメーターを調整する
- 最終モデルを選択し、評価する
アルゴリズム選択の判断表
| データの特性 | 最初に試すもの | ほかに検討するもの |
|---|
| 表形式、10K 行未満 | Random Forest、XGBoost | Logistic/Linear Regression |
| 表形式、10K 行超 | XGBoost、LightGBM | CatBoost、Neural Network |
| 高次元 | Lasso/Ridge、SVM | 特徴量選択を用いた Random Forest |
| 時系列 | Prophet、ARIMA | LSTM、ラグ特徴量を用いた XGBoost |
| テキスト分類 | ファインチューニング済み Transformer | TF-IDF + Logistic Regression |
| 画像分類 | 事前学習済み CNN(ResNet、EfficientNet) | Vision Transformer |
| 回帰 | XGBoost、Random Forest | Linear Regression、Neural Network |
| 異常検知 | Isolation Forest | LOF、Autoencoder |
交差検証戦略の判断表
| 戦略 | 使用する場面 | コード |
|---|
| K-Fold(k=5) | デフォルト、バランスの取れたデータ | KFold(n_splits=5) |
| Stratified K-Fold | 分類、不均衡データ | StratifiedKFold(n_splits=5) |
| Time Series Split | 時系列データ | TimeSeriesSplit(n_splits=5) |
| Group K-Fold | グループ化された観測値 | GroupKFold(n_splits=5) |
| Leave-One-Out | 非常に小さいデータセット | LeaveOneOut() |
評価指標の判断表
| タスク | 主な指標 | 副次的な指標 |
|---|
| 二値分類 | AUC-ROC | F1、Precision、Recall、AP |
| 多クラス分類 | Macro F1 | Accuracy、Confusion Matrix |
| 回帰 | RMSE | MAE、R-squared、MAPE |
| ランキング | NDCG | MAP、MRR |
| 異常検知 | F1、AP | Precision@K、Recall@K |
ハイパーパラメーター調整の判断表
| 手法 | 計算リソースの予算 | 探索空間 | 実装 |
|---|
| グリッドサーチ | 低(100 組未満) | 小規模で既知の範囲 | GridSearchCV |
| ランダムサーチ | 中程度 | 大規模で不確実 | RandomizedSearchCV |
| ベイズ最適化(Optuna) | 任意 | 大規模で計算コストが高い | optuna.create_study() |
| Successive Halving | 大規模 | 多数の候補 | HalvingRandomSearchCV |
一般的なハイパーパラメーター(XGBoost/LightGBM)
param_space = {
'n_estimators': [100, 300, 500, 1000],
'max_depth': [3, 5, 7, 9],
'learning_rate': [0.01, 0.05, 0.1],
'subsample': [0.7, 0.8, 0.9],
'colsample_bytree': [0.7, 0.8, 0.9],
'min_child_weight': [1, 3, 5],
}
停止 — 次の条件を満たすまでフェーズ 4 に進まないでください:
フェーズ 4:デプロイ
目標: モデルをシリアライズして本番環境で提供し、監視します。
アクション
- モデルと前処理パイプラインをシリアライズする
- 予測 API またはバッチパイプラインを作成する
- データドリフトとモデルの性能劣化を監視する仕組みを設定する
- モデルカード(入力、出力、制約、バイアス)を文書化する
停止 — 次の条件を満たしたらデプロイ完了です:
実験の追跡
MLflow のパターン
import mlflow
mlflow.set_experiment("customer-churn-prediction")
with mlflow.start_run(run_name="xgboost-v2"):
mlflow.log_params(params)
mlflow.log_metrics({"auc": auc_score, "f1": f1_score})
mlflow.log_artifact("confusion_matrix.png")
mlflow.sklearn.log_model(pipeline, "model")
mlflow.set_tag("version", "2.1")
追跡する項目
| カテゴリ | 項目 |
|---|
| パラメーター | すべてのハイパーパラメーター、乱数シード |
| 指標 | 学習時と検証時の指標 |
| データ | データのバージョン/ハッシュ、特徴量の一覧 |
| 成果物 | プロット、レポート、モデルファイル |
| メタデータ | 学習時間、モデルサイズ |
統計検定の選択表
| 質問 | 検定 | 前提条件 |
|---|
| 2つのグループの平均に差がありますか? | t検定(独立) | 正規分布 |
| 2つのグループ(非正規分布)ですか? | マン・ホイットニーのU検定 | なし |
| 対応のある測定値ですか? | 対応のあるt検定 | 差が正規分布 |
| 3つ以上のグループの平均ですか? | ANOVA | 正規分布、等分散 |
| カテゴリ間に関連がありますか? | カイ二乗検定 | 期待度数 > 5 |
| 分布は正規分布ですか? | シャピロ・ウィルク検定 | n < 5000 |
| 2つの分布に差がありますか? | コルモゴロフ・スミルノフ検定 | 連続データ |
p値のガイドライン
- p < 0.05:統計的に有意(慣例的な基準)
- p値と併せて、必ず効果量も報告します
- 多重比較を補正します(ボンフェローニ法、FDR)
- 統計的有意性は、実用上の有意性を意味するものではありません
可視化の選択表
| データの種類 | プロット | ライブラリ |
|---|
| 分布 | ヒストグラム、KDE、箱ひげ図 | seaborn |
| 比較 | 棒グラフ、グループ化棒グラフ | matplotlib |
| 相関 | 散布図、ヒートマップ | seaborn |
| 傾向 | 折れ線グラフ | matplotlib/plotly |
| 構成 | 積み上げ棒グラフ、円グラフ(最大5区分) | matplotlib |
| インタラクティブ | 散布図、折れ線グラフ、ダッシュボード | plotly |
可視化のルール
- すべてのプロットに内容がわかるタイトルを付けます
- 軸に単位を含むラベルを付けます
- 色覚多様性に配慮したパレットを使用します(
seaborn: colorblind)
- 棒グラフのy軸は0から始めます
- 重要な知見をプロット上に直接注釈します
Jupyter Notebookの構成
1. ## Setup (imports, configuration)
2. ## Data Loading
3. ## Exploratory Data Analysis
4. ## Data Preprocessing
5. ## Feature Engineering
6. ## Modeling
7. ## Evaluation
8. ## Conclusions
Notebookのベストプラクティス
- 共有する前に、カーネルを再起動してすべてのセルを実行します
- 各セルの内容を絞り、順序立てて構成します
- 説明にはMarkdownセルを使用します
- 再利用可能なコードは
.pyモジュールに切り出します
nbstripoutでバージョン管理します
- すべての依存関係のバージョンを固定します
アンチパターン/よくある間違い
| アンチパターン | 問題点 | 正しい方法 |
|---|
| テストデータで学習する | データリークが発生し、指標が過大になります | 学習データとテストデータを厳密に分離します |
| 分割前に特徴量エンジニアリングを行う | テストデータの情報が特徴量に漏れます | 学習データだけを使って特徴量を作成します |
| 学習時の指標を報告する | 汎化できません | 検証データ/テストデータの指標を報告します |
| 不均衡データで正解率を使う | 誤解を招きます(多数派クラスが優勢になります) | F1、AUC-ROC、またはAPを使用します |
| テストセットでチューニングする | テストデータに過剰適合します | チューニングには検証セットを使用します |
| ベースラインとの比較を行わない | 改善を測定できません | まず必ずベースラインを設定します |
| 評価例を都合よく選ぶ | 選択バイアスが生じます | 評価セット全体で結果を報告します |
| ドリフトを監視せずにデプロイする | 気付かないうちにモデルの性能が低下します | 入力分布を監視します |
統合ポイント
| スキル | 関係 |
|---|
senior-prompt-engineer | プロンプト評価では統計的検定手法を使用します |
testing-strategy | MLテストでは評価手法に従います |
performance-optimization | モデル推論の最適化では測定サイクルに従います |
acceptance-testing | モデル性能のしきい値を受け入れ基準にします |
llm-as-judge | 主観的な出力評価ではLLM-as-judgeを使用します |
code-review | Notebookとパイプラインのコードを品質面からレビューします |
スキルの種類
FLEXIBLE — 前処理、モデリング、評価の方法は、データの特性、ビジネス要件、計算リソースの制約に合わせて調整します。4段階のプロセスと実験の追跡を強く推奨します。モデリングの前に、必ずベースラインを設定してください。