FUNDAMENTAL | 9. 데이터 전처리 기법

yeonk·2021년 9월 22일
0

aiffel-ai-bootcamp

목록 보기
22/38
post-thumbnail

20210917



1. 전처리


모델에 데이터를 넣기 전까지 과정

  • 데이터 전처리의 중요성
    • 전처리가 충분히 되어있지 않거나 잘못된 데이터를 사용한 경우 분석 결과의 신뢰도가 떨어질 수 있음
    • 예측 모델의 정확도가 떨어질 수 있음
    • 전처리가 잘 되어 있는 경우 데이터 분석의 질이 높아지고 예측 모델의 성능을 높일 수 있음






2. 결측치(Missing Data)


손실 데이터

  • 결측치는 특성에 따라 처리
    • 결측치가 있는 데이터 제거
    • 결측치 대체



  • 결측 여부 확인
    • 컬럼별 결측치 개수: 전체 데이터 수 - 컬럼별 값이 있는 데이터 수
# 전체 데이터 수
len(파일명)

# 컬럼별 결측치 개수
len(파일명) - 파일명.count()

# 결측치가 있는 컬럼 삭제하기
trade = 파일명.drop('결측치가 있는 컬럼명', axis=1)






DataFrame.isnull(): 데이터마다 결측치 여부를 True, False로 반환

DataFrame.any(axis=1): 행마다 하나라도 True가 있으면 True, 그렇지 않으면 False를 반환

dropna: 결측치를 삭제해주는 메서드

# 데이터별 결측치 여부 확인
파일명.isnull()

# 행별 True 데이터 추출
파일명.isnull().any(axis=1)

# 각 칼럼의 값이 모두 결측치인 행 삭제하기
# subset: 특정 칼럼 선택
# how = 'all': 선택한 컬럼 전부가 결측치인 행을 삭제하겠다는 의미 ('any': 하나라도 결측치인 경우)

파일명.dropna(how='all', subset=['컬럼1', '컬럼2', '컬럼3', '컬럼4', '컬럼4'], inplace=True)






수치형 데이터 보완

  • 특정 값 지정
    • 결측치가 많은 경우, 모두 같은 값으로 대체한다면 데이터의 분산이 실제보다 작아지는 문제 발생 할 수 있음
  • 평균, 중앙값 등으로 대체
    • 결측치가 많은 경우 데이터의 분산이 실제보다 작아지는 문제가 발생 할 수 있음
  • 다른 데이터를 이용한 예측값으로 대체
  • 앞뒤 데이터를 통해 대체(시계열 특성을 가진 데이터)
    • 전후 데이터의 평균으로 보완






3. 중복 데이터


같은 값을 가진 데이터 없이 행별로 값이 유일해야 한다면 중복된 데이터를 제거해야한다.

DataFrame.dulicated(): 중복된 데이터 여부를 불리언 값으로 반환











4. 이상치(Outlier)


대부분의 값의 범위에서 벗어나 극단적으로 크거나 작은 값을 의미

  • 일부 이상치 때문에 대부분의 값의 차이의 의미가 없어지게 된다.

  • 극단적인 값이 생기는 경우를 제외하고 데이터를 고려하고 싶은 경우 이상치를 제거하고 분석






이상치 처리

  • 이상치 삭제
    • 본 데이터에서 삭제 후 이상치끼리 별도로 분석
  • 이상치 대체
    • 데이터가 적은 경우 삭제보다 대체가 좋음
  • 예측값 활용
    • 다른 데이터를 활용하여 예측 모델을 만듦
  • binning을 통해 수치형 데이터를 범주형 데이터로 변경






z-score method

평균을 빼주고 표준편차로 나눠 계산.

  • zscore=Xμσz score = \cfrac{X−μ}{σ}

  • z score가 특정 기준을 넘어서는 데이터에 대해 이상치라고 판단.

  • 기준을 작게하면 이상치라고 판단하는 데이터가 많아지고, 기준을 크게 하면 이상치 데이터가 적어짐.



