0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【R】相関分析についてデータの前処理から流れで実行してみる

Posted at

相関分析に限った話ではないですが、データを扱う際は前処理がとても大事。
しかし、Rっていまいちデータの形や加工がわかりにくい(気がする)。

こんな感じのデータ(アンケートなど)があったとして

>data <- read.csv(file="filepath/data.csv", header=TRUE)

>data
    Score1 Score2 Score3 Score4 Score5 Score6 Score7 Score8 Score9
1       10      0      4      4      4      4      4      4      4
2        9      3      6      6      5      6      6      6      6
3        8      6      6      6      6      6      6      6      5
4       10     10      6      6      6      6      5      6      6
5        9      1      6      6      4      6      5      6      6
6        7      6      6      6      4      6      6      5      6
7        9      2      6      6      6      6      6      5      5
8        6      2      5      5      5      5      5      5      5

これらの各変数の相関係数を見たいとします。
相関係数がなんぞやみたいな部分には触れませんが、変数の間に何らかの関係性が見えたら嬉しいなという目的で見ます。

まずはやってみる

そのためには次のようにcor()を使いますが、実行するとエラーになりました。

>cor(data)

cor(data) でエラー:  'x' は数値でなければなりません 

データは数字に見えますが、なぜか動きません。
次のように各変数がどうなっているのかを見たところ"character"ばかりになっていました。

>sapply(data, class)
     Score1      Score2      Score3      Score4      Score5      Score6      Score7      Score8      Score9 
"character" "character" "character" "character" "character" "character" "character" "character" "character" 

数値じゃないとエラーになるので、数値型に変換します。
intergerかnumericがあるので、どちらかに変換します(正直、違いはわかってません)

>n<-ncol(data)
>data.num<-lapply(data[1:n],as.numeric)

 警告メッセージ: 
1:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
2:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
3:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
4:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
5:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
6:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
7:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
8:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 
9:  lapply(data[1:n], as.numeric) :   強制変換により NA が生成されました 

警告メッセージがたくさんありますが、これは数字じゃない部分がNAというデータがないことを表すものに強制的に変換されたようです。

さて、data.numに数字に変換したものを格納しました。
これをもとに再度cor()を実行してみると

>cor(data.num)
cor(data.num) でエラー: 
   'x' to 'y' の両方を与えるか行列形の 'x' を与えてください 

また新たなエラーが出てきました。
どうやら「data」とは中身が異なるようです。

>is.data.frame(data)
[1] TRUE

>is.data.frame(data.num)
[1] FALSE

もともとはdataframeという形式で用意していたものが、値を変換する際に変わってしまったようです。
個人的にはdataframeのほうが扱いやすいと思っているので、変換を行います。

>df <- as.data.frame(data.num)
>is.data.frame(df)

[1] TRUE

dataframeであることが確認できました。

改めて相関分析

>cor(df)

       Score1 Score2 Score3 Score4 Score5 Score6 Score7 Score8 Score9
Score1      1     NA     NA     NA     NA     NA     NA     NA     NA
Score2     NA      1     NA     NA     NA     NA     NA     NA     NA
Score3     NA     NA      1     NA     NA     NA     NA     NA     NA
Score4     NA     NA     NA      1     NA     NA     NA     NA     NA
Score5     NA     NA     NA     NA      1     NA     NA     NA     NA
Score6     NA     NA     NA     NA     NA      1     NA     NA     NA
Score7     NA     NA     NA     NA     NA     NA      1     NA     NA
Score8     NA     NA     NA     NA     NA     NA     NA      1     NA
Score9     NA     NA     NA     NA     NA     NA     NA     NA      1

さて、実行はてきたものの、明らかに変なものが出てきてしまいました。

先程、NAに強制変換されたものをチェックしてみます

df[!complete.cases(df),]

     Score1 Score2 Score3 Score4 Score5 Score6 Score7 Score8 Score9
610      NA      5      5      6      5      6      5      5      5
749      NA      7      6      6      6      6      6      5      5
960      NA     NA     NA     NA     NA     NA     NA     NA     NA
1477     NA     NA     NA     NA     NA     NA     NA     NA     NA
1545     NA      5      5      5      5      5      5      5      5
1628     NA     NA     NA     NA     NA     NA     NA     NA     NA
2206     NA      2      5      5      5      5      5      6      6

たくさんのNAが見つかりました。このままだと分析ができないようなので、NAが入っているものはまとめて消し去ります。

