본문 바로가기
[업무 지식]/Python

[Python Basic] 이상치 파헤치기

by 에디터 윤슬 2024. 10. 30.
 

이상치 탐지: Z-SCORE

from sklearn.preprocessing import StandardScaler
# 표준화 진행
# 표준화 :  평균을 0으로, 표준 편차를 1로 
# 데이터를 0을 중심으로 양쪽으로 데이터를 분포시키는 방법
# 표준화를 하게 되면 각 데이터들은 평균을 기준으로 얼마나 떨여져 있는지를 나타내는 값으로 변환
scale_df = StandardScaler().fit_transform(df1)

 

# array 형태로 반환된 것을 dataframe 으로 받아줍니다.
scale_df = pd.DataFrame(scale_df)

# 기존 raw 값과 표준화 이후 데이터를 비교하기 위해 merge 진행
merge_df = pd.concat([df1, scale_df],axis=1)

 

이상치 감지

# 이상치 감지 
# Z-SCORE 기반, -3 보다 작거나 3보다 큰 경우를 이상치로 판별 
mask = ((merge_df['zscore']<-3) | (merge_df['zscore']>3))

# mask 메소드 사용
strange_df = merge_df[mask]

# 총 55 건 탐지 
strange_df.count()

 

이상치 탐지: IQR

# string -> float -> int 
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0).astype(int)

# 이상치를 감지할 컬럼 선정
df1 = df[['sw']]

# Q3, Q1, IQR 값 구하기
# 백분위수를 구해주는 quantile 함수를 적용하여 쉽게 구할 수 있음
# 데이터프레임 전체 혹은 특정 열에 대하여 모두 적용이 가능

q3 = df1['sw'].quantile(0.75) 
q1 = df1['sw'].quantile(0.25)

iqr = q3 - q1
q3, q1, iqr

 

이상치 판별 및 dataframe 저장

# 이상치 판별 및 dataframe 저장 
# Q3 : 100개의 데이터로 가정 시, 25번째로 높은 값에 해당합니다.
# Q1 : 100개의 데이터로 가정 시, 75번째로 높은 값에 해당합니다.
# IQR : Q3 - Q1의 차이를 의미합니다.
# 이상치 : Q3 + 1.5 * IQR보다 높거나 Q1 - 1.5 * IQR보다 낮은 값을 의미

def is_outlier(df1):
    score = df1['sw']
    if score > 7 + (1.5 * 6) or score < 1 - (1.5 * 6):
        return '이상치'
    else:
        return '이상치아님'

# apply 함수를 통하여 각 값의 이상치 여부를 찾고 새로운 열에 결과 저장
df1['이상치여부'] = df1.apply(is_outlier, axis = 1) # axis = 1 지정 필수

df1

# IQR 방식으로 구한 이상치 개수는 349 개 
df1.groupby('이상치여부').count()

 

같은 데이터프레임으로 이상치를 판별했지만, 수치는 다르게 나타난다.
정답은 없다.
판단을 할 때 데이터프레임을 보며 파고들어 기준을 어떻게 세워야 할지 생각하고 고민해야 한다.

'[업무 지식] > Python' 카테고리의 다른 글

[pandas 라이브러리] transform  (0) 2024.10.30
[pandas 라이브러리] DATEUTIL  (1) 2024.10.30
[Python basic] 결측치 파헤치기  (0) 2024.10.30
[Python 기초] ②  (0) 2024.10.24
[Python 기초] ①  (0) 2024.10.24