코딜기

[Python/ML] 결측치(Missing Value) 처리 fillna/SimpleImputer/IterativeImputer(MICE) 본문

ML & DL Process/Data Preprocessing

[Python/ML] 결측치(Missing Value) 처리 fillna/SimpleImputer/IterativeImputer(MICE)

코딜기 2022. 2. 26. 20:00
반응형

데이터 전처리 과정에서 결측치 처리는 왜 해야 할까요??

  • 데이터의 결측은 모델 학습과정에서 문제를 일으킬 수 있습니다. (결측치를 고려하여 예측을 하는 모델도 있습니다.)
  • 이를 해결하기 위해 여러 방법으로 결측치 처리를 해줘야 합니다.
  • 결측치 처리 방법으로 크게 제거(Deletion)대치(Imputation)가 있습니다.

이전 포스팅에서 결측치를 확인하는 방법과 제거를 통한 처리 방법을 포스팅했으므로 이어서 대치를 통한 처리 방법을 포스팅하겠습니다.


대치 (Imputation)

1. 평균을 이용한 대치

  • 평균은 중심에 대한 경향성을 알 수 있는 척도입니다.
  • 하지만 평균은 모든 관측치의 값을 모두 반영하므로 이상치의 영향을 많이 받기 때문에 주의하여 사용해야 합니다.
  • 평균을 이용하기 때문에 수치형 변수만 이 방식을 사용할 수 있습니다.
from sklearn.impute import SimpleImputer

# 평균으로 Imputer 선언
imputer_mean = SimpleImputer(strategy='mean')
imputer_mean.fit(numeric_data)

# 데이터 변환 (array로 반환하기 때문에 필요에 맞는 형태로 변환 후 사용)
numeric_data = imputer_mean.transform(numeric_data)

2. 중간값을 이용한 대치

  • 중간값은 데이터의 정중앙에 위치한 관측값을 말합니다.
  • 데이터 샘플의 수가 짝수일 때는 중간에 위치한 두 값의 평균을 사용합니다.
  • 중간값은 모든 관측치의 값을 모두 반영하지 않으므로 이상치의 영향을 덜 받습니다.
  • 중간값을 이용한 이 방식 또한 수치형 변수에만 사용할 수 있습니다.
from sklearn.impute import SimpleImputer

# 중간값으로 Imputer 선언
imputer_mid = SimpleImputer(strategy='median')
imputer_mid.fit(numeric_data)

# 데이터 변환 (array로 반환하기 때문에 필요에 맞는 형태로 변환 후 사용)
numeric_data = imputer_mid.transform(numeric_data)

3. 최빈값을 이용한 대치

  • 최빈값은 범주 내에서 가장 자주 등장한 관측값을 말합니다.
  • 최빈값을 이용한 이 방식은 빈도수를 사용하기 때문에 범주형 변수에만 사용할 수 있습니다.
from sklearn.impute import SimpleImputer

# 최빈값으로 Imputer 선언
imputer_mode = SimpleImputer(strategy='most_frequent')
imputer_mode.fit(categorical_data)

# 데이터 변환 (array로 반환하기 때문에 필요에 맞는 형태로 변환 후 사용)
categorical_data = imputer_mode.transform(categorical_data)

4. MICE를 이용한 자동 대치

  • Round robin 방식을 반복하여 결측 값을 회귀하는 방식으로 결측치를 처리합니다.
  • 결측 값을 회귀하는 방식으로 처리하기 때문에 이 방식은 수치형 변수에 자주 사용합니다.
  • 범주형 변수에도 사용이 가능하지만 조금 더 복잡하고 먼저 인코딩됩니다.
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

# random_state값은 원하시는 숫자 아무거나 넣으시면 됩니다.
imputer_mice = IterativeImputer(random_state=83)
numeric_data = imputer_mice.fit_transform(numeric_data)

5. fillna()를 이용한 대치

  • 결측치에 특정 값을 채워주는 pandas 함수입니다.
# 데이터 프레임의 전체 결측치를 특정 값으로 일괄 대치
data.fillna(0, inplace=True)

# 특정 열의 결측치를 특정 값으로 일괄 대치
data['champion'].fillna('Rakan', inplace=True)

# 결측치 바로 이전의 값으로 대치하기
data.fillna(method = 'ffill', inplace=True)

# 결측치 바로 이후의 값으로 대치하기
data.fillna(method = 'bfill', inplace=True)

결측치를 확인하는 과정에서는 데이터의 도메인 지식이 필요합니다.

  • 결측치가 유의미한 데이터일 수도 있기 때문에 도메인 지식을 잘 파악하는 것이 중요합니다.

결측치를 삭제하는 방법으로 처리를 하는 것은 많은 리스크가 따릅니다.

  • 데이터의 삭제는 데이터의 누락으로 이어질 수 있기 때문에 꼭 신중하게 진행해야 한다.
반응형
Comments