[機械学習のはじめ方] Part11: EDA(探索的データ分析)の基本と手順

機械学習プロジェクトへようこそ!モデルを構築する前に、まず扱うデータそのものを深く理解することが非常に重要です。そのための強力な武器が「EDA(探索的データ分析)」です。

EDAは、データセットの概要を掴み、隠れたパターンや異常、変数間の関係性を発見するためのプロセスです。📊 これをしっかり行うことで、データの前処理やモデル選択の方針が立てやすくなり、結果的にモデルの精度向上に繋がります。

EDAは、データと「対話」するようなイメージです。データが何を語りかけてくるのか、じっくり耳を傾けてみましょう!

EDAの主な目的

EDAを行う主な目的は以下の通りです。

  • データの全体像把握: データの行数・列数、各列のデータ型などを確認します。
  • 要約統計量の確認: 平均値、中央値、最大値、最小値、標準偏差などを計算し、データの基本的な性質を理解します。
  • データの可視化: ヒストグラム、散布図、箱ひげ図などを用いて、データの分布や変数間の関係性を視覚的に捉えます。📈
  • 欠損値・異常値の特定: データに含まれる欠損値(NaNなど)や外れ値(他の値から大きく外れた値)を見つけます。
  • 変数間の関係性発見: どの変数が目的変数(予測したい値)と関連が強いか、変数同士に相関はあるかなどを探ります。
  • 仮説生成: データから得られた洞察をもとに、モデリングに役立つ仮説を立てます。

これらの目的を達成することで、データに対する理解が深まり、後続のデータ前処理やモデリングのステップを効率的かつ効果的に進めることができます。

EDAの基本的な手順とPythonコード例

EDAには決まった手順があるわけではありませんが、一般的には以下のような流れで進められます。ここでは、PythonのライブラリであるPandas、Matplotlib、Seabornを使った基本的なコード例も示します。

1. データの読み込みと概要確認

まずはデータをPandasのDataFrameに読み込み、最初の数行、データ型、行数・列数、要約統計量などを確認します。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# CSVファイルの読み込み (例: 'your_data.csv')
# df = pd.read_csv('your_data.csv')

# 仮のデータフレームを作成 (実際のデータで置き換えてください)
data = {'feature1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'feature2': [2, 4, 5, 4, 8, None, 9, 1, 2, 5],
        'category': ['A', 'B', 'A', 'B', 'A', 'A', 'B', 'A', 'B', 'B'],
        'target': [0, 1, 0, 1, 0, 0, 1, 0, 1, 1]}
df = pd.DataFrame(data)


# 最初の5行を表示
print("--- 先頭5行 ---")
print(df.head())

# データフレームの基本情報を表示(データ型、非Null数など)
print("\n--- 基本情報 ---")
df.info()

# データフレームの行数と列数を表示
print(f"\n--- データサイズ (行数, 列数) ---")
print(df.shape)

# 要約統計量を表示(数値データのみ)
print("\n--- 要約統計量 ---")
print(df.describe())

# カテゴリデータの要約統計量
print("\n--- カテゴリデータの要約統計量 ---")
print(df.describe(include='object'))

2. 欠損値の確認

各列にどれくらい欠損値が含まれているかを確認します。欠損値の扱いは後の前処理ステップで重要になります。

# 各列の欠損値の数を計算
print("\n--- 欠損値の数 ---")
print(df.isnull().sum())
💡 `isnull().sum()` の結果を見ることで、どの列に欠損値が多いか一目でわかります。

3. データの可視化(単変量分析)

個々の変数の分布を理解するために可視化を行います。

  • 数値データ: ヒストグラムや箱ひげ図で分布の形状、中心、ばらつき、外れ値を確認します。
  • カテゴリデータ: 棒グラフで各カテゴリの出現頻度を確認します。
# 数値データのヒストグラム (例: feature1)
plt.figure(figsize=(8, 4))
sns.histplot(df['feature1'], kde=True) # kde=Trueで密度曲線も表示
plt.title('Histogram of feature1')
plt.xlabel('feature1')
plt.ylabel('Frequency')
# plt.show() # Jupyter Notebookなどでは不要な場合あり

