R에서 데이터를 정규화하는 방법


대부분의 경우 사람들이 데이터 세트의 변수를 “정규화”한다고 말할 때 이는 변수의 평균이 0이고 표준 편차가 1이 되도록 값을 조정한다는 의미입니다.

변수를 표준화하는 가장 일반적인 이유는 일부 유형의 다변량 분석을 수행하고(예: 여러 예측 변수와 반응 변수 간의 관계를 이해하려는 경우) 각 변수가 분석에 동일하게 기여하기를 원하는 경우입니다.

변수를 다양한 규모로 측정하면 분석에 동일하게 기여하지 않는 경우가 많습니다. 예를 들어 한 변수의 값이 0~100,000이고 다른 변수의 값이 0~100인 경우 분석에서는 범위가 큰 변수에 더 큰 가중치가 할당됩니다.

이는 한 변수가 급여($0~$100,000) 등을 측정하고 다른 변수가 연령(0~100세) 등을 측정하는 경우 흔히 발생합니다.

변수를 표준화함으로써 각 변수가 분석에 동일하게 기여하는지 확인할 수 있습니다. 변수를 정규화(또는 “척도화”)하는 두 가지 일반적인 방법이 있습니다.

  • 최소-최대 정규화: (X – min(X)) / (max(X) – min(X))
  • Z 점수의 표준화: (X – μ) / σ

그런 다음 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를 사용하여 원하는 붓꽃 데이터세트의 열에 해당 함수를 적용하면 됩니다.

 #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 사이의 값이 있습니다. 또한 다섯 번째 열 “종”이 이 데이터 프레임에서 제거되었습니다. 다음 코드를 사용하여 쉽게 추가할 수 있습니다.

 #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 점수 표준화

최소-최대 정규화 기술의 단점은 데이터 값을 평균에 더 가깝게 이동한다는 것입니다. 이상값에 다른 값보다 더 많은 가중치를 부여하려면 z-점수 표준화를 구현하는 것이 더 나은 기술입니다.

z-점수를 표준화하는 공식은 다음과 같습니다.

(X – μ) / σ

변수의 각 값에 대해 간단히 변수의 평균값을 뺀 다음 변수의 표준편차로 나눕니다.

이를 R에서 구현하려면 다음과 같은 몇 가지 옵션이 있습니다.

1. 변수 표준화

붓꽃 데이터세트의 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 함수를 사용하면 됩니다. 예를 들어, 다음 코드는 붓꽃 데이터세트의 처음 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 함수는 데이터 프레임의 각 열을 정규화하려고 시도합니다. 따라서 Species 열이 숫자가 아니고 표준화될 수 없기 때문에 scale(iris)을 사용하려고 하면 오류가 발생합니다.

 scale(iris)

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

그러나 dplyr 패키지를 사용하면 다른 모든 변수를 동일하게 유지하면서 데이터 프레임의 특정 변수만 표준화하는 것이 가능합니다. 예를 들어, 다음 코드는 다른 모든 변수를 동일하게 유지하면서 Sepal.WidthSepal.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인 반면 데이터 프레임의 다른 세 변수는 변경되지 않도록 표준화되었습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다