AI/Machine Learning

전처리와 분석

jumemory 2025. 6. 21. 16:00

 데이터 전처리와 특징 공학: 모델의 성능을 멱살 잡고 하드캐리하기

알고리즘이 '두뇌'라면, 데이터는 '체력'이다. 아무리 똑똑한 알고리즘도 부실한 데이터를 만나면 제 실력을 발휘하지 못한다. 오늘은 데이터를 탐색하고(EDA), 다듬고, 새로운 가치를 창조하는(Feature Engineering) 과정을 정리해 본다.


1. EDA (탐색적 데이터 분석): 데이터와 낯가림 없애기

본격적으로 모델을 돌리기 전, 데이터의 신상 정보를 파악하는 과정이다.

  • 변수 분포 확인: 데이터가 정규 분포를 따르는가? 아니면 한쪽으로 치우쳐 있는가? (필요시 로그 변환 등을 통해 대칭으로 만든다.)
  • 이상치(Outlier) 탐지: 말도 안 되게 크거나 작은 값이 있는가? 이를 제거할지, 상한선을 둘지 결정해야 한다.
  • 결측치(Missing Value) 확인: df.isnull().sum()은 분석의 시작이다.
    • 제거: 데이터가 충분하다면 행을 삭제(dropna).
    • 대체: 데이터가 아깝다면 평균, 중앙값, 혹은 최빈값으로 채운다(fillna).
  • 데이터 누수(Leakage) 방지: 고객 ID처럼 무작위로 생성되어 분석에 방해가 되는 변수는 과감히 제거한다.

2. 결측치(Missing Value)의 통계적 이해

데이터가 비어 있는 이유(Mechanism)를 아는 것이 전처리의 시작이다.

  • MCAR (완전 무작위 결측): 실수로 빠뜨린 경우. 단순 제거해도 편향이 적다.
  • MAR (무작위 결측): 다른 변수(성별, 나이 등)로 설명이 가능한 경우. 통계적 대치가 효과적이다.
  • MNAR (비무작위 결측): 소득이 너무 낮아 일부러 무응답 하는 경우. 예측이 매우 어렵고 모델에 편향을 줄 위험이 크다.

1) 데이터 분포와 통계적 판단

모델 성능을 높이려면 데이터의 모양부터 살펴봐야 합니다.

  • 왜도(Skewness): 데이터 분포가 왼쪽이나 오른쪽으로 얼마나 치우쳤는지를 나타냅니다.
  • 첨도(Kurtosis): 분포가 얼마나 뾰족한지(꼬리 부분이 얼마나 두꺼운지)를 나타냅니다.
  • 정규분포화: 왜도나 첨도가 심해 정규분포에서 멀어질수록 모델 성능이 떨어지므로, 로그 변환 등의 전처리가 필요합니다.

2) 결측치 처리 전략

결측치 (`NaN`, `None`, `NaT`) 포함된 값

  • 제거(dropna): 데이터가 충분할 때 사용. thresh(유효값 개수)나 subset 파라미터로 범위를 조절한다.
  • 단순 대치(fillna): 평균(Mean), 중앙값(Median), 최빈값(Mode)으로 채운다.
  • 지능적 대치: KNN(최근접 이웃)을 활용해 비슷한 데이터의 값을 빌려오거나, 다중 대치법(MICE), 보간법(Interpolation)을 사용해 데이터의 흐름을 보존한다.

3. 상관관계 분석: 신호와 소음 구분하기

변수들끼리 얼마나 친한지 수치로 확인하는 과정이다.

  • 상관계수(corr()): 절댓값이 1에 가까울수록 강력한 관계다.
  • 주의사항: 상관계수는 오직 숫자형(Number) 데이터끼리만 계산할 수 있다.
    # 숫자형 데이터만 뽑아서 상관계수 확인
    df.select_dtypes(include='number').corr()
    
  • 시각화 꿀팁 (Heatmap): 상관계수 행렬은 대각선을 기준으로 대칭이다. 중복된 부분을 가리기 위해 mask를 사용하면 가독성이 폭발한다.

violinplot (좌) countplot(우)


4. 스케일링 (Scaling): 데이터 체급 맞추기

1단계에서 배운 표준화를 실제로 적용하는 단계다. 분류는 표준화, 회귀는 정규화가 정석이다.

스케일러 특징 추천 상황
StandardScaler (표준화) 평균 0, 표준편차 1로 변환 분류 문제, 이상치가 적을 때
MinMaxScaler (정규화) 최소 0, 최대 1 사이로 압축 회귀 문제, 딥러닝, 데이터의 경계가 명확할 때

