결측치 처리 모음

syEON·2023년 8월 28일
0
post-thumbnail
post-custom-banner

데이터 탐색인 전처리 과정에서 가장 중요한 결측치 처리 절차/방안 입니다.
예제는 타이타닉 데이터를 샤용합니다.

# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

1. 데이터 불러오기

2. 불필요한 변수 제거

# 여러 열 동시 제거
drop_cols = ['Cabin', 'PassengerId', 'Name', 'Ticket']
titanic.drop(drop_cols, axis=1, inplace=True) #[주의] inplace쓰면 반환값 작성X
# titanic = titanic.drop(drop_cols, axis=1)  

3.1 NaN 확인

titanic.isna().sum(): 변수별 결측치 갯수 확인

/결과 예시/
Survived 0
Pclass 0
Sex 0
Age 177
SibSp 0
Parch 0
Fare 0
Embarked 2
dtype: int64

3.2 NaN 삭제

1) 모든 행 제거

titanic.dropna(axis=0, inplace=True)

2) 일부 행 제거

titanic.dropna(subset=['Age'], axis=0, inplace=True) #Age의 결측치만 제거, Embarked는 유지 

3) 열(변수) 제거

titanic.dropna(axis=1, inplace=True)

3.3 NaN 채우기

1) 특정 값으로 채우기

  • 수치형 변수 : 평균, etc..
  • 범주형 변수 : 최빈값, etc..

나이 결측치를 평균 값으로 대체

titanic['Age'].fillna(titanic['Age'].mean(), inplace=True) 

탑승지 결측치를 최빈값으로 대체

#최빈값 구하는 방법
titanic['Embarked'].mode()
titanic['Embarked'].value_counts().idxmax()
titanic['Embarked'].value_counts()  # 가장 많이 탑승한 값 확인 
titanic['Embarked'].fillna('S', inplace=True) 

2) 앞/뒤 값으로 채우기

  • 시계열 데이터인 경우 많이 사용
  • method = 'ffill': 앞의 값으로 채우기
  • method = 'bfill': 뒤의 값으로 채우기
# 변수 NaN 값을 바로 앞의 값으로 채우기
data['변수'].fillna(method='ffill', inplace=True)

# 변수 NaN 값을 바로 뒤의 값으로 채우기
data['변수'].fillna(method='bfill', inplace=True)

3) 선형 보간법으로 채우기

  • 값의 앞과 뒤 데이터를 파악하여 적절한 값으로 채운다.
  • interpolate() 함수사용

# 변수 NaN 값을 바로 뒤의 값으로 채우기
data['변수'].interpolate(method='linear', inplace=True)

4. 가변수화

  • 타입이 object인 변수에 사용
  • 범주형 변수를 One-Hot Encoding을 get_dummies()를 사용하여 변경
  • 다중공산성 문제를 해결하기 위해 drop_first=True 옵션을 지정

drop_first옵션 파악하기
a, b, c의 컬럼이 있을 때 b와 c만으로도 a의 값을 유추할 수 있다.
따라서 a의 컬럼의 의미가 중복 되기 때문에 a를 삭제하여 모델의 성능을 더 높이는데 사용한다.
특히 liner regression(선형회귀)에서는 해주는 것이 좋다.

>>> pd.get_dummies(pd.Series(list('abcaa')))
       a      b      c
0   True  False  False
1  False   True  False
2  False  False   True
3   True  False  False
4   True  False  False

>>> pd.get_dummies(pd.Series(list('abcaa')), drop_first=True)
       b      c
0  False  False
1   True  False
2  False   True
3  False  False
4  False  False

타이타닉 데이터 활용 예제

# 가변수 대상 변수 식별
dumm_cols = ['Pclass', 'Sex', 'Embarked']

# 가변수화
x = pd.get_dummies(x, columns=dumm_cols, drop_first=True)

2)범위 지정
자료형을 Categorical로 변경하여 미리 지정한 종류로 가변수화 진행

x_test['ShelveLoc'] = pd.Categorical(x_test['ShelveLoc'], categories=['Bad' 'Good' 'Medium'])


https://wikidocs.net/153209

post-custom-banner

0개의 댓글