Skip to main content

데이터 정제

데이터 정제(Data Cleaning)는 결측치, 이상치, 중복 등 데이터 품질 문제를 해결하는 과정입니다. 모델의 성능은 데이터 품질에 직접적으로 의존합니다.

학습 목표

  • 결측치의 유형을 파악하고 적절한 처리 전략을 선택할 수 있습니다.
  • 이상치를 탐지하고 처리하는 방법을 적용할 수 있습니다.
  • 중복 데이터를 식별하고 제거할 수 있습니다.

결측치 처리

1
결측치 현황 파악
2
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer, KNNImputer

df = pd.read_csv("data/sample.csv")

# 결측치 비율 확인
missing = df.isnull().sum()
missing_pct = (missing / len(df) * 100).round(1)
missing_info = pd.DataFrame({
    "결측 수": missing,
    "비율(%)": missing_pct
}).sort_values("비율(%)", ascending=False)

print(missing_info[missing_info["결측 수"] > 0])
3
결측치 처리 전략 선택
4
결측 비율전략방법< 5%삭제 가능dropna()5-30%대체평균/중앙값/최빈값, KNN> 30%열 삭제 고려특성 제거 또는 결측 자체를 특성화
5
# 전략 1: 행 삭제 (결측이 소수인 경우)
df_dropped = df.dropna(subset=["critical_column"])

# 전략 2: 통계값으로 대체
# 수치형 → 중앙값 (이상치에 강건)
imputer_num = SimpleImputer(strategy="median")
df[num_cols] = imputer_num.fit_transform(df[num_cols])

# 범주형 → 최빈값
imputer_cat = SimpleImputer(strategy="most_frequent")
df[cat_cols] = imputer_cat.fit_transform(df[cat_cols])

# 전략 3: KNN 기반 대체 (변수 간 관계 활용)
knn_imputer = KNNImputer(n_neighbors=5)
df[num_cols] = knn_imputer.fit_transform(df[num_cols])

# 전략 4: 결측 여부를 새 특성으로 추가
df["column_is_missing"] = df["column"].isnull().astype(int)
6
이상치 탐지
7
# 방법 1: IQR (사분위수 범위) 기반
def detect_outliers_iqr(df, column):
    """IQR 방법으로 이상치를 탐지합니다."""
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    outliers = df[(df[column] < lower) | (df[column] > upper)]
    return outliers, lower, upper

outliers, lower, upper = detect_outliers_iqr(df, "price")
print(f"이상치 수: {len(outliers)}")
print(f"정상 범위: [{lower:.2f}, {upper:.2f}]")

# 방법 2: Z-score 기반
from scipy import stats
z_scores = np.abs(stats.zscore(df[num_cols]))
outlier_mask = (z_scores > 3).any(axis=1)
print(f"Z-score 이상치: {outlier_mask.sum()}건")
8
이상치 처리
9
# 전략 1: 제거
df_clean = df[~outlier_mask]

# 전략 2: 클리핑 (경계값으로 대체)
df["price"] = df["price"].clip(lower=lower, upper=upper)

# 전략 3: 로그 변환 (왜곡된 분포 정규화)
df["price_log"] = np.log1p(df["price"])  # log(1+x)로 안전하게 변환
10
중복 데이터 처리
11
# 중복 행 확인
duplicates = df.duplicated()
print(f"중복 행: {duplicates.sum()}건")

# 중복 제거 (첫 번째만 유지)
df_dedup = df.drop_duplicates()

# 특정 열 기준 중복 확인
df_dedup = df.drop_duplicates(subset=["id", "timestamp"], keep="last")
결측치 대체(imputation)는 반드시 학습 데이터에만 fit하고, 테스트 데이터에는 transform만 적용해야 합니다. 전체 데이터에 fit하면 데이터 누수가 발생합니다.
아닙니다. 결측 자체가 정보를 담고 있을 수 있습니다. 예를 들어 설문조사에서 소득을 비워둔 경우, “응답 거부”라는 의미가 있을 수 있습니다. 이 경우 결측 여부를 별도 특성으로 추가하는 것이 효과적입니다.
아닙니다. 이상치가 측정 오류인지 실제 희귀 패턴인지 먼저 판단해야 합니다. 사기 탐지에서는 이상치가 오히려 탐지 대상입니다. 알고리즘 중 트리 기반 모델은 이상치에 강건하므로 제거하지 않아도 됩니다.

체크리스트

  • 결측치의 비율에 따라 적절한 처리 전략을 선택할 수 있다
  • IQR 또는 Z-score로 이상치를 탐지할 수 있다
  • 데이터 누수를 방지하면서 결측치를 처리할 수 있다
  • 중복 데이터를 식별하고 제거할 수 있다

다음 문서