Python

[Python] 데이터 사전처리

SangRok Jung 2022. 10. 1. 18:37
반응형

 

데이터 사전처리


▶ 누락 데이터 처리

  • 데이터 프레임에는 원소 데이터 값이 누락되는 경우가 발생합니다.
  • 데이터를 입력할 때 빠트리거나 파일 형식을 변환하는 과정에서 데이터가 소실되는 것이 주요 원인입니다.
  • 일바반적으로 유효한 데이터 값이 존재하지 않는 누락 데이터를 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