活用テクニック2026年4月10日

プロファイリングレポートの完全ガイド — EDA結果をHTMLレポートで共有・活用する

ydata-profiling(旧 pandas-profiling)を使えば、データセットの包括的な分析レポートをワンコマンドで生成できます。レポートの読み方、各セクションの活用法、チームとの共有方法、そして Qast との連携を解説します。

Qast のプロファイリングレポート画面。インタラクティブな HTML レポートが表示されている。

データ分析プロジェクトにおいて、EDA(探索的データ分析)の結果をチームに共有し、意思決定に活用することは極めて重要です。しかし、EDA を毎回手作業で行い、結果をスプレッドシートやスライドにまとめるのは非効率です。プロファイリングレポートは、データセットの統計的特性を網羅的に分析し、インタラクティブな HTML レポートとして自動生成するツールです。この記事では、代表的なライブラリ ydata-profiling の使い方と、Qast の統合プロファイリング機能を詳しく解説します。

データプロファイリングとは何か

データプロファイリングとは、データセットの構造、内容、品質を体系的に調査するプロセスです。各カラムのデータ型、欠損値の割合、基本統計量(平均、中央値、標準偏差)、値の分布、ユニーク値の数、カラム間の相関などを網羅的に計算し、レポートとして提示します。目的は、データを理解し、品質問題を早期に発見し、モデル学習の準備として何が必要かを判断するための情報を提供することです。

プロファイリングレポートは EDA の「第一歩」として使うのが効果的です。レポートで全体像を把握し、気になるポイントを見つけたら、個別の分析(外れ値検出、相関分析など)で深掘りしましょう。

ydata-profiling の概要 — pandas-profiling の後継

ydata-profiling(旧 pandas-profiling)は、pandas の DataFrame からワンコマンドで包括的な HTML レポートを生成する Python ライブラリです。2023 年にプロジェクト名が pandas-profiling から ydata-profiling に変更されましたが、機能と使い方はほぼ同じです。pip install ydata-profiling でインストールし、DataFrame を渡すだけで、数十項目にわたる分析が自動実行されます。

python
from ydata_profiling import ProfileReport
import pandas as pd

# データの読み込み
df = pd.read_csv("dataset.csv")

# プロファイリングレポートの生成
profile = ProfileReport(
    df,
    title="売上データ プロファイリングレポート",
    explorative=True,
    correlations={
        "pearson": {"calculate": True},
        "spearman": {"calculate": True},
        "kendall": {"calculate": False},
        "phi_k": {"calculate": True},
    },
)

# HTML ファイルとして保存
profile.to_file("profiling_report.html")

# Jupyter Notebook 上でインライン表示
profile.to_notebook_iframe()

レポートの構成 — 各セクションの概要

ydata-profiling が生成するレポートは、大きく分けて 6 つのセクションで構成されています。各セクションはインタラクティブに折りたたみ・展開ができ、必要な情報にすぐにアクセスできるように設計されています。セクションごとにデータの異なる側面を分析するため、レポートを上から順に読むだけで、データの全体像から詳細まで段階的に理解できます。

  1. 1

    Overview(概要)

    データセットの行数・カラム数・セル数・欠損セル数・重複行数・メモリ使用量の一覧です。また、各カラムのデータ型(数値・カテゴリ・日時・テキスト・ブール値)の内訳も表示されます。データの規模と構成をひと目で把握できるセクションです。

  2. 2

    Variables(変数)

    各カラムの詳細な統計情報を個別に表示するセクションです。数値カラムには平均・中央値・標準偏差・分位数・歪度・尖度・ヒストグラムが、カテゴリカラムにはユニーク値の数・最頻値・出現頻度のバーチャートが表示されます。欠損値の数と割合も確認できます。

  3. 3

    Interactions(インタラクション)

    2 つの数値変数の組み合わせの散布図を対話的に表示するセクションです。ドロップダウンで変数を選択すると、散布図がリアルタイムで描画されます。変数間の関係を視覚的に探索するのに適しています。

  4. 4

    Correlations(相関)

    Pearson 相関、Spearman 相関、Kendall 相関、Phi-K 相関のマトリクスをヒートマップで表示するセクションです。タブ切り替えで異なる相関手法の結果を比較できます。多重共線性の発見に特に有用です。

