import pandas as pd
train_data = pd.read_csv('./train.csv')
train_data.head()

 


NaN (Not a Number) 데이터

In computing, NaN, standing for Not a Number, is a member of a numeric data type that can be interpreted as a value that is undefined or unrepresentable, especially in floating-point arithmetic.
표현 불가능한 수치형 데이터를 NaN 데이터 라고한다.

train.shape를 통해 확인한 train의 DataFrame 형태는 891 * 12 의 형태로, 즉 891개의 데이터와 12개의 feature로 이루어져 있는 것을 알 수 잇다. 만약, train이 온전한 데이터를 가지고 있다면 각 feature마다 891개의 데이터가 채워져 있어야 할 것이다.

train_data.info()

하지만 info()를 통해 train의 정보를 출력하자, Age, Cabin, Embarked feature에서 데이터가 누락된 것을 확인할 수 있다. (각 feautre에 채워진 데이터 갯수가 891개가 아니기 때문이다.) 이렇게 누락된 데이터 자리에는 NaN 값으로 채워져 있으며, NaN 데이터 갯수는 다음과 같이 확인할 수 있다.

# isna() : NaN인지 아닌지를 boolean 데이터로 반환
# sum() : 반환된 boolean 데이터 중 True인 값만 count
train_data.isna().sum()

NaN 데이터가 Age에는 177개, Cabin에는 687개, Embarked에는 2개 있는 것을 확인할 수 있다.

머신러닝 알고리즘이 작동하기 위해서는 각 feature를 수치형 데이터로 채워 feature vector로 만들어야 한다. 이 과정을 feature engineering 이라고 하며, 그 과정 중에 하나가 NaN 데이터를 처리하는 과정이다.


NaN 데이터 삭제하기

dropna 함수를 사용해 NaN 데이터가 있는 row를 삭제할 수 있다.

# DataFrame.dropna( axis=0, how='any', thresh=None, subset=None, inplace=False )
# axis = 0 (row) 혹은 1 (column)
# how = 'any' 일 경우, label 중 하나만 NaN이어도 해당 label을 삭제함.
# how = 'all' 일 경우, label 의 모든 데이터가 NaN이어야 해당 label을 삭제함.
# subset 다른 축(axis)의 어떤 label를 고려해야 하는지 list형태로 지정
# NaN이 포함된 모든 row를 삭제했기 때문에 데이터가 183개로 줄어들었다.
train_data.dropna()

# 'Age'의 데이터가 NaN인 row만 삭제한다.
train_data.dropna( subset=[ 'Age' ] )

# column 중 NaN 데이터가 있는 column의 feature을 삭제한다.
train_data.dropna( axis = 1 )


NaN 데이터 대체하기

fillna 함수를 사용해 NaN 데이터를 원하는 data로 대체할 수 있다.

# DataFrame.fillna( value=None, method=None, axis=None, inplace=False, limit=None, downcast=None )
# value = 스칼라, dict, Series, DataFrame 만 넣을 수 있다.
# Age의 NaN 데이터를 전체 나이의 평균으로 채운다.
train_data[ 'Age' ].fillna( train_data[ 'Age' ].mean() )

# 생존자는 생존자 나이 평균으로, 사망자는 사망자 나이 평균으로 채운다.
mean1 = train_data[ train_data[ 'Survived' ] == 1 ][ 'Age' ].mean()
mean0 = train_data[ train_data[ 'Survived' ] == 0 ][ 'Age' ].mean()

train_data[ train_data[ 'Survived' ] == 1 ][ 'Age' ].fillna( mean1 )
train_data[ train_data[ 'Survived' ] == 0 ][ 'Age' ].fillna( mean0 )

# 위 코드는 fillna 함수의 inplace 속성이 False 이기 때문에, 값이 원본에 저장되지 않는다.
train_data.loc( train_data[ 'Survived' ] == 1, 'Age' ) = train_data[ train_data[ 'Survived' ] == 1 ][ 'Age' ].fillna( mean1 )
train_data.loc( train_data[ 'Survived' ] == 0, 'Age' ) = train_data[ train_data[ 'Survived' ] == 0 ][ 'Age' ].fillna( mean0 )

# 'Age' 속성이 생존자 평균 나이인 row를 출력
train_data[ train_data[ 'Age' ] == mean1 ]

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기