探索的データ分析(EDA)とは?初心者向け実践ガイド

データ分析を始めたばかりの方から「探索的データ分析(EDA)って何から手をつければいいの?」という質問をよく受けます。探索的データ分析とは、データの特徴を多面的に理解し、隠れたパターンや関係性を発見するための分析手法です。

確かに、膨大なデータを前にして、どのように分析を進めればよいか迷ってしまうのも無理はありません。適切な分析手法を選択できずに進めてしまうと、誤った結論を導き出したり、重要な洞察を見逃したりしてしまう可能性があります。

この記事では、探索的データ分析の基本概念から、PythonとJupyterLabを使った実践的な分析手法まで、初心者の方でも理解できるように段階的に解説していきます。データから価値ある情報を引き出すための第一歩を、一緒に踏み出しましょう。

目次

探索的データ分析(EDA)の基本概念と重要性

探索的データ分析とは?定義と目的

探索的データ分析(Exploratory Data Analysis、略称:EDA)は、1970年代にアメリカの統計学者John Tukey氏によって提唱された、データ分析の重要なアプローチです。従来の「仮説検証型」の分析とは異なり、データそのものに語らせることを重視します。

EDAの主な目的

目的詳細説明
データの全体像把握データセットの規模、変数の種類、基本的な統計量を理解する
パターンの発見データ内に潜む傾向、周期性、グループ化などを見つける
異常値の検出外れ値や異常なデータポイントを特定し、その原因を探る
仮説の生成データから新たな仮説や研究課題を導き出す
前処理の方針決定欠損値処理、変数変換などの方法を決める

なぜデータ分析の初期段階でEDAが重要なのか

データ分析プロジェクトにおいて、EDAを省略してすぐにモデル構築に進むことは、地図を持たずに山登りをするようなものです。初期段階でEDAを実施することで、後の分析作業が格段に効率的になります。

EDAを実施するメリット

1. エラーの早期発見 データ入力ミスや測定エラーを早期に発見できることは、EDAの重要な利点の一つです。たとえば、年齢が300歳と記録されていたり、売上がマイナス値になっていたりするような明らかな異常値は、EDAの初期段階で容易に検出できます。これらのエラーを早期に発見することで、後続の分析やモデル構築において誤った結論を導くリスクを大幅に削減できます。

2. 適切な分析手法の選択 データの分布や性質を理解することで、最適な統計手法や機械学習アルゴリズムを選択できるようになります。EDAを通じてデータの特性を把握することで、線形回帰が適切なのか、それとも非線形モデルが必要なのかを判断できます。また、正規分布していないデータを発見した場合には、対数変換やBox-Cox変換などの適切な変換を施すことで、分析の精度を向上させることができます。

3. ビジネスインサイトの獲得 グラフや可視化を通じて、数値データだけでは気づかない重要な洞察を得ることができます。たとえば、売上データの時系列グラフから季節性やトレンドを発見したり、散布図から予期せぬ相関関係を見つけたりすることがあります。また、視覚的に分かりやすい形でデータを提示することで、技術的な背景を持たないステークホルダーとのコミュニケーションも円滑になり、データに基づいた意思決定を促進できます。

EDAと従来のデータ分析手法の違い

分析アプローチの比較

項目探索的データ分析(EDA)従来の確証的データ分析
アプローチデータ駆動型(ボトムアップ)仮説駆動型(トップダウン)
目的パターンや関係性の発見仮説の検証
分析の柔軟性高い(対話的に進める)低い(事前に計画された手順)
可視化の重要度非常に高い中程度
使用する手法グラフィカルな手法が中心統計的検定が中心

注釈: EDAと確証的データ分析は対立するものではなく、相補的な関係にあります。EDAで発見した知見を、確証的分析で検証することが理想的なデータ分析のプロセスです。

EDAで使用する主要ツールとPython環境構築

pandas、matplotlib、NumPyの役割と特徴

PythonでEDAを実施する際の3大ライブラリについて、それぞれの役割と特徴を理解しましょう。

各ライブラリの役割分担

pandas(パンダス)

