반응형
데이터 사전처리
▶ 누락 데이터 처리
- 데이터 프레임에는 원소 데이터 값이 누락되는 경우가 발생합니다.
- 데이터를 입력할 때 빠트리거나 파일 형식을 변환하는 과정에서 데이터가 소실되는 것이 주요 원인입니다.
- 일바반적으로 유효한 데이터 값이 존재하지 않는 누락 데이터를 NaN(Not a Number)으로 표시합니다.
- 머신러닝 모델에 데이터 입력 전 반드시 누락 데이터 제거 혹은 다른 적절한 값으로 대체하는 과정이 필요합니다.
- 누락 데이터가 많아지면 데이터의 품질이 떨어지고 머신러닝 분식 알고리즘을 왜곡하는 현상이 발생합니다.
▶ 데이터를 불러옵니다.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
▶ nan값을 확인합니다.
df.info()
▶ deck에서 결측치를 확인합니다.
df.deck.value_counts(dropna=False)
# NaN 688
# C 59
# B 47
# D 33
# E 32
# A 15
# F 13
# G 4
▶ isnull(), notnull()을 통하여 결측치를 확인합니다.
df.isnull()
df.notnull()
# 널 값 확인
df.head().isnull().sum(axis=1)
# 0 1
# 1 0
# 2 1
# 3 0
# 4 1
# dtype: int64
▶ for반복문으로 결측치를 찾습니다.
#for 반복문으로 각 열의 Nan 개수 계산
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)
# 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
▶ 500개 이하의 데이터수를 가진 컬럼을 제거 합니다.
df.dropna(axis=1 ,thresh=500)
# thresh : 500개 이하의 데이터 수는 제거
# axis = : 1 - 컬럼 대상, 0 - 로우 대상
df.dropna(axis=1 ,thresh=500).shape
# (891, 14)
▶ age 컬럼의 nan값을 삭제합니다.
df_age = df.dropna(subset=['age'], how='any', axis=0)
# subset : age의 컬럼을 찾아 삭제한다. 개념상 axis=0로 무조건 잡는다.
print(len(df_age))
# 714
# 891개에서 714개가 됨
▶ age의 컬럼에 평균을 계산합니다.
mean()계산시 Nan값은 제외됩니다.
df.age.mean()
# 29.69911764705882
▶ age 컬럼의 결측치에 age컬럼의 평균을 입력합니다.
df.age.fillna(df.age.mean(), inplace=True)
▶ embark_town 컬럼의 가장 큰 값을 찾아 Nan값에 저장합니다.
df.embark_town.fillna(df.embark_town.value_counts().idxmax(),
inplace=True)
▶ embarked 컬럼의 Nan 값을 각각 전 로우값을 입력하여 저장합니다.
df.embarked.fillna(method='bfill', inplace=True)
df.embarked.fillna(method='ffill', inplace=True)
▶ 중복 데이터 찾기
- 전에 나온 로우들과 비교하여 중복되는 로우면 True, 처음나오는 로우면 False를 반환합니다.
▷ 메서드
DataFrame.duplicated()
▷ 데이터프레임을 가져옵니다.
df = pd.DataFrame({'c1':['a', 'a', 'b', 'a', 'b'],
'c2' : [1, 1, 1, 2, 2],
'c3' : [1, 1, 2, 2, 2]})
▷ 전체 로우의 값에서 중복값을 찾습니다.
df.duplicated()
# 0 False
# 1 True
# 2 False
# 3 False
# 4 False
# dtype: bool
▷ c2 컬럼에서 중복 값의 로우를 찾습니다.
df.c2.duplicated()
# 0 False
# 1 True
# 2 True
# 3 False
# 4 True
# Name: c2, dtype: bool
▶ 중복 데이터 제거
▷ 메서드
DataFrame.drop_duplicates()
▷ 중복되는 로우를 제거합니다.
# 중복되는 로우를 제거합니다.
df.drop_duplicates()
▷ 컬럼을 설정하여 중복되는 로우를 제거합니다.
df.drop_duplicates(subset=['c2', 'c3'])
단위환산
- 같은 데이터셋에서 서로 다른 측정 단위 사용 시 전체 데이터의 일관성 측면에서 문제 발생하고 측정 단위를 동일하게 맞출 필요가 있습니다.
- 해외 데이터를 가져올 시 국내에서 잘 사용하지 않는 도량형 단위를 많이 사용합니다.
▶ 데이터를 가져옵니다.
df_auto = pd.read_csv('./auto-mpg.csv', header=None)
df_auto.columns = ['mpg','cylinders','displacement','horsepower',
'weight','acceleration','model year','origin','name']
▶ mpg컬럼을 단위 환산하여 kpl컬럼에 추가합니다.
df_auto['kpl'] = (df_auto['mpg'] / 2.352).round(2)
반응형
'Python' 카테고리의 다른 글
[Python] TimeSeries (0) | 2022.10.06 |
---|---|
[Python] 정규화 (0) | 2022.10.06 |
[Python] Seaborn (0) | 2022.10.01 |
[Python] Boxplot (0) | 2022.09.30 |
[Python] Pie (0) | 2022.09.30 |