pythonで相関係数を計算する方法はいくつか存在します。本記事では、相関係数の概要と、主なライブラリ(numpy,pandas,scipy)を使った具体的な相関係数の求め方を紹介します。様々なデータ分析シナリオに対応できるよう、それぞれのライブラリの特徴や利点も解説しています。
相関係数とは
相関係数とは、2つのデータがどの程度関係しているかを数値で表す指標です。特に有名なのがピアソンの積率相関係数で、これは-1から1の範囲の値を取ります。相関係数の値によって、データ同士の関係を次のように解釈できます。
- 1に近い正の値の場合: 強い正の相関(一方が増えればもう一方も増える)
- 1に近い負の値の場合: 強い負の相関(一方が増えればもう一方は減る)
- 0付近の場合: 相関がほぼない
相関係数は、データ分析や統計の分野でよく使われ、傾向を把握するのに役立ちます。
以下で相関係数という単語を使うときは、ピアソンの相関係数を指します。
相関行列とは
相関行列は、複数の変数間のすべての組み合わせにおける相関係数を一覧表示したものです。データセットに複数の変数がある場合、各変数ペア間の関係を個別に調べるのは手間がかかります。相関行列を使うと、すべての変数間の関係を一度に把握できます。
相関行列の特徴:
- 対角線上の値は常に1(変数と自分自身の相関係数)
- 対称行列である(変数AとBの相関係数は、BとAの相関係数と同じ)
- ヒートマップとして視覚化すると、データ間の関係パターンを直感的に把握できる
相関行列は、多変量データ分析、特徴量選択、多重共線性の検出など、様々な場面で活用されています。
相関関数を求める方法
データ分析や統計でよく用いられるライブラリであるnumpy,pandas,scipyを使った3つの方法を順に紹介します。
numpyで求める方法
numpyにはcorrcoefという関数があり、2つの配列から相関係数を計算することができます。
import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])
# 相関行列を求める
corr_matrix = np.corrcoef(x, y)
print(corr_matrix)
# [[1. 1.]
# [1. 1.]]
# 上記の結果から、xとyの相関係数は1.0
corrcoefは相関係数の行列を返すため、xとyの相関係数は行列の(0,1)あるいは(1,0)要素が該当します。
pandasで求める方法
pandasのSeriesやDataFrameにはcorrというメソッドがあります。DataFrameの複数列に対して相関係数を一括で計算できる点が便利です。
import pandas as pd
data = {
"x": [1, 2, 3, 4, 5],
"y": [2, 4, 6, 8, 10]
}
df = pd.DataFrame(data)
# 列同士の相関を計算
corr_matrix = df.corr()
print(corr_matrix)
# x y
# x 1.0 1.0
# y 1.0 1.0
# xとyの相関係数を個別に取り出す場合
corr_value = df["x"].corr(df["y"])
print(corr_value) # 1.0
複数の列を持つDataFrameの場合、corrを呼び出すだけで各列間の相関係数がまとまった行列として得られます。特定の列同士であれば、列を選択してcorrを適用すれば数値として個別に取得可能です。
# 複数変数の例
import pandas as pd
# 複数変数を持つDataFrameを作成
multi_data = {
"身長": [165, 170, 175, 180, 185],
"体重": [60, 65, 70, 75, 80],
"年齢": [25, 30, 35, 40, 45],
"収入": [300, 350, 400, 450, 500]
}
multi_df = pd.DataFrame(multi_data)
# 相関行列を計算
correlation_matrix = multi_df.corr()
print(correlation_matrix)
# 身長 体重 年齢 収入
# 身長 1.0 1.0 1.0 1.0
# 体重 1.0 1.0 1.0 1.0
# 年齢 1.0 1.0 1.0 1.0
# 収入 1.0 1.0 1.0 1.0
# 特定の変数間の相関係数のみを取得
height_weight_corr = multi_df["身長"].corr(multi_df["体重"])
print("身長と体重の相関係数:", height_weight_corr) # 1.0
scipyで求める方法
scipyのstatsモジュールにはpearsonrという関数があり、相関係数を返します。同時にp値(統計学的有意性の指標)も返してくれるため、統計解析で相関を評価する際に便利です。
from scipy import stats
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
corr_value, p_value = stats.pearsonr(x, y)
print("相関係数:", corr_value) # 1.0
print("p値:", p_value) # 0.0(厳密には非常に小さい値)
pearsonrは返り値として「相関係数」と「p値」の2つをタプルで返すのが特徴です。
使い分け
ここまでに紹介した3つの方法(numpy,pandas,scipy)には、それぞれ得意分野があります。以下のポイントを参考に使い分けを検討してみましょう。
単純に2つの配列の相関係数を素早く知りたい場合
numpyのcorrcoefを使うとシンプルに相関係数行列を取得できます。小規模データや2つの配列だけを扱う場面に向いています。
大量の列を一括で比較したい場合
pandasのDataFrameに複数の列をまとめておき、corrを呼び出すことで、それぞれの列同士の相関係数を一度に算出できます。データフレームを利用するプロジェクトではこちらが便利です。
統計的な有意性も確認したい場合
scipyのstatsモジュールにはpearsonrという関数が用意されており、相関係数だけでなくp値も同時に得られます。統計解析の文脈で、相関が偶然ではないかどうかを検証したいときに有用です。
可視化の例
相関係数は数値として把握するだけでなく、グラフで可視化することで直感的に理解しやすくなります。ここではseabornやmatplotlibを使った簡単な可視化の例を示します。
- seaborn: データの統計的な可視化に特化したライブラリ。matplotlibを基盤としており、データフレームを直接扱えるため、ヒートマップや散布図行列などの視覚的にわかりやすいグラフを簡単に作成できる。
- matplotlib: pythonで最も基本的なグラフ描画ライブラリ。折れ線グラフやヒストグラムなど、細かいカスタマイズが可能。seabornはmatplotlibを内部で利用しているため、組み合わせて使うことが多い。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# ダミーデータの作成
data = {
"x": [10, 20, 30, 40, 50],
"y": [12, 24, 31, 47, 52],
"z": [5, 8, 15, 20, 25]
}
df = pd.DataFrame(data)
# 相関係数のヒートマップを描画
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm")
plt.show()
このコードでは、pandasのcorrメソッドを使ってデータフレームの各列の相関係数を求め、その結果をseabornのheatmapで可視化しています。annot=Trueとすることで、各セルに相関係数の数値を表示し、cmap=”coolwarm”を指定することで、正の相関を赤、負の相関を青とするカラーマップを適用しています。

ヒートマップの色合いをもとに、以下のように解釈できます。
- xとyの相関係数は0.99 → 非常に強い正の相関がある。一方の値が増えれば、もう一方の値もほぼ確実に増加する関係。
- xとzの相関係数は0.95 → 強い正の相関がある。xが増えるとzも増える傾向が強いが、xとyほどの完全な関係ではない。
- yとzの相関係数は0.96 → xとzの関係と同様に、比較的強い正の相関がある。
このように、数値だけでは見えにくいデータの関係性を直感的に把握できるのが、seabornやmatplotlibを使った可視化の大きなメリットです。
まとめ
pythonで相関係数を求めるには、numpy, pandas, scipyなど、用途に応じた便利なツールが用意されています。
- 単純な相関係数の算出ならnumpy
- 複数列の相関関係を一括で把握したいならpandas
- 統計的に有意かどうかも含めて検証したいならscipy
さらに、seabornのヒートマップなどを活用することで相関関係をビジュアルに表現でき、データの傾向を把握しやすくなります。分析の目的とデータの性質に合わせて最適な方法を選び、効果的に相関を確認してみてください。