# データの読み込みと操作
import pandas as pd
df = pd.read_csv('data.csv')
df.describe()  # 基本統計量の表示
df.info()      # データ型と欠損値の確認

主な機能: pandasの主な機能として、まずCSVやExcelファイルの読み込み機能があります。これにより、様々な形式のデータソースから簡単にデータを取り込むことができます。また、データフレーム形式でのデータ操作が可能で、SQLライクな操作や行列演算を直感的に行えます。さらに、欠損値処理、グループ化、集計といった前処理に必要な機能も充実しており、データクレンジングから分析まで一貫して作業を進められます。

matplotlib(マットプロットリブ)

# データの可視化
import matplotlib.pyplot as plt
plt.hist(df['column_name'], bins=20)
plt.xlabel('値')
plt.ylabel('頻度')
plt.show()

主な機能: matplotlibはPythonにおける基本的な可視化ライブラリで、ヒストグラム、散布図、折れ線グラフなど、データ分析に必要な様々なグラフを作成できます。また、グラフのカスタマイズ機能も充実しており、色、ラベル、タイトル、軸の設定など、細かい部分まで自由に調整可能です。これにより、論文やプレゼンテーションに使える高品質なグラフを作成できます。

NumPy(ナンパイ)

# 数値計算の高速化
import numpy as np
array = np.array([1, 2, 3, 4, 5])
mean = np.mean(array)  # 平均値の計算
std = np.std(array)    # 標準偏差の計算

主な機能: NumPyの最大の特徴は高速な配列演算です。C言語で実装されているため、純粋なPythonよりも数十倍から数百倍高速に動作します。また、平均、標準偏差、分位数などの統計関数が豊富に用意されており、データの基本統計量を効率的に計算できます。さらに、行列演算や線形代数の計算もサポートしており、機械学習アルゴリズムの実装にも欠かせないライブラリとなっています。

JupyterLabの環境構築手順

JupyterLabは対話的にEDAを進めるための最適な環境です。以下の手順で環境を構築しましょう。

インストール手順

1. Pythonのインストール確認

# Pythonのバージョン確認
python --version
# Python 3.7以上が推奨

2. pipのアップグレード

sudo python3 -m pip install --upgrade pip

3. 必要なライブラリのインストール

# JupyterLabのインストール
pip install jupyterlab

# EDA用ライブラリの一括インストール
pip install pandas matplotlib numpy seaborn

4. JupyterLabの起動

# JupyterLabを起動
jupyter lab

# ポートを指定して起動する場合
jupyter lab --port 8888

初期設定のポイント

JupyterLabを効果的に活用するためには、いくつかの初期設定が重要です。まず、作業ディレクトリの設定では、データファイルと同じフォルダでJupyterLabを起動することで、ファイルパスの管理が簡単になります。次に、拡張機能の追加により、コード補完やテーマ変更などの機能を追加できます。これらの拡張機能は作業効率を大幅に向上させます。また、大規模なデータセットを扱う場合は、メモリ設定を調整することで、メモリ不足によるエラーを防ぐことができます。

初心者向けツール選択のポイント

EDAツールは多数存在しますが、初心者の方は以下のポイントを考慮して選択しましょう。

ツール選択の判断基準

判断基準推奨ツール理由
学習コストの低さExcel → PythonExcelで基礎を学び、徐々にPythonへ移行
対話的な操作性JupyterLab結果をすぐに確認でき、試行錯誤しやすい
日本語サポートpandas + matplotlib日本語の表示や処理に対応
無料で使えるPython全般オープンソースで費用がかからない
豊富な学習リソースPython + pandasオンライン教材や書籍が充実

段階的な学習アプローチ

初級レベル(1-3ヶ月)

  • Excel でピボットテーブルやグラフ作成を習得
  • Python の基本文法を学習

中級レベル(3-6ヶ月)

  • pandas でデータ操作を練習
  • matplotlib で基本的なグラフを作成

上級レベル(6ヶ月以降)

  • seaborn や plotly で高度な可視化
  • 大規模データの処理技術を習得

実践!JupyterLabでEDAを始める方法

データの読み込みと基本的な確認方法

