공부/CS, DS

[파이썬 기초] 결측치 처리 방법 간단 정리

아기사슴 2024. 7. 17. 12:34

 

Python 사용 결측치 확인과 처리에 대해서 정리해보자.

 

※ 예시 데이터로는 titanic을 가져왔다. 

import pandas as pd
import numpy as np

# Titanic 데이터셋 로드
df = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv')

1. 결측값 확인 

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

 

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

 

age와 cabin, embarked에서 결측값이 확인되었다. 

 

2. 결측값 처리

2.1 삭제하기

가장 간단한 처리 방법은 결측 값이 있는 행 또는 열을 삭제하는 것이다. 

하지만, 중요 정보가 소실, 대표성이 상실되는 등 문제가 생길 수 있으므로 삭제가 적합할지는 판단이 필요하다. 

#결측값이 있는 행 삭제 
df_dropped_rows = df.dropna()

#결측값이 있는 열 삭제
df_dropped_columns = df.dropna(axis=1)

 

2.2  대체하기(imputation)

결측값을 평균, 최빈값 혹은 지정한 특정값으로 대체할 수 있다. 

역시 분산축소, 분포 왜곡, 패턴 손실 등의 문제가 있을 수 있으므로, 이를 고려하여 결측치 처리 방법을 정해야 한다. 

# Age 열의 결측값을 평균으로 대체
df['Age'].fillna(df['Age'].mean(), inplace=True)

# Embarked 열의 결측값을 최빈값으로 대체
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)

# Cabin열의 결측값을 'Unknown'으로 대체
df['Cabin'].fillna('Unknown', inplace=True)

 

sklearn의 SimpleImputer 사용하여 결측값을 대체할 수도 있다. 

from sklearn.impute import SimpleImputer

# Age 열의 결측값을 평균으로 대체
imputer_mean = SimpleImputer(strategy='mean')
df['Age'] = imputer_mean.fit_transform(df[['Age']])

# Embarked 열의 결측값을 최빈값으로 대체
imputer_mode = SimpleImputer(strategy='most_frequent')
df['Embarked'] = imputer_mode.fit_transform(df[['Embarked']])

 

 

2.3 KNNimputer

데이터 패턴을 보존하면서 결측값을 처리할 수 있는 방법 중 하나로, KNN(K-Nearest Neighbors) Imputation을 사용할 수 있다. 

KNN은 가장 가까운 데이터 포인트의 값으로 결측값을 채우기 때문에, 평균/최빈값으로 대체하는 것보다 더 정교하다. 

다만, 계산 복잡도로 인해 속도가 느릴 수 있고, 머신러닝으로 연결이 필요할 경우 과적합 문제가 생길 수 있다. 

거리기반 알고리즘이므로, 서로 다른 스케일의 데이터가 섞여있을 경우 스케일링이 필요하다. 

 

from sklearn.impute import KNNImputer

# KNN Imputer 적용
numeric_columns = df.select_dtypes(include=[np.number]).columns  # 숫자형 열만 선택
imputer = KNNImputer(n_neighbors=5)  # k=5 설정
df_knn_imputed = df.copy()
df_knn_imputed[numeric_columns] = imputer.fit_transform(df[numeric_columns])

# 결측값 확인
print(df_knn_imputed.isnull().sum())

 

 

 

다음 글에서는 시계열 데이터나 연속된 수치형 데이터에 사용하는 선형 보간법 (Linear Interpolation)에 대해서도 정리하겠다!