前回の記事では相関係数と相関係数の検定を行う方法を紹介しました。


ただ複数の列がある場合1つずつ相関係数を調べるのは大変な作業です。
今回は相関行列について紹介します。


1.使うデータ

今回はこちらのダミーデータを使います。

歩行が自立しているか(0:非自立、1:自立)と各種データが入っています。
スクリーンショット 2020-07-15 5.42.46



性別が男性・女性になっています。

url <- "https://raw.githubusercontent.com/mitti1210/myblog/master/data01.csv"
dat <- read.csv(url)
dat$氏名 <- NULL  #氏名の列を削除


2.GGallyパッケージのggpairs関数

相関係数を手早く確認する方法としてGGallyパッケージggpairs関数があります。
この方法のメリットは相関係数と散布図が同時に見れサクッとわかるです。

library(tidyverse)
library(GGally)
ggpairs(dat)
スクリーンショット 2020-07-15 9.30.36


左下に散布図、右上には相関係数とまとめて表示されます。
数値と数値の場合は散布図、カテゴリーと数値の場合はヒストグラムと箱ひげ図が表示されます。

もしmacで日本語が□□と文字化けしていたらもう1行追加します。

ggpairs(dat)+
  theme_gray(base_family = "HiraKakuPro-W3")
スクリーンショット 2020-07-15 9.30.47



そしてggpairsの便利な機能としてはあるカテゴリーごとに色を付けることができます。
aes_string(colour="カテゴリーの列", alpha=0.5)を追加します。
カテゴリーの列はcharactor型、もしくはfactor型である必要があります(数値型だとダメ)
alphaは色の透過の程度なので0.7あたりでも大丈夫です。
ggpairs(dat,aes_string(colour="性別", alpha=0.5))
スクリーンショット 2020-07-15 9.29.32





3.cor関数とcorrplotパッケージを使う

次にcor関数corrplotパッケージで相関行列を作成します。
この方法のメリットはp値が計算できる、pythonっぽい相関行列のグラフが作れるです。

散布図行列を求めるにはcor関数を使います。

ただ男性・女性のような文字は対応できないので0,1に置き換えます。
dat$性別 <- ifelse(dat$性別 == "男性", 0, 1)

c <- cor(dat)
c
スクリーンショット 2020-07-15 9.42.04


四捨五入する時はround関数を使います。
round(c,2)
スクリーンショット 2020-07-15 9.42.38


もしスピアマンの相関係数を求めるのであればmethod="spearman"を追加します。
c <- cor(dat, method = "spearman")

ただ数値の羅列は中々見にくいものです。そこでcorrplotパッケージのcorrplot関数を使いグラフにします。
corrplot(c, method = "color", addCoef.col = TRUE)
method="color"はグラフの見た目、addCoef.col = TRUEはグラフに数値を入れるオプションなのでそのままコピペで大丈夫です。変更するのはcのところで、ここには先程もとめた相関行列を指定します。

c <- cor(dat, method = "spearman")
cの部分です。もちろん違う名前でも大丈夫です。

もしmacで日本語文字化けの問題があれば1行追加します。
par()関数はフォントの指定ができます。

library(corrplot)
par(family="HiraKakuPro-W3") #macで日本語が文字化けするときに追加。ここでフォントの指定ができる
corrplot(c, method = "color", addCoef.col = TRUE)
スクリーンショット 2020-07-15 9.47.46
これでかなり見やすくなりました。pythonっぽいです。


検定をしてp値を求める

p値を求めるのであればcorrplotパッケージのcor.mtest()関数を使います。
cor.mtestはp値、95%信頼区間の下限、上限の3つが表示されます。スピアマンの相関係数の場合はmethod = "spearman"を追加するだけなのですが、同値(タイ)があると95%信頼区間が出ないようです。

p <- cor.mtest(dat)
p
スクリーンショット 2020-07-15 7.20.20

p$p:p値
p$lowCI:95%信頼区間の下限
p$uppCI:95%信頼区間の上限

先程の相関行列にp<0.05かそうでないかを出すこともできます。
p.mat:p値の行列(ここではp$p。上の図をよく見ると$pと書いてあります。)
sig.level = ◯◯(0.05 にしたり、0.2に設定することもあります)