実際にJupyterLabでEDAを始める最初のステップを解説します。以下では、機械学習の学習用データセットとして有名な「Iris(アヤメ)データセット」を例に説明します。

データの読み込み

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# pandasの表示数を指定
pd.options.display.max_columns = 32

# Matplotlibの設定
%matplotlib inline

# CSVファイルを読み込む
iris = pd.read_csv('./data/iris.csv')

データの基本確認

1. 最初と最後のデータを確認

# 最初の5行を表示
iris.head()

# 最後の5行を表示
iris.tail()

# 任意の行数を表示
iris.head(10)  # 最初の10行

2. データの形状を確認

# 行数と列数を確認
print(f"データの形状: {iris.shape}")
# 出力例: データの形状: (150, 5)

ポイント: データを読み込んだら、必ず最初にhead()shapeで全体像を把握しましょう。これにより、データの規模や構造を理解できます。

describeとinfoを使った統計情報の把握

pandasが提供するdescribe()info()は、EDAにおいて最も重要な関数です。これらを使いこなすことで、データの特徴を瞬時に把握できます。

describe()による統計情報

# 基本統計量の表示
iris.describe()

describe()で得られる情報:

統計量説明活用方法
countデータ件数欠損値の確認
mean平均値中心傾向の把握
std標準偏差データのばらつき確認
min最小値異常値の発見
25%第1四分位数データ分布の把握
50%中央値外れ値に強い中心傾向
75%第3四分位数データ分布の把握
max最大値異常値の発見

info()によるデータ型確認

# データフレームの情報を表示
iris.info()

出力例:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
SepalLengthCm    150 non-null float64
SepalWidthCm     150 non-null float64
PetalLengthCm    150 non-null float64
PetalWidthCm     150 non-null float64
Species          150 non-null object
dtypes: float64(4), object(1)

info()で確認すべきポイント: info()メソッドを使用する際には、主に3つの重要なポイントに注目すべきです。まず、各カラムのデータ型を確認することで、数値データか文字列データかを把握し、適切な分析手法を選択できます。次に、Non-nullの件数を確認することで、欠損値の有無とその程度を一目で理解でき、必要な前処理を計画できます。最後に、メモリ使用量を確認することで、大規模なデータセットを扱う際のメモリ管理に役立ちます。

欠損値と外れ値の確認手法

機械学習モデルの性能に大きく影響する欠損値と外れ値の確認は、EDAの重要なステップです。

欠損値の確認

# 欠損値の有無を確認
iris.isnull().any()

# 各カラムの欠損値数を表示
iris.isnull().sum()

# 欠損値の割合を表示
missing_ratio = iris.isnull().sum() / len(iris) * 100
print("欠損値の割合:")
print(missing_ratio)

外れ値の検出方法

1. 四分位範囲(IQR)を使った方法

def detect_outliers_iqr(df, column):
    """
    IQR方法で外れ値を検出
    """
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
    return outliers

# 例:PetalLengthCmの外れ値を確認
outliers = detect_outliers_iqr(iris, 'PetalLengthCm')
print(f"外れ値の数: {len(outliers)}")

2. 箱ひげ図による視覚的確認

plt.figure(figsize=(10, 6))
iris.boxplot(column=['SepalLengthCm', 'SepalWidthCm', 
                     'PetalLengthCm', 'PetalWidthCm'])
plt.title('各特徴量の箱ひげ図')
plt.ylabel('値 (cm)')
plt.show()

注意点: 外れ値は必ずしも「エラー」ではありません。ドメイン知識やビジネスコンテキストを考慮して、外れ値をどう扱うか決定しましょう。

EDAにおけるデータ可視化の手法

ヒストグラムと箱ひげ図の活用法

データの分布を理解するための2つの基本的な可視化手法を詳しく解説します。

ヒストグラムの作成と解釈

基本的なヒストグラム

# 全体のヒストグラムを作成
iris.hist(bins=15, figsize=(12, 8), color='teal', edgecolor='black')
plt.suptitle('各特徴量のヒストグラム', fontsize=16)
plt.tight_layout()
plt.show()

種類別に重ねたヒストグラム

fig = plt.figure(figsize=(12, 10))

