#ピアソン相関とは
ピアソン相関は2つの連続変数間の線形関係を評価します。
一方のデータが増加、減少し、もう一方もそのデータと同じような動きをする場合、ピアソン相関は1に近づきます。一方のデータの増加、減少しても他方に影響しない場合、値は0に、一方のデータの動きともう一方のデータが逆向きに動くようなとき、ピアソン相関は-1に近づきます。
ピアソン相関を式に表すと以下の通りになります。
$ \large r = \frac{\sum(x - \bar{x})(y - \bar{y})}{\sqrt{\sum(x - \bar{x})^2} \sqrt{\sum(y - \bar{y})^2}}$
このピアソン相関をPythonで書くと以下のようなコードになります。
import math
data1 = {'Drama': 3, 'Romance': 4, 'School': 5, 'Action': 1, 'Sports': 1}
data2 = {'Drama': 2, 'Romance': 3, 'School': 2, 'Action': 5, 'Sports': 4}
def pearson_correlation(data1, data2):
#平均
mean1 = sum([value for value in data1.values()]) / len(data1)
mean2 = sum([value for value in data2.values()]) / len(data1)
#標準偏差
deviation1 = math.sqrt(sum([(data1[key] - mean1)**2 for key in data1]))
deviation2 = math.sqrt(sum([(data2[key] - mean2)**2 for key in data1]))
#共分散
covariance = sum([(data1[key] - mean1)*(data2[key] - mean2) for key in data1])
return covariance / (deviation1 * deviation2)
pearson_correlation(data1, data2) #-0.8360556025697307
Pythonではnumpyモジュールを使用することで簡単に求めることができます。
import numpy as np
data1 = {'Drama': 3, 'Romance': 4, 'School': 5, 'Action': 1, 'Sports': 1}
data2 = {'Drama': 2, 'Romance': 3, 'School': 2, 'Action': 5, 'Sports': 4}
data1_list = []
data2_list = []
#辞書型から配列へ。valueのみを格納。
for value1 in data1.values():
data1_list.append(value1)
for value2 in data2.values():
data2_list.append(value2)
np.corrcoef(data1_list,data2_list)[0,1] #-0.8360556025697305
scipy.stats.pearsonrを使用した場合です。
from scipy.stats import pearsonr
data1 = {'Drama': 3, 'Romance': 4, 'School': 5, 'Action': 1, 'Sports': 1}
data2 = {'Drama': 2, 'Romance': 3, 'School': 2, 'Action': 5, 'Sports': 4}
data1_list = []
data2_list = []
#辞書型から配列へ。valueのみを格納。
for value1 in data1.values():
data1_list.append(value1)
for value2 in data2.values():
data2_list.append(value2)
correlation, pvalue = pearsonr(data1_list, data2_list)
print(correlation) #-0.8360556025697304
#追記
辞書型はここではあまり使わないようです。
#参考
相関係数の数式
NumPyの相関係数を求めるnp.corrcoef関数の使い方
numpy.corrcoef
【Python】ピアソンの相関係数をいろいろな方法で計算する方法まとめ(SciPy / Numpy / Pandas)