Python

데이터 전처리: 데이터 정규화와 표준화 (비선형 변환 포함)

수현조 2024. 12. 3. 13:59
데이터 변환 및 전처리

데이터 변환 및 전처리

데이터 변환은 머신러닝과 데이터 분석에서 중요한 과정으로, 데이터가 모델 학습에 적합하도록 변환하여 성능을 향상시키는 역할을 합니다.

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으로 정규 분포로 변환.