本ページはプロモーションが含まれています

広告 Analysis R データ分析

R | 複数の変数に対して相関分析をする方法(相関行列、多重比較)

複数の変数について、総当たりで相関分析をしたい!

変数間の相関について、グラフで一気に見たい!

これらの疑問を解決します。

この記事では、複数の変数間の相関分析を一挙に行う方法についてご紹介します。

この記事で説明していること

以下の項目について説明しています。

  • データフレームにおける列名の変更方法
  • 複数の変数に対する相関分析
  • 変数間の相関グラフの描画
  • エラーが出た場合の対処法

今回使用しているデータ

今回は、treesというRに元々入っているデータを用いて解説します。そのため、Rをインストール済みの人なら誰でもすぐに実践することができます!

treesデータセットについて

31本のブラックチェリーの木の直径、高さ、体積のデータセットです。

treesデータセットのヘルプページに記載されているように、直径(Diameter)が、"Girth"という名前でラベルづけされてしまっているので注意してください。

ヘルプは ?trees とRに入力・実行すれば出てきます。
(こちらの記事のヘルプの見方をご参考ください)。

Description
This data set provides measurements of the diameter, height and volume of timber in 31 felled black cherry trees. Note that the diameter (in inches) is erroneously labelled Girth in the data. It is measured at 4 ft 6 in above the ground.

treesデータセットのヘルプから引用


では、早速Rに head(trees) と入力して、データセットの中身を確認してみましょう。
当ブログでは、黒字が入力コード青字がRから返されるコードとして記載しています。

head(trees) # treesデータセットの先頭6行を確認する

> head(trees)
  Girth Height Volume
1   8.3     70   10.3
2   8.6     65   10.3
3   8.8     63   10.2
4  10.5     72   16.4
5  10.7     81   18.8
6  10.8     83   19.7

前述の通り、直径(Diameter)が "Girth"とラベル付けされています。分かりにくいので、GirthをDiameterとして列名を変更しましょう。

補足:列名の変更

列名の変更には、dplyrパッケージのrename関数を使用します。
dplyrパッケージはtidyverseパッケージの中に含まれているので、tidyverseを読み込みます。

#tidyverseをインストール済みの人は無視してください
install.packages("tidyverse") 

# tidyverseを読み込む
library(tidyverse) 

tidyverseを読み込めば、いろいろなパッケージ(ggplot2やdplyr, readrなど)が読み込まれるので便利です。dplyrって覚えにくいですしね...ちなみにdplyrはディープライヤーと読むらしいです。調べて初めて知りました。なんか適当にディスプレイって心の中で読んでました。。

話を戻します。
直径(diameter)が誤って Girthとラベル付けされているので列名の変更をします。

rename関数では、

 rename(データセット, 変更後の名前 = 変更前の名前)

と入力します。

# treesのコピーとしてtrees2を作る
trees2 <- trees 

# trees2の列名Girthを、Diameterに変更する
trees2 <- rename(trees2, Diameter = Girth) 
colnames(trees2) # 列名を確認する

> colnames(trees2)
[1] "Diameter" "Height"   "Volume"  

colnames関数でtreesデータセットの列名を出力しています。
GirthをDiameterに変更することができました!

では、データの読み込みまで終わったのでメインの相関分析をしてみましょう。

複数の変数間の相関分析

2変数の相関にはcor.test関数を使用しましたが、複数の変数間の相関分析ではpsychパッケージのcorr.test関数を使用します。

psychの読み方はおそらく”サイク"だと思います。
psychological researchを行うために作られたパッケージのようです。

Overview of the psych package.
The psych package has been developed at Northwestern University to include functions most useful for personality and psychological research.

psychパッケージのヘルプから引用

psychパッケージをインストールし、開く

パッケージをインストールし、開きます。

#すでにインストール済みの人は無視してください
install.packages("psych") 

library(psych) #psychパッケージを開く

複数の変数に対して相関分析を総当たりで行う

相関分析はcorr.test関数で行います。
corr.testでは、相関係数、p値、t値などを一気に算出することができます。
手持ちデータで解析をしていてエラーが出てしまった人は、エラーが出た場合の対処法をご覧ください。

◆ピアソンの相関係数の場合

corr.test関数では、デフォルトで特に何も指定しなければピアソンの相関係数が算出されます。

# kekkaオブジェクトに、trees2の相関分析結果を入れる
kekka <- corr.test(trees2) 

◆スピアマンの場合

spearmanの場合は、method = "spearman" を入れます。

kekka <- corr.test(trees2, method = "spearman")

◆ケンドールの場合

kendallの場合は、method = "kendall" を入れます。

kekka <- corr.test(trees2, method = "kendall")

相関分析結果を表示する

では、結果を見てみましょう。

Rに kekka  と入力し、実行すると相関係数とp値が確認できます。
ここでは、ピアソン相関の結果を確認します。

# 相関分析の結果を表示する
kekka

> kekka
Call:corr.test(x = trees2)
Correlation matrix 
         Diameter Height Volume
Diameter     1.00   0.52   0.97
Height       0.52   1.00   0.60
Volume       0.97   0.60   1.00
Sample Size 
[1] 31
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
         Diameter Height Volume
Diameter        0      0      0
Height          0      0      0
Volume          0      0      0

 To see confidence intervals of the correlations, print with the short=FALSE option

Correlation matrixが相関係数, Probability valuesがp値を示しています。
p値が丸められちゃってるので、print関数で小数点以下5桁まで表示します。

# kekkaを小数点以下5桁で表示する
print(kekka, digits = 5)  

