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)에 대해서도 정리하겠다!
'공부 > CS, DS' 카테고리의 다른 글
[빅분기 실기] 파이썬 도움말 기능 알아보기 (0) | 2024.06.08 |
---|---|
[파이썬 기초] datetime으로 날짜, 시간 데이터 다루기 (0) | 2024.06.01 |
[파이썬 문제해결] 구글 colab에서 matplotlib 한글 깨짐 해결 방법 (1) | 2024.02.05 |
[파이썬 기초] Warning 메세지 뜨지 않게 하기 (0) | 2023.07.25 |
[파이썬 기초] Jupyter Notebook 마크다운 사용 방법 (0) | 2023.07.25 |