かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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)