결측치 처리 방법
예전에 정리해 뒀던 결측치 처리 방법을 저장할 겸 올려보고자 한다.
결측 데이터의 종류
1. 완전 무작위 결측(MCAR : Missing completely at random) : 다른 변수들과 아예 상관이 없는 경우
2. 무작위 결측(MAR : Missing at random) : 결측 데이터가 다른 변수와 연관은 있지만 그 변수의 결과와는 관계 없는 경우
3. 비 무작위 결측(MNAR : Missing at not random) : 결측 데이터가 다른 변수와 연관이 있는 경우
결측치 확인, 시각화 방법
간단한 방법
df.isna().sum().plot()
# 귀찮을 때 가장 많이 쓰는 방법 isna() or isnull() 도 가능하다.
missingno 패키지
pandas 데이터프레임에서 결측 데이터를 찾고 시각화하는 기능을 제공한다.
이 패키지를 사용하려면 데이터프레임에 결측 데이터가 NaN(not a number) 값으로 저장되어 있어야 한다.
주의할 점은 NaN값은 부동소수점 실수 자료형에만 있는 값이므로
정수 자료를 데이터프레임에 넣을 때는 Int64Dtype 자료형을 명시해주어야 하고
시간 자료형을 넣을 때도 parse_dates 인수로 날짜시간형 파싱을 해주어야
datetime64[ns] 자료형이 되어 결측 데이터가 NaT(not a time) 값으로 표시된다.
import missingno as msno
msno.matrix
# 결측된 데이터는 흰색으로, 그렇지 않은 데이터는 검은색으로 나타낸다.
# 가장 오른쪽에 있는 것은 스파크라인(spark line)이라고 부르고 각 행의 데이터 완성도를 표현한다.
msno.matrix(df)
plt.show()
msno.bar
# 각 열에 결측 데이터가 얼마나 존재하는지 시각화하는 방법.
# isna().sum().plot() 과 같은 기능
msno.bar(df)
plt.show()
결측치 처리 또는 보간 방법
1. 제거
2. 평균, 중위수, 최빈수 등으로 대체(연관성 있는 컬럼으로 그룹바이하여 그 범주별 평균, 중위수 등도 고려)
3. 연관성 있는 컬럼과의 regression 등을 통한 대체(모델링)
4. 선형보간법
# 모델링으로 대체하는 부분은 설명에서는 패스
결측치를 다루는 논문을 보면 제거, 단일대체, 다중대체를 보통 사용한다.
여기서 단일대체는 평균, 중위수 등이라고 보면 된다.
다중대체는 회귀나 선형보간법 등이지 않을까 싶다.(예상)
결측치 제거
dropna # 결측치 컬럼 자체를 제거하는 방법
일반적인 결측치 처리 방식
fillna # 한 값으로 대체하는 작업 등 가능
method에 따라 이전, 이후 값을 넣을 수 있음. method = 'pad' : 이전, 'bfill' : 이후
sklearn.SimpleImputer
해당 열의 평균이나 중앙값, 최빈으로 대체하게 해 주는 클래스
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="most_frequent") # "mean", "median"값
선형 데이터에 대한 결측치 보간
Pandas interpolate
method에 따른 보간 가능, 'linear','time' 등
df.interpolate(method='polynomial', limit_direction='forward')