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
'Python' 카테고리의 다른 글
데이터 전처리: 데이터 정규화와 표준화 (비선형 변환 포함) (0) | 2024.12.03 |
---|---|
데이터 전처리: 인코딩 (Encoding) (0) | 2024.12.03 |
데이터 전처리: 이상치 탐지 및 처리 (0) | 2024.12.03 |
데이터 전처리: 결측치 탐지와 처리 방법 (0) | 2024.12.03 |
4.2.4 연습 문제: 각 자리 숫자의 합을 구하는 함수(리스트를 이용) (0) | 2024.11.29 |