kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

Rによる共分散・相関係数・ファイ係数の算出

概要

Rによる共分散・相関係数・ファイ係数の算出方法をご紹介します。

関数

2つの異なるデータ群の共分散を cov() で算出できます。

ただし、単位に依存するので、例えば、身長がm単位なのかcm単位なのかで共分散の値が異なります。

cov() : 共分散

共分散: 偏差の積の平均
デメリット: 単位に依存する
> h1 <- c(1.5, 1.6, 1.7, 1.8, 1.9) # 身長(m)
> h1
[1] 1.5 1.6 1.7 1.8 1.9
> 
> h2 <- h1*100 # 身長(cm)
> h2
[1] 150 160 170 180 190
> 
> w <- c(50, 60, 70, 80, 90) # 体重(kg)
> w
[1] 50 60 70 80 90
> 
> cov(h1, w)
[1] 2.5
> 
> cov(h2, w)
[1] 250

cor() : 相関係数

x, y の共分散を、それぞれのx, y の標準偏差の積で割った値が相関係数です。

メリットとして、単位に依存しないので、任意のデータ群の相関が統一的に算出できます。

また、

100%正の相関のときは1

100%負の相関のときは-1

無相関のときは0

となります。

相関係数r : cov(x,y) / ( sd(x) * sd(y) )
メリット: 単位に依存しない
-1 <= r <= 1
> h1 <- c(1.5, 1.6, 1.7, 1.8, 1.9) # 身長(m)
> h1
[1] 1.5 1.6 1.7 1.8 1.9
> 
> h2 <- h1*100 # 身長(cm)
> h2
[1] 150 160 170 180 190
> 
> w <- c(50, 60, 70, 80, 90) # 体重(kg)
> w
[1] 50 60 70 80 90
> 
> cor(h1, w)
[1] 1
> 
> cor(h2, w)
[1] 1

> z <- c(90, 80, 70, 60, 50)
> z
[1] 90 80 70 60 50
> cor(z,w)
[1] -1

> p <- c(100, 2, 400, 8, 5)
> cor(p, w)
[1] -0.1700732

table(x, y) クロス集計表

複数のデータ群を集計したクロス集計表は、table()を使って整理します。

> x <- c("a", "b", "a", "a", "b", "a", "b", "a", "a", "a", "a", "a", "b", "a", "a", "b", "a")
> table(x)
x
 a  b 
12  5 
> 
> y <- c("b", "b", "a", "b", "a", "a", "a", "b", "a", "a", "b", "a", "b", "b", "a", "a", "a")
> table(y)
y
 a  b 
10  7 
> 
> table(x, y)
   y
x   a b
  a 7 5
  b 3 2

ファイ係数

カテゴリカルデータの相関係数を算出したい場合は、以下のようにダミー変数に変換した値の相関係数をとります。

これをファイ係数と呼びます。

ファイ係数: 1 or 0 の値からなる変数(2値変数)の相関係数

ifelse(Condition, True, False)

IF分岐させたい場合は、ifelse()を使います。

> x <- c("a", "b", "a", "a", "b", "a", "b", "a", "a", "a", "a", "a", "b", "a", "a", "b", "a")
> x
 [1] "a" "b" "a" "a" "b" "a" "b" "a" "a" "a" "a" "a" "b" "a" "a" "b"
[17] "a"
> x_bi <- ifelse(x=="a", 1, 0)
> x_bi
 [1] 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1
> y <- c("b", "b", "a", "b", "a", "a", "a", "b", "a", "a", "b", "a", "b", "b", "a", "a", "a")
> y_bi <- ifelse(y=="a", 1, 0)
> y_bi
 [1] 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 1
> cor(x_bi, y_bi)
[1] -0.01543033
> cor(x_bi, x_bi)
[1] 1
> cor(x_bi, ifelse(x_bi==1, 0, 1))
[1] -1

以上です。