pythonでいろいろな相関係数の計算をする方法を調べてみました。
結果を記載します。
相関係数とは
以下、参考になりました。
統計学入門 - 東京大学出版会 の記載を引用します。
相関係数とは相関の程度を示す指標であり、多くの定義があるが、もっともよく用いられるのは、ピアソンの積率相関係数 product-moment correlation coeffient であり、単に相関係数というときには通常これをさしている。
相関係数として、ピアソンの積率相関係数 以外に、スピアマンの順位相関係数
、ケンドールの順位相関係数
が記載されています。
Python で 相関係数の計算が可能なライブラリ
以下で計算ができるようです。
ピアソンの積立相関係数
-
pandas.DataFrame.corr — pandas 0.23.4 documentation
method パラメータに pearson を指定する。
スピアマンの順位相関係数
-
pandas.DataFrame.corr — pandas 0.23.4 documentation
method パラメータに spearman を指定する。
ケンドールの順位相関係数
-
pandas.DataFrame.corr — pandas 0.23.4 documentation
method パラメータに kendall を指定する。
実際に計算する
ピアソンの積立相関係数
- 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
参考
以下、参考になりました。
- 【Python】ピアソンの相関係数をいろいろな方法で計算する方法まとめ(SciPy / Numpy / Pandas) - St_Hakky’s blog
- スピアマン順位相関係数の計算
- スピアマンの順位相関係数 - Wikipedia
- ケンドールの順位相関係数 - Wikipedia
- IBM 2変量の相関分析 PearsonとSpearmanの違いについて - Japan
- scipy.stats.kendalltau — SciPy v0.14.0 Reference Guide
- scipy.stats.spearmanr — SciPy v1.1.0 Reference Guide
以上です。
コメント