데이터 전처리는 결측값·이상값·범주형 변수·서로 다른 측정 단위를 모델이 학습할 수 있는 형태로 바꾸는 과정입니다. 빅데이터분석기사나 ADsP에서는 기법의 이름을 묻지만, 실제 분석에서는 왜 이 방법을 선택했는지와 어디에서 통계량을 학습했는지가 더 중요합니다.
먼저 기억할 한 문장: 데이터는 먼저 훈련·검증·테스트로 나누고, 대치값·인코딩 규칙·스케일링 통계량은 훈련 데이터에서만 적합(fit)한 뒤 나머지 데이터에는 변환(transform)만 적용합니다.
데이터 전처리 순서: 무엇을 먼저 해야 하나?
- 목적과 단위 정의: 관측 단위, 타깃, 예측 시점을 정합니다.
- 기계적 품질 점검: 자료형, 단위, 불가능한 값, 중복·동일 개체의 반복을 확인합니다.
- 데이터 분할: 무작위 분할, 층화 분할 또는 시간 순서 분할을 선택합니다.
- 훈련 데이터에서만 적합: 결측값 대치, 이상치 기준, 범주 사전, 스케일링 기준을 학습합니다.
- 검증·테스트에 변환만 적용: 훈련 세트에서 배운 규칙을 그대로 사용합니다.
- 기록과 검증: 행 수, 결측률, 범주 수, 분포와 모델 성능을 전후 비교합니다.
자료형 교정이나 명백한 입력 오류 확인처럼 타깃 분포를 사용하지 않는 규칙은 분할 전에 정의할 수 있습니다. 다만 삭제 기준이나 대치값을 데이터 전체에서 추정하면 테스트 정보가 새어 들어갈 수 있습니다. 같은 사람·상품·기관의 행이 여러 개라면 개체 단위로 분할하고, 시계열 자료는 미래가 과거의 학습에 포함되지 않도록 시간 순서를 지켜야 합니다.
결측값 처리: 삭제와 대치 전에 원인을 본다
결측률만 보고 방법을 정하면 편향을 놓치기 쉽습니다. 결측 발생 메커니즘은 보통 다음처럼 구분합니다.
| 구분 | 의미 | 실무 예시 |
|---|---|---|
| MCAR | 관측·미관측 값과 무관하게 결측 | 무작위 장비 고장으로 일부 기록 유실 |
| MAR | 관측된 다른 변수로 결측을 설명할 수 있음 | 연령대에 따라 소득 무응답률이 다름 |
| MNAR | 관측되지 않은 값 자체가 결측 가능성과 관련 | 소득이 매우 높은 사람이 소득 응답을 피함 |
평균·중앙값·최빈값 대치는 빠르고 재현하기 쉽지만 분산을 줄이고 변수 간 관계를 약화시킬 수 있습니다. 치우친 연속형 변수에는 평균보다 중앙값이 안정적일 수 있고, 결측 자체가 신호라면 결측 여부 지시변수도 함께 검토합니다.
| 방법 | 언제 유용한가 | 주의점 |
|---|---|---|
| 행·열 삭제 | 결측이 매우 적고 삭제 편향이 작을 때 | 표본 수 감소와 선택 편향 확인 |
| 평균·중앙값·최빈값 | 빠른 기준 모델, 단순한 운영 환경 | 분산·상관관계가 왜곡될 수 있음 |
| KNN Imputer | 비슷한 관측치가 실제로 비슷한 값을 가질 때 | 거리 계산 전 스케일, 차원, 계산량에 민감 |
| 회귀·트리 기반 반복 대치 | 다른 변수와의 관계를 활용할 때 | 모형 가정, 과적합, 누수 검증 필요 |
| 다중대치(MICE) | 추론에서 대치 불확실성까지 반영할 때 | 여러 대치 자료의 추정치를 Rubin 규칙으로 결합 |
KNN이나 반복 대치가 항상 단순 대치보다 좋은 것은 아닙니다. 교차검증의 각 훈련 폴드 안에서 다시 적합해 성능과 안정성을 비교해야 합니다. 특히 예측 시점에 알 수 없는 변수나 타깃을 대치 모형의 입력으로 사용하면 운영 단계에서 재현할 수 없습니다.
이상값: IQR과 Z점수의 수식과 해석
IQR 기준
IQR = Q3 − Q1입니다. 흔히 Q1 − 1.5×IQR 미만 또는 Q3 + 1.5×IQR 초과를 이상치 후보로 표시합니다. 이는 탐색 규칙이지 자동 삭제 규칙이 아닙니다. 사분위수 계산 방식은 소프트웨어에 따라 조금 달라질 수 있으므로 분석 보고서에 사용한 방식을 남기는 것이 좋습니다.