# 数値データの箱ひげ図 (例: feature2)
# 欠損値があるとエラーになるため、dropna()で欠損値を除外するか、欠損値処理後に実行
plt.figure(figsize=(8, 4))
sns.boxplot(x=df['feature2'].dropna())
plt.title('Boxplot of feature2')
plt.xlabel('feature2')
# plt.show()

# カテゴリデータの棒グラフ (例: category)
plt.figure(figsize=(8, 4))
sns.countplot(x='category', data=df)
plt.title('Countplot of category')
plt.xlabel('category')
plt.ylabel('Count')
# plt.show()

※ 上記コードでは表示を省略するため `plt.show()` をコメントアウトしていますが、実際の環境では実行してグラフを確認してください。

4. 変数間の関係性の可視化(多変量分析)

変数同士の関係性を探るために可視化を行います。

  • 数値変数同士: 散布図で相関関係の有無やパターンを確認します。
  • 数値変数とカテゴリ変数: カテゴリごとに数値変数の分布を比較します(例: 箱ひげ図、バイオリンプロット)。
  • 相関行列: 全ての数値変数間の相関係数を計算し、ヒートマップで可視化します。
# 散布図 (例: feature1 と feature2)
# 欠損値があるとプロットされない場合があるので注意
plt.figure(figsize=(8, 6))
sns.scatterplot(x='feature1', y='feature2', data=df, hue='target') # targetで色分け
plt.title('Scatter plot of feature1 vs feature2')
# plt.show()

# カテゴリ変数と数値変数の関係 (例: category と feature1)
plt.figure(figsize=(8, 6))
sns.boxplot(x='category', y='feature1', data=df)
plt.title('Boxplot of feature1 by category')
# plt.show()

# 相関行列の計算 (数値データのみ)
# Pandas 2.0以降では numeric_only=True がデフォルトで推奨されます
numeric_df = df.select_dtypes(include=['number']) # 数値列のみを選択
correlation_matrix = numeric_df.corr()
print("\n--- 相関行列 ---")
print(correlation_matrix)

# 相関行列のヒートマップ
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f") # annot=Trueで数値を表示
plt.title('Correlation Matrix')
# plt.show()
注意: 可視化はEDAの非常に強力なツールですが、たくさんのグラフを一度に作ることが目的ではありません。データについて問いを立て、その答えを探すために適切なグラフを選択することが重要です。

EDAを支えるPythonライブラリ

EDAでよく使われる主要なPythonライブラリは以下の通りです。

ライブラリ名 主な役割
Pandas データの読み込み、操作、要約統計量の計算、欠損値処理など、データハンドリング全般を担当します。DataFrameという強力なデータ構造を提供します。
Matplotlib Pythonで最も基本的なグラフ描画ライブラリです。様々な種類の静的なグラフを作成できます。カスタマイズ性が高いのが特徴です。
Seaborn Matplotlibをベースにした、より統計的なグラフを簡単に美しく描画できるライブラリです。少ないコードで見栄えの良いグラフが作成できます。

これらのライブラリを組み合わせることで、効率的にEDAを進めることができます。

最近では、`ydata-profiling` (旧 `pandas-profiling`) や `Sweetviz` のような、数行のコードで自動的に詳細なEDAレポートを生成してくれるライブラリも人気があります。これらは最初のデータ概観を素早く得るのに役立ちます。

まとめ

EDA(探索的データ分析)は、データサイエンスプロジェクトの初期段階において、データの本質を理解するために不可欠なプロセスです。時間はかかるかもしれませんが、ここでの発見が後のステップでの成功の鍵を握ります🔑。

今回学んだ基本的な手順とPythonのツールを使って、ぜひお手元のデータでEDAを実践してみてください。データを深く知ることで、より良い機械学習モデルへの道が開けるはずです!

次は、EDAで見つかった課題(欠損値や外れ値など)に対処する「データ前処理」のテクニックに進んでいきましょう!