相関分析に限った話ではないですが、データを扱う際は前処理がとても大事。
しかし、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