이상치 탐지를 위한 z-점수 사용

Python으로 배우는 이상치 탐지

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

z-점수란?

  • z-점수는 다음을 알려줍니다:
    • 평균으로부터의 표준편차 개수

예시:

  • 분포가 $\mu=10$, $\sigma=3$일 때
    • $Z_{16.3}=(16.3-10) / 3=2.1$

z-점수 계산 공식.

Python으로 배우는 이상치 탐지

경험적 법칙과 이상치

경험적 법칙:

  • 68%는 1표준편차 이내
  • 95%는 2표준편차 이내
  • 99.7%는 3표준편차 이내

이상치:

  • 3표준편차 경계 밖
  • 꼬리(양끝 분홍 영역)에 위치

위키피디아의 경험적 법칙 이미지: 정규분포에서 68%, 95%, 99.7% 영역이 표기됨.

1 이미지: 위키피디아 Empirical Rule 페이지
Python으로 배우는 이상치 탐지

코드로 보는 z-점수

from scipy.stats import zscore


scores = zscore(sales) scores[:5]
0    0.910601
1   -1.018440
2   -0.049238
3    0.849103
4   -0.695373
Python으로 배우는 이상치 탐지

코드로 보는 z-점수

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Python으로 배우는 이상치 탐지

코드로 보는 z-점수

outliers = sales[is_over_3]

print(len(outliers))
90
Python으로 배우는 이상치 탐지

z-점수의 한계

  • 정규분포에서 가장 잘 동작함
  • 평균과 표준편차는 이상치의 영향이 큼
  • 이상치가 많으면 성능 저하
Python으로 배우는 이상치 탐지

중앙절대편차(MAD)

  • 산포(변동성)를 측정
  • 이상치에 더 강건함
  • 중앙값 기반

중앙절대편차(MAD) 점수 계산 공식.

Python으로 배우는 이상치 탐지

MAD 점수

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Python으로 배우는 이상치 탐지

PyOD 소개

  • MAD 기반 수정 z-점수는 PyOD에 구현되어 있음
  • PyOD: Python 이상치 탐지 라이브러리
    • 40개 이상 알고리즘 제공
    • 모든 알고리즘은 sklearn 유사 문법
Python으로 배우는 이상치 탐지

코드로 보는 수정 z-점수

from pyod.models.mad import MAD

# threshold defaults to 3.5
mad = MAD(threshold=3.5)


# Reshape sales sales_reshaped = sales.values.reshape(-1, 1)
Python으로 배우는 이상치 탐지

코드로 보는 수정 z-점수

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Python으로 배우는 이상치 탐지

연습해 봅시다!

Python으로 배우는 이상치 탐지

Preparing Video For Download...