> print(kekka, digits = 5)
Call:corr.test(x = trees2)
Correlation matrix 
         Diameter  Height  Volume
Diameter  1.00000 0.51928 0.96712
Height    0.51928 1.00000 0.59825
Volume    0.96712 0.59825 1.00000
Sample Size 
[1] 31
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
         Diameter  Height  Volume
Diameter  0.00000 0.00276 0.00000
Height    0.00276 0.00000 0.00076
Volume    0.00000 0.00038 0.00000

 To see confidence intervals of the correlations, print with the short=FALSE option

kekka$r と入力し、出力すれば相関係数のみを確認できます。
分析結果を他の変数に格納する場合にも使います。

# 相関係数rを確認する
kekka$r

> kekka$r
          Diameter    Height    Volume
Diameter 1.0000000 0.5192801 0.9671194
Height   0.5192801 1.0000000 0.5982497
Volume   0.9671194 0.5982497 1.0000000


p値を見る場合は kekka$p と入力します。

#p値の結果を、変数test に入れる
test <- kekka$p
test

> test
             Diameter       Height       Volume
Diameter 0.000000e+00 0.0027578148 2.593300e-18
Height   2.757815e-03 0.0000000000 7.567647e-04
Volume   8.644334e-19 0.0003783823 0.000000e+00

\ オンラインでR言語を勉強するならUdemy /

UdemyのR講座を見てみる

検定の繰り返しを考慮したい場合(多重比較)

corr.test関数では、検定の繰り返し(多重比較)をした場合のp値も算出されます。

p値の結果における上三角部分(ピンク)は検定の繰り返しを考慮した有意確率(p値)、下三角()は繰り返しを考慮しない有意確率を示しています。

繰り返しを考慮したp値は、特に何も指定していなければ "holm" 法で算出されます。

# 特に何も指定しない場合は "holm" 
corr.test(trees2)


例えばボンフェローニで補正する場合は以下のコードになります。

corr.test(trees2, adjust = "bonferroni")

そのほかの調整については、corr.testのヘルプを見れば確認できます。関数の前に?マークをつけて実行すると、Rstudioの右下画面にヘルプが出てきます。

# corr.testのヘルプを見る
?corr.test 
?corr.testを実行した場合のヘルプ画面のadjust部分のキャプチャ

エラーが出た場合の対処法

手持ちデータで相関分析をした場合に、エラーが出た時の対処法についてです。

corr.test関数でエラーが出る主な原因は、”データセットに数値(numeric)以外のデータが入っている場合”で、以下のようなエラーが返されます。

Error in cor(x, use = use, method = method) : 'x' must be numeric

その場合は、データセットの数値列のみを選択してcorr.test関数に入れてあげる必要があります。

例えば、treesのデータセットが以下のようになっていたと仮定します。
Categoryという列で、"black cherry"という木の名前が追加されています。

>head(trees3)

  Girth Height Volume    Category
1   8.3     70   10.3 blackcherry
2   8.6     65   10.3 blackcherry
3   8.8     63   10.2 blackcherry
4  10.5     72   16.4 blackcherry
5  10.7     81   18.8 blackcherry
6  10.8     83   19.7 blackcherry

この状態でcorr.test関数で相関行列を見てみると以下のようにエラーが出ます。

corr.test(trees3)

> corr.test(trees3)
Error in cor(x, use = use, method = method) : 'x' must be numeric

理由は前述の通り、trees3データセットに数値以外の列(Category列)が存在するためです。trees3で相関行列を求めるには、数値のみの列を選択する必要があります。

数値のみの列を選択する記述方法はいろいろありますが、ここでは3つ紹介します。やりやすい方法で列選択してくださいね!

# 記述方法(1)
corr.test(trees3[,1:3]) # trees3の1から3列目を使う

# 記述方法(2)
# 変数varに、相関分析をしたい変数を入れる
var <- c("Girth", "Height", "Volume")
corr.test(trees3[, var]) 

# 記述方法(3)
# 変数soukanに、trees3の1から3列目を入れる
soukan <- trees3[, 1:3]
corr.test(soukan)

変数間の相関グラフの描画

変数間の相関グラフは以下のコードで確認できます。簡単に相関を見たい場合に便利です。

plot(trees) # 変数間の相関図を描画する

まとめ:複数の変数間の相関分析はcorr.test関数で一撃!

今回は複数の変数間の相関行列について紹介しました。

corr.test関数のまとめは以下の通りです。

# ピアソン相関
corr.test(trees)

# スピアマンは method で指定
corr.test(trees, method = "spearman")

# ケンドールも同様
corr.test(trees, method = "kendall")

# 多重比較の調整
# ボンフェロー二の場合
corr.test(trees, method = "spearman", adjust = "bonferroni")

この記事がどなたかの役に立つことを祈っております!

R言語の勉強におすすめの本

今後Rの勉強をしていきたい!という方に、こちらの参考書がおすすめです。
特に、RユーザのためのRStudio実践入門は、tidyverseパッケージに特化して書かれていてとても実用的でしたのでオススメです。私自身、この本を読んでRで出来ることが一気に増えた実感のある本です。kindleで試し読みもできるのでぜひ参考にしてください。


\ オンラインでR言語を勉強するならUdemy /

UdemyのR講座を見てみる



  • この記事を書いた人

かにさん

めんどくさがり日本代表のワーママ。
住んでいる自治体の認可保育料が高いことをキッカケに、全国の保育料まとめブログを書き始めました。
趣味
ブログ執筆、海外ドラマ(刑事モノ)、投資、
面倒なことをいかに楽にこなすか考えること

-Analysis, R, データ分析