데이터 분석과 머신러닝을 할 때, 서로 다른 범위와 단위를 가진 수치형 데이터가 섞여 있을 경우 문제가 발생합니다.
예를 들어
- 나이: 0 ~ 100
- 연봉: 2,000,000 ~ 100,000,000
이렇게 단위가 다른 두 변수를 그대로 모델에 넣으면 큰 값이 더 중요한 변수처럼 작용하게 되어 모델이 편향될 수 있습니다.
이 문제를 해결하는 대표적인 방법이 바로 정규화(Normalization) 와 표준화(Standardization)입니다.
만일 거리 기반 알고리즘을 개발한다고 했을 때, KNN & KMeans 등은 변수의 스케일에 민감합니다.
문제 상황 | 예시 |
거리 기반 알고리즘 | KNN, KMeans 등은 변수의 스케일에 민감 |
기울기 폭주/소실 | 딥러닝 학습 시 큰 수치로 인해 오차 급증 또는 학습 멈춤 |
모델 성능 왜곡 | 회귀분석 시 연봉 변수만 모델에 영향력을 행사 |
1. 정규화(Normalization)
정규화는 값의 범위를 0과 1 사이로 압축하여 스케일을 맞추는 작업입니다.
예를 들어, 학새들의 키가 150cm ~ 190cm 사이라면, 이를 0과 1로 바뀌면 이렇게 됩니다.
원래 키(cm) | 정규화 결과 |
150 | 0.0 |
170 | 0.5 |
190 | 1.0 |
수식
X_normalized = (X - X_min) / (X_max - X_min)
- 서로 범위가 다른 데이터를 같은 기준으로 비교할 때 사용
- KNN, KMeans, 신경망 등 거리 기반 알고리즘을 사용할 때
그럼 정규화를 어떻게 하냐
가장 많이 사용하는 것이 MinMaxScaler입니다.
MinMaxScaler이란?
MinMaxScaler는 정규화를 자동으로 수행해주는 scikit-learn의 클래스입니다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['income', 'age']] = scaler.fit_transform(df[['income', 'age']])
메서드 | 설명 |
fit() | 데이터의 최대/최소값 계산 |
transform() | 정규화 수식 적용 |
fit_transform() | 두 작업을 한 번에 처리 |
주의사항
- 이상치(outlier)에 민감
- 하나의 값이 너무 크면 나머지 값들이 0에 몰려버림
2. 표준화(Standardization)
표준화는 데이터를 평균이 0, 표준편차가 1인 분포로 변환하는 작업입니다.
예를 들어, 수학 점수 평균이 70점, 표준편차가 10점일 때
점수 표준화 결과 (Z-score)
점수 | 표준화 결과 (Z-score) |
70 | 0.0 |
80 | 1.0 |
60 | -1.0 |
수식
X_standardized = (X - 평균) / 표준편차
- 정규분포 기반 모델: 선형 회귀, 로지스틱 회귀, SVM 등 사용
- 이상치가 있는 경우에도 안정적인 스케일 조정 가능
표준화를 하는 방법은 StandardScaler를 사용하면 됩니다.
StandardScaler란?
StandardScaler는 표준화를 자동으로 수행해주는 scikit-learn의 클래스입니다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['income', 'age']] = scaler.fit_transform(df[['income', 'age']])
메서드 | 설명 |
fit() | 평균, 표준편차 계산 |
transform() | Z-score 수식 적용 |
fit_transform() | 두 작업을 한 번에 수행 |
주의사항
- 결과 값이 음수나 소수로 나올 수 있으며, 직관적 해석은 어렵다
- 단위(원, kg 등)를 잃게 됨
정리
개념 | 비유 |
정규화 | 모든 사람을 0~1 사이의 키로 만든다. → 상대적 키만 유지됨 |
표준화 | 모든 사람의 평균 키를 0으로 놓고, 그보다 얼마나 큰지 측정 |
이제 실제 사용 예시를 보도록 하겠습니다.
사용할 데이터는 sklearn.datasets의 breast_cancer (유방암 진단 데이터 셋) 데이터입니다.
from sklearn.datasets import load_breast_cancer
import pandas as pd
# 데이터 로드
data = load_breast_cancer()
df = pd.DataFrame(data.data, columns=data.feature_names)
# 정규화
from sklearn.preprocessing import MinMaxScaler
df_norm = pd.DataFrame(MinMaxScaler().fit_transform(df), columns=df.columns)
# 표준화
from sklearn.preprocessing import StandardScaler
df_std = pd.DataFrame(StandardScaler().fit_transform(df), columns=df.columns)
정규화 및 표준화를 진행할 때 주의할점
- 훈련 데이터와 테스트 데이터는 따로 스케일링해야 함
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test) # fit() 금지!
- 범주형 변수에 스케일링 적용 금지
- 먼저 인코딩을 해야합니다. (LabelEncoder, OneHotEncoder)
- 중복 처리로 값 왜곡
- ex: 정규화 후 로그 변환 = 과도환 왜곡
정리
정규화는 데이터의 범위를 0 ~ 1로, 표준화는 분포를 평균 0, 표준편차 1로 맞추는 것입니다.
사용 목적, 모델의 특성, 데이터의 분포에 따라 전략적으로 선택해야합니다.
두 방식 모두 사전 분석 → 정규화 / 표준화 → 모델링 흐름에 필수적인 전처리 과정입니다.
'Data Analysis' 카테고리의 다른 글
파생변수 생성 - Feature Engineering (0) | 2025.05.19 |
---|---|
범주형 변수 인코딩 - Label, One-Hot, Ordinal (0) | 2025.05.19 |
이상치(Outliers) 탐지와 처리 방법 (0) | 2025.05.14 |
결측치(Missing Values) 처리 (0) | 2025.05.12 |
Hypothesis Test란? (0) | 2023.08.23 |