データサイエンスのワークフローは「課題定義→データ探索→仮説構築→モデリング→評価→デプロイ」の6フェーズで標準化できる。CRISP-DMをベースに自社の開発サイクルに合わせてカスタマイズすることで、プロジェクトの品質と再現性が大幅に向上する。

データサイエンスワークフローとは

データサイエンスプロジェクトは「やってみた結果」で進むと、後で振り返った時に何をどう決定したのかが分からなくなる。標準化されたワークフローは、チーム内の共通言語を作り、過去のプロジェクトから学び、品質を一定に保つための基盤だ。

【データサイエンスワークフローの全体図】

  [フェーズ1: ビジネス理解]
  解決する課題の定義・成功指標の設定・制約条件の把握
         |
  [フェーズ2: データ理解・EDA]
  データ収集・品質確認・分布確認・外れ値・欠損値の把握
         |
  [フェーズ3: データ準備・特徴量エンジニアリング]
  クリーニング・変換・特徴量生成・学習/検証/テスト分割
         |
  [フェーズ4: モデリング]
  アルゴリズム選定・学習・ハイパーパラメータ調整
         |
  [フェーズ5: 評価]
  オフライン評価→ビジネス指標での評価→ステークホルダーレビュー
         |
  [フェーズ6: デプロイ・運用]
  本番デプロイ・モニタリング・再学習サイクルの確立
         ↑___________________________|
                (継続的な改善ループ)

  ※ CRISP-DM (CRoss-Industry Standard Process for Data Mining) をベースに設計

主要なフレームワークとして CRISP-DM (業界標準)、TDSP (Microsoft Team Data Science Process)、Kaggleコミュニティベースの実験フレームワークがあるが、実際の運用ではCRISP-DMをベースに自社の開発プロセスに合わせてカスタマイズするアプローチが最も実践的だ。

フェーズ1-2: 課題定義とデータ探索

フェーズ1の「ビジネス理解」が最も重要であり、最も軽視されがちなフェーズだ。「何を予測したいのか」ではなく「何のビジネス課題を解決するのか」から出発する必要がある。解くべき課題が曖昧なまま進んだプロジェクトは、精度の高いモデルが完成しても使われないまま終わることが多い。

フェーズ2のEDA (Exploratory Data Analysis: 探索的データ分析) は、データへの深い理解を得る重要なフェーズだ。分布・欠損・外れ値・相関を可視化することで、モデリングフェーズでの判断の根拠が生まれる。

import pandas as pd
import numpy as np

def run_eda_template(df: pd.DataFrame, target_col: str) -> dict:
    """EDAの標準テンプレート関数"""
    
    report = {}
    
    # 基本統計
    report["shape"] = df.shape
    report["dtypes"] = df.dtypes.to_dict()
    report["missing"] = df.isnull().sum().to_dict()
    report["missing_pct"] = (df.isnull().sum() / len(df) * 100).round(2).to_dict()
    
    # 数値変数の統計量
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    report["numeric_stats"] = df[numeric_cols].describe().to_dict()
    
    # 外れ値検出 (IQR法)
    outliers = {}
    for col in numeric_cols:
        Q1, Q3 = df[col].quantile(0.25), df[col].quantile(0.75)
        IQR = Q3 - Q1
        count = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
        if count > 0:
            outliers[col] = int(count)
    report["outliers"] = outliers
    
    # ターゲット変数の分布
    if target_col in df.columns:
        report["target_distribution"] = df[target_col].value_counts().to_dict()
    
    # 相関係数 (数値変数間)
    if len(numeric_cols) > 1:
        corr = df[numeric_cols].corr()
        high_corr = {f"{c1}-{c2}": round(corr.loc[c1, c2], 3)
                     for c1 in numeric_cols for c2 in numeric_cols
                     if c1 < c2 and abs(corr.loc[c1, c2]) > 0.7}
        report["high_correlations"] = high_corr
    
    return report

df = pd.read_csv("sample_data.csv")
eda_report = run_eda_template(df, target_col="churn")
print(f"データ形状: {eda_report['shape']}")
print(f"欠損値の多い列: {sorted(eda_report['missing_pct'].items(), key=lambda x: -x[1])[:5]}")

フェーズ3-4: 仮説構築とモデリング

特徴量エンジニアリングはモデルの精度を最も左右するフェーズだ。「良い特徴量は悪いモデルを良くするが、悪い特徴量は良いモデルを悪くする」という経験則がある。

