-
[Pandas] 기초 활용_TitanicNAN/Python 2021. 7. 3. 17:56728x90
NaN Data
머신러닝과 같은 데이터를 이용한 작업을 할 때, 누락 데이터를 처리하는 것은 데이터 품질을 높일 뿐 아니라,
성능 향상과도 매우 밀접한 관련이 있다. NaN(Not a Number) 즉, 누락 데이터를 확인하고 처리하는 방법은
필수적으로 알고있어야 한다.
seaborn으로 데이터 불러오기
seaborn에는 여러 data가 집합해있다. 약어로 sns라고 하며 이를 통해 titanic에 관련된 데이터를 불러올 수 있다.
이렇게 불러온 data는 그 양이 많아 한 눈에 담기 어려운데, 이때 사용할 수 있는 메서드가 head( ), tail( ) 함수이다.
예시에서 확인 할 수 있듯이 tail( )은 기본 값으로 data의 맨 끝에 존재하는 5개의 data를 불러온다.
head( ) 메서드는 이와 반대로 앞에서 5개의 data를 불러오는 함수이다.
# data 불러오기 import seaborn as sns df = sns.load_dataset('titanic') df.tail() survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone 886 0 2 male 27.0 0 0 13.00 S Second man True NaN Southampton no True 887 1 1 female 19.0 0 0 30.00 S First woman False B Southampton yes True 888 0 3 female NaN 1 2 23.45 S Third woman False NaN Southampton no False 889 1 1 male 26.0 0 0 30.00 C First man True C Cherbourg yes True 890 0 3 male 32.0 0 0 7.75 Q Third man True NaN Queenstown no True
' data ' . info( )
이름 그대로 정보를 불러오는 메서드로 사용 시 각 열(column)의 총 개수와 그 유효 데이터(Non-null count)가
몇 개 존재하는지 확 인 할 수 있다.
# 요약 정보를 통해 누락 데이터 확인 df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 survived 891 non-null int64 1 pclass 891 non-null int64 2 sex 891 non-null object 3 age 714 non-null float64 4 sibsp 891 non-null int64 5 parch 891 non-null int64 6 fare 891 non-null float64 7 embarked 889 non-null object 8 class 891 non-null category 9 who 891 non-null object 10 adult_male 891 non-null bool 11 deck 203 non-null category 12 embark_town 889 non-null object 13 alive 891 non-null object 14 alone 891 non-null bool dtypes: bool(2), category(2), float64(2), int64(4), object(5) memory usage: 80.6+ KB
value_counts( )
info를 통해 각 열마다 존재하는 유효 데이터를 탐색했다면, 어떤 열(column)이 전체 대비 누락 데이터가 많은지도
파악할 수 있는데, titanic의 경우 'deck'과 'age' 데이터에 유효 데이터 수가 적은걸 확인할 수 있었다.
이때 value_counts( ) 메서드를 이용한다면 보다 정확하게 해당 열의 누락 데이터 수와 유효 데이터를 알아볼 수 있다.
# value_count()메소드를 통해 누락률이 많은 열 탐색 nan_df = df['deck'].value_counts(dropna=False) nan_df NaN 688 C 59 B 47 D 33 E 32 A 15 F 13 G 4 Name: deck, dtype: int64
isnull( )
isnull( ), notnull( ) 메서드 역시 누락 데이터를 확인할 수 있는 메서드인데, isnull( )의 경우 전체 데이터에서
누락된 데이터에는 True를 반환하고 유효 데이터에는 False를 반환한다.
notnull( ) 데이터는 isnull( )과 반대로 작동된다.
# isnull == data가 null,NaN 일 때 해당 되는 원소를 True로 반환 df.head().isnull() survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone 0 False False False False False False False False False False False True False False False 1 False False False False False False False False False False False False False False False 2 False False False False False False False False False False False True False False False 3 False False False False False False False False False False False False False False False 4 False False False False False False False False False False False True False False False
isnull( ). sum(axis = )
info( ) 메서드와 value_counts( ) 메서드를 조합하지 않고 전체 누락 데이터 개 수를 파악하는 함수이다.
axis = 를 통해 행, 열을 조절할 수 있다.
# isnull().sum(axis = ) 를 사용하면 한 번에 누락 데이터의 개 수 파악 가능 df.isnull().sum(axis=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 dtype: int64
dropna( axis = , thresh = )
NaN data를 구했다면 이제 그 데이터를 제거하는 방법을 알아보자
보통 데이터 처리를 할 때 'deck'과 같이 지나치게 누락 데이터가 많을 경우 그 데이터를 제거해야
데이터 품질 향상에 도움이 된다.
예시의 코드를 읽어보면 dropna(axis=1, thresh = 445)를 통해 제거할 축을 지정하고, 기준을 정해
누락 데이터가 절반을 넘을 경우 제거한다고 입력했다.
# dropna(axis = , thresh = )를 사용 축을 지정한다. # thresh 옵션을 통해 누락률이 전체 데이터 절반이 넘는 열을 제거 ndf = df.dropna(axis=1, thresh=445) ndf.columns ndf survived pclass sex age sibsp parch fare embarked class who adult_male embark_town alive alone 0 0 3 male 22.0 1 0 7.2500 S Third man True Southampton no False 1 1 1 female 38.0 1 0 71.2833 C First woman False Cherbourg yes False 2 1 3 female 26.0 0 0 7.9250 S Third woman False Southampton yes True 3 1 1 female 35.0 1 0 53.1000 S First woman False Southampton yes False 4 0 3 male 35.0 0 0 8.0500 S Third man True Southampton no True ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 886 0 2 male 27.0 0 0 13.0000 S Second man True Southampton no True 887 1 1 female 19.0 0 0 30.0000 S First woman False Southampton yes True 888 0 3 female NaN 1 2 23.4500 S Third woman False Southampton no False 889 1 1 male 26.0 0 0 30.0000 C First man True Cherbourg yes True 890 0 3 male 32.0 0 0 7.7500 Q Third man True Queenstown no True
데이터 .dropna(subset=[' 열 선택 '], how='any', axis = 0)
데이터 품질 향상을 위해 누락 데이터가 많은 데이터를 제거하는 게 좋지만,
그렇다고 너무 많은 데이터를 제거하는 것 역시 데이터 품질에 좋은 영향을 끼치진 않는다.
두 번째로 누락률이 높았던 'age' 열을 제거하는 게 아닌, 정재하여 데이터 품질을 향상해 보자
dropna( ) 메서드는 여러 옵션을 가지고 있는데 그중 how 옵션은 누락 데이터만을 제거하는 게 가능하다.
how='any'를 입력하여 누락 데이터를 제거하자.
# 누락 데이터가 두 번째로 많은 'age'열을 dropna() 메소드의 how 옵션을 이용하여 # 누락 데이터를 가진 행만 제거 # how='any'를 사용하면 누락 데이터가 존재하는 모든 행을 제거한다. ndf2 = ndf.dropna(subset=['age'], how='any',axis = 0) print(ndf2.isnull().sum(axis=0)) print() print(ndf2.notnull().sum(axis=0)) survived 0 pclass 0 sex 0 age 0 sibsp 0 parch 0 fare 0 embarked 2 class 0 who 0 adult_male 0 embark_town 2 alive 0 alone 0 dtype: int64 survived 714 pclass 714 sex 714 age 714 sibsp 714 parch 714 fare 714 embarked 712 class 714 who 714 adult_male 714 embark_town 712 alive 714 alone 714 dtype: int64
median( )
dropna how를 통해 누락 데이터를 제거했다면 비어 있는 데이터 값은 평균값과 같은 대체 데이터로 채워주는 게 좋다.
df [ ' 행열 이름 ' ]. median(axis=0) 함수를 사용하면 해당 행/열의 전체 데이터 평균값을 입력한다.
# 누락 데이터가 445 이상인 데이터 제거 df.dropna(axis=1, thresh=445, inplace=True) # age열의 누락 데이터를 평균값으로 채우기 age_median = df['age'].median(axis=0) df['age'].fillna(age_median, inplace = True) df.isnull().sum(axis= 0) survived pclass sex age sibsp parch fare embarked class who adult_male embark_town alive alone 886 0 2 male 27.0 0 0 13.00 S Second man True Southampton no True 887 1 1 female 19.0 0 0 30.00 S First woman False Southampton yes True 888 0 3 female 28.0 1 2 23.45 S Third woman False Southampton no False 889 1 1 male 26.0 0 0 30.00 C First man True Cherbourg yes True 890 0 3 male 32.0 0 0 7.75 Q Third man True Queenstown no True
notnull( )
유효 데이터에는 True 반환 누락 데이터는 False
# notnull() == 유효한 data 일 경우 True 반환 null, NaN은 False df.head().notnull() survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone 0 True True True True True True True True True True True False True True True 1 True True True True True True True True True True True True True True True 2 True True True True True True True True True True True False True True True 3 True True True True True True True True True True True True True True True 4 True True True True True True True True True True True False True True True
'NAN > Python' 카테고리의 다른 글
[Pandas] Index 활용 / data 입출력 / 연산 (0) 2021.07.03 [Pandas] 소개 / 시리즈와 데이터프레임 (0) 2021.07.02 [NumPy] 객체 저장 / 로드 (0) 2021.07.01 [NumPy_5] 난수 / 고유 항목 다루기 / 행렬 전치 / 배열 뒤집기 재구성 (0) 2021.06.30 [NumPy_4] 기존 데이터에서 배열 만들기 / 배열 연산 (0) 2021.06.30