機械学習データ前処理:変数間の繋がりを見つける相関分析の基本【Pandas+Seaborn入門】
はじめに:データ間の「繋がり」を理解する重要性
機械学習モデルを構築する際、単にデータを集めるだけでは良い結果が得られないことがほとんどです。データの中には、モデルにとって有用な情報もあれば、そうでない情報、あるいはモデルの学習を妨げる情報も含まれています。そこで重要になるのが、データ前処理です。
データ前処理の目的の一つは、モデルがデータをより効率的かつ正確に学習できるように、データの質を高め、形を整えることです。この過程で、データに含まれるそれぞれの「変数」(列)が、互いにどのような関係を持っているのかを理解することが非常に役立ちます。変数間の関係性を知ることで、どの変数が重要そうか、あるいは逆にどの変数が冗長かといった洞察を得ることができ、より適切な特徴量(モデルに入力する変数)を選択したり、モデルの解釈を深めたりすることにつながります。
本記事では、データ間の関係性を数値とグラフで明らかにする「相関分析」の基本について解説します。特に、Pythonの代表的なデータ分析ライブラリであるPandasと、データの可視化に特化したライブラリSeabornを使って、実際にどのように相関分析を行うのか、具体的なコード例を交えてご紹介します。
データ分析や機械学習プロジェクトにこれから取り組むビジネスパーソンの方にとって、相関分析はデータの理解を深めるための強力なツールとなります。ぜひ、その基本的な考え方と実践方法を身につけてください。
相関分析とは何か?
相関分析とは、2つ以上の変数間にどのような関係性があるかを、統計的な手法を用いて調べる分析です。具体的には、一方の変数が増加するともう一方の変数も増加する関係なのか(正の相関)、一方の変数が増加するともう一方が減少する関係なのか(負の相関)、あるいは特に関係性が見られないのか(無相関)などを明らかにします。
この関係性の強さや方向を示す指標として、相関係数がよく用いられます。相関係数は一般的に-1から+1までの値を取ります。
- +1に近い値: 強い正の相関があることを示します。一方の変数が増えると、もう一方の変数もほぼ同じ割合で増加する傾向があります。
- -1に近い値: 強い負の相関があることを示します。一方の変数が増えると、もう一方の変数はほぼ同じ割合で減少する傾向があります。
- 0に近い値: ほとんど相関がない(無相関)ことを示します。一方の変数の増減と、もう一方の変数の増減に関連性は見られません。
相関係数が0.7以上であれば強い相関、0.4〜0.7であれば中程度の相関、0.2〜0.4であれば弱い相関、0.2未満であればほとんど相関なし、といったように判断されることがありますが、この基準は分野やデータの種類によって異なります。重要なのは、単に数値を見るだけでなく、その関係性がビジネスや分析の目的と照らしてどのような意味を持つのかを考えることです。
なぜデータ前処理で相関分析が重要なのか?
相関分析は、機械学習モデル構築におけるデータ前処理段階で、主に以下の目的のために利用されます。
- 重要な特徴量の特定: 目的変数(予測したい変数)と強い相関を持つ説明変数(入力変数)は、モデルにとって予測に役立つ可能性が高いと考えられます。相関分析を通じて、どの変数をモデルに使うべきかのヒントを得ることができます。
- 多重共線性の検出: 説明変数同士が互いに強い相関を持っている状態を「多重共線性(たじゅうきょうせんせい)」と呼びます。多重共線性があると、モデルの係数解釈が難しくなったり、モデルが不安定になったりする(例:少しデータが変わるだけで結果が大きく変動する)ことがあります。相関分析は、この多重共線性を引き起こしている可能性のある変数ペアを見つけるのに役立ちます。
- 冗長な特徴量の削減: 複数の説明変数が互いに非常に強い相関を持っている場合、それらは似たような情報を含んでいると考えられます。このような場合、全ての特徴量を使うとモデルが複雑になりすぎる可能性があるため、相関の高い変数群から一つだけを選ぶなどして、特徴量を削減することが検討されます。これは、モデルの過学習(特定のデータには適合するが、未知のデータには適合しない状態)を防ぐためにも有効です。
Pandasを使った相関行列の計算
Pandasライブラリを使えば、データフレーム内の数値変数間の相関係数を簡単に計算できます。.corr()
メソッドを使用します。
まず、分析対象となるサンプルデータを作成します。ここでは、製品の広告費、販売価格、販売個数、顧客満足度(数値化)、競合製品価格といった変数を持つデータフレームを想定します。
import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
'広告費': [10, 15, 20, 25, 30, 35, 40, 45, 50, 55],
'販売価格': [100, 95, 90, 88, 85, 82, 80, 78, 75, 70],
'販売個数': [50, 60, 70, 75, 80, 85, 90, 95, 100, 110],
'顧客満足度': [4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9],
'競合製品価格': [105, 100, 98, 95, 93, 90, 88, 85, 83, 80],
'製品コスト': [50, 52, 55, 56, 58, 60, 61, 63, 65, 68]
}
df = pd.DataFrame(data)
print("サンプルデータフレーム:")
print(df)
このデータフレームに対して、相関行列を計算してみましょう。.corr()
メソッドを呼び出すだけです。デフォルトではピアソン相関係数が計算されます。
# 相関行列の計算
correlation_matrix = df.corr()
print("\n相関行列:")
print(correlation_matrix)
出力された相関行列は、各行と各列がデータフレームの変数を示しており、セルに入る数値が対応する変数間の相関係数です。対角線上の値は常に1となります(同じ変数同士の相関は完全な正の相関)。
例えば、上記のサンプルデータで計算すると、以下のような結果が得られる可能性があります。
相関行列:
広告費 販売価格 販売個数 顧客満足度 競合製品価格 製品コスト
広告費 1.000000 -0.994842 0.991534 0.998772 -0.997365 0.992086
販売価格 -0.994842 1.000000 -0.998547 -0.991319 0.997775 -0.999309
販売個数 0.991534 -0.998547 1.000000 0.988825 -0.998254 0.997401
顧客満足度 0.998772 -0.991319 0.988825 1.000000 -0.994692 0.988825
競合製品価格 -0.997365 0.997775 -0.998254 -0.994692 1.000000 -0.998933
製品コスト 0.992086 -0.999309 0.997401 0.988825 -0.998933 1.000000
この表から、例えば「広告費」と「販売個数」の間には0.99という非常に強い正の相関があること、「販売価格」と「販売個数」の間には-0.99という非常に強い負の相関があることなどが読み取れます。また、「広告費」と「顧客満足度」の間にも強い正の相関が見られます。
相関行列の可視化(ヒートマップ)
相関行列は数値の羅列であるため、変数が多い場合は全体を把握するのが難しくなります。そこで役立つのが、相関行列を色で表現するヒートマップです。Seabornライブラリを使うと、簡単に美しいヒートマップを作成できます。
import seaborn as sns
import matplotlib.pyplot as plt
# 相関行列をヒートマップで可視化
plt.figure(figsize=(8, 6)) # 図のサイズを指定
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=.5)
plt.title('変数間の相関ヒートマップ')
plt.show()
sns.heatmap()
: Seabornのヒートマップ描画関数です。correlation_matrix
: 描画するデータ(Pandasで計算した相関行列)を指定します。annot=True
: セルの中に相関係数の値を表示します。cmap='coolwarm'
: 色のテーマを指定します。coolwarm
は正の相関を暖色系(赤など)、負の相関を寒色系(青など)で表現するため、相関関係の方向が分かりやすいです。他にも多くのテーマがあります。fmt=".2f"
: 表示する数値の小数点以下の桁数を指定します(ここでは小数点以下2桁)。linewidths=.5
: セルの境界線の太さを指定します。
ヒートマップを見ることで、色とその濃淡によって変数間の相関の強さと方向を直感的に把握できます。例えば、上記のコードでサンプルデータを可視化すると、以下のようなヒートマップが得られるでしょう。
(※LLMは図を直接生成できないため、これは概念を示すイメージです。実際のヒートマップは、上記のコードを実行することで得られます。)
このヒートマップでは、色が濃い赤や濃い青ほど相関が強いことを示します。赤いセルは正の相関、青いセルは負の相関です。例えば、「販売価格」と「販売個数」のセルが濃い青になっていることから、強い負の相関があることが視覚的に確認できます。
相関分析から得られる示唆と注意点
相関分析によって、データに関する様々な示唆を得られます。
- 目的変数との関連性: 例えば、「販売個数」を予測したい(目的変数とする)場合、ヒートマップや相関行列の「販売個数」の行(または列)を見ると、「広告費」や「顧客満足度」と強い正の相関、「販売価格」や「競合製品価格」と強い負の相関があることがわかります。これは、これらの変数が販売個数を予測する上で重要な特徴量になる可能性を示唆しています。
- 説明変数間の多重共線性: また、「広告費」と「顧客満足度」、「販売価格」と「競合製品価格」のように、説明変数同士が強い相関を持っているペアも見つかることがあります。これらは多重共線性の兆候かもしれません。モデルの種類によっては、これらの変数ペアのうち片方だけを使用したり、両方の情報を組み合わせた新しい特徴量を作成したりすることが検討されます。
ただし、相関分析を行う上でいくつか注意点があります。
- 相関は因果関係ではない: 相関が見られるからといって、必ずしも一方がもう一方の原因となっているわけではありません。「広告費が増えると販売個数が増える」という強い正の相関が見られたとしても、それは別の要因(例:季節要因やキャンペーン)が両方に影響している結果かもしれません。相関はあくまで関係性の強さを示すものであり、因果関係の有無は別の分析や実験によって明らかにする必要があります。
- 非線形な関係は捉えにくい: 相関係数は基本的に線形な関係性(直線的な関係)の強さを測ります。曲線的な関係や複雑な非線形な関係を持つ変数同士の相関は、相関係数が低く算出されてしまう可能性があります。このような関係性を把握するには、散布図を描いて目で確認したり、別の統計手法を用いたりする必要があります。
- 外れ値の影響: 外れ値(データの大部分から大きく外れた値)が存在する場合、相関係数の値が大きく歪められることがあります。相関分析を行う前に、外れ値の確認と適切な処理を検討することが重要です。(外れ値については、別の記事で詳しく解説します。)
これらの注意点を理解した上で相関分析の結果を解釈することが大切です。
まとめ
本記事では、機械学習のためのデータ前処理において重要となる相関分析の基本的な考え方と、PandasおよびSeabornを使った実践的な方法を解説しました。
相関分析は、データに含まれる変数間の関係性を数値である相関係数や、視覚的に分かりやすいヒートマップとして表現することで、データの構造を理解し、機械学習モデルに使う特徴量を選択したり、多重共線性を検出したりする上で非常に役立ちます。
- Pandasの
.corr()
メソッドで相関行列を計算できます。 - Seabornの
.heatmap()
関数を使えば、相関行列を直感的に理解できるヒートマップとして可視化できます。
データ前処理の初期段階で相関分析を行うことで、データに対する理解が深まり、その後の特徴量エンジニアリングやモデル選択の精度を高めることができます。
ただし、相関は因果関係ではないこと、非線形な関係や外れ値に注意が必要であることを忘れてはなりません。
データ前処理は、機械学習モデルの成功に不可欠なステップです。本記事で紹介した相関分析を、ぜひ皆さんのデータ分析プロセスに取り入れてみてください。