ステップ 内容 成果物 よくある失敗
特徴量設計 ドメイン知識に基づく特徴量の仮説立案 特徴量候補リスト ドメイン知識なしに機械的に特徴量を増やす
特徴量選択 重要度・相関に基づく不要特徴量の除去 最終特徴量セット 過剰な特徴量でモデルが過学習する
ベースラインモデル シンプルなモデルで精度の下限を確認 ベースラインスコア いきなり複雑なモデルから始める
モデル比較 複数アルゴリズムをクロスバリデーションで比較 モデル比較表 1つのモデルしか試さない
ハイパーパラメータ調整 Optuna等で自動最適化 最適パラメータ 手動チューニングに時間をかけすぎる
エラー分析 誤予測サンプルのパターン分析 改善ポイントの特定 メトリクスの数字だけ見て中身を見ない

フェーズ5-6: 評価とデプロイ

フェーズ 主な活動 ツール例 所要期間目安
ビジネス理解 課題定義・KPI設定・データ調査 Confluence、JIRA 1〜2週間
EDA・データ準備 データ探索・クリーニング・特徴量設計 pandas、Jupyter、Great Expectations 2〜4週間
モデリング 実験・モデル比較・ハイパーパラメータ調整 scikit-learn、XGBoost、Optuna、MLflow 2〜4週間
オフライン評価 テストセット評価・ビジネス指標換算 SHAP、Evidently 1週間
本番デプロイ API化・A/Bテスト・モニタリング設定 FastAPI、Docker、MLflow、Grafana 2〜4週間
運用・改善 ドリフト検知・再学習・性能監視 Evidently、Prometheus 継続的

オフライン評価 (テストセットでの精度評価) だけで判断するのは危険だ。必ずビジネス指標 (コスト削減額・CVR改善率等) に変換してステークホルダーへ報告し、最終的にオンライン評価 (A/Bテスト) で本番での効果を確認することがMLOpsの基本サイクルだ。

LLM時代のワークフロー変化

LLMの登場でデータサイエンスの作業効率は大きく変わった。特にEDA・特徴量設計のアイデア出し・コード生成の3点でLLMが強力な支援ツールとなっている。

import anthropic
import pandas as pd
import io

client = anthropic.Anthropic()

def generate_eda_insights(df: pd.DataFrame, business_context: str) -> str:
    """LLMでEDAの自動インサイト生成"""
    
    # データの基本情報をテキストで整形
    buf = io.StringIO()
    df.describe(include="all").to_csv(buf)
    stats_text = buf.getvalue()
    
    missing_info = df.isnull().sum()[df.isnull().sum() > 0].to_string()
    
    response = client.messages.create(
        model="claude-3-5-haiku-20241022",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": f"""ビジネスコンテキスト: {business_context}

データの統計情報:
{stats_text}

欠損値情報:
{missing_info}

このデータの分析から、以下を日本語で回答してください:
1. 重要な傾向や特徴 (3点)
2. データ品質の懸念事項 (2点)
3. 推奨する次のアクション (3点)"""
        }]
    )
    
    return response.content[0].text

df = pd.read_csv("customer_data.csv")
insights = generate_eda_insights(df, "顧客チャーン予測モデルの構築")
print(insights)

ただし、LLMが得意なのは「コードを書く」「パターンを提案する」部分であり、「このビジネス課題に対して何を予測すべきか」「モデルの予測結果が本当にビジネスに役立つか」という判断は依然として人間の仕事だ。LLMはデータサイエンティストを代替するのではなく、定型的な作業から解放して本質的な判断に集中できるようにする道具だ。

まとめ

  • CRISP-DMをベースとした6フェーズのワークフローで標準化することで品質と再現性が向上する
  • 最も重要なフェーズはビジネス理解。課題定義が曖昧なプロジェクトは高精度モデルが完成しても使われない
  • ベースラインモデルを最初に作り、複雑さを段階的に増やすアプローチが失敗を防ぐ
  • LLMはEDA・コード生成を効率化するが、ビジネス課題の判断は人間の仕事

よくある質問

Q. データサイエンスの標準的なワークフローは?

CRISP-DM (ビジネス理解→データ理解→データ準備→モデリング→評価→デプロイ) が最も広く使われているフレームワークです。

Q. データサイエンスプロジェクトの期間はどのくらいですか?

探索的分析なら2〜4週間、予測モデル構築なら2〜3ヶ月、本番デプロイまで含めると3〜6ヶ月が一般的です。

Q. LLMでデータサイエンスの作業は自動化できますか?

EDA (探索的データ分析) やコード生成はLLMで大幅に効率化できます。ただしビジネス課題の定義やモデルの解釈は人間の判断が不可欠です。