수집한 데이터를 분석에 적합하도록 사전처리(Preprocessing) 하는 방법을 살펴보자.
pandas 라이브러리의 info()메소드는 유효한값(non-null)의 개수를 보여준다.
또는 value_counts(dropna=False)를 사용하여 NaN의 개수를 알 수 있다.
직접적인 방법으로는 isnull() -> 유효한 데이터가 존재하면 False 반환, 누락데이터이면 True 반환
notnull() -> 유효한 데이터가 존재하면 True 반환
누락데이터이면 False 반환
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 개로 두번째로 많은 누락값이 존재한다.
승객의 나이가 데이터 분석의 중요한 변수라면 나이 데이터가 없는 승객의 레코드(행)을 제거하는 것이 좋다.
df_age = df.dropna(subset=['age'],how='any',axis=0)
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])
이따 replace()메소드를 활용하여 Numpy에서 지원하는 np.nan으로 변경해주는 것이 좋다.
ex) ('?'을 NaN으로 치환) df.replace('?',np.nan,inplace=True)