Recent Posts
Recent Comments
Link
Today
Total
01-01 20:35
관리 메뉴

Hippo's data

이상치(outlier) 처리하기 본문

ML(Machine Learning)

이상치(outlier) 처리하기

Hippo's data 2023. 12. 28. 16:35
728x90

오늘은 이상치를 처리하는 방법에 대해 알아보겠습니다

 

# 이상치(outlier)란?

데이터의 일반적인 범주에서 크게 벗어난 값들을 의미하는데요 

그렇다면 데이터의 일반적인 범주에서 벗어났다고 할 수 있는 기준이 무엇이 있을까요?

 

1) Z-score 확인

신뢰구간 : 모수(모집단의 값)가 실제로 포함될 것으로 예측되는 범위

신뢰수준 : 신뢰구간에 실제 평균값이 포함될 확률  

일반적으로 95%의 신뢰수준을 사용함 ( Z-scroe 1.96 기준 )

 

Z = ( X_i(i번째 값) - X의 평균 ) / 표준편차 

 

코드로 구현 ( 신뢰수준 95% 이상인 데이터 확인 )

->  df[(abs((df['기준 변수'] - df['기준 변수'].mean())/df['기준 변수'].std())) > 1.96]

 

 

2) IQR(Inter Quartile Range)확인

#IQR => 제 3사분위(상위25%) - 제 1사분위(상위 75%) 

이상치 > 제 3사분위 + IQR X 1.5

이상치 < 제 1사분위 + IQR X 1.5

 

코드로 구현

# 이상치를 대체하는 함수 만들기
def changeOutliers(data, column):
    x=data.copy()
    # Q1, Q3구하기
    q1 = x[column].quantile(0.25)
    q3 = x[column].quantile(0.75)
    
    # 1.5 * IQR(Q3 - Q1)
    iqr = 1.5 * (q3 - q1)
    
    #이상치 대체값 설정하기
    Min = 0
    if (q1 - iqr) > 0 : Min=(q1 - iqr)
        
    Max = q3 + iqr
    
    # 이상치 대체 -> 최대값 or 최솟값으로 
    x.loc[(x[column] > Max), column]= Max
    x.loc[(x[column] < Min), column]= Min
    
    return(x)

 

3. 구간화(binning) 하기 

-> 연속형 데이터를 구간으로 나누어 범주형으로 변경 

 

1)cut 함수 -> 길이 동일하게 

 

파라미터

bins : 구간화 지점 예) 0, 5, 10

labels : 구간화된 값의 이름 

pd.cut(df['기준 변수'], bins = [0, 5, df['기준 변수'].max( ) ], labels =['A', 'B'])

 

2)qcut 함수 -> 개수 동일하게 

 

# cut 함수의 bins 대신 나눌 구간개수 지정 

pd.qcut(df['기준 변수'], 3,  labels =['A', 'B', 'C'])

728x90