散布図を作成
Rで散布図を作成する。データはrunifで10個ずつ作成する。データのレンジは50~100.
x_test <- as.integer(runif(10, 50, 100)) y_test <- as.integer(runif(10, 50, 100))
x_testおよびy_testをプロットする。ドットは見やすくするために大きめで表示する(pch=19)。さらに赤色で区別がつくようにする。デフォルトは黒。
plot(x_test, y_test, pch=19, col="red")
散布図の利用
散布図は2変数の関連を視覚的に表示することでおおよその関係を推測できる。データが与えられ個々のデータについて関連が推測できない時に、最初のステップとして利用できる。おおよその関連性があることがわかれば、より詳細な分析である回帰分析などに移行できる。
しかし変数の数が多いときには個々の変数について2値の関連性をプロットするのは手間がかかる。このとき前もって関連性がありそうな変数についてわかれば、その変数に絞って散布図を作成すればよいので時間の短縮になる。
このフィルタリングに使えるのが共分散である。次は共分散について計算してみる。
共分散
共分散を手で計算してみる。
> cov_x_y = sum((x_test - mean(x_test)) * (y_test - mean(y_test)))/length(x_test) > cov_x_y [1] 20.8
次にRで用意されているcov()を使う。
> cov(x_test, y_test) [1] 23.11111
計算結果が異なるのはcov()では自由度n-1で計算した不偏共分散の結果が戻っているためである。
さてこの共分散の結果をどのように解釈すればよいのだろうか。共分散は正の方向に大きいほどあるいは負の方向に小さいほど2つの変数に関連がある予想される。0に近ければお互いに偏差が打ち消しあっているので関連は小さい。しかし共分散では単位が異なると計算が結果に違い出てくる。例えば身長と体重から共分散を計算するときにmおよびkgから計算された共分散よりもcmとgで計算された共分散が大きくなる。
これでは本来の目的である変数間の相関を予測しフィルタリングする作業に使えない。単位の効果をなくすために共分散をそれぞれの変数の標準偏差で割る。この値を相関係数と呼ぶ。
相関係数
相関係数を手で求める。
> cov(x_test, y_test)/(sd(x_test) * sd(y_test)) [1] 0.144664
次にRで提供されているcor()を使う。
> cor(x_test, y_test) [1] 0.144664
クロス集計表
相関は量的変数の関連性を表現するのに使えるが、質的変数には別の取り扱いが必要になる。質的変数同士の関係を連関とよぶ。
クロス集計表は2つの変数について組み合わせを集計した表である。クロス集計表を作成することで質的変数についての関係を調べることができる。
クロス集計表を作成するために数学と国語について好きおよび嫌いでデータを作成する。
> 数学<-sample(c("好き", "嫌い"), 10, replace=TRUE) > 国語<-sample(c("好き", "嫌い"), 10, replace=TRUE) > 数学 [1] "嫌い" "嫌い" "好き" "嫌い" "好き" "好き" "好き" "嫌い" "好き" "好き" > 国語 [1] "嫌い" "好き" "嫌い" "好き" "嫌い" "好き" "嫌い" "嫌い" "嫌い" "好き"
クロス集計表をtable()で作成する。
> table(数学, 国語) 国語 数学 嫌い 好き 嫌い 2 2 好き 4 2
相関係数とおなじように質的変数でも数値で連関がわかれば、より詳細なデータ分析に移行するにあたって変数をフィルタリングして時間を有効に活用できる。相関係数の特別な場合である、ファイ係数が利用できる。ファイ係数を利用するためにはあらじめ2値データを0と1に変換する必要がある。
ファイ係数
データの前準備として0,1に変換する。
> 数学_w <- ifelse(数学=="好き", 1, 0) > 数学_w [1] 0 0 1 0 1 1 1 0 1 1 > 国語_w <- ifelse(国語=="好き", 1, 0) > 国語_w [1] 0 1 0 1 0 1 0 0 0 1
ファイ係数を計算する。計算はcor()が利用できる。
> cor(数学_w, 国語_w) [1] -0.1666667
0,1変換していないデータにcor()を適用するとエラーになる。
> cor(数学,国語) 以下にエラー cor(数学, 国語) : 'x' は数値でなければなりません
練習問題
1
データを作成する。
> study_time <- c(1, 3, 10, 12, 6, 3, 8, 4, 1, 5) > point <- c(20, 40, 100, 80, 50, 50, 70, 50, 10, 60)
おおよその傾向を見る
plot(study_time, point, pch=19, col="red")
2
相関係数を算出する
> cor(study_time, point) [1] 0.9092974
3
データ作成が面倒くさいのでえランダムで作成する。
> food<-sample(c("洋食", "和食"), 20, replace=TRUE) > food [1] "洋食" "洋食" "洋食" "和食" "和食" "和食" "洋食" "洋食" "洋食" "和食" [11] "和食" "和食" "洋食" "和食" "洋食" "和食" "和食" "和食" "洋食" "和食" > taste<-sample(c("甘党", "辛党"), 20, replace=TRUE) > taste [1] "甘党" "甘党" "辛党" "辛党" "甘党" "辛党" "甘党" "甘党" "辛党" "辛党" [11] "辛党" "辛党" "辛党" "甘党" "甘党" "甘党" "甘党" "甘党" "甘党" "甘党"
クロス集計表を作成する
> table(food, taste) taste food 甘党 辛党 洋食 6 3 和食 6 5
4
ファイ係数を計算する
> food_w <- ifelse(food=="洋食", 1, 0) > taste_w <- ifelse(taste=="甘党", 1, 0) > cor(food_w, taste_w) [1] 0.1230915