낭만적(?) 일상/파이썬, 데이터분석

파이썬 전처리①결측치 확인, 결측치 처리(제외)하기

Soo♥JJeong 2019. 6. 27. 16:43

데이터 파일을 불러오고, 데이터의 기본구조를 파악한 다음 해야하는 것은 결측치를 확인하는 것이다.

 

0. 데이터의 기본구조 파악하기 (복습)



df.columns            #컬럼명 확인
df['컬럼명'].head()  #'컬럼명'의 값 중 최상단 5개 불러오기
df.dtypes              #각 컬럼의 데이터타입 확인하기
df.describe()         #데이터 요약(컬럼별 데이터갯수, 평균, 표준편차, 최소값, 사분위수, 최대값)

 

 

1. 컬럼별 결측치가 몇 개인지 확인하기

 

 
df.isnull() sum()

 

 

 

각 컬럼별로 결측치들이 몇 개씩 있는지를 확인했다. 여기서 혹자는 궁금증이 생길 수도 있다.

 

Q. isnull()만 하면 뭐가 나올까?

A. 전체 데이터 프레임이 다 보여지고, 결측치가 있으면 True, 없으면 False가 나와서 한눈에 결측치를 확인하기 어렵다. isnull() 뒤 sum()을 꼭 기억하자.

 

 

2. 결측치 제외하기 (빈칸이 하나라도 있는 row는 다 날리기)

 

 
df2 = df.copy()  #df를 카피해서 df2로 만들기(df는 그대로 보존)
df2.dropna()      #drop해라, na(결측치)를!
df2.describe()    #결측치 제외 전과 비교

 

 

 

 

 

결측치를 제외하고 기술통계를 확인해보니, 데이터 갯수(count)가 달라진 것을 확인할 수 있다. 그리고 다시 결측치 갯수를 확인해보니 모두 0이다.(제외가 제대로 된 것인지 확인)

 

(아직 결측치 제외하는 것만 배웠다. 결측치에 평균을 넣거나 직전행의 값을 넣어주는 방법이 있다고 한다. 이것은 좀더 배워서 수정 예정)

 

 

---'19.7.15 수정 : 결측치를 평균, 직전값, 최빈값으로 변경하는 방법

 

1. 결측치를 평균으로 변경하는 방법(ex.연령의 평균을 구해서 연령 결측치에 넣기)



mean_age = df2['연령컬럼명'].mean(axis=0)
df2['연령컬럼명'] = fillna(mean_age, inplace= True)

 

axis = 0은 열 연산(디폴트), axis=1은 행 연산을 의미. 여기서는 열의 평균이므로 axis =0

inplace = True는 원본 객체를 변경한다는 의미이다.

만약 평균 대신 중앙값을 넣고 싶으면 mean대신 median을 써도 된다.

 

 

2. 결측치를 인접으로 변경하는 방법

데이터셋의 특성상 이웃하고 있는 데이터끼리 유사성을 가진다고 판단될 경우, 바로 직전 값이나 바로 다음 값으로 바꿔줄 수 있다.

 



df['컬럼명'].fillna(method = 'ffill', inplace = True)   #NaN 직전 행의 값으로 바꿔줌
df['컬럼명'].fillna(method = 'bfill', inplace = True)  #NaN 직후 행의 값으로 바꿔줌

 

 

3.결측치를 최빈값으로 변경하는 방법



most_freq = df['결측컬럼명'].value_counts(dropna = True).idxmax()
print(most_freq) #최빈값 확인
df['결측컬럼명'].fillna(most_freq, inplace = True)

 

위 데이터로 실습을 하려고 했으나, 파일명이 변경되어 실습이 불가하다;; 실습은 다음에 하는 것으로!

 

 

  결측치를 왜 제외해야할까?

 

결측치가 평균, 표준편차에 영향을 주기 때문이다. 예를 들어,  x = [1,2,3,4,NaN] 이 있다고 해보자. x의 평균을 구하기 위해는 1+2+3+4의 값을 5로 나누게 되어 평균이 2가 된다. 하지만 결측치를 제거한다면, 4로 나누게 되어 평균이 2.5가 된다. 평균이 이렇게 달라지는데, 표준편차(평균으로부터 떨어진 정도)가 달라지는 것은 말할 것도 없다.

 

이렇게 작은 데이터셋도 1개의 결측치가 평균에 영향을 주는데 큰 데이터 셋에 있는 많은 결측치는 분명 평균과 표준편차, 그리고 뒤이어 오는 분석에도 큰 영향을 주게 될 것이다.

 

 

 

 

 

* 위 내용은 내돈내고(!)  '드립력으로 머신러닝 배우기 기초반' 에서 배운 내용이다.

** 혹시 수정되어야 할 부분이 있으면 댓글로 알려주세요! (저도 공부하는 중입니다 ^^)