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


相関係数とは

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

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

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

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


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()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
SepalLength SepalWidth PetalLength PetalWidth
SepalLength 1.000000 -0.109369 0.871754 0.817954
SepalWidth -0.109369 1.000000 -0.420516 -0.356544
PetalLength 0.871754 -0.420516 1.000000 0.962757
PetalWidth 0.817954 -0.356544 0.962757 1.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")
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
x y
x 1.000000 0.880952
y 0.880952 1.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

参考

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

以上です。

コメント