정규화(Normalization)
개요
데이터 분석 과정에서 정규화(Normalization)는 데이터를 비교 가능하도록 만들거나 왜곡을 줄여 데이터를 효율적으로 처리하는 데 매우 중요한 역할을 합니다. 간단히 말해, 정규화는 서로 다른 단위와 범위를 가진 데이터를 동일한 기준으로 변환해 비교를 가능하게 하는 작업입니다.
정규화는 다양한 상황에서 필요합니다. 예를 들어, 단위가 다른 데이터를 비교해야 할 때 정규화를 사용하면 보다 명확한 비교가 가능합니다. 또한, 데이터 내에 극단적인 값(이상치)이 포함되어 있다면, 이를 정규화하여 이상치의 영향을 줄이고 보다 신뢰성 있는 결과를 도출할 수 있습니다. 데이터의 상대적 중요성을 직관적으로 보여주는 데에도 정규화는 효과적입니다.
정규화에는 여러 방법이 있으며, 각각의 특성과 장단점이 다릅니다. 이번 글에서는 주요 정규화 방법과 함께 R에서 이를 구현하는 방법을 소개합니다.
정규화 방법
다음은 다양한 정규화 방법과 그 특징을 비교한 표입니다. 각 방법의 특성과 적합한 상황을 이해하는 데 도움이 될 것입니다.
| 정규화 방법 | 특징 | 장점 | 단점 |
|---|---|---|---|
| 순위(Ranking) | 데이터 값의 순위를 계산 | - 단순하고 이상치의 영향을 받지 않음 - 상대적 비교가 용이 | - 절대적 정보가 손실됨 - 데이터 간 간격에 대한 정보 제공 불가 |
| 표준화(Standardization or z-score) | 평균이 0, 표준편차가 1이 되도록 변환 | - 값의 분포를 표준화하여 비교 가능 - 데이터 간 차이를 반영 | - 이상치의 영향을 받기 쉬움- 직관적인 해석이 어려움 |
| 최소-최대 정규화(Min-max normalization) | 데이터의 최소값을 0, 최대값을 1로 변환 | - 값이 항상 0~1 범위에 있어 해석이 직관적 - 모든 값이 동일한 스케일로 정규화 | - 이상치가 있으면 결과 왜곡됨 - 새로운 데이터 추가 시 범위 재조정 필요함 |
| 기준값까지의 거리(Distance to a reference) | - 기준값과의 절대적 거리로 정규화 - 기준값은 목표값이나 벤치마크로 설정 | - 특정 목표나 기준과의 비교가 가능 - 결과 해석이 직관적 | - 기준값 설정의 자의성 - 기준값에 따라 결과가 크게 달라질 수 있음 |
| 범주형 척도(Categorical scale) | 값을 범주로 나누고 범주별 점수를 부여 | - 간단하고 명확한 비교 가능 - 이상치의 영향을 받지 않음 | - 데이터의 연속적 특성이 손실됨 - 범주 구분 기준 설정의 자의성 |
| 평균 위/아래 지표(Indicators above/below the mean) | 평균 기준으로 -1(아래), 0(평균), 1(위)로 변환 | - 이상치의 영향을 받지 않음 - 상대적 위치를 직관적으로 표현 가능 | - 절대적 정보 손실 - 평균을 기준으로 한 변환의 자의성 |
정규화 구현
다음은 다양한 정규화 방법을 R로 구현한 코드입니다. 각 예제를 통해 정규화가 어떻게 이루어지는지 확인해 보세요.
순위(Ranking)
순위는 데이터를 정렬한 후, 각 데이터에 순위를 부여하는 방법입니다. 이 방법은 데이터 값의 절대적인 크기보다는 상대적인 순서에 초점을 맞춥니다. 예를 들어, 특정 점수가 그룹 내에서 몇 번째에 해당하는지 알고 싶을 때 유용합니다. 이상치의 영향을 받지 않는다는 장점이 있지만, 데이터 간 간격에 대한 정보는 제공하지 않습니다.
다음 코드는 values 벡터를 순위로 변환합니다. 가장 작은 값(50)은 1위, 가장 큰 값(200)은 4위가 됩니다.
values <- c(100, 200, 150, 50)
rank(values)
## [1] 2 4 3 1
표준화(Standardization or z-score)
표준화는 데이터의 평균을 0으로, 표준편차를 1로 변환하여 데이터의 분포를 비교 가능하게 만듭니다. 값들이 평균에서 얼마나 떨어져 있는지(표준편차 단위로) 알 수 있어, 서로 다른 분포의 데이터를 비교할 때 유용합니다. 단점으로는 이상치의 영향을 쉽게 받으며, 결과값이 직관적으로 해석하기 어려울 수 있다는 점이 있습니다.
다음 코드는 values 벡터를 표준화하여 각 값이 평균에서 몇 표준편차만큼 떨어져 있는지를 나타냅니다.
scale(values)
## [,1]
## [1,] -0.3872983
## [2,] 1.1618950
## [3,] 0.3872983
## [4,] -1.1618950
## attr(,"scaled:center")
## [1] 125
## attr(,"scaled:scale")
## [1] 64.54972
최소-최대 정규화(Min-max normalization)
최소-최대 정규화는 데이터를 0과 1 사이로 스케일링합니다. 데이터를 일정한 범위로 변환하여 비교를 쉽게 하고, 해석이 직관적이라는 장점이 있습니다. 단점으로는 이상치가 있을 경우 결과가 왜곡될 수 있으며, 새로운 데이터가 추가되면 범위를 재조정해야 한다는 점이 있습니다.
다음 함수는 각 값을 최소값과 최대값 기준으로 스케일링합니다. 예를 들어, 값이 최소값에 가까우면 0에, 최대값에 가까우면 1에 가까운 값이 됩니다.
min_max_norm <- function(x){
(x - min(x)) / (max(x) - min(x))
}
min_max_norm(values)
## [1] 0.3333333 1.0000000 0.6666667 0.0000000
기준값까지의 거리(Distance to a reference)
이 방법은 기준값(Reference value)과의 절대적인 거리를 계산하는 정규화 방법입니다. 특정 기준점(예: 목표치 또는 벤치마크)과 비교하여 상대적인 위치를 확인할 때 유용합니다. 단점으로는 기준값을 설정하는 기준이 자의적일 수 있으며, 기준값에 따라 결과가 크게 달라질 수 있습니다.
다음 코드는 values의 각 값이 기준값 70과 얼마나 떨어져 있는지를 계산합니다. 기준값과 가까운 값일수록 결과값이 작게 나타납니다.
dist_to_ref <- function(x, ref){
abs(x - ref)
}
dist_to_ref(values, ref = 70)
## [1] 30 130 80 20
범주형 척도(Categorical scale)
범주형 척도는 값을 일정 범위로 나누어 각 범주에 레이블을 부여하는 방법입니다. 예를 들어, 점수를 Low, Medium, High와 같은 범주로 구분할 수 있습니다. 이 방법은 간단하고 명확하며 이상치의 영향을 받지 않는다는 장점이 있지만, 데이터의 연속적인 특성이 손실될 수 있습니다.
다음 코드는 values 벡터를 범주로 변환합니다. 예를 들어, 값이 50이라면 Low, 125라면 Medium 범주에 속하게 됩니다.
ctg <- function(x, breaks, labels){
cut(x, breaks = breaks, labels = labels, include.lowest = TRUE)
}
breaks <- c(0, 100, 150, 200) # (0, 100], (100~150], (150~200]
labels <- c("Low", "Medium", "High")
ctg(values, breaks, labels)
## [1] Low High Medium Low
## Levels: Low Medium High
평균 위/아래 지표(Indicators above/below the mean)
평균 위/아래 지표는 평균을 기준으로 값이 평균보다 높은지, 낮은지, 평균과 같은지를 나타냅니다. 값이 평균보다 크면 1, 작으면 -1, 같으면 0으로 변환됩니다. 이 방법은 이상치의 영향을 받지 않으며, 값의 상대적 위치를 직관적으로 표현하는 데 유용합니다.
다음 코드는 values 벡터의 각 값이 평균을 기준으로 위인지 아래인지 표시합니다.
ab_bl <- function(x){
mean_x <- mean(x)
ifelse(x > mean_x, 1, ifelse(x < mean_x, -1, 0))
}
ab_bl(values)
## [1] -1 1 1 -1
정규화는 데이터를 비교 가능하게 만들고, 이상치로 인한 왜곡을 줄이며, 분석 결과를 명확하게 표현하는 데 중요한 도구입니다. 이 글에서 소개한 다양한 정규화 방법을 활용하면 데이터의 특성과 분석 목적에 맞게 정규화를 적용할 수 있습니다. 이제 정규화를 활용해 데이터를 더 깊이 이해하고 분석에 활용해 보세요!