Python to AI

Python - Pandas, Scikit-learn, SciPy(데이터 전처리 : 데이터 정규화와 표준화)

최 수빈 2024. 12. 11. 21:32

 

데이터 정규화(Normalization)

 

데이터의 범위를 0과 1사이로 변환하는 과정

서로 다른 범위를 가진 데이터를 동일한 스케일로 맞추어 비교하기 쉽게 만듦

 

 

 

Min-Max 정규화

가장 일반적인 정규화 방법

각 데이터의 최소값을 0, 최대값을 1로 변환

 

pip install scikit-learn

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)
normalized_df

 

 

데이터 표준화(Standardization)

 

표준화(Standardization)

데이터를 평균이 0, 표준편차가 1이 되도록 변환하는 과정

정규 분포를 가정한 많은 분석 기법에 유리

 

Z-score 표준화

데이터에서 평균을 빼고 표준편차로 나누어 모든 데이터가 표준 정규분포(평균 0, 표준편차 1)를 따르도록 만듦

from sklearn.preprocessing import StandardScaler

#Z-score standardization
scaler = StandardScaler()
standardized_df = pd.DataFrame(scaler.fit_transform(df), columns = df.columns)
standardized_df

각 열의 데이터가 평균이 0, 표준편차가 1이 되도록 변환됨

 

 

 

비선형 변환(Non-linear Transformation)

 

데이터의 비정상적인 분포를 정규 분포에 가깝게 만들기 위해 사용

대표적인 방법 : 로그 변환, 제곱근 변환, 박스-콕스 변환

 

 

로그(Log)변환

양의 데이터에서 주로 사용

데이터의 분포를 좁히는 데 유용

특히, 지수 분포를 가진 데이터를 다룰 때 효과적

import numpy as np

#로그 변환
df['특성1_log'] = np.log(df['특성1'])
df

로그 변환 후 데이터의 분포가 평탄해지는 효과를 얻을 수 있음

 

 

제곱근(square root)변환

데이터의 분포를 평탄하게 만들기 위한 또 다른 방법

포아송 분포를 가진 데이터에서 사용

 

*포아송 분포

주어진 시간이나 공간에서 사건이 발생하는 평균 횟수 λ (람다)가 알려져 있을 때, 특정 사건이 k번 발생할 확률

 


 

제곱근 변환은 포아송 분포 데이터에 대해 다음과 같은 장점을 제공

 

 분포의 대칭성 개선

  • 포아송 분포는 오른쪽으로 치우친(skewed) 분포를 가지는 경우가 많음
  • 제곱근 변환을 적용하면 데이터의 치우침(skewness)이 줄어들고, 분포가 더 대칭적으로 변화하여 정규성(normality)에 가까워짐

분산 안정화

  • 포아송 분포는 분산이 평균(λ)에 의존하기 때문에 데이터의 분산이 비일정
  • 제곱근 변환을 적용하면 분산이 안정(stabilize)됨. 데이터의 평균 값에 관계없이 일정한 수준의 분산을 갖게함
  • 제곱근 변환 후의 분산은 데이터의 원래 분산보다 작아지며, 분석 과정에서 더 다루기 쉬운 형태로 변환

이상치의 영향 완화

  • 사건 발생 횟수가 많아질수록 이상치가 발생할 가능성이 증가 -> 제곱근 변환은 데이터 값을 축소, 이상치가 분석 결과에 미치는 영향을 줄이는 데 도움을 줌

선형 관계로의 변환

  • 포아송 데이터는 종종 비선형적인 특성을 보임. 제곱근 변환을 적용하면 데이터가 더 선형적인 패턴을 가지게 되어 회귀 분석이나 기타 선형 모델에서 더 잘 작동함

 

#제곱근 변환
df['특성1_sqrt'] = np.sqrt(df['특성1'])
df

제곱근 변환을 통해 분포가 줄어드는 효과를 얻음

 

 

 

박스-콕스(Box-Cox) 변환

다양한 형태의 데이터 분포를 정규분포에 가깝게 변환하기 위해 사용

양수 데이터에서만 사용 가능

(Scipy라이브러리 하위 모듈 scipy.stats 사용, 통계적 분석에 필요한 다양한 기능을 제공)

 

 

Box-cox변환 공식

 

: 변환할 원본 데이터 (양수여야 함)

: 변환 파라미터로, 최적의 값은 데이터의 정규성 개선 정도에 따라 결정

 

 

scipy.stats 모듈의 boxcox함수

 

1. 데이터를 변환하고 동시에 최적의 λ 값을 자동으로 계산

2. 변환된 데이터와 최적의 λ 값을 함께 반환

 

하여

Box-Cox 변환을 쉽게 수행할 수 있게 해줌

from scipy.stats import boxcox

#박스-콕스 변환
df['특성1_boxcox'], _ = boxcox(df['특성1'])
df

박스-콕스 변환을 통해 데이터의 분포가 정규분포에 가까워지는 효과를 얻음