import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
# 한글 폰트 세팅
font_path = "./malgun.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
'''
데이터 사전처리
1. 누락 데이터 처리
--> 데이터 프레임에는 원소 데이터 값이 누락되는 경우가 발생
--> 데이터를 입력할때 빠트리거나 파일 형식을 변환하는 과정에서 데이터가 소실되는 것이 주요원인
--> 일반적으로 유효한 데이터 값이 존재하지 않는 누락 데이터를 NaN으로 표시
-----------------------------------------------------------------------------------------
--> 머신러닝 모델에 데이터 입력 전 반드시 누락 뎅이터 제거 혹은 다른 적절한 값으로 대체하는 과정 필요
--> 누락 데이터가 많아지면 데이터의 품질이 떨어지고 머신러닝 분석 알고리즘을 왜곡하는 현상 발생
'''
df = sns.load_dataset('titanic')
print(df['deck'].isnull().sum())
print(df.deck.value_counts(dropna=False))
'''
isnull은 반환값이 참이면 1 , 거짓이면 0으로 판별
'''
#isnull()이용 상위 5개 행의 누락 데이터 개수 구하기
print(df.head(5).isnull().sum(axis=0))
#notnull()이용 상위 5개 행의 누락 데이터 개수 구하기
print('-------------------------------------------')
print(df.head(5).notnull().sum(axis=0))
'''누락 데이터 제거
--> 누락 데이터가 들어있는 열 또는 행 삭제
--> 열 삭제시 분석 대상이 갖는 특성(변수)을 제거
--> 행 삭제시 분석 대상의 관측값(레코드)를 제거
for 반복문으로 각 열의 NaN개수 계산하기
'''
print('--------------------------------------------')
missing_df = df.isnull()
for col in missing_df.columns:
missing_count = missing_df[col].value_counts() #각 열의 NaN 개수 파악
try:
print(col,':',missing_count[True]) # NaN값이 있으면 개수를 출력
except:
print(col,':',0) # NaN값이 없으면 0 출력
'''전체 891명의 승객중 688명 deck 데이터 누락
-누락 데이터 비율이 높음
-분석에서 제외하는 것이 의미 있어 보임
-NaN값이 500개 이상인 열을 모두 삭제
-deck 열(891개중 688개의 NaN 값)
-dropna() 메소드, thresh 옵션 사용
'''
#deck열이 삭제 되었다.
df.dropna(axis = 1, thresh = 500)
#나이 데이터가 없는 승객의 행을 제거
df_age =df.dropna(subset=['age'],how='any',axis=0)
print(len(df_age))
#age 열의 NaN 값을 삭제하지 않고 다른 나이 데이터의 평균으로 변경
#age열의 첫 10 개 출력
print(df.head(10).age)
#age열의 평균 계산 (NAN 값 제외 , mean 사용)
mean_ = df['age'].mean()
#fillna 메소드 활용 NAN값을 평균값으로 변경
df['age'].fillna(mean_, inplace = True)
#age열의 첫 10개 데이터 출력
print(df.head(10).age)
'''
승선 도시를 나타내는 embark_town 열에 있는 NaN 처리
승객들이 가장 많이 승선한 도시의 이름을 찾아 NaN을 치환
embark_town 열의 825~830번 행의 NaN데이터 확인
'''
#embark_town 열의 825~830번 행의 NaN데이터 확인
print(df.loc[825:830,'embark_town'])
#문제가 있는 행 찾기
print(df.loc[829])
#최빈값 찾기 = Southampton
print(df.embark_town.value_counts())
#최빈값 찾기2
most_frequent = df['embark_town'].value_counts().idxmax()
#최빈값으로 변경 하기
df.embark_town.fillna(most_frequent, inplace=True)
#변경 내용 확인
print(df.loc[825:830,'embark_town'])
'''embarked 열의 NaN값을 바로 앞에 있는 828행의 값으로 변경하기'''
df.embarked.fillna(method='ffill',inplace=True)
print(df.loc[825:830,'embarked'])
'''중복 데이터를 갖는 데이터프레임 만들기'''
df = pd.DataFrame({'c1':['a','a','b','a','b'],
'c2':[1,1,1,2,2],
'c3':[1,1,2,2,2]})
'''데이터 프레임 전체 행 데이터에서 중복값 찾기'''
print(df.duplicated())
#데이터 프레임의 특정열(c2)데이터에서 중복값 찾기
print(df.c2.duplicated())
'''앞의 뎅이터프레임에서 중복행 제거'''
df2 = df.drop_duplicates(inplace=True)
# c2,c3열 기준으로 중복행 제거
df3 =df.drop_duplicates(subset=['c2','c3'])
'''
같은 데이터셋에서 서로 다른 측정 단위 사용 시 전체 데이터의 일관성 측면에서 문제 발생
측정 단위를 동일하게 맞출 필요
외국 데이터를 가져오면 국내에서 잘 사용하지 않는 도량형 단위 많이 사용
영미권의 마일,야드,온스 등은 한국의 미터,평,그램으로 변환
mpg 데이터프레임의 mpg(mile per gallon)을 kpl(kilometer per liter)로 변환
'''
df = sns.load_dataset('mpg')
print(df.head(3))
#mpg와 kpl의 비율 확인 0.425
print(df.mpg * 0.425)
df['kpl'] = df.kpl.round(2)
print(df)
'Python' 카테고리의 다른 글
Python - Pandas 데이터프레임 응용 (0) | 2022.10.04 |
---|---|
Python - Pandas 데이터 전처리 (0) | 2022.10.04 |
Python - folium 사용 지도데이터 (0) | 2022.10.01 |
Python -seaborn 그래프 -2 (0) | 2022.10.01 |
Python - Seaborn 데이터셋, 그래프 그리기 (1) | 2022.09.30 |