いっかくのデータサイエンティストをいく

1からプログラミングとデータサイエンスを独習したい

【統計学】相関係数(R)

前回解説いたしました相関係数をRで実装してみたいと思います。

共分散

データ

散布図でも使用しました上記書籍のP60にあるJリーグの試合結果のデータを使用します。

#勝数
wins  <- c(22, 20, 20, 18, 17, 18, 13, 13, 13, 13, 13, 13, 13, 12, 12, 5, 6, 4)
#得点
score <- c(67, 84, 80, 60, 68, 62, 51, 47, 49, 50, 57, 43, 56, 46, 42, 32, 44, 38)
#失点
lost    <- c(28, 55, 48, 41, 51, 53, 49, 45, 43, 56, 58, 55, 65, 65, 64, 56, 70, 74)

計算

cov関数を使用します。勝数と得点の共分散をみると

cov(wins, score)
#[1] 61.3268

標本相関係数

データ

上記のデータです。

計算

次に同じ勝数と得点で相関係数をとります。相関係数はcor関数で算出できます。

cor(wins, score)
#[1] 0.8681079

強い相関があることがわかります。点が取れるチームが勝つ!ということですね。

複数個並べると、各変数間の相関係数が相関行列の形で計算されます。

data <- data.frame(wins = wins, score = score, lost = lost) 
cor(data)
#            wins      score       lost
#wins   1.0000000  0.8681079 -0.7077240
#score  0.8681079  1.0000000 -0.4413409
#lost  -0.7077240 -0.4413409  1.0000000

失点より得点ですね。

標本自己相関分析

データ

ここからは新しいデータを使います。教科書のP65例題2.3を使います。

rate <- c(103,105,105,107,107,109,112,111,111,115,118,119)

計算

計算には いいパッケージがなかったため、下のサイトを拝借しました。

R -- 自己相関係数

acf2 <- function(    x,      # 時系列データ
                        k)      # ラグ
{
        n <- length(x)
        if (n < 3 || n-k < 2 || k < 1) {
                stop("invalid argument")
        }
        mean <- mean(x)
        num <- sum((x[1:(n-k)]-mean)*(x[(k+1):n]-mean))
        den <- var(x)*(n-1)
        return(num/den)
}

acf2(rate, 1)
#[1] 0.6979758

順位相関

データ

教科書P66表2-5のデータを使用します。10人の統計学と数学の得点順位です。

statistics <- c(1,2,3,4,5,6,7,8,9,10)
math <- c(1,4,2,3,7,5,6,10,8,9)

計算

cor.test関数のメソッドに"s"または"spearman"を設定することで計算できます。

cor.test ( statistics , math, method="s")
#0.8909091