⊢MachineLearning

데이터 전처리 실습 흐름/코드 정리

최 수빈 2025. 3. 6. 03:47

1. 데이터 준비

import numpy as np
import pandas as pd

data = {
    'A': [1, 2, np.nan, 4, 5, 100, 1, 2, 2, 4, '1', '2', '3', '4', '5', 10, 20, 30, 40, 50],
    'B': [5, np.nan, np.nan, 8, 10, 60, 10, 20, 20, 40, '10', '20', '30', '40', '50', 5, 4, 3, 2, 1],
    'C': [1, 2, 3, 4, 5, 5, 100, 200, 200, 400, 100, 200, 300, 400, 500, 1, 2, 3, 4, 5],
    'D': [np.nan, np.nan, 3, 3, 3, 5, 5, 5, 5, 5, np.nan, np.nan, np.nan, np.nan, np.nan, 2, 3, 4, 5, 6],
    'category_column': [np.nan]*10 + ['A', 'B', 'A', 'C', 'B'] + [np.nan]*5,
    'value_column': [np.nan]*10 + [1, 2, 3, 4, 5] + [np.nan]*5,
    'target': [np.nan]*15 + [1, 0, 1, 0, 1]
}

df = pd.DataFrame(data)

 

2. 결측값 처리 (Missing Value Handling)

 

(1) 결측값 확인

print(df.isnull().sum())

(2) 결측값 제거

# 결측값이 포함된 행 제거
df_dropped_rows = df.dropna()

# 결측값이 포함된 열 제거
df_dropped_cols = df.dropna(axis=1)

(3) 결측값 대체

# 0으로 대체
df_filled = df.fillna(0)

# 평균값으로 대체
df_filled_mean = df.fillna(df.mean(numeric_only=True))

# 중간값으로 대체
df_filled_median = df.fillna(df.median(numeric_only=True))

# 최빈값으로 대체
df_filled_mode = df.fillna(df.mode().iloc[0])

(4) 머신러닝을 이용한 결측값 예측

from sklearn.linear_model import LinearRegression

# 회귀 모델을 활용한 결측값 예측
known = df[df['D'].notnull()]
unknown = df[df['D'].isnull()]

model = LinearRegression()
model.fit(known[['A', 'B', 'C']], known['D'])

predicted_values = model.predict(unknown[['A', 'B', 'C']])
df.loc[df['D'].isnull(), 'D'] = predicted_values

 

3. 이상값 처리 (Outlier Handling)

 

(1) 이상값 확인 (IQR 방법)

Q1 = df['A'].quantile(0.25)
Q3 = df['A'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = df[(df['A'] < lower_bound) | (df['A'] > upper_bound)]
print(outliers)

(2) 이상값 처리

# 이상값 제거
df_no_outliers = df[(df['A'] >= lower_bound) & (df['A'] <= upper_bound)]

# 이상치를 평균값으로 대체
mean_value = df['A'].mean()
df['A'] = df['A'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)

 

4. 중복값 처리 (Duplicate Handling)

# 중복된 행 확인
print(df.duplicated().sum())

# 중복된 행 제거
df_no_duplicates = df.drop_duplicates()

5. 데이터 타입 변환 (Data Type Conversion)

# 정수형 변환
df['A'] = df['A'].astype(int)

# 문자열 변환
df['B'] = df['B'].astype(str)

 

6. 인코딩 (Encoding)

# 범주형 데이터를 원-핫 인코딩
df_encoded = pd.get_dummies(df, columns=['category_column'])

 

7. 샘플링 (Sampling)

# 데이터에서 50% 샘플 추출
df_sampled = df.sample(frac=0.5)

# 100개 샘플 추출
df_sampled_n = df.sample(n=100, random_state=42)

 

8. 특징 선택 및 추출 (Feature Selection & Extraction)

 

(1) 특징 선택

from sklearn.feature_selection import SelectKBest, f_classif

X = df[['A', 'B', 'C', 'D']].fillna(0)
y = df['target'].fillna(0)

selector = SelectKBest(score_func=f_classif, k=3)
X_new = selector.fit_transform(X, y)
selected_features = selector.get_support(indices=True)
print(selected_features)

(2) 특징 추출

# 두 열의 곱을 새로운 특징으로 추가
df['new_feature'] = df['A'] * df['B']

# 두 열의 합을 새로운 특징으로 추가
df['new_feature_sum'] = df['A'] + df['B']

 

 


 

  • 결측값 처리: 제거 또는 대체
  • 이상값 처리: 제거 또는 변환
  • 중복값 제거: 데이터 정제
  • 데이터 타입 변환: 일관성 유지
  • 인코딩: 범주형 데이터를 수치형으로 변환
  • 샘플링: 데이터 크기 조절
  • 특징 선택 및 추출: 중요한 변수만 사용