Rで,2つあるいはそれ以上の量的変数の関連を調べるための方法について簡単に紹介する.
以下,「量的データの要約」でも使用した iris
データを用いて説明する. 外部データを読み込んで使用したい場合は,「質的変数の要約,分割表」のページなどを参考に.
data(iris)
head(iris) # 最初の6行分のデータ確認
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
iris
(アヤメのデータ)には, Sepal.Length
(がく片の長さ),Sepal.Width
(がく片の幅), Petal.Length
(花弁の長さ),Petal.Width
(花弁の幅)の4つの量的変数と, Species
(種,setosa
,versicolor
,virginica
の3種類)という質的変数が含まれている.
まずは plot
関数で,Sepal.Length
と Sepal.Width
の散布図を描いてみる.
plot(iris$Sepal.Length, iris$Sepal.Width)
Species
ごとに色を分けて,あるいはプロットの形を分けて表示することも可能である.
plot(iris$Sepal.Length, iris$Sepal.Width, col=as.numeric(iris$Species))
plot(iris$Sepal.Length, iris$Sepal.Width, pch=as.numeric(iris$Species))
ここで col
は色,pch
はプロット記号の指定であり,as.numeric
は「数値にせよ」を意味する. この意味を理解するには,以下を試してみるとよい.
iris$Species
## [1] setosa setosa setosa setosa setosa setosa
## [7] setosa setosa setosa setosa setosa setosa
## [13] setosa setosa setosa setosa setosa setosa
## [19] setosa setosa setosa setosa setosa setosa
## [25] setosa setosa setosa setosa setosa setosa
## [31] setosa setosa setosa setosa setosa setosa
## [37] setosa setosa setosa setosa setosa setosa
## [43] setosa setosa setosa setosa setosa setosa
## [49] setosa setosa versicolor versicolor versicolor versicolor
## [55] versicolor versicolor versicolor versicolor versicolor versicolor
## [61] versicolor versicolor versicolor versicolor versicolor versicolor
## [67] versicolor versicolor versicolor versicolor versicolor versicolor
## [73] versicolor versicolor versicolor versicolor versicolor versicolor
## [79] versicolor versicolor versicolor versicolor versicolor versicolor
## [85] versicolor versicolor versicolor versicolor versicolor versicolor
## [91] versicolor versicolor versicolor versicolor versicolor versicolor
## [97] versicolor versicolor versicolor versicolor virginica virginica
## [103] virginica virginica virginica virginica virginica virginica
## [109] virginica virginica virginica virginica virginica virginica
## [115] virginica virginica virginica virginica virginica virginica
## [121] virginica virginica virginica virginica virginica virginica
## [127] virginica virginica virginica virginica virginica virginica
## [133] virginica virginica virginica virginica virginica virginica
## [139] virginica virginica virginica virginica virginica virginica
## [145] virginica virginica virginica virginica virginica virginica
## Levels: setosa versicolor virginica
as.numeric(iris$Species)
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [36] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [71] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3
## [106] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [141] 3 3 3 3 3 3 3 3 3 3
setosa
が 1 に,versicolor
が 2 に,virginica
が 3 に変換されている. R では,色番号 1 が黒,2 が赤,3 が黄緑であり,プロット番号 1 が丸,2 が三角,3 がプラス記号のため,このような散布図となるのである.
変数を 3 つ以上指定して(あるいは変数を指定せず)plot
すると,すべての変数の組み合わせについての散布図行列が得られる.
plot(iris)
ここでは質的変数 Species
が含まれるため,Species
と他変数との散布図だけは注意する必要がある.
4つの量的変数のみ,Species
ごとに色を分けて表示してみよう.
plot(iris[,1:4],col=as.numeric(iris$Species))
iris[i,j]
のように i
と j
を指定することで,iris
の i
行 j
列のデータを取り出せる. ここでは,行は指定せず(つまりすべて),列は1〜4列目までを指定して(1:4
のようにコロンで指定) 散布図行列にした.
iris
データでは,種ごとに分けると変数間の相関が強そうに思える. そこで,subset
関数で virginica
(の4つの量的変数)だけを抽出し,変数間の相関を見てみよう.
virginica <- subset(iris, Species=="virginica", c(1:4))
subset
は特定のデータだけを抜き出す関数であり, Species=="virginica"
で Species
が virginica
に一致する行のみを取り出し, c(1:4)
で1列目〜4列目のみを取り出すことを意味している. c
はベクトルを作る関数である.
相関係数は cor
関数で計算できる.
cor(virginica$Sepal.Length, virginica$Sepal.Width)
## [1] 0.4572278
3 変数以上を同時に指定する(あるいは変数を指定しない)と, すべての組み合わせの相関係数を同時に計算した相関行列が得られる.
cor(virginica)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 0.4572278 0.8642247 0.2811077
## Sepal.Width 0.4572278 1.0000000 0.4010446 0.5377280
## Petal.Length 0.8642247 0.4010446 1.0000000 0.3221082
## Petal.Width 0.2811077 0.5377280 0.3221082 1.0000000
回帰直線を求めるには lm
関数を用いる. 例えば,Petal.Length
を目的変数,Sepal.Length
を説明変数とした結果を kaiki
に格納しておく.
kaiki <- lm(Petal.Length~Sepal.Length, virginica)
kaiki
##
## Call:
## lm(formula = Petal.Length ~ Sepal.Length, data = virginica)
##
## Coefficients:
## (Intercept) Sepal.Length
## 0.6105 0.7501
Coefficients
欄の Intercept
が切片,Sepal.Length
が傾きを表す . summary
関数を用いると,もう少し詳細な結果を得ることができる.
summary(kaiki)
##
## Call:
## lm(formula = Petal.Length ~ Sepal.Length, data = virginica)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.68603 -0.21104 0.06399 0.18901 0.66402
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.61047 0.41711 1.464 0.15
## Sepal.Length 0.75008 0.06303 11.901 6.3e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2805 on 48 degrees of freedom
## Multiple R-squared: 0.7469, Adjusted R-squared: 0.7416
## F-statistic: 141.6 on 1 and 48 DF, p-value: 6.298e-16
結果の詳細は省くが,Multiple R-squared
が決定係数である.
散布図上に赤色で回帰直線を書き入れてみよう.
plot(virginica$Sepal.Length, virginica$Petal.Length)
abline(kaiki, col="red")
abline
は直線を書き入れる関数で, 様々な使い方ができる.