데이터 & 머신러닝

[python] 로그 변환(Log Transformation)의 사용

항해사.K 2025. 3. 29. 21:07

1. 로그란 무엇인가

‘로그(log)’라는 단어, 아마 수학 수업 중에 ‘지수 어쩌구’, ‘e 저쩌구’ 하는 이야기 속에서 한 번쯤 들어보셨을 겁니다. 익숙한 단어일 수도 있지만, 돌다리도 두드려 보고 건너듯이 로그 변환 이야기를 시작하기 전에 로그가 무엇인지 간단히 짚고 넘어가 보려 합니다.

‘로그(log)’는 logarithm의 줄임말로, 고대 그리스어 λόγος(lógos)ἀριθμός(arithmós)의 합성어입니다.

  • λόγος (lógos): 계산, 또는 ‘비(比, 비율)’을 뜻하는 말
  • ἀριθμός (arithmós): 숫자(number)를 의미

하지만 현대 수학에서의 로그는 비율이 아닌, '거듭제곱의 횟수'를 알려주는 수로 정의됩니다.


1) 로그의 정의

로그는 어떤 수를 몇 번 곱해야 특정 값이 되는지를 나타냅니다. 즉, 지수의 역함수라고 볼 수 있습니다.

지수는 “밑을 몇 번 곱한다”는 개념이라면,
로그는 “몇 번 곱했더니 이 값이 되었는가?”를 묻는 개념입니다.

 

수식으로 표현하면 아래와 같습니다:

로그와 지수의 관계

예를 들어 아래와 같이 표현할 수 있습니다.

예시


2) 로그변환을 사용하는 이유

데이터 분석에서 로그 변환(Log Transformation)은 단순한 수학적 변환을 넘어 데이터의 특성을 더욱 명확하게 드러내기 위한 방법입니다. 로그 변환은 데이터가 한쪽으로 크게 치우쳐 있거나(skewed), 값들의 범위 차이가 큰 경우 유용하게 활용됩니다.

특히 집값, 소득, 인구수와 같이 일부 값이 매우 크고 대부분의 값이 상대적으로 작은 데이터를 분석할 때, 로그 변환을 적용하면 데이터의 분포가 정규분포에 가까워지고 분산이 안정됩니다. 이를 통해 이상치(outlier)의 영향이 줄어들고, 선형 회귀와 같은 분석 모델이 더 정확하고 안정적으로 작동할 수 있게 됩니다. 뿐만 아니라 독립변수의 변화가 종속변수에 미치는 영향을 비율(%)로 직관적으로 해석할 수 있어 분석 결과의 이해가 쉬워집니다.

인천시 연수구 2015년부터 2024년까지 매매 실거래가에 대한 로그 변환 분포 비교


3) 로그 변환은 어떨 때 사용하는가

  • 데이터 분포가 오른쪽으로 치우쳐 있을 때 (positive skew)
  • 지수적인 증가 패턴을 보일 때
  • 변동성이 큰 데이터를 안정화시키고 싶을 때
  • 곱셈 관계를 덧셈으로 단순화하고 싶을 때

4) 로그 변환을 사용하는 방법

데이터 전처리 단계에서 변수에 로그를 취합니다. (예: np.log(x), np.log1p(x))

단, 0 이하의 값에는 로그를 바로 적용할 수 없기 때문에 사전 처리가 필요합니다. (+1을 더하는 방식 등)

🔹np.log vs np.log1p 차이점

🔸왜 np.log1p를 사용할까?
  • 데이터가 0을 포함할 때 log(0) 문제 해결
  • 매우 작은 숫자에서 발생하는 부동소수점 오류 방지

 코드 예시

import numpy as np

x = np.array([0, 1, 2, 10])

# np.log 사용 시
print("log(x):", np.log(x))  # 0에서 음의 무한대 발생

# np.log1p 사용 시
print("log1p(x):", np.log1p(x))  # 안정적으로 계산 가능

 

출력 결과:

log(x): [-inf  0.  0.69314718  2.30258509]
log1p(x): [0.  0.69314718  1.09861229  2.39789527]

권장사항

  • 데이터가 크고 0 이하의 값이 없는 경우 → np.log
  • 0이 많거나 매우 작은 값이 자주 등장하는 경우 → np.log1p 사용 추천
  • 음수 값은 최소값을 더해 양수로 변환 후 로그 적용

2. 로그 변환과 회귀 분석

로그는 회귀분석에서도 매우 자주 사용되는 도구입니다.

데이터의 스케일을 조정하고 관계를 단순화함으로써, 더 효과적인 모델을 만들 수 있게 도와줍니다.

