読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

R言語で相関係数

2つの数字データがあって、相関ってあるの?っていうのが知りたい。そんなときに使えるのが相関係数というものみたいです。

相関係数を求める前に共分散というのを求める必要があります。共分散というのは、2つのデータの偏差(平均と引いた数)を掛け算して平均をとったものみたいです。R的に書くとこんな感じ。

x <- 1:10
y <- 101:110

z <- mean((x - mean(x)) * (y - mean(y)))

1~10と101~110までという、とても強い正の相関を持った数字で試してみました。zが共分散です。zには8.25というとても数字が入りました。数字的にも正の相関がありそうですね。

共分散だと、同じような相関のありそうなデータでも単位が変わると値が変わっちゃうという欠点があります。

x <- c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
y <- 101:110

z <- mean((x - mean(x)) * (y - mean(y)))

これだとzが0.825になっちゃいます。

じゃぁ1~-1の間に正規化してやろうというのが相関係数になります。求め方は共分散を2つのデータの標準偏差を掛け合わせたもので割ります。標準偏差は、偏差の2乗の平均の√だったのでRで書くとこんな感じですね。

x <- c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
y <- 101:110

z <- mean((x - mean(x)) * (y - mean(y)))
sdx <- sqrt(mean((x - mean(x))^2))
sdy <- sqrt(mean((y - mean(y))^2))
answer <- z / (sdx * sdy)

answerには1という結果が入ります。正の相関があるって感じですね。こういう感じに相関が逆っぽいデータをつっこむとanswerは-1になります。

x <- -1:-10
y <- 101:110

z <- mean((x - mean(x)) * (y - mean(y)))
sdx <- sqrt(mean((x - mean(x))^2))
sdy <- sqrt(mean((y - mean(y))^2))
answer <- z / (sdx * sdy)

Rは統計関係の関数をたっぷりもってるので(標準偏差はsdって関数でしたよね)ここで求めた共分散や相関係数も関数で持ってます。covとcorがそれになります。covとsdを使うとさっきのプログラムはこんな感じになります。

x <- -1:-10
y <- 101:110

answer <- cov(x, y) / (sd(x) * sd(y))

corを使うとこうですね。

x <- -1:-10
y <- 101:110

answer <- cor(x, y)