Overview セクションの読み方

Overview セクションは最初にチェックすべきセクションです。ここでの主な確認ポイントは 3 つあります。まず、欠損セルの割合です。全体の 5% を超えていれば、欠損値処理の戦略を検討する必要があります。次に、重複行の数です。重複が存在する場合、データ収集プロセスの問題や、意図しないデータの重複が疑われます。最後に、変数の型推論が正しいかどうかです。郵便番号が「数値型」と推論されていたり、ID 列が「カテゴリ型」になっていたりする場合は、型の修正が必要です。

Variables セクションの読み方

Variables セクションは最も情報量が多く、重要なセクションです。各変数のカードには「WARNINGS」としてアラートが表示されます。「HIGH CORRELATION」は他の変数と強い相関があること、「HIGH CARDINALITY」はユニーク値が非常に多いこと、「ZEROS」はゼロ値の割合が高いこと、「MISSING」は欠損率が高いことを示します。これらのアラートを手がかりに、詳細な分析が必要なカラムを特定します。ヒストグラムの形状からは、分布の歪み、外れ値の存在、多峰性(ピークが複数ある)などを視覚的に読み取れます。「Toggle details」ボタンをクリックすると、パーセンタイル、IQR、歪度・尖度、極端な値(extreme values)のリストなど、さらに詳細な統計情報が展開されます。

Correlations セクションの読み方

Correlations セクションでは、変数間の相関マトリクスが複数の手法で表示されます。Pearson は線形関係、Spearman は単調関係、Phi-K は数値変数とカテゴリ変数の間の関係も含めた汎用的な相関指標です。ヒートマップ上で相関が 0.8 以上(または -0.8 以下)の変数ペアを探し、多重共線性(特徴量同士が強く相関し、モデルが不安定になる問題)の有無を確認します。相関の高いペアが見つかったら、片方を除外するか、PCA で次元削減することを検討します。

レポートのカスタマイズ — 目的に応じた設定

  1. 1

    Minimal モード

    大規模データセットでは、Full レポートの生成に数十分かかることがあります。ProfileReport(df, minimal=True) を指定すると、計算コストの高い分析(相関マトリクスの全ペア計算など)がスキップされ、高速にレポートが生成されます。まず Minimal で全体像を把握し、必要に応じて Full で詳細を確認する二段階アプローチが効率的です。

  2. 2

    Explorative モード

    ProfileReport(df, explorative=True) を指定すると、追加の分析(テキスト変数の文字数分布、URL やファイルパスの検出、画像メタデータの抽出など)が有効になります。未知のデータセットを初めて分析する場合に有用です。

  3. 3

    相関手法のカスタマイズ

    デフォルトでは 4 種類の相関が計算されますが、correlations パラメーターで計算する手法を選択できます。Kendall 相関は計算コストが高いため、大規模データでは無効化することで高速化できます。

python
# Minimal モード(高速生成)
profile_minimal = ProfileReport(df, minimal=True, title="Minimal レポート")
profile_minimal.to_file("minimal_report.html")

# データセット間の比較レポート
df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")

profile_train = ProfileReport(df_train, title="学習データ")
profile_test = ProfileReport(df_test, title="テストデータ")

# 2つのデータセットの比較レポートを生成
comparison = profile_train.compare(profile_test)
comparison.to_file("comparison_report.html")
print("比較レポートを生成しました。")

データセットの比較 — 学習データ vs テストデータ

プロファイリングレポートの強力な活用法の一つが、2 つのデータセットの比較です。ydata-profiling の compare() メソッドを使えば、学習データとテストデータ、あるいは過去のデータと最新のデータの統計的な違いを一つのレポートで並べて確認できます。学習データとテストデータの分布が大きく異なっている場合(データドリフト)、モデルの本番精度が低下するリスクがあります。比較レポートでは、各カラムの統計量が並列表示され、差異が大きい箇所がハイライトされます。

