LoginSignup
2
1

More than 3 years have passed since last update.

Pythonでピアソン相関を計算する【レコメンド】

Last updated at Posted at 2019-08-23

ピアソン相関とは

ピアソン相関は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で書くと以下のようなコードになります。

pearson2.py

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モジュールを使用することで簡単に求めることができます。

pearson2.py
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を使用した場合です。

pearson3.py
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)

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1