ピープル・アナリティクスケーススタディ:複数の変数の相関係数を一度に出力!
相関係数を一度に出力する方法
前回はネットワーキングとイノベーションに相関性があるかということで1対1の相関係数を算出しました。
今回のお題は「イノベーションを予測する変数を複数の中から選択せよ」というものです。
複数の変数には仕事のコミットメント、社員のやる気、キャリア意識、組織へのコミットメント、自主性、他者と連携を促す活動。。などいくつかあります。
お題に出てくる変数の種類はともかく、何が望ましい行動(今回であればイノベーション)をもたらす要因がなにかということを特定するのは人事としてはやりたいことの一つですね。
相関係数をPythonで出すだけなら前回と同じようにPandasを使って”データフレーム名.corr”で一度に出力することができます。
>|python|
import pandas as pd
df=pd.read_excel('AIHR_Statistics_dataset_2018.xlsx')
net=df.loc[:,["MEANINNOVATION", "MEANNORMCOMMIT", "MEANTI","MEANENGAGEMENT", "MEANPERSONALINIT","CSMnetworking","MEANCSM","MEANORGCOMMITMENT","MEANPROFCOMMIT","MEANTIMEPRESSURE","CLAGE","CLWORKEXP","CLGENDER"]]
cor=net.corr()
cor
||<
注:netでもともとのデータに入っていた列の中で関係のありそうな変数のみを抽出しています。
結果はこんな感じです。横にもそれぞれの変数の相関係数がでていますが、今回はInnovation(変数名:MEANINNOVATION)にかかる相関だけ見たいので割愛しています)
とても簡単ですね。簡単すぎて怖いくらいです。。
可視化の方法としては①ヒートマップ、②散布図があります。
ヒートマップはSeabornを使えば、先ほどのcor変数を入れ込むだけで簡単に作れます。
>|python|
import seaborn as sns
sns.heatmap(cor, vmax=1, vmin=-1, center=0)
||<
ちょっと変数も多くてわかりにくいのですが、赤・青色とも薄い方が相関性が強いので、MEANTIやMEANPERSONALINIT、CSMNetworkingやMEANCSM、CLGENDERあたりが他よりも強いのかな。。という感じです。(今回は手法の説明がメインなのでそれぞれの変数がどういう意味を持つかは気にしないでください。。)
ヒートマップ出力結果
一方散布図はSeabornのペアプロット図を出力する1行を書けば一気に表示されますが、また見にくいです。。
>|Python|
sns.pairplot(net)
||<
ペアプロット出力結果
MEANINNVOATIONと他の変数の相関関係を観たいのであれば、matplotlibでPythonで出すだけなら前回と同じようにPandasを使って”データフレーム名.corr”で一度に出力することができます。
>|Python|
from matplotlib import pyplot as plt
for col in ([ "MEANNORMCOMMIT", "MEANTI","MEANENGAGEMENT", "MEANPERSONALINIT","CSMnetworking","MEANCSM","MEANORGCOMMITMENT","MEANPROFCOMMIT","MEANTIMEPRESSURE","CLAGE","CLWORKEXP","CLGENDER"]):
net.plot(col, 'MEANINNOVATION', kind='scatter')
||<
以下出力結果の一部です。スクロールしていけば各変数とMEANINNOVATIONの相関性について大きな散布図で確認できます。
散布図出力結果(一部)
p値も一緒に出力したいのなら・・
こんなに簡単に出ると「これでいいのかしら?」と思ってしまうのが世の常(?)
そもそもこの相関係数が有意であるかどうかを確認しようと相関係数のp値も出すこととしました。
参考にさせていただいたのはこちらのブログです。
ただし、こちらのプログラムは欠損値があるとうまくいかないので、元のnetというデータから年齢で欠損値があった2行を除いたnet_wnullというデータを作成して回しています。
>|Python|
#p値の検出
import itertools
import numpy as np
from scipy.stats import pearsonr
for i, j in itertools.combinations(net_wnull, 2): #組み合わせでforループを実行
x = net_wnull.loc[:,[i]].values
y = net_wnull.loc[:,[j]].values
a, b = pearsonr(np.ravel(x), np.ravel(y)) # リストを整形し相関係数:aとp値:bの計算
if b.round(10) < 0.10: # p値 < 0.10print("=" * 45)
print(i + "----" + j)
print("相関係数:", a.round(4))
print("p値:", b.round(4))
||<
MEANINNOVATIONとの相関結果はこんな感じです。そもそもP値が0.1より小さいものに絞っているため、元の変数よりも少ない結果になっています。
- MEANINNOVATION----MEANTI 相関係数: 0.6484 p値: 0.0
- MEANINNOVATION----MEANPERSONALINIT 相関係数: 0.3147 p値: 0.0038
- MEANINNOVATION----CSMnetworking 相関係数: 0.4498 p値: 0.0
- MEANINNOVATION----MEANCSM 相関係数: 0.3899 p値: 0.0003
- MEANINNOVATION----CLGENDER 相関係数: -0.3473 p値: 0.0013
結論としては
イノベーションと関係がありそうな変数は
正の相関性があるものは MEANTI, MEANPERSONALIT, CSMnetworking, MEANCSMの4つ、負の相関はCLGENDERの1つという感じですね。
次の作業としては前回行ったように、この絞られた変数の外れ値を確認して再度相関関係を回すといいのでしょう。
今回はここまでで。。