Python

데이터 전처리: 데이터 정규화와 표준화

수현조 2024. 12. 3. 12:49

1. 데이터 정규화 (Normalization)

정규화란?

  • 데이터를 0과 1 사이의 값으로 변환하는 과정입니다.
  • 목적: 서로 다른 범위를 가진 데이터를 동일한 스케일로 맞춰 비교 가능하게 만듭니다.

1) Min-Max 정규화

공식:

\[ X' = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}} \]

  • \( X \): 원래 데이터 값
  • \( X_{\text{min}} \): 최소값
  • \( X_{\text{max}} \): 최대값

예제 코드

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# 데이터 생성
data = {
    '특성1': [10, 20, 30, 40, 50],
    '특성2': [1, 2, 3, 4, 5]
}
df = pd.DataFrame(data)

# Min-Max 정규화
scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(normalized_df)

결과

   특성1  특성2
0  0.00  0.00
1  0.25  0.25
2  0.50  0.50
3  0.75  0.75
4  1.00  1.00

특징:

  • 모든 값이 0~1 사이로 변환됩니다.
  • 이상치(outlier)에 민감합니다.

2. 데이터 표준화 (Standardization)

표준화란?

  • 데이터를 평균이 0, 표준편차가 1이 되도록 변환하는 과정입니다.
  • 목적: 정규 분포를 가정한 분석에 유리하며, 데이터의 단위 차이를 제거합니다.

1) Z-점수 표준화

공식:

\[ Z = \frac{X - \mu}{\sigma} \]

  • \( X \): 원래 데이터 값
  • \( \mu \): 평균
  • \( \sigma \): 표준편차

예제 코드

from sklearn.preprocessing import StandardScaler

# Z-점수 표준화
scaler = StandardScaler()
standardized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(standardized_df)

결과

       특성1      특성2
0 -1.414214 -1.414214
1 -0.707107 -0.707107
2  0.000000  0.000000
3  0.707107  0.707107
4  1.414214  1.414214

특징:

  • 평균값이 0, 표준편차가 1이 되도록 변환합니다.
  • 이상치에 덜 민감합니다.

3. 정규화와 표준화 비교

특징 정규화 (Normalization) 표준화 (Standardization)
목적 데이터를 0~1 범위로 변환 데이터를 평균 0, 표준편차 1로 변환
장점 간단하고 계산 효율적 이상치의 영향을 덜 받음
단점 이상치에 민감 직관적으로 해석하기 어려울 수 있음
적용 예시 신경망, Min-Max 기반 알고리즘 SVM, PCA, 회귀 분석 등

4. 비선형 변환

비선형 변환이란?

  • 데이터의 분포가 비대칭적이거나 왜곡된 경우, 이를 보정하기 위해 사용하는 변환 방법입니다.
  • 데이터의 분포를 정규 분포에 가깝게 만들어 분석과 모델 학습에 유리하게 합니다.

1) 로그 변환 (Log Transformation)

공식:

\[ X' = \log(X + 1) \]

  • 로그 변환은 데이터의 크기 차이를 줄이는 데 효과적입니다.
  • \( +1 \): \( X = 0 \)인 경우 로그가 정의되지 않으므로 1을 더해줍니다.
  • 양수 데이터에만 사용 가능합니다.

예제 코드

import numpy as np
import pandas as pd

# 데이터 생성
data = {'값': [1, 10, 100, 1000, 10000]}
df = pd.DataFrame(data)

# 로그 변환
df['로그값'] = np.log1p(df['값'])
print(df)

결과

       값      로그값
0      1   0.693147
1     10   2.397895
2    100   4.615121
3   1000   6.908755
4  10000   9.210440

2) 제곱근 변환 (Square Root Transformation)

공식:

\[ X' = \sqrt{X} \]

  • 극단적으로 큰 값의 영향을 줄여줍니다.
  • 음수 데이터에서는 사용 불가합니다.

예제 코드

import numpy as np

# 제곱근 변환
df['제곱근값'] = np.sqrt(df['값'])
print(df)

결과

       값      로그값      제곱근값
0      1   0.693147   1.000000
1     10   2.397895   3.162278
2    100   4.615121  10.000000
3   1000   6.908755  31.622777
4  10000   9.210440 100.000000

3) Box-Cox 변환

공식:

\[ T(Y) = \begin{cases} \frac{Y^\lambda - 1}{\lambda}, & \text{if } \lambda \neq 0 \\ \log(Y), & \text{if } \lambda = 0 \end{cases} \]

  • \( \lambda \): 변환 파라미터 (데이터 특성에 따라 조정).
  • 데이터의 분포를 정규 분포에 가깝게 만들어줍니다.
  • 음수 데이터는 사용 불가합니다.

예제 코드

from scipy.stats import boxcox

# Box-Cox 변환
df['BoxCox값'], lambda_val = boxcox(df['값'])
print(df)
print(f"Optimal λ: {lambda_val}")

결과

       값      로그값      제곱근값     BoxCox값
0      1   0.693147   1.000000   -3.601309
1     10   2.397895   3.162278   -0.711332
2    100   4.615121  10.000000    2.178645
3   1000   6.908755  31.622777    5.068622
4  10000   9.210440 100.000000    7.958599

Optimal λ: 0.146