데이터 전처리
IT 위키
더 많은 작업
- Data Preprocessing
- 데이터를 실제 업무에 활용하기에 앞서서 정제하는 행위
데이터 전처리는 수집한 원자료의 빈 값, 잘못된 값, 서로 다른 형식과 척도를 정리해 분석과 모델링에 쓸 수 있는 형태로 만드는 작업이다. 전처리 결과는 모형 성능에 직접 영향을 주므로 탐색적 데이터 분석과 함께 분석의 앞단에서 반복해서 수행한다.
- 데이터 분석가는 업무 시간 중 80%정도를 데이터 수집 및 전처리 과정에 사용[1]
| 구분 | 기법 | 설명 |
|---|---|---|
| 정제 | 결측치 처리 | 행·열 삭제, 평균·중앙값·최빈값 대치, 회귀·KNN 등 모형 기반 대치 |
| 이상치 처리 | 사분위 범위(IQR) 기준이나 z 점수로 찾아 삭제, 상하한 값으로 바꾸기(capping), 변환으로 영향 줄이기 | |
| 노이즈 처리 | 구간화(binning), 이동 평균 같은 평활로 우연한 흔들림을 줄인다 | |
| 통합 | 병합·연결 | 여러 출처의 데이터를 키로 결합하고 중복·단위·코드 불일치를 해소한다 |
| 축소 | 차원 축소 | 변수 선택, 주성분 분석 등으로 변수 수를 줄인다 |
| 샘플링 | 데이터 일부를 뽑거나, 클래스 불균형을 맞추려 언더·오버샘플링한다 | |
| 변환 | 정규화(최소-최대) | 값을 0~1 구간으로 옮긴다. 척도가 다른 변수를 거리 기반 기법에 함께 쓸 때 필요하다 |
| 표준화(z-score) | 평균 0, 표준편차 1로 맞춘다 | |
| 로그 변환 | 오른쪽으로 길게 치우친 분포를 대칭에 가깝게 만든다 | |
| 범주형 인코딩 | 범주를 숫자로 바꾼다. 원-핫 인코딩은 범주마다 0/1 열을 만든다 |
- 최소-최대 정규화:
- 표준화(z-score):
- 로그 변환: (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 실기 출제 방향에서 기계학습 영역 '유형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하는지가 데이터 누수 여부를 가른다.