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.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.Length 및 Sepal.Width 는 두 변수 모두 평균이 0이고 표준 편차가 1인 반면 데이터 프레임의 다른 세 변수는 변경되지 않도록 표준화되었습니다.