1) 회귀 분석에서 로그 변환을 사용하는 이유

첫째, 로그 변환은 비선형적인 곡선관계를 직선관계로 단순화해줍니다. 이로 인해 선형 회귀 모델을 적용하기 쉬워지고, 예측 정확도도 높아질 수 있습니다.

 

둘째, 데이터의 분포를 정규분포에 가깝게 정규화해 회귀분석의 주요 가정 중 하나인 정규성을 만족시키는데 도움을 줍니다.

 

셋째, 로그를 사용하면 변수 간의 관계를 비율(%)로 해석할 수 있어, 분석 결과를 보다 직관적으로 이해할 수 있습니다.


2) 로그 변환 적용 방식

로그 변환은 회귀식에서 다음 세 가지 방식으로 적용될 수 있습니다.

  • 로그-선형 모델: 종속변수에 로그를 취한 형태
    • log(Y) = β₀ + β₁X + ε
    • 해석: X가 1 단위 증가할 때, Y는 약 100 × β₁% 증가합니다.
  • 선형-로그 모델: 독립변수에 로그를 취한 형태
    • Y = β₀ + β₁ log(X) + ε
    • 해석: X가 1% 증가할 때,  Y는 β₁ / 100 만큼 증가합니다.
  • 로그-로그 모델: 종속변수와 독립변수 모두에 로그를 취한 형태
    • log(Y) = β₀ + β₁ log(X) + ε
    • 해석: X가 1% 증가할 때, Y도 β₁% 증가합니다. 이 경우 특히 탄력성(elasticity)해석에 적합합니다.

3) 로그 변환 시 주의할 점

  • 0 이하 값에는 로그를 적용할 수 없습니다.
  • 따라서 np.log1p(x) 또는 x + 1 과 같은 처리를 통해 로그 변환이 가능하도록 만들어야 합니다.
  • 로그 변환된 회귀식은 해석이 직관적이지 않을 수 있습니다.
  • 특히 로그-선형 모델의 경우, 초반에는 계수 해석에 혼동이 생길 수 있습니다. 
  • 예측값이 로그 스케일로 출력될 경우, 최종 해석을 위해 다시 지수 변환(np.exp())을 해주는 과정이 필요합니다.

실제 예시 (Python 코드)

import statsmodels.formula.api as smf
model = smf.ols("np.log(price) ~ area + rooms + np.log(distance_to_station)", data=df).fit()

위의 회귀식은 종속변수 price에 로그를 취한 로그-선형 모델이며, 독립변수 distance_to_station에도 로그를 적용한 혼합 형태입니다.

 

해석 예:

  • area: 면적이 1㎡ 증가할 때, 집값은 β₁% 상승합니다.
  • np.log(distance_to_station): 역과의 거리가 1% 증가할 때, 집값은 β₃% 하락합니다.

🧭마무리

로그 변환은 회귀 분석을 포함한 다양한 데이터 분석에서 매우 유용하게 쓰입니다.

✔️ 첫째, 변수 간의 관계가 곡선 형태일 때 로그를 적용하면 직선 형태로 단순화되어 선형 회귀 모델에 적합하게 만들 수 있습니다.
✔️ 둘째, 데이터 분포가 한쪽으로 치우쳐 있거나 이상치가 많은 경우, 로그 변환을 통해 분포를 안정화하고 분석의 신뢰도를 높일 수 있습니다.
✔️ 셋째, 로그를 사용하면 변수 간의 관계를 비율(%) 기반으로 해석할 수 있어, 결과를 더욱 직관적으로 이해할 수 있습니다.

이처럼 로그 변환은 데이터의 구조를 단순화하고 해석을 명확하게 해주는 도구로, 분석의 정밀도를 높이는 데 큰 도움이 됩니다. 

로그라는 도구 하나 챙겨두면, 출렁이는 데이터의 바다도 더 평온하게 건널 수 있습니다.🌊📊


Reference

1. Khan Academy, 대수학2, 로그란?

2. 친절한 데이터사이언티스트되기 강좌, 데이터를 로그 변환했을 때 벌어지는 일과 결과 해석 (https://recipesds.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EB%A1%9C%EA%B7%B8-%EB%B3%80%ED%99%98-%ED%96%88%EC%9D%84-%EB%95%8C-%EB%B2%8C%EC%96%B4%EC%A7%80%EB%8A%94-%EC%9D%BC%EA%B3%BC-%EA%B2%B0%EA%B3%BC-%ED%95%B4%EC%84%9D)

 

 


🚢 데이터의 바다는 넓고, 우리의 항해는 계속됩니다.

다음 여정에서 또 만나요! 😎🌊