Python

[Python] 데이터 사전 처리(Preprocessing)_1

구루싸 2019. 10. 1. 22:35
반응형
SMALL

지금까지 파이썬(Python)의 판다스(Pandas), 맷플롯립(Matplotlib), 씨본(Seaborn), 폴리엄(Folium) 라이브러리(Library)를 통해

여러 데이터를 다양한 방법으로 출력해보면서 본래 이 학습의 목적인 데이터 분석을 위한 아주 미미한-_- 준비를 해보았습니다

그런데 머신러닝 등 데이터 분석의 정확도는 분석 데이터의 품질에 의해 좌우됩니다

일전 학습에서도 일부 데이터의 누락(NaN)으로 오류가 발생한다던지 결과가 잘못나온다던지 하는 현상이 있었습니다-_-

데이터 품질을 높이기 위해서는 누락된 데이터, 중복 데이터 등 오류를 수정하고 분석하려는 목적에 맞게 데이터를 가공해야합니다

먼저 누락 데이터를 처리하는 법을 학습해보도록 하겠습니다

import seaborn as sb

titanic_data = sb.load_dataset('titanic')
print(titanic_data.head(), end = '\n')
# 요약 정보 출력
print(titanic_data.info(), end = '\n')

# 누락 데이터 확인
nan_deck = titanic_data['deck'].value_counts(dropna = False)
print(nan_deck, end = '\n')
print(titanic_data.head().isnull()) # NaN이면 True 아니면 False
print(titanic_data.head().notnull()) # NaN이면 True 아니면 False
print(titanic_data.head().isnull().sum(axis = 0)) # NaN 데이터 개수

# 누락 데이터 제거 (age : 177, embarked : 2, deck : 688, embark_town : 2)
missing_data = titanic_data.isnull()
for col in missing_data.columns :
    missing_count = missing_data[col].value_counts() # 각 열의 NaN 개수
    # NaN 값을 갖지 않는 컬럼의 경우 에러가 발생하므로 
    try :
        print(col, ': ', missing_count[True])
    except :
        print(col, ': ', 0)

# deck 열은 전체 891개 행 중 688개의 행이 NaN이므로 분석에서 제외
apply_thresh = titanic_data.dropna(axis = 1, thresh = 450)
print(apply_thresh.columns, end = '\n')

# age 열은 177개의 행이 NaN이지만 분석에 유용할 수 있으므로 NaN만 제외
del_non_age = titanic_data.dropna(subset = ['age'], # age 열로 한정
                                  how = 'any', # any - 하나라도 NaN이면 삭제
                                               # all - 모두 NaN이면 삭제
                                  axis = 0)
print(len(del_non_age), end = '\n')

# 누락 데이터 치환 : 수집한 데이터를 최대한 활용
# 평균값으로 치환
print(titanic_data['age'][5:10], end = '\n')
mean_age = titanic_data['age'].mean(axis = 0) # age 열의 평균
titanic_data['age'].fillna(mean_age, inplace = True)
print(titanic_data['age'][5:10], end = '\n')
# 최빈값으로 치환
print(titanic_data['embark_town'][60:65], end = '\n')
most_freq = titanic_data['embark_town'].value_counts(dropna = True).idxmax()
print(most_freq, end = '\n')
titanic_data['embark_town'].fillna(most_freq, inplace = True)
print(titanic_data['embark_town'][60:65], end = '\n')
# 이웃값으로 치환
print(titanic_data['embarked'][60:65], end = '\n')
titanic_data['embarked'].fillna(method = 'ffill', inplace = True)
print(titanic_data['embarked'][60:65], end = '\n')

누락 데이터를 처리하는 방법을 학습해보았습니다 이제는 동일한 데이터가 수집되었을 때 어떻게 처리하는지 학습해보도록 하겠습니다

import pandas

# 중복데이터 생성
duplicated_data = pandas.DataFrame({'column1':['a', 'a', 'b', 'c', 'd'],
                                    'column2':['a', 'a', 'a', 'a', 'a'],
                                    'column3':['b', 'b', 'b', 'b', 'b'],
                                    'column4':['c', 'c', 'c', 'c', 'c'],
                                    'column5':['d', 'd', 'd', 'd', 'd']})
print(duplicated_data, end = '\n')

# 데이터프레임 전체 행 데이터 중 중복값 찾기
found_duplicated_data = duplicated_data.duplicated()
print(found_duplicated_data, end = '\n')

# 데이터프레임 특정 열 데이터 중 중복값 찾기
found_col_duplicated_data = duplicated_data['column2'].duplicated()
print(found_col_duplicated_data, end = '\n')

# 데이터프레임 전체 행 데이터 중 중복데이터 제거
drop_duplicated_data = duplicated_data.drop_duplicates()
print(drop_duplicated_data, end = '\n')

# 데이터프레임 특정 열 데이터 중 중복데이터 제거
drop_col_duplicated_data = duplicated_data.drop_duplicates(subset = ['column3', 'column4'])
print(drop_col_duplicated_data, end = '\n')

중복데이터가 수집되었을 때 전체 데이터에 대해 혹은 특정 열에 대해 중복값을 True, False로 찾고, 중복값을 제거해보았습니다

놀러 다니느라 정신이 없어 이 부분을 무려 4일이나 지나서 작성하게되었네요-_-

실컷 놀았으니 다시 달려보도록 하겠습니다 다음 학습을 향해 고고!!

반응형
LIST