Z점수 기준
z = (x − 평균) / 표준편차입니다. 표본에서는 보통 표본평균과 표본표준편차를 사용합니다. |z| > 3 같은 기준은 정규분포에 가까운 단봉형 자료에서 참고하기 좋지만, 치우친 분포나 표본이 작을 때는 부적절할 수 있습니다.
위의 여덟 값에서 45의 표본 Z점수는 약 2.30입니다. 극단값 자체가 평균과 표준편차를 끌어올렸기 때문에 |z| > 3 규칙은 45를 잡지 못하지만 IQR 규칙은 후보로 표시합니다. 한 가지 기준만 기계적으로 적용하면 안 되는 이유입니다.
- 입력 오류: 원자료와 단위를 확인해 수정하거나 근거를 남기고 제외합니다.
- 실제 희귀 사건: 삭제하지 말고 별도 지시변수, 로그 변환, 분위수 절단(Winsorization), 강건한 손실함수·모형을 검토합니다.
- 집단 혼합: 서로 다른 집단이 섞여 생긴 극단값인지 층별 분포를 확인합니다.
인코딩: 변수의 의미와 모델을 함께 본다
| 방법 | 적합한 상황 | 모델별 주의점 |
|---|---|---|
| 원-핫 인코딩 | 순서가 없는 명목형 범주 | 선형·거리 기반 모델에 안전하지만 고유 범주가 많으면 차원 증가 |
| 순서 인코딩 | 낮음·중간·높음처럼 순서가 명확함 | 선형 모델은 숫자 간격까지 동일하다고 해석할 수 있음 |
| 빈도 인코딩 | 고유 범주가 많고 빈도가 정보일 때 | 서로 다른 범주가 같은 빈도 값을 가질 수 있음 |
| 타깃 인코딩 | 고카디널리티 범주의 축약 | 훈련 폴드 바깥값을 사용하지 않는 out-of-fold 계산과 평활화 필수 |
| 네이티브 범주 처리 | CatBoost 등 범주형을 직접 다루는 모델 | 라이브러리별 입력 형식과 검증 방식 확인 |
예를 들어 성적 C·B·A를 0·1·2로 바꾸면 순서는 표현됩니다. 그러나 선형회귀는 C→B의 변화와 B→A의 변화가 같은 크기라고 가정합니다. 그 간격에 근거가 없다면 원-핫 인코딩이나 적절한 대비 코딩이 더 낫습니다.
트리 모델도 정수 코드가 붙은 명목형 변수를 자동으로 올바르게 이해하는 것은 아닙니다. 일반적인 결정트리는 숫자 임계값으로 분할하므로 서울=0, 부산=1, 제주=2 같은 임의 순서가 경계에 반영될 수 있습니다. 명목형은 원-핫 인코딩을 쓰거나 범주형 변수를 네이티브로 지원하는 모델을 선택합니다. 타깃 y의 클래스 이름을 숫자로 바꾸는 라벨 인코딩과, 입력 변수 X의 명목형 범주를 숫자로 바꾸는 작업도 구분해야 합니다.
표준화·정규화·Robust Scaling
| 방법 | 수식 | 특징 |
|---|---|---|
| 표준화 | z = (x − 평균) / 표준편차 | 평균 0, 표준편차 1에 가까운 척도. 이상치에 민감 |
| 최소-최대 정규화 | x′ = (x − 최솟값) / (최댓값 − 최솟값) | 보통 0~1 범위. 새로운 극단값과 이상치에 매우 민감 |
| Robust Scaling | x′ = (x − 중앙값) / IQR | 중앙값과 IQR을 사용해 중심·크기 추정이 이상치에 덜 민감 |

