데이터 공부

수정 후 실험하기(2)_이상치 탐지 및 제거

데이터분석가 소히의 개발일지 2021. 7. 8. 05:04

[앞서 standard scaler 정규화를 진행한 데이터에] 

+ 이상치 데이터 제거 --> 회귀분석(모델학습) 재 진행

 

**이상치 데이터(Outlier, 아웃라이어)**는 전체 데이터의 일반적인 패턴과는 다른 양상을 보이는 데이터입니다. 일반적이지 않은 패턴이기 때문에 머신 러닝 예측 성능에 영향을 줄 수 있는 요소가 됩니다. 

 

이상치 탐지 방법 중에서는 IQR(Inter Qunatile Range) 방법이 있습니다. 

 

[4분위]

데이터들을 오름차순으로 정렬하고, 정확히 4등분(25%, 50%, 75%, 100%)으로 나눕니다. 여기서 75% 지점의 값과 25% 지점의 값의 차이를 IQR이라고 합니다.

 

이 IQR에 1.5를 곱해서 75% 지점의 값에 더하면 최댓값, 25% 지점의 값에서 빼면 최솟값으로 결정합니다.

이 때, 결정된 최댓값보다 크거나 최솟값보다 작은 값을 이상치 라고 간주합니다. 

 

이제 이상치를 제거할 특성(열, Colmn)을 골라야 합니다.

모든 특성에 대해서 이상치를 제거하는 것은 시간적으로도 비효율적이고, 효과적이지도 않습니다. 레이블과 상관도가 높은 특성을 위주로 이상치를 제거하는 것이 좋습니다. --> 상관분석 진행하여 확인

 

 

import numpy as np

def remove_outlier(df, column):
		# 레이블이 1인 경우만 추출 --> fraud에 시리즈 저장
    fraud = df[df['Class']==1][column] --> 이게 시리즈

		# Numpy의 percential 함수는 입력한 값의 %의 분위값을 추출해준다.
    quantile_25 = np.percentile(fraud.values, 25) --> fraud.values는 시리즈의 값
    quantile_75 = np.percentile(fraud.values, 75)

    # IQR에 1.5를 곱한다.
    iqr = quantile_75 - quantile_25
    iqr_weight = iqr * 1.5

    # 최솟값과 최댓값 연산.
    lowest_val = quantile_25 - iqr_weight
    highest_val = quantile_75 + iqr_weight

    # 아웃라이어 필터링 (최솟값보다 작거나 최댓값보다 큰 데이터를 추출) 후
		# 아웃라이어에 해당되는 인덱스 리턴 (.index를 사용하면 인덱스만 리턴)
    outlier_index = fraud[(fraud < lowest_val) | (fraud > highest_val)].index -->조건부를 넣어준다
    return outlier_index
```
outlier_index = remove_outlier(df=card_df, column='V14') #v14는 임의로 정한것
print('이상치 샘플의 인덱스:', outlier_index)
outlier_index = remove_outlier(df=standard_card_df_copy, column='V14')
standard_card_df_copy.drop(outlier_index, axis=0, inplace=True) #axis=0은 행방향! (가로), =1은 세로
len(standard_card_df_copy)