日々学び、感謝し、成長する

データとハートを活かす人事を目指した成長奮闘記(?)です

ピープル・アナリティクスケーススタディ(補足②):Pythonで偏相関係数を計算する

f:id:millebon:20210515133346p:plain

 

2つの変数に本当に相関がある?

以前のブログ相関係数Pythonで計算しましたが、この時どうしても拭い去れなかった思いが、「この係数は2者間の純粋な係数を算出しているのか」ということです。

 

人事のデータを扱う際には、いくつもの変数の相関性を一気に出したくなる場面があります。ただ、それぞれの変数が完全に独立しているというようなことがはっきり言えない場合が多いと思うので、出てきた相関係数を信じていいのか?という疑いがどうしても残ります。

 

その疑いをはらしてくれそう?なのが相関係数です

 

以下のように第三者の影響を除いた「見かけの相関」を取り除いて相関係数を出してくれるというものですね。

f:id:millebon:20210515134334p:plain

相関係数とは?

Pythonで偏相関係数を出してみる!

実装はいつものとおりPython頼みです!

Scipy.Statsあたりに関数あるかな~と思ったのですが、ないみたいですね。。

ということで、またあまたあるブログよりお知恵を拝借して作成しました。

 

今回参考にさせていただいたのは以下のブログです。ありがとうございます。

cartman0.hatenablog.com

 

まず、普通にピアソンの相関係数を出してみます。data_2に相関を出したいデータがすべて入っていると想定してください。

>|Python|
import pandas as pd
cor_2= data_2.corr()
print(cor_2)
||<

cor_2の結果はこちらです。

 

array([[ 2.06213096, 0.23729669, -0.28963555, -0.34506658, -0.30974387,
-1.01414826, -0.14092344],
[ 0.23729669, 1.29826588, 0.29162403, 0.34677453, 0.2800417 ,
-0.06692941, -0.02397585],
[-0.28963555, 0.29162403, 1.38245585, 0.81203609, 0.00587289,
-0.05940651, -0.01374919],
[-0.34506658, 0.34677453, 0.81203609, 1.96962014, -0.25722581,
-0.36393852, -0.36610405],
[-0.30974387, 0.2800417 , 0.00587289, -0.25722581, 1.28210144,
0.00363923, 0.21239925],
[-1.01414826, -0.06692941, -0.05940651, -0.36393852, 0.00363923,
1.92073679, -0.29606956],
[-0.14092344, -0.02397585, -0.01374919, -0.36610405, 0.21239925,
-0.29606956, 1.29148533]])

 

そのあと、偏相関係数行列を出す関数を作成し(cor2pcor)、pcorに入れてその値を返します。正直あまり計算式はよくわかっていません。。

>|python|
import scipy as sp
from scipy import linalg
def cor2pcor(cor_2):
inv_cor = linalg.inv(cor_2)
rows = inv_cor.shape[0]
regu_1 = 1 / sp.sqrt(sp.diag(inv_cor))
regu_2 = sp.repeat(regu_1, rows).reshape(rows, rows)
pcor = (-inv_cor) * regu_1 * regu_2
sp.fill_diagonal(pcor, 1)
return pcor

pcor = cor2pcor(cor_2)
pcor
||<

出てきた結果はこちらです。

array([[ 1. , -0.14502796, 0.17154107, 0.17121962, 0.19049492,
0.50957651, 0.08635359],
[-0.14502796, 1. , -0.21767866, -0.21685734, -0.21705995,
0.04238393, 0.01851601],
[ 0.17154107, -0.21767866, 1. , -0.49210577, -0.00441129,
0.03645646, 0.0102898 ],
[ 0.17121962, -0.21685734, -0.49210577, 1. , 0.16186841,
0.18711253, 0.22954538],
[ 0.19049492, -0.21705995, -0.00441129, 0.16186841, 1. ,
-0.00231907, -0.16506197],
[ 0.50957651, 0.04238393, 0.03645646, 0.18711253, -0.00231907,
1. , 0.1879815 ],
[ 0.08635359, 0.01851601, 0.0102898 , 0.22954538, -0.16506197,
0.1879815 , 1. ]])

 

これだけだとよくわからないので、相関係数及び偏相関係数をヒートマップで表してみましょう。

>|Python|
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

sns.heatmap(cor_2, annot=True, square=True, vmin=-1, vmax=1, fmt=".2f", cmap="jet")
plt.savefig("cor_2.png")
plt.show()
||<

ピアソンの相関係数のヒートマップはこんな感じです。

f:id:millebon:20210515140625p:plain

cor_2(相関係数のヒートマップ)

同じように偏相関係数をヒートマップで表すと。。

>|python|
sns.heatmap(pcor, annot=True, square=True, vmin=-1, vmax=1, fmt=".2f", cmap="jet")
plt.savefig("pcor.png")
plt.show()
||<

タイトルが上手く表せていませんが、ピアソンの相関係数とはだいぶん違うことがお分かりいただけるかと思います。

f:id:millebon:20210515140900p:plain

pcor(偏相関係数)のヒートマップ

数学の知識不足で完全に理解はできていませんが、偏相関係数という概念が理解できたことで少しすっきりしました!