いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】相関係数を求めたりヒートマップを描いたりしたい

・お題:pandasのDataFrameで得られた連続変数に関して、columnごとの相関係数を求めて、ヒートマップを作成したい。

 

・とりあえず、データセットを作成する。

import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random(20).reshape(5,4),
               columns=["A","B","C","D"])

これで、dfの中身は以下になる。

・例えば特定の列ごとの相関係数を算出したい場合、scipyのstatsを使うことができる。

from scipy import stats
stats.pearsonr(df.A,df.B)#ピアソンの相関係数

で、(0.7072447540179786, 0.18156590674547599)が返ってくる。それぞれ、correlationとpvalue。

ちなみに、

stats.spearmanr(df.A,df.B)#スピアマンの相関係数

で、SpearmanrResult(correlation=0.7, pvalue=0.1881204043741873)が返ってくる。

正規分布を仮定できるか否かで使い分けるっぽい。今回は、一様乱数を発生させたので、正規分布を仮定できないかもしれない(一方で、n=5なので、データセットから正規性を議論するのは難しいかもしれないが)。

・次に、それぞれの組み合わせをすべて求めたい。この場合はpandasで実行できる。

df2=df.corr(method="spearman")#とりあえずspearman

これでdf2の中身は以下になる。

・次に、これをヒートマップで表したい。相関係数なのだから、-1~1に収まり、0を真ん中として解釈したい。seabornのheatmapで描いてみた。

import seaborn as sns
sns.heatmap(df2, vmax=1, vmin=-1, center=0,cmap="bwr",square=True)

これで一応目的の図示はできた。

相関係数も図示したい場合、引数annot=Trueを加える。

sns.heatmap(df2, vmax=1, vmin=-1, center=0,cmap="bwr",square=True, annot=True)

 

 

 

おわり。