>df.om <- na.omit(df

>cor(df.om)

          Score1     Score2    Score3    Score4    Score5     Score6     Score7    Score8    Score9
Score1 1.0000000 0.29661111 0.2760750 0.2557100 0.2369902 0.27303887 0.20265788 0.3590587 0.4011898
Score2 0.2966111 1.00000000 0.1187151 0.1031597 0.0917925 0.09925027 0.07854108 0.1543527 0.1554024
Score3 0.2760750 0.11871507 1.0000000 0.7186500 0.6461274 0.59996621 0.57148358 0.5892070 0.5145922
Score4 0.2557100 0.10315967 0.7186500 1.0000000 0.6823484 0.57285505 0.62339528 0.5011205 0.5206750
Score5 0.2369902 0.09179250 0.6461274 0.6823484 1.0000000 0.59823126 0.64174583 0.4310555 0.4228794
Score6 0.2730389 0.09925027 0.5999662 0.5728550 0.5982313 1.00000000 0.60774455 0.4758982 0.4560535
Score7 0.2026579 0.07854108 0.5714836 0.6233953 0.6417458 0.60774455 1.00000000 0.3931223 0.3757161
Score8 0.3590587 0.15435272 0.5892070 0.5011205 0.4310555 0.47589816 0.39312229 1.0000000 0.8228832
Score9 0.4011898 0.15540243 0.5145922 0.5206750 0.4228794 0.45605350 0.37571611 0.8228832 1.0000000

ようやく実行ができました。
相関係数の見方は諸説あるようですが、いくつか中程度以上の相関がある項目が見受けられます。
各変数が何を示しているかをチェックすることで思ってもみなかった関係性が見つかることもあるかもしれません。(実際にはこの変数はとあるアンケートの数字なのですが、比較的似たような設問ではあったので、そりゃそうだよねっていうイマイチな結果でした)

他にもこんな出し方

一見、似たようなものですが、データの行数だったり検定まで行ってくれます。

>install.packages("psych")
>library(psych)

>corr <- corr.test(df.om)

>corr$r
          Score1     Score2    Score3    Score4    Score5     Score6     Score7    Score8    Score9
Score1 1.0000000 0.29661111 0.2760750 0.2557100 0.2369902 0.27303887 0.20265788 0.3590587 0.4011898
Score2 0.2966111 1.00000000 0.1187151 0.1031597 0.0917925 0.09925027 0.07854108 0.1543527 0.1554024
Score3 0.2760750 0.11871507 1.0000000 0.7186500 0.6461274 0.59996621 0.57148358 0.5892070 0.5145922
Score4 0.2557100 0.10315967 0.7186500 1.0000000 0.6823484 0.57285505 0.62339528 0.5011205 0.5206750
Score5 0.2369902 0.09179250 0.6461274 0.6823484 1.0000000 0.59823126 0.64174583 0.4310555 0.4228794
Score6 0.2730389 0.09925027 0.5999662 0.5728550 0.5982313 1.00000000 0.60774455 0.4758982 0.4560535
Score7 0.2026579 0.07854108 0.5714836 0.6233953 0.6417458 0.60774455 1.00000000 0.3931223 0.3757161
Score8 0.3590587 0.15435272 0.5892070 0.5011205 0.4310555 0.47589816 0.39312229 1.0000000 0.8228832
Score9 0.4011898 0.15540243 0.5145922 0.5206750 0.4228794 0.45605350 0.37571611 0.8228832 1.0000000

>corr$n
[1] 7062

>corr$p
              Score1        Score2        Score3        Score4        Score5        Score6        Score7        Score8        Score9
Score1  0.000000e+00 2.736209e-142 1.191791e-122 7.910642e-105  8.713975e-90 6.419529e-120  1.904823e-65 9.276213e-213 3.710969e-270
Score2 2.104776e-143  0.000000e+00  6.890859e-23  1.440148e-17  2.171257e-14  1.885746e-16  3.861470e-11  3.960604e-38  1.416022e-38
Score3 9.931590e-124  1.378172e-23  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
Score4 7.910642e-106  3.600370e-18  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
Score5  9.682194e-91  1.085629e-14  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 3.059661e-316 3.636689e-303
Score6 5.835935e-121  6.285819e-17  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
Score7  2.381029e-66  3.861470e-11  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 1.644305e-258 1.923275e-234
Score8 6.625866e-214  6.601006e-39  0.000000e+00  0.000000e+00 1.610348e-317  0.000000e+00 1.027690e-259  0.000000e+00  0.000000e+00
Score9 2.182923e-271  2.022889e-39  0.000000e+00  0.000000e+00 2.020383e-304  0.000000e+00 1.282184e-235  0.000000e+00  0.000000e+00


0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?