데이터프레임에는 원소 데이터 값이 종종 누락되는 경우가 있다.
유효한 데이터 값이 존재하지 않는 누락 데이터를 NaN(Not a Number)으로 표현한다.
누락 데이터가 많아지면 데이터의 품질이 떨어지고, 머신러닝 분석 알고리즘을 왜곡하는 현상이 발생하기 때문에 제거하거나 다른 적절한 값으로 대체하는 과정이 필요하다.
누락 데이터 확인
import seaborn as sns
df = sns.load_dataset('titanic')
df.info()
→ 각 열에는 891개의 데이터가 있고, ‘deck’ 열에는 203개의 유효한 범주형 데이터가 있다.
따라서 ‘deck’열에 있는 누락 데이터는 (891 - 203 = 688)개이다.
value_counts() 메소드에 dropna=False 옵션을 사용하여 ‘deck’ 열에 688개의 누락 데이터가 있는 것을 파악할 수도 있다.
nan_deck = df['deck'].value_counts(dropna=False)
nan_deck
df.head().isnull()
df.head().notnull()
df.head().isnull().sum(axis=0)
→ 앞 5개 열에서는 ‘deck’에만 3개의 누락 데이터가 존재함을 알 수 있다.
누락 데이터 제거
missing_df = df.isnull()
for col in missing_df.columns:
missing_count = missing_df[col].value_counts()
try:
print(col, ': ', missing_count[True])
except:
print(col, ': ', 0)
df.thresh = df.dropna(axis=1, thresh=500) # NaN 값을 500개 이상 갖는 열 삭제
df_thresh.columns # 'deck'열 삭제
# 'age' 열의 행 중에서, NaN이 있는 행을 삭제
df_age = df.dropna(subset=['age'], how='any', axis=0)
len(df_age)
# 714
누락 데이터 치환
누락 데이터를 무작정 삭제하면 어렵게 수집한 데이터를 활용하지 못하게 된다.
데이터의 분포와 특성을 잘 나타낼 수 있는 평균값, 최빈값 등을 활용한다.
평균값으로 치환
mean_age = df['age'].mean(axis=0)
df['age'].fillna(mean_age, inplace=True)
df['age'].head(10)
# 'embark_town' 열에 있는 NaN을 승객들이 가장 많이 승선한 도시의 이름으로 치환
most_freq = df['embark_town'].value_counts(dropna=True).idxmax()
df['embark_town'].fillna(most_freq, inplace=True)
df['embark_town'][825:830]
df['embark_town'].fillna(method='ffill', inplace=True)
df['embark_town'][825:830]
하나의 데이터셋에서 동일한 관측값이 2개 이상 중복되는 경우 분석 결과를 왜곡하기 때문에 삭제해야 한다.
중복 데이터 확인 [duplicated()]
print(df)
df_dup = df.duplicated()
print(df_dup)
# 특정 열 데이터에서 중복값 찾기
col_dup = df['c2'].duplicated()
col_dup
중복 데이터 제거 [drop_duplicated()]
print(df)
df2 = df.drop_duplicates() # inplace=True 사용 가능
print(df2)
→ subset 옵션에 열 이름의 리스트를 전달할 수 있다. 중복 여부를 subset에 해당하는 열을 기준으로 판단
df3 = df.drop_duplicates(subset=['c2', 'c3'])
df3