박스-콕스(Box-Cox) 변환은 비대칭적이고 비정상적인 분포를 가진 데이터를 정규 분포에 가까운 형태로 변환하는 데 사용되는 방법이다.
이 방법은 데이터의 변환 파라미터인 람다
를 찾는 방식으로 데이터를 변환한다.
박스-콕스 변환 공식:
람다
값에 따른 변화import numpy as np
from scipy import stats
# 예시 데이터 (왜도가 큰 데이터)
data = np.array([0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0])
# 박스-콕스 변환 (최적의 lambda를 찾음)
transformed_data, best_lambda = stats.boxcox(data)
print("박스-콕스 변환된 데이터:", transformed_data)
print("최적의 lambda 값:", best_lambda)
여-존슨(Yeo-Johnson) 변환은 박스-콕스 변환을 음수 값을 처리할 수 있도록 확장한 방식.
즉, 박스-콕스 변환은 0 이하의 값에 대해 적용할 수 없지만, 여-존슨 변환은 음수 데이터를 포함한 데이터도 처리할 수 있음. 그래서 이게 sklearn.preprocessing
에서 power_transform
의 기본값임.
여-존슨 변환 공식:
from scipy import stats
# 예시 데이터 (음수 값 포함)
data_with_negatives = np.array([0.1, -0.5, 1.0, 2.0, -5.0, 10.0, 20.0])
# 여-존슨 변환 (최적의 lambda를 찾음)
transformed_data, best_lambda = stats.yeojohnson(data_with_negatives)
print("여-존슨 변환된 데이터:", transformed_data)
print("최적의 lambda 값:", best_lambda)
코드적으로 봤을때 box-cox든 yeo-johnson이든 fit과 transform을 여타 sklearn 모듈처럼 나누지 않는다.
왜냐하면 box-cox와 yeo-johnson 모두비교
에 목적이 있는 것이 아니라, 단순히 데이터의 모양새를 정규표현식과 유사하게 변경시켜줌에 목적이 있기 때문이다.
그래서 보통 바로 아래와 같이 적용하게 된다.
from sklearn.preprocessing import power_transform power_transform(data, method = ???) # 여기서 기본적으로 method는 범용성이 좋은 yeo-johnson이다.