k-NN, k-means, SVM, 주성분분석, 신경망과 규제가 있는 선형모델은 변수 스케일의 영향을 크게 받습니다. 반면 의사결정나무와 랜덤 포레스트 같은 트리 기반 모델은 보통 단조 스케일 변환의 영향이 작습니다. 다만 트리와 거리 기반 단계를 섞은 파이프라인이라면 스케일링이 다시 필요할 수 있습니다.
Python 실전 코드: 누수 없는 전처리 파이프라인
아래 예시는 연속형 변수에는 중앙값 대치와 Robust Scaling을, 범주형 변수에는 최빈값 대치와 원-핫 인코딩을 적용합니다. 핵심은 train_test_split()을 먼저 수행하고, 전처리와 모델을 하나의 Pipeline으로 묶는 것입니다.
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, RobustScaler
X = df.drop(columns="target")
y = df["target"]
# 1) 먼저 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
numeric_cols = ["age", "income", "usage_time"]
categorical_cols = ["region", "grade"]
numeric_pipe = Pipeline([
("imputer", SimpleImputer(strategy="median", add_indicator=True)),
("scaler", RobustScaler()),
])
categorical_pipe = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("onehot", OneHotEncoder(handle_unknown="ignore")),
])
preprocess = ColumnTransformer([
("num", numeric_pipe, numeric_cols),
("cat", categorical_pipe, categorical_cols),
])
model = Pipeline([
("preprocess", preprocess),
("classifier", LogisticRegression(max_iter=1000)),
])
# 2) fit은 훈련 데이터에서만
model.fit(X_train, y_train)
# 3) 테스트에는 학습된 변환만 적용
test_score = model.score(X_test, y_test)
교차검증도 완성된 model 파이프라인에 적용해야 합니다. 먼저 전체 훈련 데이터에 대치·스케일링을 해 놓고 교차검증하면 검증 폴드의 정보가 훈련 폴드에 섞입니다. KNN 대치는 단순히 SimpleImputer를 바꾸는 것으로 끝나지 않습니다. 이웃을 찾을 때 사용할 변수의 척도·차원·결측 패턴과 계산 비용을 함께 설계해야 합니다.
R 실전 코드: tidymodels recipe로 같은 원칙 적용
library(tidymodels)
set.seed(42)
split <- initial_split(df, prop = 0.8, strata = target)
train_data <- training(split)
test_data <- testing(split)
rec <- recipe(target ~ ., data = train_data) |>
step_impute_median(all_numeric_predictors()) |>
step_normalize(all_numeric_predictors()) |>
step_impute_mode(all_nominal_predictors()) |>
step_novel(all_nominal_predictors()) |>
step_dummy(all_nominal_predictors())
fit_obj <- workflow() |>
add_recipe(rec) |>
add_model(logistic_reg() |> set_engine("glm")) |>
fit(data = train_data)
pred <- predict(fit_obj, new_data = test_data)
prep()과 bake()를 직접 사용할 수도 있지만, workflow 안에 recipe를 넣으면 재표본추출 과정마다 전처리가 해당 분석 폴드 안에서 다시 적합됩니다. 결측이 추론 결과에 중요한 연구에서는 단일 대치보다 mice 같은 다중대치 도구와 결합 규칙을 별도로 검토해야 합니다.
전처리 전후에 반드시 확인할 것
- 분할 전후의 행 수와 개체 수, 중복 개체의 폴드 간 겹침
- 변수별 결측률과 결측 지시변수의 타깃별 분포
- 대치 전후 평균·중앙값·표준편차·분위수와 변수 간 관계
- 훈련에는 없던 검증·테스트 범주의 처리 방식
- 이상값 처리 전후의 성능, 잔차, 계수와 중요도 변화
- 파이프라인의 random seed, 라이브러리 버전, 선택 근거
시험용 핵심 정리: 평균은 이상치에 민감하고 중앙값과 IQR은 상대적으로 강건합니다. 명목형은 원-핫, 순서형은 순서 인코딩을 우선 검토합니다. 표준화는 평균·표준편차, 최소-최대 정규화는 최솟값·최댓값, Robust Scaling은 중앙값·IQR을 사용합니다. 어떤 방법이든 학습 통계량은 훈련 데이터에서만 계산합니다.
다음 학습: 과목 전체 흐름은 1·4과목 점수 확보 가이드와 2·3과목 과락 방어 가이드에서 확인하세요.
자주 묻는 질문
결측값은 무조건 평균으로 대치하면 되나요?
아닙니다. 변수의 분포, 이상치, 결측 발생 원인과 분석 목적을 먼저 확인해야 합니다. 치우친 연속형 변수에는 중앙값이 더 안정적일 수 있고, 단순 대치는 분산과 변수 관계를 왜곡할 수 있습니다.
Robust Scaling을 하면 이상치 문제가 해결되나요?
아닙니다. 중앙값과 IQR을 사용하므로 중심과 크기 추정이 극단값에 덜 흔들릴 뿐, 이상치를 제거하거나 원인을 해결하지는 않습니다. 오류인지 실제 희귀 사건인지 별도로 판단해야 합니다.
트리 모델에는 인코딩과 스케일링이 필요 없나요?
스케일링은 일반적으로 영향이 작지만, 명목형 범주에 임의 정수 코드를 붙이면 숫자 순서가 분할에 반영될 수 있습니다. 원-핫 인코딩이나 네이티브 범주 지원 모델을 검토해야 합니다.
데이터 누수를 막는 가장 중요한 전처리 원칙은 무엇인가요?
먼저 데이터를 분할하고, 대치값·범주 사전·스케일 같은 전처리 기준을 훈련 데이터에서만 학습하는 것입니다. 교차검증에서는 각 훈련 폴드 안에서 전처리를 다시 적합해야 합니다.
당신이 좋아할 만한 콘텐츠
by Google Adsense