데이터 전처리: 데이터 정규화와 표준화 (비선형 변환 포함)
데이터 변환 및 전처리
데이터 변환은 머신러닝과 데이터 분석에서 중요한 과정으로, 데이터가 모델 학습에 적합하도록 변환하여 성능을 향상시키는 역할을 합니다.
1. 정규화 (Normalization)
정규화는 데이터를 특정 범위(일반적으로 0과 1 사이)로 변환하여 데이터의 스케일을 맞추는 과정입니다.
1.1 Min-Max 정규화
Min-Max 정규화는 아래 공식을 사용하여 데이터를 변환합니다:
$$ x' = \frac{x - \text{min}(x)}{\text{max}(x) - \text{min}(x)} $$
예제:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
data = {'특성1': [10, 20, 30], '특성2': [5, 10, 15]}
df = pd.DataFrame(data)
scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(normalized_df)
2. 표준화 (Standardization)
표준화는 데이터를 평균이 0, 표준편차가 1이 되도록 변환합니다. 이는 정규 분포를 가정한 모델에 적합합니다.
2.1 Z-점수 표준화
Z-점수 표준화의 공식은 다음과 같습니다:
$$ z = \frac{x - \mu}{\sigma} $$
예제:
from sklearn.preprocessing import StandardScaler
data = {'특성1': [10, 20, 30], '특성2': [5, 10, 15]}
df = pd.DataFrame(data)
scaler = StandardScaler()
standardized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(standardized_df)
3. 비선형 변환 (Non-linear Transformation)
비선형 변환은 데이터의 분포를 정규화하거나 큰 값의 영향을 줄이기 위해 사용됩니다.
3.1 로그 변환 (Log Transformation)
로그 변환은 아래 공식을 사용하여 데이터를 변환합니다:
$$ x' = \log(x) $$
예제:
import numpy as np
data = [1, 10, 100, 1000]
log_transformed = np.log(data)
print(log_transformed)
3.2 제곱근 변환 (Square Root Transformation)
제곱근 변환의 공식은 다음과 같습니다:
$$ x' = \sqrt{x} $$
예제:
sqrt_transformed = np.sqrt(data)
print(sqrt_transformed)
3.3 Box-Cox 변환
Box-Cox 변환의 공식:
$$ x' = \begin{cases} \frac{x^\lambda - 1}{\lambda}, & \text{if } \lambda \neq 0 \\ \log(x), & \text{if } \lambda = 0 \end{cases} $$
예제:
from scipy.stats import boxcox
data = [1, 10, 100, 1000]
boxcox_transformed, lambda_ = boxcox(data)
print(boxcox_transformed)
4. 이상치 처리 (Outlier Transformation)
Winsorization을 사용하여 이상치를 처리합니다.
예제:
import pandas as pd
data = {'값': [1, 2, 3, 100, 200]}
df = pd.DataFrame(data)
capped_df = df.clip(lower=df['값'].quantile(0.05), upper=df['값'].quantile(0.95))
print(capped_df)
5. 분포 조정 (Quantile Transformation)
Quantile Transformation은 데이터를 정규 분포로 변환합니다.
예제:
from sklearn.preprocessing import QuantileTransformer
data = [[10], [20], [30], [40], [50]]
transformer = QuantileTransformer(output_distribution='normal')
normalized_data = transformer.fit_transform(data)
print(normalized_data)
요약
- 정규화: 데이터 범위를 [0, 1]로 조정.
- 표준화: 데이터의 평균을 0, 표준편차를 1로 조정.
- 비선형 변환: 로그, 제곱근, Box-Cox 변환 사용.
- 이상치 처리: Winsorization으로 극단값 제한.
- 분포 조정: Quantile Transformation으로 정규 분포로 변환.