ichou1のブログ

主に音声認識、時々、データ分析のことを書く

R 計算メモ(分散、共分散)

分散と共分散を計算をしたいとき用のメモ。

Rでは、標本分散、標本共分散を求める関数はないので、自分で定義する。
以下のサイトを参考にさせていただいた。
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/59.html

関数定義ここから。

標本分散
# 関数を定義(標本分散)
variance <- function(x) { var(x) * (length(x)-1) / length(x) }
標本共分散
# 関数を定義(2変数の標本共分散)
# 2変数(xとy)の不偏共分散 : var(x, y)
covariance <- function(x, y) { var(x, y) * (length(x)-1)/length(x) }
標本標準偏差
# 関数を定義(標本標準偏差)
stddev <- function(x) { sqrt(variance(x)) } 
相関係数
# 関数を定義(標本分散と標本共分散を使った相関係数)
# cor(x, y)と同じになる
correlation <- function(x, y) { covariance(x, y) / (stddev(x) * stddev(y)) }

検算。以下のサイトのデータを使わせいただいた。
https://sci-pursuit.com/math/statistics/correlation-coefficient.html

元データ(2変数、xとy)
# 変数x (英語の点数)
xvar <- c(50, 60, 70, 80, 90)
# 変数y (数学の点数)
yvar <- c(40, 70, 90, 60, 100)
分散
# 変数xの標本分散
variance(xvar)
[1] 200

# (参考)変数xの不偏分散
var(xvar)
[1] 250

# 変数yの標本分散
variance(yvar)
[1] 456

# (参考)変数yの不偏分散
var(yvar)
[1] 570
標準偏差
# 変数xの標本標準偏差
stddev(xvar)
[1] 14.14214

# (参考)変数xの不偏標準偏差
sd(xvar)
[1] 15.81139

# 変数yの標本標準偏差
stddev(yvar)
[1] 21.35416

# (参考)変数yの不偏標準偏差
sd(yvar)
[1] 23.87467
共分散
# 2変数の標本共分散
covariance(xvar, yvar)
[1] 220

# (参考)2変数の不偏共分散
cov(xvar, yvar)
[1] 275
相関係数
# 2変数の相関係数(標本分散、標本共分散を使うパターン)
correlation(xvar, yvar)
[1] 0.7284928

# (参考)2変数の相関係数 (R標準の関数)
> cor(xvar, yvar)
[1] 0.7284928

相関係数は不偏、標本のどちらを使っても同じ結果になる。
計算式の分母(割る数)は、標本の方が大きいので(標本はN、不偏はN-1)、大小関係は以下のとおりとなる。

標本分散 < 不偏分散
標本標準偏差 < 不偏標準偏差
標本共分散 < 不偏共分散

グラフ化

ggplot2を使って、2変数を散布図にプロットする方法。

library(ggplot2)
obs <- data.frame(x=xvar, y=yvar)
g <- ggplot(obs, aes(x=xvar, y=yvar))
g <- g + xlim(0, 100) + ylim(0, 100)
g <- g + geom_point()
plot(g)

f:id:ichou1:20180930095102p:plain