AI/머신러닝

숫자의 함정에서 벗어나는 법: 스케일링(Scaling)과 로그(Log) 변환

코딩금융치료 2026. 4. 28. 09:55

데이터 분석이나 머신러닝 공부를 시작하면 가장 먼저 마주치는 벽이 있습니다. 바로 "데이터 전처리"죠. 그중에서도 "왜 멀쩡한 숫자에 로그를 취하나요?", "스케일링은 왜 꼭 해야 하나요?"라는 질문에 대한 답을 오늘 완벽하게 정리해 보겠습니다.


1. 로그(Log) 변환: "폭발적인 숫자를 잠재우는 마법"

머신러닝 모델은 '숫자의 크기'에 굉장히 민감합니다. 하지만 우리가 사는 세상의 데이터는 그리 고르지 않습니다.

🏠 집값 데이터의 예시

대부분의 집은 3억~10억 사이에 몰려 있지만, 가끔 100억이 넘는 초고가 펜트하우스가 등장합니다. 이를 데이터 시각화해보면 왼쪽으로 치우치고 오른쪽 꼬리가 아주 긴(Right-Skewed) 모양이 됩니다.

로그를 왜 취하나요?

  1. 데이터의 격차 해소: 로그는 큰 숫자를 작게 만들고, 작은 숫자들 사이의 간격은 상대적으로 넓게 만듭니다. 100억이라는 거대한 숫자를 로그의 세계로 가져오면 다른 데이터들과 '대화가 가능한 수준'으로 차분해집니다.
  2. 종 모양(정규분포)으로 만들기: 머신러닝 모델(특히 선형 회귀)은 데이터가 예쁜 종 모양일 때 학습 성능이 가장 좋습니다. 로그는 삐져나온 꼬리를 안으로 당겨 데이터를 종 모양에 가깝게 펴주는 역할을 합니다.
  3. 비율(%)의 관점: 1억에서 2억이 되는 것(2배)과 10억에서 20억이 되는 것(2배)을 동일한 '성장'으로 인식하게 합니다. 이는 복리나 성장률이 중요한 금융 데이터에서 필수적입니다.

💡 꿀팁: 데이터에 0이 있으면 로그값은 정의되지 않습니다(마이너스 무한대). 그래서 보통 log(x + 1)을 해주는 np.log1p() 함수를 사용합니다.


2. 데이터 스케일링(Scaling): "공평한 운동장을 만드는 과정"

스케일링은 한마디로 "단위(Unit)의 통일"입니다.

🏃‍♂️ 유치원생과 거인의 달리기 시합

데이터셋에 '방의 개수(1~5개)'와 '거실 면적(100~3000sqft)'이라는 두 변수가 있다고 가정해 봅시다.

  • 방이 1개 늘어나는 것은 엄청난 변화지만, 수치상으로는 겨우 '+1'입니다.
  • 면적이 조금 넓어지는 것은 사소할 수 있지만, 수치상으로는 '+100'이 훌쩍 넘습니다.

모델은 바보같이 "오! 숫자가 큰 면적이 훨씬 중요한 변수구나!"라고 오해하게 됩니다. 이를 막기 위해 모든 변수를 동일한 체급으로 맞춰주는 것이 스케일링입니다.

대표적인 스케일링 3대장

① StandardScaler (표준화)

  • 방식: 평균을 0, 표준편차를 1로 만듭니다.
  • 특징: 데이터를 '평균 근처에 얼마나 모여 있는가'로 재배치합니다.
  • 단점: 이상치(Outlier)가 있으면 평균이 확 변해서 성능이 떨어질 수 있습니다.

② MinMaxScaler (정규화)

  • 방식: 최솟값을 0, 최댓값을 1로 압축합니다.
  • 특징: 모든 데이터를 0과 1 사이의 좁은 감옥에 가둡니다.
  • 단점: 이상치가 '1억'처럼 크다면, 나머지 데이터들은 0.0001 근처에 닥닥 붙게 되어 변별력을 잃습니다.

③ RobustScaler (이상치 해결사)

  • 방식: 평균 대신 중앙값(Median)과 사분위수(IQR)를 사용합니다.
  • 특징: 이상치에 매우 강합니다. 튀는 값이 한두 개 있어도 대다수 데이터의 체급을 아주 예쁘게 잘 맞춰줍니다.
  • 결론: 실제 현업 데이터나 캐글 집값 데이터처럼 튀는 값이 많은 경우 가장 정석적인 선택입니다.

📝 블로그 요약 노트

  1. 로그 변환은 데이터의 분포를 고르게 만들고(정규화), 비율의 관점을 도입하기 위해 쓴다.
  2. 스케일링은 서로 다른 단위를 가진 변수들을 공평하게 비교하기 위해 필수적이다.
  3. 이상치가 걱정된다면 고민 말고 RobustScaler를 선택하자.