データセットの比較レポートは、モデルの監視(モニタリング)にも活用できます。定期的にプロファイリングを実行し、学習時のデータと現在の入力データを比較することで、データドリフトの兆候を早期に検出できます。

チームとの共有方法

  1. 1

    HTML ファイルの共有

    生成された HTML ファイルは自己完結型(CSS・JavaScript が埋め込み済み)のため、メール添付や社内ファイルサーバーでそのまま共有できます。ブラウザで開くだけでインタラクティブに操作でき、特別なソフトウェアは不要です。

  2. 2

    JSON 形式でのエクスポート

    profile.to_json() でレポートの内容を JSON 形式で出力できます。BI ツールやカスタムダッシュボードに統合する場合や、プログラムからレポートの内容を参照する場合に有用です。

  3. 3

    Jupyter Notebook との統合

    profile.to_notebook_iframe() を使えば、Jupyter Notebook 上でレポートをインラインで表示できます。分析コードとレポートを同じノートブックに含められるため、再現性の高い分析ワークフローを構築できます。

  4. 4

    CI/CD パイプラインへの組み込み

    データパイプラインの一部としてプロファイリングを自動実行し、レポートをアーティファクトとして保存する運用が可能です。データの更新のたびにレポートが生成されるため、データ品質の変化を継続的に監視できます。

パフォーマンスの最適化 — 大規模データへの対応

100 万行を超える大規模データセットでは、Full モードのレポート生成に長時間かかることがあります。パフォーマンスを最適化するためのテクニックがいくつかあります。まず、前述の Minimal モードの使用です。次に、サンプリングです。df.sample(n=10000) でランダムに 1 万件を抽出してからプロファイリングを実行すれば、全体の傾向を高速に把握できます。さらに、不要な分析の無効化も有効です。相互作用プロットや特定の相関手法を無効にすることで、計算コストを大幅に削減できます。

python
# 大規模データ向けの最適化設定
profile_optimized = ProfileReport(
    df.sample(n=50000, random_state=42),  # サンプリング
    title="最適化レポート",
    minimal=True,
    correlations={
        "pearson": {"calculate": True},
        "spearman": {"calculate": True},
        "kendall": {"calculate": False},  # 計算コスト高を無効化
        "phi_k": {"calculate": False},    # 計算コスト高を無効化
    },
    interactions={"continuous": False},     # インタラクションプロットを無効化
    missing_diagrams={"heatmap": False},    # 欠損値ヒートマップを無効化
    samples={"head": 10, "tail": 10},
)
profile_optimized.to_file("optimized_report.html")

# レポートの統計情報を辞書として取得
stats = profile_optimized.get_description()
print(f"変数数: {stats.table['n_var']}")
print(f"行数:   {stats.table['n']}")
print(f"欠損セル割合: {stats.table['p_cells_missing']:.2%}")

Qast の統合プロファイリング機能

Qast では、CSV をアップロードするだけで、プロファイリングレポートが自動的に生成されます。ydata-profiling と同等の分析に加え、Qast 独自の分析(ターゲットリーケージ検出、クラスタリング、外れ値のアンサンブル検出など)が統合された包括的なレポートが提供されます。レポートは Qast のダッシュボード上でインタラクティブに操作でき、各セクションの結果から直接「この特徴量を除外する」「対数変換を適用する」といったアクションを学習ジョブの設定に反映できます。また、レポートの PDF エクスポート機能を使えば、非技術者のステークホルダーとの共有も容易です。

Qast のプロファイリングレポートは、学習ジョブの作成時に自動実行されるため、ユーザーが明示的にレポートの生成を指示する必要はありません。データセットをアップロードした時点で EDA が開始され、学習が完了する前にレポートを確認してデータの品質問題に対処できます。

Qast を導入してみませんか?

導入のご相談やデモのご依頼は、お気軽にお問い合わせください。