機械学習のためのデータ前処理:グラフでデータを「見る」方法【Pandas+Matplotlib/Seaborn入門】
機械学習のためのデータ前処理:グラフでデータを「見る」方法【Pandas+Matplotlib/Seaborn入門】
機械学習モデルの性能は、使用するデータの質に大きく左右されます。そして、データの質を高めるためには、適切なデータ前処理が不可欠です。しかし、データ前処理を始める前に、まず「どのようなデータなのか」を把握することが非常に重要になります。
データの特徴や傾向を把握する上で強力な手段となるのが、データ可視化です。データをグラフとして表現することで、数値や文字だけでは見えにくい、隠れたパターンや異常値、変数間の関係性などを直感的に理解することができます。これは、その後のデータ前処理の方向性を定める上で、羅針盤のような役割を果たします。
この記事では、機械学習のためのデータ前処理におけるデータ可視化の重要性と、よく用いられる基本的なグラフの種類、そしてそれらをPythonの主要なライブラリ(Pandas, Matplotlib, Seaborn)を使ってどのように作成・解釈するのかを、コード例を交えながら解説します。
なぜデータ可視化が必要なのか?
データ前処理のステップに進む前にデータを可視化する最大の理由は、「データセットの全体像と個々の変数の性質を深く理解するため」です。
生データはしばしば、膨大な数の行と列からなる単なる数値や文字の羅列です。この状態では、データがどのような分布をしているのか、欠損値はどの程度あるのか、特定の変数間に相関はあるのかといった重要な情報は簡単には読み取れません。
グラフとしてデータを表現することで、以下のような情報を効率的に把握できます。
- データの分布: データが特定の範囲に集中しているか、均等に散らばっているかなどを把握できます。
- 変数間の関係性: 2つ以上の変数が互いにどのように影響し合っているかを見つけられます。
- 異常値(外れ値): 他のデータポイントから大きく外れた値(異常値の候補)を視覚的に発見できます。
- 傾向とパターン: 時系列データにおけるトレンドや季節性、カテゴリデータにおける偏りなどを発見できます。
- データのばらつき: データの散らばり具合や集中度を確認できます。
これらの情報は、その後の欠損値の処理方法、外れ値への対応、特徴量の選択や生成、さらには使用する機械学習モデルの選定など、データ前処理のあらゆるステップの判断材料となります。つまり、データ可視化は、闇雲に前処理を行うのではなく、データに基づいて戦略的に前処理を進めるための「データ理解の第一歩」なのです。
データ可視化に使う主要ライブラリ
Pythonでデータ可視化を行う際には、主に以下のライブラリがよく使用されます。
- Matplotlib: Pythonでグラフを作成するための最も基本的なライブラリです。非常に柔軟性が高く、様々な種類のグラフを作成できますが、コードがやや冗長になる場合があります。
- Seaborn: Matplotlibを基盤としており、より洗練された美しい統計グラフを少ないコード量で描画できるライブラリです。複雑なグラフも簡単に作成できます。
- Pandas: データ分析の主役であるPandasにも、簡単なグラフ描画機能が組み込まれています。これはMatplotlibを内部的に利用しています。
通常、これらのライブラリは組み合わせて使用されます。Pandasでデータを整形し、MatplotlibやSeabornでグラフを描画するという流れが一般的です。
よく使われる基本的なグラフの種類とその使い方
ここでは、データ理解のためによく使われる基本的なグラフをいくつか紹介し、それぞれの目的とPythonでの簡単なコード例を示します。
使用するデータは、ここでは例として以下のようなシンプルなデータフレーム(df
とします)を想定します。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 例として使用するデータフレームを作成
data = {
'売上': [150, 200, 120, 300, 180, 250, 130, 220, 160, 280],
'広告費': [10, 15, 8, 25, 12, 20, 9, 18, 11, 22],
'地域': ['東京', '大阪', '東京', '福岡', '大阪', '東京', '大阪', '東京', '福岡', '大阪'],
'月': pd.to_datetime(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01', '2023-05-01',
'2023-06-01', '2023-07-01', '2023-08-01', '2023-09-01', '2023-10-01'])
}
df = pd.DataFrame(data)
print(df.head())
売上 広告費 地域 月
0 150 10 東京 2023-01-01
1 200 15 大阪 2023-02-01
2 120 8 東京 2023-03-01
3 300 25 福岡 2023-04-01
4 180 12 大阪 2023-05-01
1. ヒストグラム (Histogram)
- 目的: 1つの数値変数の分布を理解するために使用します。データがどのような値の範囲に多く集まっているか、あるいは均等に散らばっているか、偏りがあるかなどを確認できます。
- 見えること: データの中心的な値、ばらつきの範囲、分布の形状(正規分布に近いか、歪んでいるか、複数のピークがあるかなど)が分かります。これは、後続の正規化や標準化、対数変換などの前処理が必要かを判断するのに役立ちます。
# 売上データのヒストグラム
plt.figure(figsize=(8, 5)) # グラフのサイズを指定
sns.histplot(data=df, x='売上', bins=5, kde=True) # bins: 棒の数, kde: カーネル密度推定曲線
plt.title('売上データの分布') # グラフタイトル
plt.xlabel('売上額') # x軸ラベル
plt.ylabel('頻度') # y軸ラベル
plt.grid(axis='y', linestyle='--', alpha=0.7) # グリッド表示
plt.show() # グラフを表示
(ここではグラフ画像は表示できませんが、売上額の各範囲にいくつのデータが存在するかが棒グラフで示されます。kde=True
で分布の滑らかな線も表示されます。)
2. 棒グラフ (Bar Plot)
- 目的: カテゴリ変数と数値変数の関係や、カテゴリごとの数値の集計値(合計、平均など)を比較するために使用します。
- 見えること: 各カテゴリ間での数値の違いや傾向が明確になります。例えば、地域ごとの売上の違いなどを比較できます。
# 地域ごとの平均売上を計算
avg_sales_by_region = df.groupby('地域')['売上'].mean().reset_index()
# 地域ごとの平均売上を棒グラフで表示
plt.figure(figsize=(8, 5))
sns.barplot(data=avg_sales_by_region, x='地域', y='売上')
plt.title('地域別 平均売上')
plt.xlabel('地域')
plt.ylabel('平均売上')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
(地域ごとの棒の高さで平均売上が比較できます。)
3. 散布図 (Scatter Plot)
- 目的: 2つの数値変数間の関係性(相関)を理解するために使用します。一方の変数が増加すると、もう一方の変数も増加するのか(正の相関)、減少するのか(負の相関)、あるいは特に関係がないのかなどを確認できます。
- 見えること: 点の集まり方から、線形関係、非線形関係、クラスター(データの塊)、そして外れ値の候補などを発見できます。例えば、広告費と売上に関係があるかなどを調べられます。
# 広告費と売上の関係を散布図で表示
plt.figure(figsize=(8, 5))
sns.scatterplot(data=df, x='広告費', y='売上')
plt.title('広告費と売上の関係')
plt.xlabel('広告費')
plt.ylabel('売上')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
(点が右肩上がりに集まっていれば正の相関、右肩下がりなら負の相関、点がばらけていれば相関が薄いと解釈できます。)
4. 折れ線グラフ (Line Plot)
- 目的: 時系列データにおいて、時間の経過に伴う数値の変化やトレンドを理解するために使用します。
- 見えること: データの増加・減少傾向(トレンド)、周期的な変動(季節性)、突発的な変化などを把握できます。
# 月ごとの売上推移を折れ線グラフで表示
plt.figure(figsize=(10, 6))
sns.lineplot(data=df, x='月', y='売上')
plt.title('月別 売上推移')
plt.xlabel('月')
plt.ylabel('売上')
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(rotation=45) # 日付が見やすいように軸ラベルを回転
plt.tight_layout() # レイアウト調整
plt.show()
(時間の経過とともに売上がどのように変化しているかが線で追えます。)
5. 箱ひげ図 (Box Plot)
- 目的: 1つまたは複数のカテゴリに属する数値データの分布の概要を理解するために使用します。特に、データの中心(メディアン)、ばらつき(四分位範囲)、そして外れ値の有無を確認するのに適しています。
- 見えること: データの中央値、データの50%が含まれる範囲(箱)、データの広がり(ひげ)、そして個々の外れ値候補が視覚的に示されます。カテゴリ間の分布の違いを比較するのにも便利です。
# 地域別の売上分布を箱ひげ図で表示
plt.figure(figsize=(8, 5))
sns.boxplot(data=df, x='地域', y='売上')
plt.title('地域別 売上分布')
plt.xlabel('地域')
plt.ylabel('売上')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
(箱の位置と長さ、ひげの長さ、そして箱の外に点として描かれるデータ(外れ値候補)から、各地域の売上の特徴とばらつき、異常値の可能性が比較できます。)
可視化で見えた情報と前処理への繋がり
データ可視化によって得られた洞察は、その後の前処理ステップを効率的かつ適切に進めるための重要な手がかりとなります。
- 分布の偏り: ヒストグラムなどで分布が大きく偏っている(例えば、一部の値に集中しているなど)ことが分かった場合、対数変換やBox-Cox変換といったデータの分布を正規に近づける変換を検討します。
- 変数間の相関: 散布図やヒートマップ(複数の変数間の相関を色で示すグラフ、ここでは割愛)で強い相関が見られた場合、その関係性を活かした特徴量エンジニアリング(新しい特徴量を作成すること)や、多重共線性の問題(複数の説明変数が互いに高い相関を持つこと)に注意する必要があることを認識できます。
- 異常値: 散布図や箱ひげ図で他の点から大きく離れたデータが見つかった場合、それが入力ミスによるものか、あるいは真の異常値なのかを確認し、異常値の除去や補正といった対応を検討します。
- カテゴリ間の違い: 棒グラフや箱ひげ図でカテゴリによって数値に大きな差が見られた場合、そのカテゴリ変数がモデルにとって重要な情報源となる可能性が高いと判断できます。カテゴリ変数のエンコーディング方法を検討する際に、この違いを考慮に入れることもあります。
- 時系列トレンド/季節性: 折れ線グラフでトレンドや季節性が見られた場合、これらの要素をモデルに組み込むための時系列データに特化した前処理(例えば、差分を取る、ラグ特徴量を作成するなど)を検討します。
このように、データ可視化は単にデータを見るだけでなく、「何が問題で、どのような前処理が必要か」という疑問に対するヒントを与えてくれるのです。
まとめ
データ前処理は機械学習モデル構築の要であり、その前処理を効果的に行うためには、まずデータを深く理解することが不可欠です。データ可視化は、数値や文字のデータに「命を吹き込み」、パターンや特徴、問題点を直感的に把握するための強力なツールです。
この記事では、データ可視化の重要性と、ヒストグラム、棒グラフ、散布図、折れ線グラフ、箱ひげ図といった基本的なグラフの種類、そしてPythonを使ったそれらの作成方法と解釈のポイントについて解説しました。
これらの基本的なグラフを使いこなすことで、データが持つ情報を引き出し、より適切で効果的なデータ前処理へと繋げることができます。ぜひ、ご自身のデータで様々なグラフを作成し、「データが何を語っているのか」を探してみてください。データへの理解が深まるほど、より良い機械学習モデルを構築できるはずです。
次回の記事では、可視化によって見つかった具体的な問題点(例えば欠損値や外れ値)に対する前処理の手法について、さらに詳しく解説していきます。