10. 데이터 사전처리 - 누락데이터

김동웅·2021년 8월 25일
0

Pandas with python

목록 보기
10/23

머신러닝 등 데이터 분석의 정확도는 분석 데이터의 품질에 의해 좌우된다.

데이터 품질을 높이기 위해서는 누락 데이터, 중복 데이터 등 오류를 수정하고 분석 목적에 맞게 변형하는 과정이 필요하다.

수집한 데이터를 분석에 적합하도록 사전처리(Preprocessing) 하는 방법을 살펴보자.

데이터프레임에는 원소 데이터 값이 종종 누락되는 경우가 있다.

머신러닝 분석 모형에 데이터를 입력하기 전에 반드시 누락 데이터를 제거하거나 다른 적절한 값으로 대체하는 과정이 필요하다.


1. 누락 데이터 확인

  • pandas 라이브러리의 info()메소드는 유효한값(non-null)의 개수를 보여준다.

  • 또는 value_counts(dropna=False)를 사용하여 NaN의 개수를 알 수 있다.

  • 직접적인 방법으로는 isnull() -> 유효한 데이터가 존재하면 False 반환, 누락데이터이면 True 반환

  • notnull() -> 유효한 데이터가 존재하면 True 반환
    누락데이터이면 False 반환

2. 누락 데이터 제거

  • 누락데이터가 들어있는 열 또는 행을 삭제하는 방법
import seaborn as sns

df = sns.load_dataset('titanic')

missing_df = df.isnull()


# for 반복문으로 각 열의 NaN 개수 계산하기
for col in missing_df.columns :
    # 각열의 데이터 개수 파악
    # missing_count 는 data와 data개수가 시리즈형태로 저장됨 
    missing_count = missing_df.value_counts()
    
    try :
    	# NaN값이 있으면 출력
        print(col,': ',missing_count[True])
    except : 
    	# NaN값이 없으면 0으로 표시
        print(col,': ',0)
        
    

실행결과

survived :  0
pclass :  0
sex :  0
age :  177
sibsp :  0
parch :  0
fare :  0
embarked :  2
class :  0
who :  0
adult_male :  0
deck :  688
embark_town :  2
alive :  0
alone :  0

실행결과 deck 열에 가장많은 누락값이 존재한다.

# NaN값이 500개이상인 열을 삭제.
 
df_thresh = df.dropna(axis=1,thresh=500)

실행결과 age 열에 177 개로 두번째로 많은 누락값이 존재한다.

승객의 나이가 데이터 분석의 중요한 변수라면 나이 데이터가 없는 승객의 레코드(행)을 제거하는 것이 좋다.

  • dropna() 메소드에 subset을 'age'열로 한정하면, 'age'열의 행 중에서 NaN값이 있는 모든 행(axis=0)을 삭제한다. 기본적으로 how='any' 옵션이 적용되는데, NaN값이 하나라도 존재하면 삭제한다는 뜻이다.
    how='all' 옵션으로 입력하면 모든 데이터가 NaN 값일 경우에만 삭제한다.
df_age = df.dropna(subset=['age'],how='any',axis=0)

3. 누락 데이터 치환

  • fillna() 메소드로 누락데이터를 치환할 수 있다.

ex1)

import seaborn as sns

df = sns.load_dataset('titanic')

# age 열의 첫 10개 데이터 출력
print(df['age'].head(10))
print('\n')


# age열의 NaN값을 나이평균값으로 replace

mean_age = df['age'].mean(axis=0)
df['age'].fillna(mean_age,inplace=True)

ex2)

import seaborn as sns

df = sns.load_dataset('titanic')

print(df['embark_town'][825:830])

# embark_town 열에서 NaN을 제외한 가장 많은값으로 치환
most_freq = df['embark_town'].value_counts(dropna=True).idxmax()

print(most_freq)

df['embark_town'].fillna(most_freq,inplace=True)

print(df['embark_town'][825:830])

※ 누락 데이터가 NaN값으로 표시되지 않은 경우

  • 데이터셋중에는 누락데이터가 NaN 값이 아닌 '?', '-', 0 으로 입력되기도 하는 경우가 있다.

이따 replace()메소드를 활용하여 Numpy에서 지원하는 np.nan으로 변경해주는 것이 좋다.

ex) ('?'을 NaN으로 치환) df.replace('?',np.nan,inplace=True)

※ fillna()메소드에 method='ffill' 옵션을 추가하면 NaN이 있는 행의 직전 행에 있는 값으로 바꿔준다.

'bfill'으로 하면, 바로 다음행의 값으로 치환한다.


0개의 댓글