LoginSignup
1
3

More than 3 years have passed since last update.

Rのscale 関数で標準化

Last updated at Posted at 2021-02-12

はじめに(標準化とは)

標準化とはデータの平均が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

R_rnorm_hist.png

これに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

R_norm_new_hist.png

となり、平均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 

R_iris_hist.png

これを標準化する。

コード
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 

R_iris_hist_new.png

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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3