z score의 단점

  • Robust하지 못하다
    • 평균과 표준편차 자체가 이상치의 존재에 크게 영향을 받기 때문
  • 작은 데이터셋의 경우 z-score의 방법으로 이상치를 알아내기 어렵다. 특히 item이 12개 이하인 데이터셋에서는 불가능






# 이상치 데이터의 인덱스를 리턴하는 함수 생성
# df: 데이터 프레임, col: 컬럼, z: 기준

def outlier(df, col, z):
    return df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index


# 이상치 확인

파일명.loc[outlier(df, col, z)]


# 이상치가 아닌 데이터를 추출하는 함수

def not_outlier(df, col, z):
    return df[abs(df[col] - np.mean(df[col]))/np.std(df[col]) <= z].index
    



abs(df[col] - np.mean(df[col])) : 데이터에서 평균을 빼준 것에 절대값을 취함

abs(df[col] - np.mean(df[col]))/np.std(df[col]) : 위에 한 작업에 표준편차로 나눔

df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index: 값이 z보다 큰 데이터의 인덱스를 추출






IQR(Interquartile range, 사분위범위수) method

  • IQR은 3사분위수에서 제 1사분위 값을 뺀 값
    • 데이터의 중간 50%의 범위
    • IQR=Q3Q1IQR=Q_3−Q_1
  • Q11.5IQRQ_1−1.5∗IQR보다 왼쪽에 있거나, Q3+1.5IQRQ_3+1.5∗IQR 보다 오른쪽에 있는 경우 이상치라고 판단



출처 : https://en.wikipedia.org/wiki/Interquartile_range



# 제1사분위수와 제 3사분위수 구하기
Q3, Q1 = np.percentile(data, [75 ,25])
IQR = Q3 - Q1


# 이상치 확인하기

data[(Q1-1.5*IQR > data)|(Q3+1.5*IQR < data)]






5. 정규화(Normalization)


일반적으로 컬럼간에 범위가 크게 다를 경우 전처리 과정에서 데이터를 정규화.
대표적인 정규화 방법: 표준화(Standardization), Min-Max Scaling

  • train 데이터와 test 데이터가 나눠져 있는 경우 train 데이터를 정규화시켰던 기준 그대로 test 데이터도 정규화 시켜줘야 한다.






Standardization

데이터의 평균은 0, 분산은 1로 변환

Xμσ\cfrac{X−μ}{σ}



# 정규분포를 따라 랜덤하게 데이터 x를 생성. 
np.random.seed(2020)
x = pd.DataFrame({'A': np.random.randn(100)*4+4,
                 'B': np.random.randn(100)-1})


# 데이터 x를 Standardization 기법으로 정규화 
x_standardization = (x - x.mean())/x.std()






Min-Max Scaling

데이터의 최솟값은 0, 최댓값은 1로 변환

XX(min)X(max)X(min)\cfrac {X−X_(min)} {X_(max)−X_(min)}



# 데이터 x를 min-max scaling 기법으로 정규화. 
x_min_max = (x-x.min())/(x.max()-x.min())






6. One-Hot Encoding


카테고리별 이진 특성을 만들어 해당하는 특성만 1, 나머지는 0으로 만드는 방법.
머신러닝이나 딥러닝 프레임워크에서 범주형을 지원하지 않는 경우 원-핫 인코딩.

pandasget_dummies 함수 활용



# get_dummies를 통해 컬럼1 원-핫 인코딩
변수명 = pd.get_dummies(파일명['컬럼1'])
변수명.head()






7. 구간화(Binning)


히스토그램과 같이 연속적인 데이터를 구간을 나눠 분석할 때 사용하는 방법

  • 수치형 데이터를 범주형 데이터로 변환

    • pandas의 cutqcut을 이용
  • cut: 데이터와 구간을 입력하면 데이터를 구간별로 나눠줌

  • value_counts(): 구간별로 값이 몇 개 속해 있는지 확인

  • bin 옵션에 정수를 입력하면 데이터의 최솟값에서 최댓값을 균등하게 bin의 개수만큼 나눠줌.

  • qcut: 데이터의 분포를 비슷한 크기의 그룹으로 나눠줌

0개의 댓글