데이터 탐색인 전처리 과정에서 가장 중요한 결측치 처리 절차/방안 입니다.
예제는 타이타닉 데이터를 샤용합니다.
# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 여러 열 동시 제거
drop_cols = ['Cabin', 'PassengerId', 'Name', 'Ticket']
titanic.drop(drop_cols, axis=1, inplace=True) #[주의] inplace쓰면 반환값 작성X
# titanic = titanic.drop(drop_cols, axis=1)
titanic.isna().sum()
: 변수별 결측치 갯수 확인
/결과 예시/
Survived 0
Pclass 0
Sex 0
Age 177
SibSp 0
Parch 0
Fare 0
Embarked 2
dtype: int64
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)
1) 특정 값으로 채우기
나이 결측치를 평균 값으로 대체
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) 앞/뒤 값으로 채우기
# 변수 NaN 값을 바로 앞의 값으로 채우기
data['변수'].fillna(method='ffill', inplace=True)
# 변수 NaN 값을 바로 뒤의 값으로 채우기
data['변수'].fillna(method='bfill', inplace=True)
3) 선형 보간법으로 채우기
# 변수 NaN 값을 바로 뒤의 값으로 채우기
data['변수'].interpolate(method='linear', inplace=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'])