2025.12.08 TIL (본캠프, 36일차)
오늘은 데이터 표준화와 정규화에 대해 공부를 하였다.
이번 강의는 개인적으로 "데이터 전처리의 기술"에 관한 심화 강의였던거 같다.
Feature Scaling, 로그변환, KNN을 배웠는데, 모두 머신러닝 모델을 올바르게 구축하기 위한 필수 기술들이다.
첫 번째 깨달음: 데이터의 스케일이 왜 중요한가??
강의 초반부에 받은 예제가 정말 인상적이었다:
"최근 일주일 접속일수의 '1일'과 결제금액의 '1원'이 가지는 의미가 다르다."
이전에는 이런 생각을 해본 적이 없었다. 하지만 생각해보니 맞다.
머신러닝 모델은 수치만 본다. 만약 접속일수(1~7)이 섞여있다면, 모델은 결제금액 (1,000~100,000,000) 의 편향성을 강하게 반영할 수밖에 없다.
Feature Scaling이 필요한 이유
- 변수 범위의 기준점 통일 → 모든 변수를 같은 스케일로 본다
- 머신러닝 모델의 편향성 제거 → 특정 데이터에 과도한 가중치가 실리지 않도록 함
- 이상치 처리 정확도 향상 → 기준점이 맞아야 이상치를 정확히 판단
이제 데이터 전처리 흐름을 봤을 때, 단순히 결측치와 이상치 제거만이 전부가 아니라는 것을 알게 됐다.
표준화(Standardization) vs 정규화(Normalization)
비슷하지만 다른 두 가지 방법
처음 강의자료를 봤을 때 표준화와 정규화의 차이를 이해하기가 어려웠다.
둘 다 "데이터를 변환한다"는 점은 같은데, 구체적으로 뭐가 다른가?
강의를 들으면서 명확해졌다.
표준화 (Standardization): 평균 0, 표준편차 1
표준화된 값 = (원본값 - 평균) / 표준편차
표준화의 핵심은 분포의 모양은 유지하면서 기준점만 바꾼다는 것이다.
- 원본 데이터의 분포 모양: 유지
- 평균: 0으로 이동
- 표준편차: 1로 정규화
- 이상치 영향: 비교적 강함 (아웃라이어가 있어도 표준편차가 그걸 반영)
정규화 (Normalization): 0~1 범위로 재조정
정규화된 값 = (원본값 - 최소값) / (최대값 - 최소값)
정규화의 핵심은 모든 데이터를 0과 1 사이에 압축한다는 것이다.
- 범위: 항상 0~1
- 분포: 원본 비율 유지하되 범위만 압축
- 이상치 영향: 매우 취약함 (극단값이 나머지 값들을 압축시킴)
언제 어떤 것을 쓸까?
표로 간단하게 정리해본다.
| 구분 | 표준화 | 정규화 |
| 언제 | 평균/표준편차 의미 있을 때 | 절대 크기가 중요할 때 |
| 이상치 | 강함 | 취약함 |
| 활용 알고리즘 | KNN, SVM, 로지스틱 회귀 | 신경망 |
다음주에 진행되는 데이터 분석 프로젝트에서는 KNN을 쓸 것이므로, 표준화를 자세히 학습해야 겠다.
표준화의 또 다른 이점: 68-95-99.7 규칙
강의에서 배운 표준정규분포의 성질:
- 68%의 값이 μ±σ 범위에 존재
- 95%의 값이 μ±2σ 범위에 존재
- 99.7%의 값이 μ±3σ 범위에 존재
그리고 이상치 판단에도 이런 성질을 활용하여 쓸 수 있다.
Z-score가 3을 넘으면 이상치로 간주할 수 있다는 뜻이다.
표준화 vs 정규화: 처리 순서
- 표준화: 먼저 표준화 → 그 후 이상치 처리 (이상치 처리 후에도 범위가 변하지 않음)
- 정규화: 먼저 이상치 처리 → 그 후 정규화 (이상치가 있으면 전체 범위가 왜곡됨)
로그 변환 (Log Transformation)
오른쪽으로 치우친 분포를 정상화하기
로그 변환의 목적은 간단하다: 큰 수를 작은 수로 변환하되, 작은 값의 변화는 크게 표현하는 것이다.
예를 들어:
- 10 → log(10) = 1
- 100 → log(100) = 2
- 1,000 → log(1,000) = 3
큰 값의 변화(10배)가 작은 차이(1)로 표현되는 반면, 작은 값들의 차이는 상대적으로 더 크게 표현된다.
실무에서 왜 필요한가
대부분의 현실 데이터는 Positive Skew (오른쪽으로 치우친) 분포를 따른다.
- 소득 데이터: 대부분 평균 근처, 극소수의 부자들
- 웹사이트 방문수: 대부분의 페이지는 적게 방문, 소수의 인기 페이지는 많이 방문
- 상품 가격: 대부분의 상품은 저렴, 극소수의 명품은 고가
이런 분포에서는 로그 변환이 데이터를 더 정규분포에 가깝게 만들어준다.
# 로그 변환 예제
import numpy as np
log_df = np.log(num_df)
강의 실습에서 stock_market.csv의 자본금, PER, EPS 등을 로그 변환했을 때, 히스토그램이 왼쪽으로 치우친 모양에서 훨씬 더 종 모양에 가까워지는 것을 봤다. 이 결과는 바로 로그 변환의 효과다.
KNN (K-Nearest Neighbor) - 이상치 처리의 새로운 방법
거리 기반 분류의 원리
KNN은 새로운 개념이 아니라 우리가 이미 배운 개념의 활용이었다.
"유사한 특성을 가진 데이터는 유사한 범주에 속하는 경향이 있다."
개념은 매우 직관적이다.
만약 어떤 데이터가 "이상인가, 정상인가"를 판단하려면, 그 데이터 주변의 다른 데이터들이 뭔지 보면 된다.
거리 측정: 어떤 기준으로 "가깝다"고 정의할까
두 가지 거리 측정 방식을 배웠다:
- 유클리드 거리 (Euclidean Distance): √[(x₁-x₂)² + (y₁-y₂)²] → 직선거리, 일반적으로 가장 많이 사용
- 맨해튼 거리 (Manhattan Distance): |x₁-x₂| + |y₁-y₂| → 블록을 따라 가는 거리
대부분의 경우 유클리드 거리를 쓰면 된다.
KNN의 가장 중요한 전제: Feature Scaling 필수
KNN은 거리를 기반으로 작동한다. 만약 접속일수(1~7)와 결제금액(1000~100,000,000) 이 섞여있다면?
결제금액의 차이 1,000만 원이 거리 계산에서 훨씬 더 큰 영향을 미친다. 이러한 분석은 완전히 잘못되 결과를 초래한다.
그래서 KNN 적용 전에는 반드시 표준화 또는 정규화를 해야 한다.
from sklearn.neighbors import KNeighborsClassifier
# n_neighbors: 몇 개의 이웃을 참고할 것인가? (default: 5)
# p: 거리 측정 방식 (1=맨해튼, 2=유클리드)
knn = KNeighborsClassifier(n_neighbors=5, p=2)
KNN과 이상치 처리
오늘 강의의 핵심이 여기에 있었다.
지금까지 배운 이상치 처리 방법:
- IQR 방식 (Q1, Q3 기반)
- Z-score 방식 (표준편차 기반)
- (추가) KNN 방식: "이 점이 주변의 데이터들과 얼마나 다른가?"
KNN으로 이상치를 처리하면, 단순한 통계적 기준이 아니라 실제 데이터 분포 맥락에서 이상치를 판단할 수 있다.
예를 들어, 만약 데이터가 두 개의 서로 다른 클러스터를 형성하고 있다면, 한 클러스터에서는 "이상치"지만 다른 클러스터에서는 "정상"일 수 있다. KNN은 이런 미묘한 차이를 반영할 수 있다.
데이터 전처리 파이프라인 정리
오늘 배운 내용을 통해 데이터 전처리의 전체 흐름을 다시 정리해본다.
1. 결측치 처리
↓
2. 표준화 / 정규화
↓
3. 이상치 처리 (IQR, Z-score, 또는 KNN)
↓
4. 로그 변환 (필요시, 분포 정규화)
↓
5. 머신러닝 모델 적용
데이터 전처리에 있어서 표준화 단계가 중요하다는 것을 알게 됐다. 결측치 다음에 표준화를 하고, 그 후에 이상치를 처리해야 한다.
오늘 학습에 대한 나의 생각...
3일 전 가설검정을 배웠을 때는 통계의 큰 그림을 배웠다면, 오늘은 데이터를 머신러닝에 맞게 준비하는 기술을 배웠다.
두 가지 모두 중요하다:
- 가설검정: "우리 데이터가 의미 있는가?" 판단
- 전처리 기술: "우리 데이터를 모델이 올바르게 처리할 수 있도록 준비"
실전에 가까워지고 있다는 느낌
초반부 SQL, Python 기초에서는 "이게 언제 쓸까?" 했지만, 이제는 구체적인 목적이 보인다.
- SQL: 데이터 추출
- Python 기초: 데이터 조작
- EDA (시각화, 통계): 데이터 이해
- 전처리 기술: 데이터 준비
- 머신러닝: 모델 구축
강의에서 KNN은 이상치 처리뿐만 아니라 분류 알고리즘으로도 사용된다고 했다.
다음 강의부터는 본격적인 머신러닝 모델들을 배울 것 같다.
지금까지 배운 것들:
- 데이터 준비 (SQL, Python)
- 데이터 탐색 (시각화, 통계)
- 데이터 전처리 (결측치, 이상치, Feature Scaling)
- ▶ 머신러닝 모델링 (예정)
새로운 한주가 시작하는 하루를 마무리..
36일차는 "데이터 분석에서 머신러닝으로 가는 다리"를 건너는 날이었다.
지금까지 배운 모든 것들이 서로 결합되고 있는거 같다.
- 결측치와 이상치 처리는 왜 그런 방식으로 하는가?
- Feature Scaling은 왜 필수인가?
- KNN은 어떻게 이상치를 판단하는가?
이번 한 주는 지금보다 더 복잡한 머신러닝 모델들을 배울 것 같다.
어려워지는 만큼 복습과 학습을 꾸준히 해야겠다.