
지난 글에서는 데이터를 효과적으로 표현하기 위한 데이터 시각화(Data Visualization)에 대해 알아봤다.
데이터를 충분히 분석했다면 이제는 머신러닝 모델이 학습할 수 있도록 데이터를 정리하는 과정이 필요하다. 이 과정을 데이터 전처리(Data Preprocessing)라고 한다.
실제 AI 프로젝트에서는 모델을 만드는 시간보다 데이터 전처리에 더 많은 시간을 투자한다고 할 정도로 매우 중요한 단계이다.
데이터 전처리(Data Preprocessing)는
원본 데이터를 분석과 머신러닝에 적합한 형태로 가공하고 정리하는 과정이다.
실제 데이터는 대부분 완벽하지 않다.
예를 들어
등이 존재한다.
이러한 문제를 해결해야 AI 모델이 데이터를 올바르게 학습할 수 있다.
AI 모델은 입력된 데이터를 그대로 학습한다.
만약 데이터 품질이 좋지 않다면 모델 역시 잘못된 결과를 만들어낼 가능성이 높다.
예를 들어
| 나이 | 혈당 |
|---|---|
| 25 | 95 |
| 34 | 102 |
| 41 | NULL |
| 52 | 118 |
| 300 | 140 |
여기에는 두 가지 문제가 있다.
이러한 데이터를 그대로 학습시키면 모델의 성능이 크게 떨어질 수 있다.
일반적으로 다음과 같은 순서로 진행한다.
결측치(Missing Value)는 값이 비어 있는 데이터를 의미한다.
먼저 결측치가 얼마나 있는지 확인한다.
df.isnull().sum()
결측치를 처리하는 대표적인 방법은 다음과 같다.
df.dropna()
결측치가 포함된 행을 삭제한다.
df["Glucose"] = df["Glucose"].fillna(df["Glucose"].mean())
숫자형 데이터에서 자주 사용하는 방법이다.
df["Age"] = df["Age"].fillna(df["Age"].median())
이상치가 많은 데이터에서는 평균보다 중앙값을 사용하는 경우가 많다.
이상치(Outlier)는 다른 데이터와 비교했을 때 지나치게 크거나 작은 값을 의미한다.
예를 들어
25
28
30
31
220
220은 일반적인 나이 범위를 벗어나므로 이상치일 가능성이 높다.
이상치는
등의 방법으로 처리한다.
대표적으로 박스플롯(Box Plot)을 이용하여 이상치를 확인한다.
import seaborn as sns
sns.boxplot(x=df["Age"])
동일한 데이터가 여러 번 저장되어 있는 경우도 있다.
중복 데이터는 분석 결과를 왜곡할 수 있기 때문에 제거하는 것이 좋다.
중복 확인
df.duplicated().sum()
중복 제거
df = df.drop_duplicates()
머신러닝 모델은 대부분 숫자 데이터만 이해할 수 있다.
예를 들어
| 성별 |
|---|
| 남성 |
| 여성 |
이 데이터를 그대로 사용할 수 없기 때문에 숫자로 변환해야 한다.
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df["Gender"] = encoder.fit_transform(df["Gender"])
결과
| 성별 | 변환 |
|---|---|
| 남성 | 0 |
| 여성 | 1 |
pd.get_dummies(df, columns=["Gender"])
결과
| Gender_Male | Gender_Female |
|---|---|
| 1 | 0 |
| 0 | 1 |
명목형 데이터에서는 One-Hot Encoding을 많이 사용한다.
변수마다 값의 크기가 크게 다르면 머신러닝 모델의 성능에 영향을 줄 수 있다.
예를 들어
| 나이 | 혈당 |
|---|---|
| 25 | 95 |
| 60 | 180 |
과
| 연봉 |
|---|
| 80,000,000 |
처럼 값의 범위가 크게 차이 나는 경우에는 스케일을 맞춰주는 것이 좋다.
평균을 0, 표준편차를 1로 변환한다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
모든 데이터를 0~1 사이의 값으로 변환한다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)
| 전처리 전 | 전처리 후 |
|---|---|
| 결측치 존재 | 결측치 제거 또는 대체 |
| 이상치 존재 | 이상치 처리 |
| 문자열 데이터 | 숫자로 변환 |
| 데이터 범위가 제각각 | 동일한 범위로 스케일링 |
| 중복 데이터 존재 | 중복 제거 |
전처리를 거친 데이터는 머신러닝 모델이 보다 안정적으로 학습할 수 있는 상태가 된다.
예를 들어 건강검진 데이터를 분석한다고 가정해보자.
전처리 과정에서는 다음과 같은 작업을 수행할 수 있다.
이러한 과정을 거친 데이터는 AI 모델이 학습하기 쉬운 형태가 되며, 예측 성능 향상에도 도움이 된다.
데이터 전처리는 머신러닝 프로젝트에서 가장 중요하면서도 가장 많은 시간이 소요되는 과정이다.
아무리 뛰어난 AI 모델을 사용하더라도 데이터 품질이 좋지 않으면 좋은 결과를 기대하기 어렵다. 반대로 데이터를 꼼꼼하게 전처리하면 비교적 단순한 모델이라도 높은 성능을 얻을 수 있다.
지금까지 데이터 타입 → Pandas → EDA → 데이터 시각화 → 데이터 전처리까지 데이터 분석의 기본 과정을 살펴보았다. 이러한 기초를 탄탄히 익혀두면 이후 머신러닝과 딥러닝 학습에서도 데이터를 보다 효과적으로 다룰 수 있게 된다.