carsデータの例

散布図

例として,Rに組み込まれているcarsデータを使う.

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

散布図はplotに2つの変数ベクトルを投入する.3変数以上のデータフレームを投入すると,散布図マトリックスを出力する.

plot(cars$speed,cars$dist)

散布図に回帰直線を引く.

plot(cars$speed,cars$dist)
lm_cars<-lm(dist ~ speed, data=cars)
abline(coef=coef(lm_cars),col="red")

共分散

共分散,ただしcovはn-1で割る定義である.また,covにデータフレームを投入すると,分散共分散行列を出力する.

cov(cars$speed,cars$dist)
## [1] 109.9469
cov(cars)
##           speed     dist
## speed  27.95918 109.9469
## dist  109.94694 664.0608

nで割る共分散の関数を定義する.

cov_p<-function(x,y, na.rm = TRUE) {
  if (!na.rm && any(c(is.na(x),is.na(y)))) 
    return(NA_real_)
  data<-data.frame(x=x,y=y)
  data<-na.omit(data)
  mx<-mean(data$x)
  my<-mean(data$y)
  n<-length(data$x)
  sum((data$x-mx)*(data$y-my))/n
}

cov_cars<-cov_p(cars$speed,cars$dist)
cov_cars
## [1] 107.748

相関係数

まずは,定義どおりに相関係数を計算しよう.そのために,nで割る標準偏差関数を定義する.

sd_p<-function(x, na.rm = TRUE) {
  if (!na.rm && any(is.na(x))) 
    return(NA_real_)
  x<-na.omit(x)
  m<-mean(x)
  n<-length(x)
  sqrt(sum((x-m)^2)/n)
}
sd_speed<-sd_p(cars$speed)
sd_dist<-sd_p(cars$dist)

標準得点の共分散として相関係数を計算する.

mean(((cars$speed-mean(cars$speed))/sd_speed)*((cars$dist-mean(cars$dist))/sd_dist))
## [1] 0.8068949

共分散を標準偏差の積で除したものとして相関係数を計算する.

cov_cars/(sd_speed*sd_dist)
## [1] 0.8068949

R上の関数corで計算しても値は変わらない.共分散・標準偏差の定義に1/nを使った場合でも,1/(n-1)の場合でも,相関係数の計算では,分母と分子でキャンセルされるからである.

cor(cars$speed,cars$dist)
## [1] 0.8068949
cov(cars$speed,cars$dist)/(sd(cars$speed)*sd(cars$dist))
## [1] 0.8068949

irisデータの例

setosa種のデータだけを除く.

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
except_setosa_data<-subset(iris,Species!="setosa")[,-5]
pairs(except_setosa_data)

cov(except_setosa_data)
##              Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length    0.4393495  0.12215758    0.4533616  0.16715960
## Sepal.Width     0.1221576  0.11072323    0.1427960  0.08002828
## Petal.Length    0.4533616  0.14279596    0.6815798  0.28873131
## Petal.Width     0.1671596  0.08002828    0.2887313  0.18042828
cor(except_setosa_data)
##              Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length    1.0000000   0.5538548    0.8284787   0.5937094
## Sepal.Width     0.5538548   1.0000000    0.5198023   0.5662025
## Petal.Length    0.8284787   0.5198023    1.0000000   0.8233476
## Petal.Width     0.5937094   0.5662025    0.8233476   1.0000000