PP-Handling Missing Values

장지백·2023년 12월 15일
0

prepreocessing(by python)

목록 보기
3/10

개요

1. 결측치 처리란?

1) 결측치를 탐색하고 이를 처리하는 과정을 통칭한다

2) 여기서 결측치란, 데이터 값이 누락된 것을 말하며 전산오류, 입력누락, 인위적 누락 등 다양한 원인으로 발생할 수 있다.

3) 결측치 유형

  • MCAR(완전 무작위 결측)
  • 결측치 발생 변수에 상관없이 결측치가 전체에 걸쳐 무작위로 발생
  • 결측치의 영향이 없으므로 제거 가능
  • MAR(무작위 결측)
  • 결측치 발생한 변수의 값이 다른 변수와 상관관계가 있어 추정이 가능
  • 결측치의 영향이 다소 있으나 편향은 없으므로 대체 가능
  • MNAR(비무작위 결측)
  • 결측치가 발생한 변수의 값과 관계가 있고 그 이유가 있는 경우
  • 결측치의 영향이 크므로 결측치의 원인에 대한 조사 후 대응 필요

4) 결측치 처리방법

  • 제거(deletion)
  • MCAR(완전 무작위 결측)일 때 사용 가능
  • 데이터의 손실이 발생 → 자유도 감소 → 통계적 검정력 저하
  • 표본의 수가 충분하고 결측값이 10-15% 이내일 때에는 결측값을 제거한 후 분석하여도 결과에 크게 영향을 주지 않음
  • 대표적으로 두가지 방법이 존재함
  • Listwise deletion : 결측치가 존재하는 행 자체를 삭제하는 방식
  • Pairwise deletion : 분석에 사용하는 속성의 행만 제거하는 방식
  • 대체(imputation)
  • 표본 평균과 같은 대표값으로 대체할 경우 → 대표값 데이터가 많아짐
    → 잔차 변동이 줄어듬 → 잘못된 통계적 결론 유도가능
  • 모수 추정 시 편향(bias) 발생가능
  • 대표적으로 두가지 방법이 존재함
  • 단순대체법(Single Imputation) : 결측치의 대체값으로 하나의 값을
    선정
  • 다중대체법(Multiple Imputation) : 결측치의 대체값을 여러 추정값
    을 종합하여 선정

결측치 탐색 코드

pandas를 이용한 결측치 탐색

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(열 기준)

klib을 이용한 결측치 탐색

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. 결측치 제거(Deletion)

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')

2. 결측치 대체(Imputation)

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
  • mice 사용예시
# 데이터 세트
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 Imputation 사용예시
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))
profile
Data Scientist

0개의 댓글