pandas: 相関行列の作成と解釈サポートのための可視化

pandasはデータサイエンス、データアナリシス、機械学習の分野で広く利用されているpythonのオープンソースパッケージです。

ワカメさん

この記事は「pandasを使った相関行列の作成方法」をまとめます。

この記事がカバーする内容
  • 何のために相関行列を使うか
  • pandasでどのように相関行列を作成するか
  • どうやって相関行列の結果を整理するか
スポンサーリンク

相関行列

相関行列(Correlation matrix)は、異なる変数同士の相関係数をまとめたテーブルです。相関係数行列は、全ての変数の組み合わせに対する相関係数を示します。

相関行列は、大きなデータセットの要約、データの特徴・パターン特定を目的に扱います。

相関行列に記述されている相関係数(Correlation coefficient)は、2変数間の直線的関係の強さを示します。相関係数は\([-1,1]\)の実数です。

相関係数が1に近ければ「正の相関」、相関係数が-1に近ければ「負の相関」があると言います。また、相関係数が0に近ければ「無相関」であると言います。

ワカメさん

注意点として「相関関係だけでは因果関係を断定できない」ということが、よく強調されます。

Example of correlation coefficient.

Figure1. Example of correlation coefficient (1)

ヒトデちゃん

相関係数はどうやって算出されるんでしょうか?

ピアソンの相関係数を\(\rho\)、変数\(\boldsymbol{x}\)と\(\boldsymbol{y}\)の共分散を\(Cov(\boldsymbol{x},\boldsymbol{y})\)、変数\(\boldsymbol{x}\)と\(\boldsymbol{y}\)それぞれの標準偏差を\(\sigma_{\boldsymbol{x}},\sigma_{\boldsymbol{y}}\)とおくと、相関係数は以下の式から算出されます。

$$\rho_{\boldsymbol{xy}}=\frac{Cov(\boldsymbol{x},\boldsymbol{y})}{\sigma_{\boldsymbol{x}} \sigma_{\boldsymbol{y}}}$$

相関係数の種類には、「ピアソンの積率相関係数」「スピアマンの順位相関係数」「ケンドールの順位相関係数」などがあります。多くの場合、相関係数と言われれば、ピアソンの積立相関係数を意味しています。

相関行列の作成

データフレームを扱うパッケージpandasを使って、相関行列を作成します。

scikit-learnから糖尿病に関するデータセットを例として使用します。

import pandas as pd
from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
df = pd.DataFrame(diabetes.data, columns = diabetes.feature_names)

以下のデータフレーム (df)を作成しました。このデータは糖尿病患者442名の基礎項目と血液検査項目から構成されています。

>>>df
        age       sex       bmi  ...        s4        s5        s6
0    0.038076  0.050680  0.061696  ... -0.002592  0.019907 -0.017646
1   -0.001882 -0.044642 -0.051474  ... -0.039493 -0.068332 -0.092204
2    0.085299  0.050680  0.044451  ... -0.002592  0.002861 -0.025930
3   -0.089063 -0.044642 -0.011595  ...  0.034309  0.022688 -0.009362
4    0.005383 -0.044642 -0.036385  ... -0.002592 -0.031988 -0.046641
..        ...       ...       ...  ...       ...       ...       ...
437  0.041708  0.050680  0.019662  ... -0.002592  0.031193  0.007207
438 -0.005515  0.050680 -0.015906  ...  0.034309 -0.018114  0.044485
439  0.041708  0.050680 -0.015906  ... -0.011080 -0.046883  0.015491
440 -0.045472 -0.044642  0.039062  ...  0.026560  0.044529 -0.025930
441 -0.045472 -0.044642 -0.073030  ... -0.039493 -0.004222  0.003064
[442 rows x 10 columns]

このデータセットの相関行列はdf.corr()から得ます。

df_corr = df.corr()

定義したdf_corrを確認すると、それぞれの変数同士の相関係数をまとめた相関行列が得られました。

>>>df_corr
          age       sex       bmi  ...        s4        s5        s6
age  1.000000  0.173737  0.185085  ...  0.203841  0.270774  0.301731
sex  0.173737  1.000000  0.088161  ...  0.332115  0.149916  0.208133
bmi  0.185085  0.088161  1.000000  ...  0.413807  0.446157  0.388680
bp   0.335428  0.241010  0.395411  ...  0.257650  0.393480  0.390430
s1   0.260061  0.035277  0.249777  ...  0.542207  0.515503  0.325717
s2   0.219243  0.142637  0.261170  ...  0.659817  0.318357  0.290600
s3  -0.075181 -0.379090 -0.366811  ... -0.738493 -0.398577 -0.273697
s4   0.203841  0.332115  0.413807  ...  1.000000  0.617859  0.417212
s5   0.270774  0.149916  0.446157  ...  0.617859  1.000000  0.464669
s6   0.301731  0.208133  0.388680  ...  0.417212  0.464669  1.000000
[10 rows x 10 columns]

スピアマンの順位相関を得たい場合、df.corr(method='spearman')から、ケンドールの順位相関を得たい場合、df.corr(method='kendall')から相関係数の計算方法を変更できます。

相関行列を作成する方法としては以上です。

ヒトデちゃん

こんな簡単な操作で相関行列が作れるんですね!

相関行列の可視化

大きなデータセットの相関行列を作成した場合、変数が多すぎて結果の要約に苦労することがあります。ここでは、作成した相関行列の解釈をサポートするための可視化方法の例2つまとめます。

ヒートマップ

相関行列のヒートマップは、相関係数の大きさに応じてカラープロットで可視化する方法です。ヒートマップは、どの変数同士が線形関係・非線形関係にあるかの判断をサポートします。

Figure2. Heatmap

ヒートマップは、例えば、seaborn.heatmapから作成できます。

import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(df_corr,annot=True,cmap="bwr")
plt.show()
ワカメさん

ヒートマップのカラーはmatplotlib.colormapで変更できます。例はcmap="bwr"を使用していますが、カラーマップを指定すればヒートマップのカラーが変わります。

クラスターマップ

クラスターマップは、ヒートマップと階層クラスタリングを組み合わせて可視化する手法です。階層クラスタリングを利用して、似た特徴の変数をグループ化してまとめることができます。

Figure3. Clustermap

クラスターマップは、例えば、seaborn.clustermapから作成できます。

sns.clustermap(df_corr,annot=True,fmt=".2f",cmap="bwr")
plt.show()
ワカメさん

変数同士をグループにまとめると、相関行列の解釈がしやすくなりますね。

まとめ

この記事は相関行列についてまとめました。

相関行列
  • 相関行列(Correlation matrix)は、異なる変数同士の相関係数をまとめたテーブル
  • pandasではdf.corr()から相関行列を取得
  • ヒートマップ、クラスターマップは相関行列の解釈をサポート
ワカメさん

相関行列を扱ってみる入口としてはこの内容で十分だと思います。可視化方法は、networkxで可視化する方法など、様々ありますので、意欲あればいろいろとアレンジしてみてください。

この記事は以上です。最後まで読んで頂きありがとうございました。

参考資料

(1) Wikipedia, 相関係数 (2023/3/15アクセス)

(2)pandas, pandas.DataFrame.corr (2023/3/29アクセス)

スポンサーリンク
この記事が気にいったらシェアしてね!
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
ABOUT US
ワカメ
Data Scientist, Master of Data Science & Master of Engineering in Material Science
このブログは以下2点を目的に運営.
1. 管理人の学び・体験の復習機会
2. 海外留学を目指す方の参考情報
趣味の範囲で淡々と更新します.
*ブログ・SNSは所属組織と無関係の個人発信.