R でデータを正規化する方法


ほとんどの場合、データセット内の変数を「正規化」するということは、変数の平均が 0、標準偏差が 1 になるように値をスケーリングすることを意味します。

変数を標準化する最も一般的な理由は、ある種の多変量分析を実行しているとき (つまり、複数の予測変数と応答変数の間の関係を理解したいとき) で、各変数が分析に均等に寄与するようにしたいときです。

変数が異なるスケールで測定される場合、それらは分析に同等に寄与しないことがよくあります。たとえば、ある変数の値の範囲が 0 ~ 100,000 で、別の変数の値の範囲が 0 ~ 100 の場合、分析では範囲が大きい変数に大きな重みが割り当てられます。

これは、ある変数が給与 (0 ~ 100,000 ドル) などを測定し、別の変数が年齢 (0 ~ 100 歳) などを測定する場合によく発生します。

変数を標準化することで、各変数が分析に均等に寄与していることを確認できます。変数を正規化 (または「スケール」) するには、次の 2 つの一般的な方法があります。

  • 最小-最大正規化: (X – min(X)) / (max(X) – min(X))
  • Z スコアの標準化: (X – μ) / σ

次に、これら 2 つの手法を R で実装する方法を示します。

R で変数を正規化 (または「スケール」) する方法

次の各例では、組み込みの R データセットirisを使用して、R で変数を正規化またはスケーリングする方法を説明します。

 #view first six rows of iris dataset
head(iris)

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 5.1 3.5 1.4 0.2 setosa
#2 4.9 3.0 1.4 0.2 setosa
#3 4.7 3.2 1.3 0.2 setosa
#4 4.6 3.1 1.5 0.2 setosa
#5 5.0 3.6 1.4 0.2 setosa
#6 5.4 3.9 1.7 0.4 setosa

最小値と最大値の正規化

最小-最大正規化の式は次のとおりです。

(X – 最小(X))/(最大(X) – 最小(X))

変数の各値について、その値と最小値の間の距離を単純に求め、範囲で割ります。

これを R で実装するには、単純な関数を定義し、 laplyを使用して、必要なirisデータセット内の列にその関数を適用します。

 #define Min-Max normalization function
min_max_norm <- function (x) {
    (x - min(x)) / (max(x) - min(x))
  }

#apply Min-Max normalization to first four columns in iris dataset
iris_norm <- as.data.frame(lapply(iris[1:4], min_max_norm))

#view first six rows of normalized iris dataset
head(iris_norm)

# Sepal.Length Sepal.Width Petal.Length Petal.Width
#1 0.22222222 0.6250000 0.06779661 0.04166667
#2 0.16666667 0.4166667 0.06779661 0.04166667
#3 0.11111111 0.5000000 0.05084746 0.04166667
#4 0.08333333 0.4583333 0.08474576 0.04166667
#5 0.19444444 0.6666667 0.06779661 0.04166667
#6 0.30555556 0.7916667 0.11864407 0.12500000

各列の値が 0 と 1 の間であることに注意してください。また、5 番目の列「Species」がこのデータ フレームから削除されていることにも注意してください。次のコードを使用して簡単に追加できます。

 #add back Species column
iris_norm$Species <- iris$Species

#view first six rows of iris_norm
head(iris_norm)

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 0.22222222 0.6250000 0.06779661 0.04166667 setosa
#2 0.16666667 0.4166667 0.06779661 0.04166667 setosa
#3 0.11111111 0.5000000 0.05084746 0.04166667 setosa
#4 0.08333333 0.4583333 0.08474576 0.04166667 setosa
#5 0.19444444 0.6666667 0.06779661 0.04166667 setosa
#6 0.30555556 0.7916667 0.11864407 0.12500000 setosa

Zスコアの標準化

min-max 正規化手法の欠点は、データ値が平均値に近づくことです。外れ値が他の値よりも重み付けされるようにしたい場合は、Z スコアの標準化を実装する方が良い手法です。

Z スコアを標準化する式は次のとおりです。

(X – μ) / σ

変数の各値について、単純に変数の平均値を減算し、変数の標準偏差で割ります。

これを R で実装するには、いくつかのオプションがあります。

1. 変数を標準化する

irisデータセットの Sepal.Width など、データセット内の変数を単に標準化したい場合は、次のコードを使用できます。

 #standardize Sepal.Width
iris$Sepal.Width <- (iris$Sepal.Width - mean(iris$Sepal.Width)) / sd(iris$Sepal.Width)

head(iris)

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 5.1 1.01560199 1.4 0.2 setosa
#2 4.9 -0.13153881 1.4 0.2 setosa
#3 4.7 0.32731751 1.3 0.2 setosa
#4 4.6 0.09788935 1.5 0.2 setosa
#5 5.0 1.24503015 1.4 0.2 setosa
#6 5.4 1.93331463 1.7 0.4 setosa

Sepal.Width の値は、平均が 0、標準偏差が 1 になるようにスケーリングされます。必要に応じて、これを確認することもできます。

 #find mean of Sepal.Width
mean(iris$Sepal.Width)

#[1] 2.034094e-16 #basically zero

#find standard deviation of Sepal.Width
sd(iris$Sepal.Width)

#[1] 1

2. スケール関数を使用して複数の変数を標準化する

複数の変数を正規化するには、 scale関数を使用するだけです。たとえば、次のコードは、 irisデータセットの最初の 4 列をスケーリングする方法を示しています。

 #standardize first four columns of iris dataset
iris_standardize <- as.data.frame(scale(iris[1:4]))

#view first six rows of standardized dataset
head(iris_standardize)

# Sepal.Length Sepal.Width Petal.Length Petal.Width
#1 -0.8976739 1.01560199 -1.335752 -1.311052
#2 -1.1392005 -0.13153881 -1.335752 -1.311052
#3 -1.3807271 0.32731751 -1.392399 -1.311052
#4 -1.5014904 0.09788935 -1.279104 -1.311052
#5 -1.0184372 1.24503015 -1.335752 -1.311052
#6 -0.5353840 1.93331463 -1.165809 -1.048667

デフォルトでは、 scale関数はデータ フレーム内の各列を正規化しようとすることに注意してください。そのため、 Scale(iris)を使用しようとすると、 Species列が数値ではなく標準化できないため、エラーが発生します。

 scale(iris)

#Error in colMeans(x, na.rm = TRUE): 'x' must be numeric

ただし、 dplyrパッケージを使用すると、データ フレーム内の特定の変数のみを標準化し、他のすべての変数を同じに保つことができます。たとえば、次のコードは、他のすべての変数を同じに保ちながら、 Sepal.Width変数とSepal.Length変数を標準化します。

 #load dplyr package
library(dplyr)

#standardize Sepal.Width and Sepal.Length
iris_new <- iris %>% mutate_each_(list(~scale(.) %>% as.vector),
                                  vars = c("Sepal.Width","Sepal.Length"))

#view first six rows of new data frame
head(iris_new)

# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 -0.8976739 1.01560199 1.4 0.2 setosa
#2 -1.1392005 -0.13153881 1.4 0.2 setosa
#3 -1.3807271 0.32731751 1.3 0.2 setosa
#4 -1.5014904 0.09788935 1.5 0.2 setosa
#5 -1.0184372 1.24503015 1.4 0.2 setosa
#6 -0.5353840 1.93331463 1.7 0.4 setosa

Sepal.LengthSepal.Width は、両方の変数の平均が 0、標準偏差が 1 になるように標準化されていますが、データ フレーム内の他の 3 つの変数は変更されないことに注意してください。

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です