corrplot(c, method = "color", addCoef.col = TRUE, p.mat = p$p, sig.level = 0.05)
スクリーンショット 2020-07-15 10.33.07

これで有意差があるものがどれか一目瞭然です。


4.corrrパッケージを使う

もう一つcorrrパッケージを紹介します。
この方法のメリットは相関が高い組み合わせ順が知りたい!というときに便利です。

相関行列を出す時はcor関数でなくcorrelate関数を使います。
使い方はcor関数と同じです。cor→correlateに変わるだけです。
スピアマンの相関係数にしたい時はmethod="spearman"を追加すればOKです。

c <- correlate(dat, method = "spearman")
c
スクリーンショット 2020-07-15 10.41.13


マイナスの値が赤字になっただけでここまでは今までと違いはありませんが、corrrの便利な所はここからになります。

まずcorrr関数は第2章で扱ったtidyverseと同じ%>%が使えます。

右上と左下は同じものなので片方を削除することができます。削除するにはshave関数を使います。
c %>% shave()
スクリーンショット 2020-07-15 10.45.16



これで左下だけになりました。

次に行列形式ではなくlong形式に変換します。streach関数を使います。
streach(na.rm=TRUE)とするとNAとなっているいらない列を消すことができます。

c %>% shave() %>% stretch(na.rm = TRUE)
スクリーンショット 2020-07-15 10.55.02



次に並べ替えます。arrange関数を使います。何も指定しなかければ相関係数が高い順から並びます。
c %>% shave() %>% stretch(na.rm = TRUE) %>% arrange()
スクリーンショット 2020-07-15 10.55.14
スクリーンショット 2020-07-15 10.55.31


ただ注意しないといけないのが相関係数は-1〜1の値を取ります。
相関がないのは0付近で、-1は1と同様に強い相関があります。
なので相関が強い順に並べるには相関係数の絶対値で並び替える事が必要になります。
相関係数の列名はrになっています。abs関数が絶対値を求める関数なのでabs(r)となります。

c %>% shave() %>% stretch(na.rm = TRUE) %>% arrange(abs(r))
スクリーンショット 2020-07-15 10.55.31


そしてこれだと相関係数が0に近い方から並んでしまったので順番を逆にします。
順番を逆にするにはdesc(並べ替えたい列)を使います。
並べ替えたい列はabs(r)でした。desc(abs(r))とします。
()が多くなってエラーが出やすくなるので注意してください。

c %>% shave() %>% stretch(na.rm = TRUE) %>% arrange(desc(abs(r)))
スクリーンショット 2020-07-15 10.55.45

相関行列を1個ずつ見てると見落としがちですが、これなら見落とすことはありません。


5.相関係数の有意差がないってどういう意味?

スクリーンショット 2020-07-15 10.33.07

ところで×がついた項目(p値が有意水準に満たさなかった)というのはどういう意味でしょうか?
これは相関係数が低いから有意差が出ないわけではありません。

相関係数の検定は「相関係数が0である」と仮説を立てます。
そしてデータから信頼区間を求め、信頼区間に0が含まれているかを調べます。
その時もし信頼区間に0が含まれていたら有意差なしとなります。

例えば上の図でいうと性別×BBSを見ると相関係数が-0.13となっています。
ただ95%信頼区間を見ると-0.27〜0.007となっています。
つまり今回は計算上-0.13となったけど実は信頼区間にマイナスの値も0もプラスの値も入っていて、符号が変わる可能性がある→正の相関があるとも負の相関があるとも言えないよね。といったニュアンスになります。もし95%信頼区間が-0.27〜-0.001であれば符号が変わらないため有意差あり(p<0.05)となります。ただ相関係数0.13というのはほとんど相関がないという意味ではありますが...

つまり相関係数の検定のp値は出した相関係数の符号が変わる可能性が高いのか低いのか?を見る検定と考え、p値が低いから相関係数が強いんだという意味ではないことに注意が必要です。相関の強さはあくまでもp値ではなく相関係数の値で評価します。



6.まとめ

今回は相関行列を紹介しました。

相関行列を出すだけならEZRでもできますが、検定やグラフの作成はEZRだけではできません。

他にもいろいろな方法はあるのですが、今回は3パターン紹介しました。

ただGGallyやcorrrはもっといろいろなことができます。

もっと詳しく知りたい方は以下のサイトがおすすめです!