파이썬 머신러닝 입문 공부일지 7. 결손 데이터 Null Data 처리하기
결손 데이터란?
칼럼에 값이 없는 Null 값을 의미합니다. 이는 넘파이의 NaN으로 표시합니다.
NaN 값은 칼럼에 값이 아예 없기 때문에 평균, 총합 등 함수 연산 시에 제외가 되는 것은 당연하겠죠.
100개의 데이터가 있는 칼럼에서 10개가 NaN 값일 경우 이 칼럼의 평균 값은 나머지 90 개의 평균 값이 됩니다.
즉, 머신러닝 알고리즘은 이 NaN 값을 처리하지 않기 때문에 이 값을 다른 값으로 대체해야 합니다.
이 NaN 여부를 확인하는 API 는 isna() 이며 NaN 값을 다른 값으로 대체하는 API는 fillna() 입니다.
isna()
isna()는 데이터가 NaN 인지 아닌지를 True 와 False 로 알려줍니다.
그럼 총 몇 개의 결손 데이터가 있는지 확인해볼게요.
isna() 결과로 NaN일 경우 True, NaN이 아닐 경우 False 가 반환되기 때문에 sum() 함수로 구할 수 있습니다.
sum() 함수는 True 를 1, False 를 0 으로 변환하므로 Null 결손 데이터의 갯수를 구할 수 있어요.
fillna()
현재 위에서 발생한 결손 데이터들을 처리해주기 위해 fillna()를 사용할 수 있습니다.
fillna()는 결손 데이터를 다른 값으로 일괄 대체할 수 있습니다.
Cabin (객실의 번호) 칼럼의 NaN 값을 C000 으로 대체해보겠습니다.
우선 데이터 프레임의 Cabin 칼럼을 선택해서 fillna로 대체합니다.
단, inplace=True 파라미터를 fillna() 를 추가해야 실제 데이터 세트 값이 변경됩니다.
실제 데이터 세트 값을 변경하려면 다음과 같습니다.
(1) titanic_df['Cabin'] = titanic_df['Cabin'].fillna('C000')
상기 코드와 같이 fillna() 의 반환값을 다시 해당 컬럼 값으로 정해주거나
(2) titanic_df['Cabin'].fillna('C000', inplace=True)
상기 코드와 같이 inplace 를 True 값으로 설정하여 줍니다.
titanic_df['Cabin'] = titanic_df['Cabin'].fillna('C000')
titanic_df.head(10)
상기에 보였던 타이타닉 결손 데이터 집계에서 결손 데이터가 발생한 것은 Age, Embarked, Cabin 입니다.
Cabin 은 fillna('C000') 으로, Age는 평균 나이로, Embarked 는 'S'로 대체하여 결손 데이터를 처리해봅니다.
titanic_df['Cabin'] = titanic_df['Cabin'].fillna('C000')
titanic_df['Age'].fillna(titanic_df['Age'].mean(), inplace=True)
titanic_df['Embarked'].fillna('S', inplace=True)
titanic_df.isna().sum()
결손 데이터가 모두 처리된 것을 확인할 수 있습니다.
이것은 나중에 우리가 사이킷런을 활용해서 데이터를 분석할 때 '전처리 작업' 에 해당하는 과정이며,
이 과정을 반드시 처리해야만 정확도가 높은 결과치를 얻을 수 있으니
해당 작업은 꼭 잊지 않도록 합니다.