# 特徴量の名前と位置
features = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
species = iris['Species'].unique()

for i, feature in enumerate(features):
    plt.subplot(2, 2, i+1)
    for sp in species:
        data = iris[iris['Species'] == sp][feature]
        plt.hist(data, bins=15, alpha=0.6, label=sp)
    
    plt.xlabel(feature)
    plt.ylabel('頻度')
    plt.legend()
    plt.title(f'{feature}の分布')

plt.tight_layout()
plt.show()

箱ひげ図の活用

箱ひげ図の要素と意味

要素意味活用方法
箱の下端第1四分位数(Q1)データの25%がこれ以下
箱の中の線中央値(Q2)データの中心的位置
箱の上端第3四分位数(Q3)データの75%がこれ以下
ひげの範囲Q1-1.5×IQR~Q3+1.5×IQR正常値の範囲
外れ値異常値の可能性

種類別の箱ひげ図

fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()

for i, feature in enumerate(features):
    iris.boxplot(column=feature, by='Species', ax=axes[i])
    axes[i].set_title(f'{feature}の種類別箱ひげ図')
    axes[i].set_xlabel('種類')
    axes[i].set_ylabel('値 (cm)')

plt.tight_layout()
plt.show()

散布図による相関関係の発見

散布図は、2つの変数間の関係性を視覚的に確認できる強力なツールです。特に、相関関係や非線形関係の発見に役立ちます。

基本的な散布図の作成

# 2つの特徴量の散布図
plt.figure(figsize=(8, 6))
plt.scatter(iris['SepalLengthCm'], iris['SepalWidthCm'], alpha=0.6)
plt.xlabel('がく片の長さ (cm)')
plt.ylabel('がく片の幅 (cm)')
plt.title('がく片の長さと幅の関係')
plt.grid(True, alpha=0.3)
plt.show()

種類別に色分けした散布図

# 種類ごとに色を変えてプロット
species_colors = {'Iris-setosa': 'red', 
                  'Iris-versicolor': 'green', 
                  'Iris-virginica': 'blue'}

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 花弁の長さ vs 花弁の幅
ax1 = axes[0, 0]
for species, color in species_colors.items():
    data = iris[iris['Species'] == species]
    ax1.scatter(data['PetalLengthCm'], data['PetalWidthCm'], 
                color=color, label=species, alpha=0.6, s=50)
ax1.set_xlabel('花弁の長さ (cm)')
ax1.set_ylabel('花弁の幅 (cm)')
ax1.set_title('花弁の長さと幅の関係')
ax1.legend()
ax1.grid(True, alpha=0.3)

# その他の組み合わせも同様に作成...

相関係数の計算と表示

# 数値特徴量のみを抽出
numeric_features = iris.select_dtypes(include=[np.number])

# 相関係数を計算
correlation_matrix = numeric_features.corr()

# 相関係数の可視化
plt.figure(figsize=(8, 6))
plt.imshow(correlation_matrix, cmap='coolwarm', aspect='auto', vmin=-1, vmax=1)
plt.colorbar(label='相関係数')

# 軸ラベルの設定
feature_names = correlation_matrix.columns
plt.xticks(range(len(feature_names)), feature_names, rotation=45)
plt.yticks(range(len(feature_names)), feature_names)

# 値を表示
for i in range(len(feature_names)):
    for j in range(len(feature_names)):
        plt.text(j, i, f'{correlation_matrix.iloc[i, j]:.2f}', 
                ha='center', va='center')

plt.title('特徴量間の相関係数')
plt.tight_layout()
plt.show()

ポイント: 花弁の長さと幅には非常に強い正の相関(0.96)があることがわかります。これは機械学習モデルを構築する際の重要な情報です。

複数変数の関係を見る多変量可視化

3つ以上の変数の関係性を同時に把握するための可視化手法を紹介します。

散布図行列(Scatter Matrix)

from pandas.plotting import scatter_matrix

# 散布図行列の作成
scatter_matrix(iris, alpha=0.8, figsize=(15, 15), diagonal='hist')
plt.suptitle('各特徴量の散布図行列', fontsize=16)
plt.tight_layout()
plt.show()

