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

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

Rによる分散・標準偏差・Z得点・偏差値の算出

概要

Rによる分散・標準偏差・Z得点・偏差値の算出方法をご紹介します。

関数

var(): 不偏分散

不偏分散を算出するには、var()を使います。

x <- c(10, 13, 8, 15, 8)
x
# [1] 10 13  8 15  8

# 不偏分散
var(x)
# [1] 9.7

sd(): 標準偏差

標準偏差を算出するには、sd() を使います。 もしくは、sqrt(var(x)) で分散の平方根をとります。

x <- c(10, 13, 8, 15, 8)
x
# [1] 10 13  8 15  8

# 標準偏差(不偏分散)
> sd(x)
[1] 3.114482

# OR

> sqrt(var(x))
[1] 3.114482

varp() // 標本分散 独自関数

不偏分散ではなく、標本分散を算出したい場合は、以下のような独自関数を作成します。

自由度を n ではなく n-1 に置き換える必要があります。

# 標本分散を算出する関数
varp <- function(x) {
  ret <- var(x) * ( length(x) - 1 ) / length(x)
  ret
}

x <- c(10, 13, 8, 15, 8)
x
# [1] 10 13  8 15  8

# 標本分散
varp(x)
# [1] 7.76

# 標準偏差(標本分散)
> sqrt(varp(x))
[1] 2.785678

score(): 標準化によるZ得点

Z得点(z値、z-score、z-value)とは、

平均が0

標準偏差が1

になるように変換した得点のことを指し、

(値 - 平均) / 標準偏差 で算出できます。

また、偏差値とは、

平均が50

標準偏差が10

になるように変換した値であり、

z得点 * 10 + 50 で算出できます。

z得点 = (値 - 平均) / 標準偏差
平均(z得点) = 0
標準偏差(z得点) = 1

偏差値 = z得点 * 10 + 50
平均(偏差値) = 50
標準偏差(偏差値) = 10

scale() を使えば、標準化できます。

> num <- sample(20)
> num
 [1]  6  8 17 18 19  2 11  1 20  5 15  3 16 12  9 14  7 13  4 10
> z_score <- scale(num)
> z_score
             [,1]
 [1,] -0.76063883
 [2,] -0.42257713
 [3,]  1.09870053
 [4,]  1.26773138
 [5,]  1.43676223
 [6,] -1.43676223
 [7,]  0.08451543
 [8,] -1.60579308
 [9,]  1.60579308
[10,] -0.92966968
[11,]  0.76063883
[12,] -1.26773138
[13,]  0.92966968
[14,]  0.25354628
[15,] -0.25354628
[16,]  0.59160798
[17,] -0.59160798
[18,]  0.42257713
[19,] -1.09870053
[20,] -0.08451543
attr(,"scaled:center")
[1] 10.5
attr(,"scaled:scale")
[1] 5.91608

> mean(z_score)
[1] 0

> sd(z_score)
[1] 1

# 偏差値 = z得点 * 10 + 50
# 平均(偏差値) = 50
# 標準偏差(偏差値) = 10
> standard_score = z_score * 10 + 50
> standard_score
          [,1]
 [1,] 42.39361
 [2,] 45.77423
 [3,] 60.98701
 [4,] 62.67731
 [5,] 64.36762
 [6,] 35.63238
 [7,] 50.84515
 [8,] 33.94207
 [9,] 66.05793
[10,] 40.70330
[11,] 57.60639
[12,] 37.32269
[13,] 59.29670
[14,] 52.53546
[15,] 47.46454
[16,] 55.91608
[17,] 44.08392
[18,] 54.22577
[19,] 39.01299
[20,] 49.15485
attr(,"scaled:center")
[1] 10.5
attr(,"scaled:scale")
[1] 5.91608

> mean(standard_score)
[1] 50
> sd(standard_score)
[1] 10

以上です。