Posted at

R scale関数でデータフレームを正規化

More than 3 years have passed since last update.


正規化とは?

統計解析の現場では、データフレームの各列の単位が異なる場合があります。


  • 身長

  • 体重

  • 血圧

  • etc...

その場合、各変量を平均が0、分散が1となるよう変換を加えることがあります。

これを正規化と呼びます。

Rでは関数scale()を用いることで、データフレームを正規化可能です。

正規化には2つの手順があります。


  1. センタリング : それぞれの変量から全体の平均を引く。平均が0となる。

  2. スケーリング : それぞれの変量を全体の標準偏差で割る。分散が1となる。


Rによる実例

では、Rで実例を見ていきましょう。

身長・体重・血圧の変量を作った後、melt関数で縦持ちにしてggplotでヒストグラムを描画してみます。

n = 1000

df <- data.frame(
height = rnorm(n, 170, 10),
weight = rnorm(n, 70, 5),
bloodpressure = rnorm(n, 125, 2)
)

library(reshape2)
library(ggplot2)
ggplot(melt(df), aes(x=value)) +
geom_histogram(fill="gray", binwidth=1) +
facet_grid(variable~., scales="free")

RPlot1.png

3変量が全く別の分布になっていることが分かります。

次に、これをscale関数で正規化した後、ヒストグラムにしてみます。

df.scale = scale(df)

ggplot(melt(df.scale), aes(x=value)) +
geom_histogram(fill="gray", binwidth=0.1) +
facet_grid(Var2~., scales="free")

Rplot2.png

全て同じ分布になっていることが分かります。

平均と分散も見てみましょう。

> apply(df.scale, 2, function(x){

+ print(mean(x))
+ print(var(x))
+ })
[1] -3.592281e-16
[1] 1
[1] 9.214658e-16
[1] 1
[1] 2.510722e-15
[1] 1
height weight bloodpressure
1 1 1

全て平均0と分散1になっています。


まとめ


  • scale関数で正規化が可能