ペアプロット(seabornを使用)

# seabornをインストールしている場合
import seaborn as sns

# ペアプロットの作成
sns.pairplot(iris, hue='Species', diag_kind='kde', 
             markers=['o', 's', 'D'], palette='husl')
plt.suptitle('種類別ペアプロット', y=1.02)
plt.show()

パラレルコーディネート(高次元データの可視化)

# データの準備
from sklearn.preprocessing import StandardScaler

# 数値データのみを抽出して標準化
X = iris.drop('Species', axis=1)
X_scaled = StandardScaler().fit_transform(X)

# パラレルコーディネートの作成
plt.figure(figsize=(10, 8))

for i, species in enumerate(iris['Species'].unique()):
    mask = iris['Species'] == species
    plt.plot(X_scaled[mask].T, alpha=0.3, label=species)

plt.xlabel('特徴量インデックス')
plt.ylabel('標準化された値')
plt.xticks(range(4), ['Sepal Length', 'Sepal Width', 
                      'Petal Length', 'Petal Width'])
plt.legend()
plt.title('パラレルコーディネートによる多変量可視化')
plt.grid(True, alpha=0.3)
plt.show()

多変量可視化の活用ポイント

手法使いどころメリット
散布図行列全体的な変数間関係の把握一度にすべての組み合わせを確認できる
ペアプロットクラス分け問題の探索クラスごとの特徴が明確にわかる
パラレルコーディネートプロファイルパターンの発見高次元データでもパターンを把握しやすい

探索的データ分析を次のステップにつなげる方法

EDAで得た知見を機械学習につなげる

EDAで得られた知見は、機械学習モデルの性能向上に直結します。ここでは、EDAの結果をどのように活かすかを解説します。

EDAから機械学習への橋渡し

1. 特徴選択への活用

# 相関係数が高い特徴量の組み合わせを発見
highly_correlated = []
corr_matrix = iris.corr()

for i in range(len(corr_matrix.columns)):
    for j in range(i+1, len(corr_matrix.columns)):
        if abs(corr_matrix.iloc[i, j]) > 0.8:
            colname = corr_matrix.columns[i] + ' & ' + corr_matrix.columns[j]
            highly_correlated.append((colname, corr_matrix.iloc[i, j]))

print("高い相関を持つ特徴量の組み合わせ:")
for pair, corr in highly_correlated:
    print(f"{pair}: {corr:.2f}")

2. 前処理戦略の決定

EDAの発見前処理のアクション
欧歪した分布対数変換やBox-Cox変換を適用
外れ値の存在ロバストなスケーリングや外れ値除去
高い相関多重共線性を避けるため特徴選択
クラス不均衡サンプリング戦略の検討

3. モデル選択への指針

# EDA結果に基づくモデル選択の例
if iris['PetalLengthCm'].nunique() < 10:
    print("カテゴリ変数が少ない → 決定木ベースのモデルが適している可能性")
elif correlation_exists:
    print("線形関係が強い → 線形モデルやSVMが有効な可能性")
else:
    print("複雑な非線形関係 → ランダムフォレストやニューラルネットワークを検討")

分析結果のレポーティングとコミュニケーション

EDAの結果を効果的に伝えることは、データサイエンティストにとって重要なスキルです。ステークホルダーに知見を伝え、意思決定につなげましょう。

効果的なレポートの構成

1. エグゼクティブサマリー エグゼクティブサマリーは、経営層や意思決定者向けに作成する重要なセクションです。ここでは、主要な発見を3~5点に絞り込み、それぞれの発見がビジネスにどのような影響を与えるかを明確に示します。また、データ分析の結果に基づいた具体的な推奨アクションを提示することで、データドリブンな意思決定を支援します。技術的な詳細は最小限に抑え、ビジネス価値に焦点を当てることが重要です。

2. 視覚的なストーリーテリング

# ダッシュボード風のレポート作成
fig = plt.figure(figsize=(15, 10))
fig.suptitle('アヤメデータセットEDAサマリー', fontsize=16)

