본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 로그 변환(Log Transform) 활용 시점 3가지와 정규성 문제 해결 방법

by Papa Martino V 2026. 4. 8.
728x90

로그 변환(Log Transform)
로그 변환 (Log Transform)

 

데이터 분석과 머신러닝 모델링 과정에서 우리가 마주하는 실제 데이터는 교과서처럼 예쁜 정규분포(Normal Distribution)를 따르는 경우가 드뭅니다. 대부분의 수치 데이터는 한쪽으로 크게 치우친 왜도(Skewness)를 가지거나, 값의 범위가 기하급수적으로 차이나는 특성을 보입니다. 이때 데이터의 성질을 보존하면서도 통계적 유의성을 확보하기 위한 강력한 해결책이 바로 로그 변환(Log Transform)입니다. 본 가이드에서는 로그 변환의 수학적 원리와 실무 적용 시의 차이를 심도 있게 분석합니다.


1. 로그 변환이 필요한 3가지 핵심 상황과 이론적 근거

로그 변환은 큰 값을 작게 만들고 작은 값들 사이의 간격을 상대적으로 넓혀주는 비선형 변환 기법입니다. 이는 모델이 극단적인 데이터 포인트(Outliers)에 휘둘리지 않게 돕는 핵심적인 방법입니다.

데이터 스케일링 기법 간 비교 요약

구분 로그 변환 (Log) 표준화 (Standardization) 정규화 (Normalization)
주요 목적 왜도 제거, 등분산성 확보 평균 0, 표준편차 1 고정 최소 0, 최대 1 범위 고정
수학적 특성 비선형 변환 (곱셈 -> 덧셈) 선형 변환 (Z-score) 선형 변환 (Min-Max)
이상치 반응 이상치 영향력 대폭 축소 평균 변화로 인한 영향 있음 매우 민감함
데이터 제약 양수(Positive)만 가능 제약 없음 제약 없음

2. 실무 즉시 적용 가능한 파이썬 로그 변환 Example 7선

로그 변환을 적용할 때 단순히 `np.log()`를 쓰는 것만으로는 부족합니다. 0이나 음수 처리 등 실무에서 발생하는 예외 상황을 고려한 7가지 구현 방법입니다.

Example 1: 기본 자연로그 변환 (Natural Log)

import numpy as np
import pandas as pd

# 양의 실수로 구성된 데이터
data = pd.Series([10, 100, 1000, 10000])
log_data = np.log(data)

print(f"Original: {data.values}")
print(f"Log Transformed: {log_data.values}")
# 곱셉적 관계가 선형적 관계로 변환됨

Example 2: 0이 포함된 데이터 해결 (Log1p)

# 데이터에 0이 있으면 로그값은 -inf가 됨. 이를 방지하기 위해 1을 더함.
zero_data = np.array([0, 1, 10, 100])
# np.log1p(x)는 내부적으로 log(1+x)를 수행하여 수치적 안정성 확보
log1p_data = np.log1p(zero_data)

print(f"Log1p Result: {log1p_data}")

Example 3: 왜도(Skewness) 시각화 및 검증

import seaborn as sns
import matplotlib.pyplot as plt

# 치우친 데이터 생성
skewed_data = np.random.exponential(scale=2, size=1000)

plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.histplot(skewed_data, kde=True)
plt.title(f"Before (Skew: {pd.Series(skewed_data).skew():.2f})")

plt.subplot(1, 2, 2)
sns.histplot(np.log1p(skewed_data), kde=True)
plt.title(f"After (Skew: {pd.Series(np.log1p(skewed_data)).skew():.2f})")
plt.show()

Example 4: Scikit-learn FunctionTransformer 활용

from sklearn.preprocessing import FunctionTransformer

# 파이프라인에 통합 가능한 로그 변환기
log_transformer = FunctionTransformer(np.log1p, validate=True)
X = np.array([[1, 2], [3, 4]])
X_transformed = log_transformer.transform(X)

Example 5: 로그 변환 데이터의 역변환 (Inversion)

# 예측값이 로그 단위일 때 실제 값으로 복원하는 방법
log_pred = np.array([2.3, 4.6, 6.9])
# log1p의 역변환은 expm1
original_scale_pred = np.expm1(log_pred)
print(f"Original Scale: {original_scale_pred}")

Example 6: Pandas를 활용한 일괄 로그 변환 적용

df = pd.DataFrame({'Sales': [100, 200, 5000], 'Price': [10, 15, 100]})
# 특정 열들에 대해 일괄 적용
target_cols = ['Sales', 'Price']
df[target_cols] = df[target_cols].apply(np.log1p)

Example 7: 박스-콕스 변환(Box-Cox)과의 차이 확인

from scipy import stats

# 로그 변환은 박스-콕스 변환의 특수한 형태 (람다가 0일 때)
data = np.random.exponential(size=100)
bc_data, lmbda = stats.boxcox(data + 1) # 양수 보정
print(f"Optimal Lambda: {lmbda}")

3. 로그 변환 시 주의사항 및 전문적 해결책

  1. 해석의 어려움: 로그 변환된 데이터의 회귀 계수는 '절대적 변화'가 아닌 '비율적 변화'를 의미하게 됩니다. 분석 리포트 작성 시 반드시 지수 함수를 통해 역변환하여 설명해야 합니다.
  2. 0과 음수 문제: 로그 함수는 0 이하에서 정의되지 않습니다. 실무에서는 $log(x + c)$ (여기서 $c$는 보통 1 또는 아주 작은 양수)를 사용하는 해결책이 보편적입니다.
  3. 등분산성(Homoscedasticity) 확인: 로그 변환은 분산이 값의 크기에 비례하여 커지는 경우(이분산성)에 매우 효과적입니다. 변환 후 잔차 분석을 통해 분산이 일정해졌는지 확인하는 것이 정석입니다.

4. 결론: 왜곡된 데이터를 바로잡는 데이터 사이언티스트의 도구

로그 변환은 단순히 숫자를 조작하는 행위가 아닙니다. 이는 자연계와 경제계에서 흔히 발생하는 '지수적 성장' 또는 '곱셈적 관계'를 선형적인 시각으로 재해석하여 머신러닝 알고리즘이 패턴을 더 잘 찾을 수 있도록 길을 닦아주는 과정입니다. 특히 선형 회귀, 신경망 모델 등을 사용할 때 치우친 피처가 있다면 로그 변환을 가장 먼저 고려해 보십시오. 작은 차이가 압도적인 성능 해결로 이어질 것입니다.

 

내용 출처: 1. Feature Engineering for Machine Learning (Alice Zheng)

                2. Numpy Documentation (numpy.org)

                3. Scikit-learn User Guide - Preprocessing data

728x90