(표기) NA, N/A(Not Applicable or Not Available), NaN(Not a Number), Null
결측치 갯수 확인
# 데이터 정보에서 Non-Null Count 갯수로 결측치 확인
df.info()
# isnull()의 True 개수를 합하여 확인
print(df.isnull().sum(axis=0)) # axis = 0 열기준, 1 행기준
import klib
import warnings
# 경고 메시지 무시
warnings.filterwarnings(action='ignore')
# 결측치에 대한 프로파일링 플롯
klib.missingval_plot(df)
# 결측치에 대한 프로파일링 플롯
klib.missingval_plot(df, sort=True)
# 상관관계 플롯
klib.corr_plot(df)
import matplotlib.pyplot as plt
# 한글이 안나올 경우 폰트 지정
plt.rc('font', family='Malgun Gothic')
# 범주형 변수에 대한 분석
klib.cat_plot(df)
# 결측치가 있는 변수의 분포 확인
klib.dist_plot(df.weight)
klib.dist_plot(df.IQ)
klib.dist_plot(df.mid_score)
import pandas as pd
# Listwise deletion
df_listwise = df.dropna()
# Pairwise deletion
df_pairwise = df.dropna(subset=['weight', 'mid_score'])
print(f'Original Data:\n {df}\n')
print(f'Listwise deletion:\n {df_listwise}\n')
print(f'Pairwise deletion:\n {df_pairwise}\n')
결측치를 대체하는 방법에는 단순대체법과 다중대체법이 있다.
from sklearn.impute import SimpleImputer
df_imputed = pd.DataFrame.copy(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
결측치의 대체값을 여러 추정값을 종합하여 선정하는 것
- Multiple Imputation 3단계
- Imputation Phase: 가능한 대체 값의 분포에서 추출된 서로 다른 값으로 복수의 데이터 셋을 생성
- Analysis Phase: 각 데이터 셋에 대하여 모수의 추정치와 표본오차 계산
- Pooling Phase: 모든 데이터 셋의 추정치와 표본오차를 통합하여 하나의 대치값 생성
import numpy as np
# scikit-learn에서 R의 MICE 패키지를 따라서 실험적으로 개발 중
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))
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))