# 1. データ概要
ax1 = plt.subplot(2, 3, 1)
ax1.text(0.1, 0.5, f'● データ件数: 150件\n● 特徴量: 4つ\n● クラス: 3種類', 
         fontsize=12, verticalalignment='center')
ax1.set_title('データ概要')
ax1.axis('off')

# 2. 主要な発見
ax2 = plt.subplot(2, 3, 2)
key_findings = """主要な発見:
1. 花弁の長さと幅に強い相関(0.96)
2. Setosaは明確に区別可能
3. 欠損値なし
4. 外れ値は少数"""
ax2.text(0.1, 0.5, key_findings, fontsize=10, verticalalignment='center')
ax2.set_title('重要な発見')
ax2.axis('off')

# 3~6. 可視化を配置
# ...(実際のグラフを配置)

plt.tight_layout()
plt.savefig('eda_summary_report.png', dpi=300, bbox_inches='tight')

コミュニケーションのポイント

ターゲット伝えるべき内容伝え方
経営層ビジネスインパクトシンプルなグラフと1ページサマリー
データチーム技術的な詳細Jupyterノートブック共有
ビジネス部門実務への応用具体的なユースケースを示す

継続的な分析スキル向上のためのロードマップ

EDAはデータサイエンスの第一歩です。ここからさらにスキルを向上させるためのロードマップを提示します。

スキルレベル別学習プラン

初級者(0-3ヶ月)

学習項目具体的なアクション目標
Python基礎オンラインコースを修了基本構文の理解
pandas入門データ操作の練習CSV読み込みができる
可視化基礎matplotlibでグラフ作成基本的なグラフが作れる
EDA実践本記事の内容を実践簡単なEDAができる

中級者(3-12ヶ月)

# 中級者向け学習項目
intermediate_skills = {
    '統計学': ['仮説検定', '回帰分析', '時系列分析'],
    '機械学習': ['scikit-learn', 'モデル評価', 'ハイパーパラメータ調整'],
    '高度な可視化': ['seaborn', 'plotly', 'インタラクティブ可視化'],
    '大規模データ': ['SQL', 'Spark', 'クラウドサービス']
}

上級者(12ヶ月以降)

  • 深層学習の基礎
  • ビッグデータ分析
  • MLOpsとプロダクション化
  • ドメイン特化(金融、医療、製造業など)

学習リソースの活用

無料リソース

  • Kaggle Learn:実践的なハンズオン学習
  • Google Colab:環境構築不要ですぐに始められる
  • YouTube:日本語の解説動画も充実

有料コース

  • Coursera:体系的な学習が可能
  • Udemy:実践的なプロジェクトベース
  • データサイエンススクール:メンターサポートあり

ポイント学習は継続が鍵です。毎日10分でも、コードを書いたりデータを触ったりする習慣を付けましょう。

まとめ

探索的データ分析(EDA)は、データサイエンスプロジェクトの成功の鍵を握る重要なステップです。

本記事のまとめ

EDAの本質

  • データに語らせるアプローチ
  • 仮説を立てる前の探索的アプローチ
  • 可視化を中心とした直感的な理解

必須ツール

  • pandas:データ操作
  • matplotlib:可視化
  • NumPy:数値計算
  • JupyterLab:対話的分析環境

基本的な分析手法

  • describe()とinfo()でデータの概要把握
  • ヒストグラムと箱ひげ図で分布確認
  • 散布図で相関関係の発見
  • 多変量可視化で全体像の把握

次のステップへ

今すぐ始められるアクション:

  1. 環境構築(15分)
    • PythonとJupyterLabをインストール
    • 本記事のコードをコピーして実行
  2. サンプルデータで練習(30分)
    • Kaggleからデータセットをダウンロード
    • 本記事の手法を順番に試す
  3. 実務データへの応用
    • 自社のデータでEDAを実施
    • 発見をチームで共有

最後に: EDAはデータサイエンスの基礎中の基礎です。一度身につければ、どんなデータ分析プロジェクトでも必ず役に立ちます。今日からデータと対話する習慣を始めましょう!

この記事をシェアする
  • URLをコピーしました!

この記事を書いた人

データラーニングメディア運営事務局

目次