머신러닝 기초 – 데이터 전처리(Data Preprocessing) 베스트 프랙티스
데이터 전처리(Data Preprocessing)는 머신러닝 모델의 성능을 결정짓는 중요한 단계다. 데이터가 정리되지 않은 상태에서 학습하면 모델이 오작동하거나 성능이 저하될 수 있다. 이번 글에서는 머신러닝에서 데이터 전처리를 수행하는 최적의 방법(베스트 프랙티스)을 소개한다.
🔍 데이터 전처리란?
데이터 전처리(Data Preprocessing)는 원본 데이터를 분석 가능하도록 정리하고 변환하는 과정이다. 이 과정에는 결측값 처리, 이상치 탐지, 데이터 스케일링, 특성 선택(feature selection), 인코딩 등이 포함된다.
🏆 데이터 전처리가 중요한 이유
- 데이터 품질 향상 → 노이즈 제거 및 데이터 정리
- 모델 성능 향상 → 불필요한 정보 제거, 데이터 균형 맞추기
- 학습 속도 증가 → 차원 축소 및 최적화 수행
- 일반화 능력 개선 → 과적합(overfitting) 방지
📌 데이터 전처리 베스트 프랙티스
1️⃣ 데이터 탐색 및 이해
데이터를 분석하기 전에 반드시 데이터의 분포와 특성을 파악해야 한다. 주요 탐색 방법은 다음과 같다.
✅ 데이터 정보 확인
import pandas as pd
df = pd.read_csv("data.csv") # 데이터 불러오기
print(df.info()) # 데이터 타입 및 결측값 확인
print(df.describe()) # 기초 통계량 출력
print(df.head()) # 데이터 미리보기
✅ 데이터 시각화
import matplotlib.pyplot as plt
import seaborn as sns
# 히스토그램으로 데이터 분포 확인
df.hist(figsize=(10, 6))
plt.show()
# 상관관계 히트맵
sns.heatmap(df.corr(), annot=True, cmap="coolwarm")
plt.show()
2️⃣ 결측값(Missing Values) 처리
결측값이 포함된 데이터는 모델 성능을 저하시킬 수 있으므로 반드시 처리해야 한다.
✅ 결측값 확인
print(df.isnull().sum()) # 결측값 개수 확인
✅ 결측값 처리 방법
- 삭제(Removal): 결측값이 많지 않을 경우 해당 행 또는 열 삭제
- 대체(Imputation): 평균, 중앙값, 최빈값 등으로 채우기
- 예측(Prediction): 머신러닝 모델을 활용하여 결측값 보정
🔹 결측값을 평균값으로 채우기
df.fillna(df.mean(), inplace=True)
🔹 결측값을 중앙값으로 채우기
df.fillna(df.median(), inplace=True)
🔹 특정 열의 결측값을 최빈값으로 채우기
df['column_name'].fillna(df['column_name'].mode()[0], inplace=True)
3️⃣ 이상치(Outliers) 탐지 및 처리
이상치는 데이터 분포를 왜곡할 수 있으므로 적절히 처리해야 한다.
✅ 이상치 탐지 방법
- Z-Score
- IQR(사분위 범위)
- 머신러닝 기법 (Isolation Forest, DBSCAN)
🔹 IQR을 활용한 이상치 탐지 및 제거
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 제거
df_cleaned = df[~((df < lower_bound) | (df > upper_bound)).any(axis=1)]
4️⃣ 데이터 스케일링(Data Scaling)
특정 머신러닝 알고리즘(예: KNN, SVM, 신경망)은 데이터 스케일이 다를 경우 성능이 저하될 수 있다. 따라서 데이터를 정규화(Normalization)하거나 표준화(Standardization)하는 것이 중요하다.
✅ 스케일링 방법
표준화(Standardization, Z-score scaling)
- 평균이 0, 표준편차가 1이 되도록 변환
X_scaled = (X - mean) / std
- SVM, KNN, PCA에 유용
정규화(Normalization, Min-Max scaling)
- 데이터를 [0, 1] 범위로 변환
X_scaled = (X - X_min) / (X_max - X_min)
- 딥러닝, 신경망에 적합
🔹 StandardScaler (표준화) 적용
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
🔹 MinMaxScaler (정규화) 적용
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)
5️⃣ 범주형 데이터(Categorical Data) 인코딩
머신러닝 모델은 문자형 데이터를 직접 처리할 수 없기 때문에 숫자로 변환해야 한다.
✅ 범주형 데이터 인코딩 방법
- 레이블 인코딩(Label Encoding)
- 각 카테고리를 숫자로 변환 (순서가 있는 데이터에 적합)
- 원-핫 인코딩(One-Hot Encoding)
- 이진 벡터로 변환 (순서가 없는 범주형 변수에 적합)
🔹 레이블 인코딩(Label Encoding)
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df['category'] = encoder.fit_transform(df['category'])
🔹 원-핫 인코딩(One-Hot Encoding)
df_encoded = pd.get_dummies(df, columns=['category'])
6️⃣ 데이터 분할 (Train/Test Split)
모델의 성능을 검증하기 위해 데이터를 훈련 세트(Train)와 테스트 세트(Test)로 분리해야 한다.
🔹 80:20 비율로 데이터 분할
from sklearn.model_selection import train_test_split
X = df.drop('target', axis=1) # 독립 변수
y = df['target'] # 종속 변수
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
🏁 정리
단계 | 주요 작업 | 방법 |
---|---|---|
데이터 탐색 | 데이터 이해 | .info() , .describe() , 시각화 |
결측값 처리 | 결측 데이터 제거 또는 대체 | 평균, 중앙값, 최빈값 대체 |
이상치 탐지 | 데이터 분포 확인 | Z-Score, IQR, 머신러닝 기법 |
데이터 스케일링 | 데이터 정규화 또는 표준화 | StandardScaler , MinMaxScaler |
범주형 데이터 변환 | 숫자로 변환 | LabelEncoder , OneHotEncoder |
데이터 분할 | 훈련/테스트 데이터 나누기 | train_test_split() |
🔑 키워드
- 데이터 전처리
- 결측값 처리
- 이상치 탐지
- 데이터 스케일링