개요
1) 결측치를 탐색하고 이를 처리하는 과정을 통칭한다
2) 여기서 결측치란, 데이터 값이 누락된 것을 말하며 전산오류, 입력누락, 인위적 누락 등 다양한 원인으로 발생할 수 있다.
3) 결측치 유형
4) 결측치 처리방법
결측치 탐색 코드
1) pandas를 이용하여 데이터 불러오기
import pandas as pd
df = pd.read_csv('../data/preprocessing_students.csv', sep=',')
df.head()
2) 결측치 갯수 확인하기
# info에서 Non-Null Count 갯수로 결측치 확인
df.info()
# isnull()의 True 개수를 합하여 확인
print(df.isnull().sum(axis=0)) # axis = 0(열 기준)
1) 필요 패키지 가져오기
import klib
import warnings
2) 결측치를 직접적으로 확인하는 플롯
# 결측치에 대한 프로파일링 플롯 확인1
klib.missingval_plot(df)
# 결측치에 대한 프로파일링 플롯 확인2
klib.missingval_plot(df, sort=True)
3) 결측치를 간접적으로 보기 위해 각종 플롯 생성
# 범주형 변수에 대한 분석
klib.cat_plot(df)
# 변수의 분포로 결측치 유무를 확인(분포의 모양이 특이한 지점을 확인)
klib.dist_plot(df.weight)
klib.dist_plot(df.IQ)
klib.dist_plot(df.mid_score)
결측치 처리 코드
1) Listwise deletion / Pairwise deletion 방식 사용
import pandas as pd
# Listwise deletion
df_listwise = df.dropna()
# Pairwise deletion
df_pairwise = df.dropna(subset=['weight', 'mid_score'])
2) 결측치 제거 결과 확인
print(f'Original Data:\n {df}\n')
print(f'Listwise deletion:\n {df_listwise}\n')
print(f'Pairwise deletion:\n {df_pairwise}\n')
1) 단순대체법(Single Imputation) 사용
from sklearn.impute import SimpleImputer
df_imputed = pd.DataFrame(df)
# 110대가 결측인 IQ는 평균으로 대체
df_imputed[['IQ']] = SimpleImputer(strategy="mean").fit_transform(df[['IQ']])
# 비대칭 분포를 갖는 mid_score는 중앙값으로 대체
df_imputed[['mid_score']] = SimpleImputer(strategy="median").fit_transform(df[['mid_score']])
# 범주형 employed는 Hot deck으로 대체
df_imputed['employed'].fillna(method='bfill', inplace=True)
# height와 양의 상관관계가 있는 weight는 Stochastic regression으로 대체
from sklearn.linear_model import LinearRegression
import numpy as np
# 결측치가 있는 인덱스 검색
idx = df.weight.isnull() == True
# 학습을 위한 데이터 세트 분리
X_train, X_test, y_train = df[['height']][~idx], df[['height']][idx], df[['weight']][~idx]
# 선형회귀모형 인스탄스 생성 후 학습
lm = LinearRegression().fit(X_train, y_train)
# 예측값 + 변동값하여 결측치를 대체
df_imputed.loc[idx, 'weight'] = lm.predict(X_test) + 5*np.random.rand(4,1)
# 결과 확인
df_imputed
2) 다중 대체법(Multiple Imputation) 사용
MICE(Multiple Imputation by Chained Equations) 기법 사용
필요 패키지(함수) 가져오기
import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# 데이터 세트
X_train = [[33, np.nan, .153], [18, 12000, np.nan], [np.nan, 13542, .125]]
X_test = [[45, 10300, np.nan], [np.nan, 13430, .273], [15, np.nan, .165]]
# mice 인스탄스 생성
mice = IterativeImputer(max_iter=10, random_state=0)
mice.fit(X_train)
np.set_printoptions(precision=5, suppress=True)
print('X_train MICE: \n', mice.transform(X_train))
print('X_test MICE: \n', mice.transform(X_test))
KNN Imputation(knn분류기법을 사용한 대체법)
필요 패키지 가져오기
import numpy as np
from sklearn.impute import KNNImputer
knn = KNNImputer(n_neighbors=2, weights="uniform")
knn.fit(X_train)
print('X_train KNN: \n', knn.transform(X_train))
print('X_test KNN: \n', knn.transform(X_test))