Rのscale 関数で標準化


はじめに(標準化とは)

標準化とはデータの平均が0、標準偏差が1になるように変換すること。実際の操作としてはデータの平均を $\bar{x}$ 、標準偏差を $s$ と置くと、以下の計算をしていることになる。

$$x_{new} = \frac{x-\bar{x}}{s}$$

R で標準化する場合にはscale関数を使う。

ランダムで生成した正規分布のデータに対して

平均50、分散が10の正規分布に伴うデータを生成する。

コード
dat <- rnorm(n=1000, mean=50, sd=10)
dat.mean <- mean(dat)
dat.sd <- sd(dat)
print(c(dat.mean, dat.sd))
hist(dat)
出力
[1] 49.65276 10.17034

これにscale関数を適応してみると、

コード
dat.new <- scale(dat) #scale関数で標準化する
dat.new.mean <- mean(dat.new)
dat.new.sd <- sd(dat.new)
print(c(dat.new.mean, dat.new.sd))
hist(dat.new)
出力
[1] 1.5824e-16 1.0000e+00

となり、平均0、標準偏差1のデータになっている。

おまけ(iris データで標準化)

かの有名なiris dataでも標準化してみる。今回はlabelを無視してすべてのデータを一気に標準化してしまう。

コード
iris.data <- iris[,-5] #Speacies の列を削除
iris.data.mean <- sapply(iris.data, mean)
iris.data.sd <- sapply(iris.data, sd)
print(c(iris.data.mean, iris.data.sd)) #平均と標準偏差を出力

split.screen(figs=c(2, 2)) #四つの図を書く準備
screen(1)
hist(iris.data[,1], xlab=colnames(iris.data)[1])
screen(2)
hist(iris.data[,2], xlab=colnames(iris.data)[2])
screen(3)
hist(iris.data[,3], xlab=colnames(iris.data)[3])
screen(4)
hist(iris.data[,4], xlab=colnames(iris.data)[4])

出力
Sepal.Length  Sepal.Width Petal.Length  Petal.Width Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.8433333    3.0573333    3.7580000    1.1993333    0.8280661    0.4358663    1.7652982    0.7622377 

これを標準化する。

コード
iris.data.new <- as.data.frame(scale(iris.data)) #標準化+データフレーム化(値がmatrixで返ってくるので。)
iris.data.new.mean <- sapply(iris.data.new, mean)
iris.data.new.sd <- sapply(iris.data.new, sd)
print(c(iris.data.new.mean, iris.data.new.sd)) #平均と標準偏差を出力

split.screen(figs=c(2, 2)) #四つの図を書く準備
screen(1)
hist(iris.data.new[,1], xlab=colnames(iris.data.new)[1])
screen(2)
hist(iris.data.new[,2], xlab=colnames(iris.data.new)[2])
screen(3)
hist(iris.data.new[,3], xlab=colnames(iris.data.new)[3])
screen(4)
hist(iris.data.new[,4], xlab=colnames(iris.data.new)[4])
出力
 Sepal.Length   Sepal.Width  Petal.Length   Petal.Width  Sepal.Length   Sepal.Width  Petal.Length   Petal.Width 
-4.484318e-16  2.034094e-16 -2.895326e-17 -3.663049e-17  1.000000e+00  1.000000e+00  1.000000e+00  1.000000e+00 

一回の操作ですべての項目についてまとめて標準化できる。