230410 / BSA05. 데이터 전처리 2 : python에서 결측값 처리

BSA05_Missing-Value.ipynb

 

필요한 패키지

import pandas as pd
import numpy as np

 

결측값 제거

행 제거 : 관측값 제거

결측자료 = pd.read_csv("Employee_missing.csv", encoding="cp949")

# 결측자료의 수 확인
결측자료.isna().sum()

# 결측값이 하나라도 있는 경우 제거
결측자료.dropna(axis=0).head()

# 모든 자료가 결측값이면 제거 : how='all', default='any'
# default='any' : 결측값이 하나라도 있는 행 제거
결측자료.dropna(how='all').head() 

# 결측값이 아닌 개수가 k개 미만이면 제거
k=5
결측자료.dropna(thresh=k).head()

# 결측값이 특정 변수(column)에 있으면 제거
결측자료.dropna(subset='gender').head()

# 여러 변수(column)에 결측값이 있으면 제거 (합집합의 개념)
결측자료.dropna(subset=['gender', 'jobcat']).head()

# 결측을 제거한 데이터프레임을 동일명의 데이터프레임으로 저장
결측자료.dropna(subset='gender', inplace=True)

 

열 제거 : 변수 제거

# 결측값이 있는 열(컬럼) 제거
# axis=1 : column, axis=0 : row
결측자료.dropna(axis=1).head()
결측자료.dropna(axis='columns').head()

# 각 컬럼(열)의 결측값이 아닌 개수가 474개 미만이면 제거
결측자료.dropna(axis=1, thresh=474).head()

# 특정변수의 값을 NaN으로 처리
결측자료['jobcat'].replace('경영자',np.NaN)  # jobcat='경영자'이면 결측값으로 처리
결측자료['jobcat'].replace({'경영자':np.NaN, '사무직':np.NaN})  # jobcat='경영자'이거나 '사무직'이면 결측값으로 처리

 

결측값 대체

결측자료 = pd.read_csv("Employee_missing.csv", encoding="cp949")

# 대체값 직접 지정
결측자료.fillna(0).head()  # 데이터 타입과 관계없이 결측값을 0으로 대체

# 변수에 따라 대체값 직접 지정 (딕셔너리 형태로)
결측자료.fillna({"id":0, "gender":"남자", "jobcat":"경영자"}).head()
# 결측자료.fillna({"id":0, "gender":"남자", "jobcat":"경영자"}, inplace=True)

# 전/후 관측값으로 대체 (관측값의 순서가 시간순인 경우)
결측자료.fillna(method='ffill').head()  # former(앞의 데이터로)
# 앞의 데이터에 결측값이 있다면 채워넣을 수 없음
결측자료.fillna(method='bfill').head()  # backward(뒤의 데이터로)
# 통계값으로 대체
# 수치자료 : 평균, 중앙값 / 범주자료 : 최빈값

수치변수명 = 결측자료.select_dtypes(include=np.number).columns.tolist()
수치결측자료 = 결측자료[수치변수명]
# 수치자료 = 결측자료.select_dtypes(include=np.number)

# 특정 컬럼의 값 분포 확인
수치결측자료.groupby("educ").count()  # 개수 계산
수치결측자료.groupby("educ").mean()  # 평균 계산

# 각 컬럼의 평균 계산
수치결측자료.mean()

# 각 컬럼의 평균으로 결측값 대체
수치결측자료.fillna(수치결측자료.mean()).head()
# 중앙값:median(), 최솟값:min(), 최댓값:max()

# 각 컬럼의 최빈값으로 결측값 대체
최빈값 = 결측자료.mode()
결측자료.fillna(최빈값.iloc[0,:]).head()

 

대체 패키지 이용

# 1. SimpleImuter
from sklearn.impute import SimpleImputer

단순대체 = SimpleImputer(strategy='mean')
대체자료 = 단순대체.fit_transform(수치결측자료)  # 수치결측자료에 mean을 계산한 것을 대체자료로 저장 
# 평균=mean, 중앙값=median, 최빈값=most_frequent, 정해진값=constant (fill_value로 값 지정)

대체자료  # numpy의 array 형태로

대체자료 = pd.DataFrame(대체자료, columns=수치결측자료.columns)

# 또는 
단순대체.set_output(transform='pandas')  # pandas의 dataframe으로 출력
대체자료 = 단순대체.fit_transform(수치결측자료)
# 2. IterativeImputer
from sklearn.experimental import enable_iterative_imputer # noqa
from sklearn.impute import IterativeImputer

확률대체 = IterativeImputer(random_state=0)
확률대체.set_output(transform='pandas')
대체자료 = 확률대체.fit_transform(수치결측자료)
대체자료.head()
# 3. K-NN
from sklearn.impute import KNNImputer

근접대체 = KNNImputer(n_neighbors=190, weights='uniform')
근접대체.set_output(transform='pandas')
근접대체.fit_transform(수치결측자료).head()

 

회귀분석을 통한 대체