코딜기

[Python/ML] 결측치(Missing Value) 처리 isna/missingno/dropna 본문

ML & DL/Data Preprocessing

[Python/ML] 결측치(Missing Value) 처리 isna/missingno/dropna

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

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

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

결측치 확인

1. isna() 사용

  • 데이터 프레임 내에 결측 값을 확인하여 그 결과를 True / False로 반환합니다.
  • isna()를 따로 사용하기보다 sum()을 같이 사용하여 주로 결측치의 개수를 파악합니다.
import pandas as pd

# 데이터 프레임 개별값들의 결측 여부(True/False)를 알고 싶을 때 사용
pd.isna(data)

 


# 컬럼별로 결측치 갯수를 알고 싶을 때
pd.isna(data).sum()

 


# 데이터 프레임 전체의 결측치 갯수를 알고 싶을 때
pd.isna(data).sum().sum()

 


2. missingno 라이브러리 사용

  • 간단한 코드로 결측 부분을 시각화하는 결측치 라이브러리입니다.
  • 빠른 시간 안에 데이터 프레임의 결측 상태를 파악할 수 있습니다.
  • 행 전체에 결측치가 많은지 파악할 수 있습니다. (이 행은 제거하는 것이 합리적입니다.)
import missingno as msno

# 결과 plot의 흰색부분이 결측부분
msno.matrix(data)
 
 
 

※ 실행이 되지 않는다면 !pip install missingno 를 하여 라이브러리를 다운받아 줍니다.

missingno 라이브러리엔 다양한 기능들이 있기 때문에 다음에 하나의 포스팅으로 다뤄볼 예정입니다.


제거 (Deletion)

1. dropna() 사용

  • 행 단위로 삭제
# 결측치가 하나라도 포함된 행은 삭제
# 아주 위험한 방식
data.dropna(inplace = True)

# 원하는 컬럼(level, champion)에서 결측치가 발견되면 그 행은 삭제
# 지정 컬럼이 아주 중요한 컬럼일 때 사용
data.dropna(subset=['level', 'champion'], inplace = True)
  • 열 단위로 삭제
# 결측치가 하나라도 포함된 열은 삭제
# 아주 위험한 방식
data.dropna(axis=1, inplace = True)
  • 조건을 걸고 삭제
# 원하는 컬럼(level, champion)에서 행 전체가 결측치이면 그 행은 삭제
data.dropna(subset=['level', 'champion'], how = 'all', inplace = True)

# 원하는 컬럼(level, champion)에서 2개 초과의 결측치가 있으면 그 행은 삭제
data.dropna(subset=['level', 'champion'], thresh = 2, inplace = True)

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

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

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

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