⚠️ 실무 핵심: fit과 transform의 분리

훈련 데이터로 기준을 정했으면(fit), 테스트 데이터는 그 기준에 맞추기(transform)만 해야 한다.

ss = StandardScaler()
train_X_scaled = ss.fit_transform(train_X)
test_X_scaled = ss.transform(test_X) # fit을 다시 하면 안 됨!

5. 데이터 전처리의 숨은 꿀팁

1). 범주형 데이터의 수치화: 인코딩(Encoding)

컴퓨터는 '서울', '부산'을 계산할 수 없다. 이를 숫자로 바꾸는 세 가지 방법이 있다.

  1. 라벨 인코딩 (Label Encoding): 서울=0, 부산=1. 간단하지만 컴퓨터가 "부산(1)이 서울(0)보다 크다"라고 오해할 수 있다.
  2. 원-핫 인코딩 (One-Hot Encoding): 각 범주를 컬럼으로 만들고 0과 1로 표시. 확실하지만 범주가 너무 많으면 **'차원의 저주'**에 빠진다.
  3. 임베딩 (Embedding): 단어를 고정된 크기의 벡터로 변환. 딥러닝에서 의미적 유사도를 파악할 때 주로 쓴다.

2) 스케일링(Scaling) 주의사항

모델 학습 시 가장 많이 실수하는 부분이다.(비선형 구조는 스케일링 필요없음)

  • 반드시 훈련 데이터(Train)의 통계치(평균, 표준편차)로 테스트 데이터(Test)도 스케일링해야 한다. * 테스트 데이터는 우리가 "모르는 정보"여야 하므로, 훈련할 때 썼던 기준(StandardScaler 등)을 그대로 가져와서 변환만 시켜줘야 데이터 누수(Data Leakage)를 막을 수 있다.
  • 표준화 (StandardScaler): 평균 0, 분산 1로 만듦. 주로 분류 모델에 유리.
  • 정규화 (MinMaxScaler): 0~1 사이로 압축. 주로 회귀 모델에 유리.

6. 불균형 데이터 처리 (Sampling)

"99명이 정상이고 1명이 암 환자"라면 모델은 그냥 다 정상이라고 대답해도 정확도가 99%가 나온다. 이걸 해결해야 한다.

  • 언더샘플링 (Under-sampling): 많은 쪽(정상)을 줄여서 비율을 맞춘다. (데이터 손실 위험)
  • 오버샘플링 (Over-sampling): 적은 쪽(환자)을 뻥튀기한다. (SMOTE 같은 기법으로 가짜 데이터를 생성한다.)

7. 비정형 데이터(텍스트)의 맥락 분류 (Data Storytelling)

데이터를 단순히 종류별로 나누는 게 아니라, 시간의 흐름이나 사건의 전개 방식에 따라 분류하는 것입니다.

  • 방식: 특정 개체(예: 유튜버, 기업)가 시간이 지남에 따라 어떤 상태 변화를 겪는지 '이야기(Story)'처럼 잇는 방식입니다.
  • 활용: 주형 님이 하셨던 마케팅 자동화 프로젝트를 예로 들면, 유튜버를 단순히 '구독자 수'로 분류하는 게 아니라, [성장 정체기 → 급상승기 → 안정기] 같은 스토리라인으로 분류하는 식입니다.

8. 분석 보고서 자동화: ydata-profiling

일일이 시각화 코드를 짜기 귀찮을 때, 한 줄로 HTML 보고서를 뽑아주는 사기 아이템이다.

from ydata_profiling import ProfileReport
ProfileReport(df).to_file("report.html")

이 보고서 하나면 결측치, 상관관계, 분포가 한눈에 정리된다.


✍️ 공부를 마치며

전처리는 화려한 알고리즘을 쓰는 것보다 훨씬 지루하고 고된 작업이다. 하지만 시각화 도구(violinplot, countplot)로 데이터를 뜯어보고, 적절한 스케일러를 선택하고, 결측치를 메우는 이 과정이야말로 '진짜' 데이터 과학자의 역량이 드러나는 지점임을 잊지 말자.

'AI > Machine Learning' 카테고리의 다른 글

과적합과 규제 (L1/L2)  (0) 2025.06.23
평가지표와 통계적 판단  (0) 2025.06.22
경사하강법 (최적화)  (0) 2025.06.20
지도학습 Ⅱ (분류)  (0) 2025.06.19
지도학습 Ⅰ (회귀)  (0) 2025.06.19