matlabで相関係数行列をヒートマップで表示する方法を調べたのでシェアします。行列を色付きで表示するアレです。
相関係数行列って?
あるデータ$\mathit{\mathbf{x}}=\left\lbrace x_1 ,x_2 ,\cdots ,x_n \right\rbrace$,$\mathit{\mathbf{y}}=\left\lbrace y_1 ,y_2 ,\cdots ,y_n \right\rbrace$があったとき、それぞれの組合せで相関を計算することができます。計算式はwikipediaから以下の通り
r=\frac{\sum_{i=1}^n \left(x_i -\bar{x} \right)\left(y_i -\bar{y} \right)}{\sqrt{\sum_{j=1}^n {\left(x_j -\bar{x} \right)}^2 }\sqrt{\sum_{k=1}^n {\left(y_k -\bar{y} \right)}^2 }}
複数のデータ列${\mathit{\mathbf{x}}}_1 ,{\mathit{\mathbf{x}}}_2 ,\cdots ,{\mathit{\mathbf{x}}}_n$があったときにこれら全ての組合せで相関係数を計算して行列化することができます。行列の各要素は次のようになっています。
R\left(i,j\right)=r_{i,j} \;\;\;\;\left(i=1,2,\cdots ,n\right)
これが相関係数行列ですね。言わずもがな$R\left(i,j\right)=R\left(j,i\right)$で、$R\left(i,i\right)=1$となります。
相関係数行列のmatlabコード
これをmatlabで実現するのは簡単です。とりあえずまずはデータ読み込みます。今回はアヤメです。
load fisheriris.mat
size(meas)
ans = 1x2
150 4
4個の説明変数のそれぞれにつき、150個のデータがありますね。
それぞれの説明変数ごとの相関係数行列は次のコードで計算できます。
R = corrcoef(meas)
R = 4x4
1.0000 -0.1176 0.8718 0.8179
-0.1176 1.0000 -0.4284 -0.3661
0.8718 -0.4284 1.0000 0.9629
0.8179 -0.3661 0.9629 1.0000
これで各変数の相関係数行列ができました。3番目と4番目の変数の相関がめちゃくちゃ高いですね。まぁ相関は単に線形の関係があるかどうか見ているだけなので必ず散布図を見ることを忘れてはいけないとは思います。
% おまけ
plotmatrix(meas)
これをみると4番目要らなくないですかね。
行列をヒートマップとして可視化
こちらにはheatmap関数というのがありました。
h = heatmap(R);
・・・色がイケてない
青が相関maxってなんか逆な感じしませんかね…。カラーマップももちろんいじれます。
h.Colormap = parula(64);
初めて使ったので知りませんでしたが、GUIで行、列の入れ替えができるんですね~。
追記(2020/7/2)
@sanmojih さんからコメントいただきました。色の範囲を指定することと、負の相関も相関アリとしてヒートマップでわかるようにすることで、さらに見やすく誤解がない可視化となります。
h.ColorLimits = [-1,1];
h.Colormap = [flipud(parula(64));parula(64)]; % parulaの場合
おわりに
ちょっと調べた内容のシェアでした。今回は短めです。
謝辞
いつも通り、eigsさんのlivescript2markdown使わせていただいてます。