pythonでいろいろな相関係数の計算をする方法を調べてみました。
結果を記載します。


相関係数とは

以下、参考になりました。

統計学入門 - 東京大学出版会記載を引用します。

相関係数とは相関の程度を示す指標であり、多くの定義があるが、もっともよく用いられるのは、ピアソンの積率相関係数 product-moment correlation coeffient であり、単に相関係数というときには通常これをさしている。

相関係数として、ピアソンの積率相関係数 以外に、スピアマンの<wbr>順位相関係数ケンドールの<wbr>順位相関係数記載されています。


Python で 相関係数の計算が可能なライブラリ

以下で計算ができるようです。

ピアソンの積立相関係数

スピアマンの順位相関係数

ケンドールの順位相関係数

実際に計算する

ピアソンの積立相関係数

  • numpy.corrcoef を使う
    corrcoef には、相関係数を求めたい 2値を ndarray で渡します。
    戻り値は、ndarray で返ります。
    2値以上の値も渡すことができ、その場合、戻り値の次元数が増えます。

# iris の pandas データセットを作成
import pandas as pd   
import requests
import io
response_text = requests.get("https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv").text
df = pd.read_csv(io.StringIO(response_text))

# 抽出
arrays = df.loc[:,['SepalLength', 'PetalLength']].values

# 相関係数の計算
import numpy as np
results = np.corrcoef(arrays.T)
print("相関係数を出力")
print(results)

相関係数を出力
[[ 1.          0.87175416]
 [ 0.87175416  1.        ]]
  • scipy.stats.pearsonr を使う
    x軸の値、y軸の値を配列で渡すと、相関係数、p値がTaple形式で返ります。

# iris の pandas データセットを作成
import pandas as pd   
import requests
import io
response_text = requests.get("https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv").text
df = pd.read_csv(io.StringIO(response_text))

# 抽出
x = df.loc[:,['SepalLength']].values.T
y = df.loc[:,['PetalLength']].values.T

# 相関係数の計算
from scipy.stats import pearsonr

# ndarray を 1次元配列に変換して渡す
a, b = pearsonr(np.ravel(x), np.ravel(y))
print("相関係数:", a)
print("p値:", b)

相関係数: 0.871754157305
p値: 1.03845406279e-47
  • pandas.DataFrame.corrを使う

# iris の pandas データセットを作成
import pandas as pd   
import requests
import io
response_text = requests.get("https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv").text
df = pd.read_csv(io.StringIO(response_text))

# 相関係数の計算 df.corr(method="pearson") でも結果は同様 デフォルト動作
df.corr()

SepalLengthSepalWidthPetalLengthPetalWidth
SepalLength1.000000-0.1093690.8717540.817954
SepalWidth-0.1093691.000000-0.420516-0.356544
PetalLength0.871754-0.4205161.0000000.962757
PetalWidth0.817954-0.3565440.9627571.000000

スピアマンの順位相関係数

  • scipy.stats.spearmanr を使う

from scipy.stats import spearmanr
# 統計学入門 - 東京大学出版会  p55 表3.9 を参考に作成  
x = [1,2,3,4,5,6,7,8]
y = [3,1,2,5,4,7,6,8]

correlation, pvalue = spearmanr(x,y)
print("相関係数", correlation)   
print("p値",pvalue)

相関係数 0.880952380952
p値 0.00385032046373
  • pandas.DataFrame.corrを使う
    pandas.DataFrame.corr の引数に method=”spearman” を指定して求めます。

import pandas as pd
# 統計学入門 - 東京大学出版会  p55 表3.9 を参考に作成
x = [1,2,3,4,5,6,7,8]
y = [3,1,2,5,4,7,6,8]
df = pd.DataFrame({'x': x,'y': y})
df.corr(method="spearman")

xy
x1.0000000.880952
y0.8809521.000000

ケンドールの順位相関係数

  • scipy.stats.kendalltau を使う
    使用方法は、scipy.stats.spearmanr と同様です。

from scipy.stats import kendalltau
# 統計学入門 - 東京大学出版会  p55 表3.9 を参考に作成  
x = [1,2,3,4,5,6,7,8]
y = [3,1,2,5,4,7,6,8]

correlation, pvalue = kendalltau(x,y)
print("相関係数", correlation)
print("p値",pvalue)

相関係数 0.714285714286
p値 0.0133475759268

参考

以下、参考になりました。

以上です。

コメント