機械学習データ前処理:ヒストグラムと箱ひげ図でデータを「診る」方法【Pandas入門】
はじめに:データ前処理における「データの理解」の重要性
機械学習モデルを構築する際、その性能は使用するデータの質に大きく依存します。データ前処理は、生のデータをモデルが学習しやすい形に整えるための重要なステップです。この前処理の初期段階で特に重要となるのが、「データの理解」です。
データには様々な特徴や傾向が隠されています。例えば、特定の数値が極端に多い、値が特定の範囲に集中している、あるいは一部に異常な値(外れ値)が含まれている、といった性質です。これらのデータの「かたち」や「ばらつき」を把握しないままモデル構築に進むと、期待通りの結果が得られなかったり、モデルの予測精度が低下したりする可能性があります。
特に、ビジネスの現場で様々なデータを扱う皆様にとって、データがどのような状態にあるのかを知ることは、次のアクションを決める上でも非常に役立ちます。例えば、顧客の年齢層や購買金額の分布を見ることで、ターゲット層への理解が深まります。
この「データの理解」において、データの分布を視覚的に捉えることは非常に効果的です。本記事では、データの分布を確認するための代表的なグラフである「ヒストグラム」と「箱ひげ図」について、その読み方と、Pythonのデータ分析ライブラリであるPandasを使った簡単な実装方法を解説します。プログラミング経験が少ない方でも理解できるよう、丁寧に進めてまいります。
なぜデータの分布を確認する必要があるのか
データの分布を理解することは、機械学習モデルの選択や前処理の方法を検討する上で不可欠です。
- データの偏り: データが特定の範囲に偏っている場合、モデルはその偏りに強く影響されてしまう可能性があります。
- 外れ値の検出: 分布を確認することで、他の値から大きく外れた異常な値(外れ値)が存在しないかを確認できます。外れ値はモデルの学習に悪影響を与えることがあるため、適切に対処する必要があります。
- 特徴量の性質理解: 連続値データが正規分布に近いか、あるいは複数の山を持つかなど、その性質を把握することで、どのような変換(例えば、対数変換など)が必要かを判断できます。
- 複数のデータ間の比較: 異なるグループやカテゴリ間でのデータの分布を比較することで、特徴量の違いや傾向を把握できます。
このように、データの分布を知ることは、データそのものが持つ情報を引き出し、より適切なデータ前処理やモデル選択を行うための重要な手がかりとなります。
データの分布を見る代表的な方法:ヒストグラム
ヒストグラムは、数値データがどのような範囲に、どれくらいの頻度で出現するかを示すグラフです。データの分布の形状、中心、ばらつき、歪み、そして複数の山があるかなどを視覚的に捉えることができます。
ヒストグラムの概念と読み方
ヒストグラムを作成するには、まずデータの値の範囲をいくつかの「階級」に分割します。次に、各階級にいくつのデータが含まれるか(これを「度数」と呼びます)を数え、その度数を縦軸、階級を横軸として棒グラフで表現します。
例えば、ある商品の購入金額データがあったとします。 1. 購入金額の範囲を「0円〜1000円」「1001円〜2000円」「2001円〜3000円」...のように階級に分けます。 2. 各階級に該当する購入金額の件数を数えます。 3. それぞれの階級に対して、対応する件数の高さの棒を描きます。
ヒストグラムを見ると、購入金額がどの価格帯に集中しているか、高い購入金額の人はどのくらいいるか、といった情報が一目でわかります。山の高いところがデータが集中している階級であり、山の形が左右対称か、どちらかに偏っているかなどで分布の傾向を把握できます。
Pandasを使ったヒストグラムの作成
Pandasでは、DataFrameやSeriesに対してhist()
メソッドを使うことで簡単にヒストグラムを作成できます。
例として、以下のPandas DataFrameを使用します。これは、あるECサイトの顧客の「年齢」と「年間購入金額(円)」のデータです。
import pandas as pd
import numpy as np
# ダミーデータの作成
np.random.seed(0)
data = {
'年齢': np.random.randint(18, 70, 100),
'年間購入金額': np.random.randint(1000, 50000, 100)
}
df = pd.DataFrame(data)
print(df.head())
年齢 年間購入金額
0 53 22681
1 60 16842
2 41 47015
3 56 4017
4 27 28207
「年齢」データのヒストグラムを作成してみましょう。
# 「年齢」カラムのヒストグラムを作成
df['年齢'].hist()
# Jupyter Notebookやスクリプトで実行する場合、以下の行でグラフが表示されます
# import matplotlib.pyplot as plt
# plt.show()
このコードを実行すると、「年齢」データのヒストグラムが表示されます(実行環境によります)。このヒストグラムを見ることで、顧客の年齢層がどのように分布しているか、特定の年齢層に偏りがあるかなどを視覚的に確認できます。例えば、20代後半と40代後半に山がある、といった傾向が読み取れるかもしれません。
次に、「年間購入金額」のヒストグラムも見てみましょう。
# 「年間購入金額」カラムのヒストグラムを作成
df['年間購入金額'].hist(bins=20) # binsで階級の数を指定できます
# import matplotlib.pyplot as plt
# plt.show()
bins=20
のように引数を指定することで、階級の数を調整できます。データの性質に合わせて階級数を調整することで、より適切な分布の形状を捉えることができます。年間購入金額のヒストグラムからは、購入金額が低い層に集中しているか、高額購入者がどの程度いるかなどが分かります。もし、非常に高い購入金額のデータが数件だけ離れて表示されていれば、それは外れ値の可能性を示唆します。
データの分布を見る代表的な方法:箱ひげ図
箱ひげ図は、データのばらつきを把握し、特に複数のグループ間で比較するのに便利なグラフです。ヒストグラムがデータの全体的な形状を詳細に示すのに対し、箱ひげ図はデータの要約統計量(中央値、四分位数など)をシンプルに表現します。
箱ひげ図の概念と読み方
箱ひげ図は、以下の要素で構成されます。
- 箱 (Box): データの第1四分位数 (Q1) から第3四分位数 (Q3) までの範囲を示します。データの中心的な50%がこの箱の中に含まれます。箱の長さが短いほど、その範囲のデータが集中していることを意味します。
- 中央値 (Median): 箱の中央線で示されます。データを小さい順に並べたときにちょうど真ん中にくる値です。データの中心的な傾向を示します。
- ひげ (Whiskers): 箱から上下に伸びる線です。通常、Q1から「1.5 * IQR」下限までの最小値、およびQ3から「1.5 * IQR」上限までの最大値を表します。IQR (Interquartile Range) は Q3 - Q1 で計算される四分位範囲です。ひげの長さは、データのばらつきの範囲を示します。
- 外れ値候補 (Outliers): ひげの範囲から外れたデータ点は点でプロットされます。これらは、ひげの計算に使用された基準(例: 1.5 * IQR)に基づいて「外れ値候補」と見なされるデータです。
箱ひげ図を見ることで、データの中央値、ばらつきの範囲(箱とひげの長さ)、そして外れ値候補の存在を素早く確認できます。また、複数の箱ひげ図を並べることで、グループ間の比較が容易になります。例えば、性別ごとの年間購入金額の分布の違いなどを比較できます。
Pandasを使った箱ひげ図の作成
Pandasでは、DataFrameに対してboxplot()
メソッドを使うことで箱ひげ図を作成できます。
先ほどの顧客データを使用します。
# 「年間購入金額」カラムの箱ひげ図を作成
df.boxplot(column='年間購入金額')
# import matplotlib.pyplot as plt
# plt.show()
このコードを実行すると、「年間購入金額」の箱ひげ図が表示されます。箱の位置で中央値とデータの集中範囲(Q1からQ3)を、ひげの長さでばらつきを、ひげの外側の点で外れ値候補を確認できます。もし、ひげの外側に点が多数表示されていれば、そのデータには多くの外れ値候補が含まれている可能性が高いと判断できます。
複数の数値カラムがある場合に、まとめて箱ひげ図を作成することも可能です。
# 複数の数値カラムの箱ひげ図をまとめて作成
# df.boxplot(column=['年齢', '年間購入金額'])
# import matplotlib.pyplot as plt
# plt.show()
(注:この例では年齢と購入金額でスケールが大きく異なるため、まとめて表示すると見づらい可能性があります。実際には、似たスケールのカラムや、カテゴリ別に分けて表示することが多いです。)
ヒストグラムと箱ひげ図の使い分け
ヒストグラムと箱ひげ図は、どちらもデータの分布を視覚化するツールですが、それぞれ得意とする表現が異なります。
-
ヒストグラム:
- 得意なこと: データの全体的な形状(山がいくつあるか、左右対称か非対称か)、データの密度、特定の値の頻度を詳細に把握する。
- 苦手なこと: 複数のデータの分布を比較する際に、グラフが重なると見づらくなる。要約統計量(中央値、四分位数など)を直接読み取りにくい。
-
箱ひげ図:
- 得意なこと: データのばらつき(四分位範囲)、中央値、外れ値候補を素早く把握する。複数のデータの分布(例えば、カテゴリごとの数値データの分布)を並べて比較する。
- 苦手なこと: データの詳細な形状(山がいくつあるかなど)は分からない。
したがって、以下のように使い分けるのが効果的です。
- データの全体的な形状や、特定の値の頻度を知りたい場合: ヒストグラム
- データのばらつき、中央値、外れ値候補を素早く確認したい場合: 箱ひげ図
- 複数のグループ間(例:性別、地域別など)で数値データの分布を比較したい場合: 箱ひげ図
データ分析の初期段階では、両方のグラフを作成して多角的にデータを確認することが推奨されます。
まとめ
本記事では、機械学習のデータ前処理において重要となる「データの分布の理解」に焦点を当て、そのための代表的な可視化手法であるヒストグラムと箱ひげ図について解説しました。
- ヒストグラムは、データの頻度分布を棒グラフで表し、データの全体的な形状や偏りを把握するのに役立ちます。
- 箱ひげ図は、データの要約統計量(中央値、四分位数)と外れ値候補をコンパクトに表示し、データのばらつきや複数のグループ間の比較に便利です。
どちらのグラフも、Pandasを使えば数行のコードで簡単に作成できます。データの前処理を行う際は、まずこれらのグラフを使ってデータを「診る」ことから始めてみてください。データの状態を正確に把握することが、その後の適切な前処理やモデル構築の成功につながる第一歩となります。
データの分布理解の次は、欠損値の処理、カテゴリ変数のエンコーディング、数値データのスケーリングなど、様々な前処理ステップが控えています。本サイトでは、これらのステップについても順を追って解説してまいりますので、ぜひ他の記事もご参照いただき、機械学習のためのデータ前処理スキルを体系的に習得していただければ幸いです。