본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Data Preprocessing
데이터를 실제 업무에 활용하기에 앞서서 정제하는 행위

데이터 전처리는 수집한 원자료의 빈 값, 잘못된 값, 서로 다른 형식과 척도를 정리해 분석과 모델링에 쓸 수 있는 형태로 만드는 작업이다. 전처리 결과는 모형 성능에 직접 영향을 주므로 탐색적 데이터 분석과 함께 분석의 앞단에서 반복해서 수행한다.

데이터 전처리 부담

편집 원본 편집
  • 데이터 분석가는 업무 시간 중 80%정도를 데이터 수집 및 전처리 과정에 사용[1]
  • 데이터 품질 향상
    • 이상치 처리
    • 결측치 처리
    • 노이즈 제거
    • 오타 처리
    • 개행문자 등 특수문자 처리
  • 데이터 통일
    • 메타 데이터 조정: 칼럼명 통일
    • 데이터 형태 조정: Data Type, Datetime Type, 원핫 인코딩
    • 연계 정보 조정: 불필요 칼럼 삭제, 칼럼 추가 등
  • 개인정보 보호
구분 기법 설명
정제 결측치 처리 행·열 삭제, 평균·중앙값·최빈값 대치, 회귀·KNN 등 모형 기반 대치
이상치 처리 사분위 범위(IQR) 기준이나 z 점수로 찾아 삭제, 상하한 값으로 바꾸기(capping), 변환으로 영향 줄이기
노이즈 처리 구간화(binning), 이동 평균 같은 평활로 우연한 흔들림을 줄인다
통합 병합·연결 여러 출처의 데이터를 키로 결합하고 중복·단위·코드 불일치를 해소한다
축소 차원 축소 변수 선택, 주성분 분석 등으로 변수 수를 줄인다
샘플링 데이터 일부를 뽑거나, 클래스 불균형을 맞추려 언더·오버샘플링한다
변환 정규화(최소-최대) 값을 0~1 구간으로 옮긴다. 척도가 다른 변수를 거리 기반 기법에 함께 쓸 때 필요하다
표준화(z-score) 평균 0, 표준편차 1로 맞춘다
로그 변환 오른쪽으로 길게 치우친 분포를 대칭에 가깝게 만든다
범주형 인코딩 범주를 숫자로 바꾼다. 원-핫 인코딩은 범주마다 0/1 열을 만든다

스케일링 공식

편집 원본 편집
  • 최소-최대 정규화: x′=x−xminxmax−xmin
  • 표준화(z-score): z=x−x¯s
  • 로그 변환: x′=log⁡(x+1) (0이 있는 양수 자료에 흔히 1을 더한다)

여기서 정규화는 값의 범위를 맞추는 스케일링을 뜻하며, 데이터베이스 설계의 정규화와는 다른 개념이다.

결측치가 있는 작은 표에 중앙값 대치, 최소-최대 정규화, 표준화, 원-핫 인코딩을 차례로 적용한다.

import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import MinMaxScaler, StandardScaler, OneHotEncoder

df = pd.DataFrame({
    "age":    [23, 35, np.nan, 41, 29, 52],
    "income": [2400, 3800, 3100, np.nan, 2900, 6200],
    "city":   ["서울", "부산", "서울", "대구", "부산", "서울"],
})
print(df.isna().sum())

num = ["age", "income"]
imp = SimpleImputer(strategy="median")
df[num] = imp.fit_transform(df[num])
print(imp.statistics_)

print(np.round(MinMaxScaler().fit_transform(df[num]), 3))
print(np.round(StandardScaler().fit_transform(df[num]), 3))

ohe = OneHotEncoder(handle_unknown="ignore")
print(ohe.fit_transform(df[["city"]]).toarray())
print(ohe.get_feature_names_out())

실행 결과는 다음과 같다(pandas 2.3.3, scikit-learn 1.7.2).

age       1
income    1
city      0
dtype: int64
[  35. 3100.]
[[0.    0.   ]
 [0.414 0.368]
 [0.414 0.184]
 [0.621 0.184]
 [0.207 0.132]
 [1.    1.   ]]
[[-1.405 -0.954]
 [-0.091  0.175]
 [-0.091 -0.39 ]
 [ 0.566 -0.39 ]
 [-0.748 -0.551]
 [ 1.769  2.11 ]]
[[0. 0. 1.]
 [0. 1. 0.]
 [0. 0. 1.]
 [1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
['city_대구' 'city_부산' 'city_서울']

age와 income의 빈 값은 각각 중앙값 35와 3100으로 채워졌다. income의 최댓값 6200이 다른 값보다 훨씬 커서 표준화 점수가 2.11로 튄다. 이런 값은 이상치 여부를 따로 확인한다.

데이터 누수 주의

편집 원본 편집
  • 대치값, 최솟값·최댓값, 평균·표준편차 같은 전처리 기준은 학습 데이터에서만 구해야 한다. 전체 데이터로 기준을 구한 뒤 나누면 평가 데이터의 정보가 학습에 섞여 성능이 실제보다 좋게 나온다.
  • 순서는 데이터 분할 → 학습 데이터로 fit → 학습·평가 데이터 모두 transform이다.
  • scikit-learn 문서는 먼저 데이터를 나누고, 평가 데이터에는 fit이나 fit_transform을 쓰지 말며, 전처리와 모형을 Pipeline으로 묶으면 교차 검증 때도 알맞은 부분에만 fit된다고 설명한다.
  • 위 Python 예는 설명을 위해 6행 전체에 fit했지만, 실제 모델링에서는 학습 데이터에만 fit한다.

ADP 실기와의 대응

편집 원본 편집

한국데이터산업진흥원이 밝힌 ADP 실기 출제 방향에서 기계학습 영역 '유형1: 데이터 전처리'는 결측값 처리, 이상값 탐지 및 수정, 데이터 정규화, 파생 변수 생성, 데이터 샘플링, 데이터 병합 및 분할 작업을 포함한다.

공식 문구 이 문서의 기법 파이썬 도구 예
결측값 처리 결측치 삭제·대치 pandas dropna, fillna / SimpleImputer
이상값 탐지 및 수정 IQR, z 점수, 상하한 대체 pandas quantile, clip
데이터 정규화 최소-최대 정규화, 표준화 MinMaxScaler, StandardScaler
파생 변수 생성 파생 변수, 변수 변환 pandas 열 연산
데이터 샘플링 표본 추출, 언더·오버샘플링 pandas sample, train_test_split(stratify)
데이터 병합 및 분할 통합, 데이터 분할 pandas merge, concat / train_test_split
  • 최소-최대 정규화와 z-score 표준화의 공식과 결과 범위(0~1 대 평균 0·표준편차 1)를 구분한다.
  • 결측치 처리 방법(삭제, 단순 대치, 모형 기반 대치)과 이상치 탐지 기준(IQR 1.5배, z 점수)을 설명할 수 있어야 한다.
  • 실기에서는 전처리 기준을 학습 데이터로만 fit하는지가 데이터 누수 여부를 가른다.