포스트

[Data Analysis] 통계적 기법 이상 탐지

통계적인 기법으로 이상탐지하기

[Data Analysis] 통계적 기법 이상 탐지

통계적 기법으로 이상탐지

3-Sigma Rule (68–95–99.7 rule)

3-sigma-rule

  • 정규 분포에서 데이터의 99.7%가 평균으로부터 3시그마 이내에 위치함을 설명하는 규칙

  • 장점
    • 구현하기 쉽다.
    • 명확한 기준을 설정할 수 있기 때문에, 방법론에 재학습 필요없음
  • 단점
    • 정규분포가 가정되어야 함
    • 타차원 데이터에 적용하기 어려움
    • 단변량 데이터에 적용할 수 있으며, Feature간 상관관계 파악하기 어려움
1
2
3
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
1
2
3
4
5
iris = load_iris()
datasets = pd.DataFrame(iris.data, columns=iris.feature_names)
datasets['target'] = iris.target

datasets
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)target
05.13.51.40.20
14.93.01.40.20
24.73.21.30.20
34.63.11.50.20
45.03.61.40.20
..................
1456.73.05.22.32
1466.32.55.01.92
1476.53.05.22.02
1486.23.45.42.32
1495.93.05.11.82

150 rows × 5 columns

1
2
# 데이터 분포 확인
datasets.describe()
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)target
count150.000000150.000000150.000000150.000000150.000000
mean5.8433333.0573333.7580001.1993331.000000
std0.8280660.4358661.7652980.7622380.819232
min4.3000002.0000001.0000000.1000000.000000
25%5.1000002.8000001.6000000.3000000.000000
50%5.8000003.0000004.3500001.3000001.000000
75%6.4000003.3000005.1000001.8000002.000000
max7.9000004.4000006.9000002.5000002.000000
1
2
3
4
5
6
7
8
# UCL(Upper Control Limit), LCL(Lower Control Limit) 생성
datasets["UCLpental_length"] = datasets["petal length (cm)"].mean() + 2 * datasets["petal length (cm)"].std()
datasets["LCLpental_length"] = datasets["petal length (cm)"].mean() - 2 * datasets["petal length (cm)"].std()

datasets["LCL_pental_width"] = datasets["petal width (cm)"].mean() - 2 * datasets["petal width (cm)"].std()
datasets["UCL_pental_width"] = datasets["petal width (cm)"].mean() + 2 * datasets["petal width (cm)"].std()

datasets
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)targetUCLpental_lengthLCL_pental_widthLCLpental_lengthUCL_pental_width
05.13.51.40.207.288596-0.3251420.2274042.723809
14.93.01.40.207.288596-0.3251420.2274042.723809
24.73.21.30.207.288596-0.3251420.2274042.723809
34.63.11.50.207.288596-0.3251420.2274042.723809
45.03.61.40.207.288596-0.3251420.2274042.723809
..............................
1456.73.05.22.327.288596-0.3251420.2274042.723809
1466.32.55.01.927.288596-0.3251420.2274042.723809
1476.53.05.22.027.288596-0.3251420.2274042.723809
1486.23.45.42.327.288596-0.3251420.2274042.723809
1495.93.05.11.827.288596-0.3251420.2274042.723809

150 rows × 9 columns

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# petal length (cm) plot
sns.scatterplot(x= datasets.index, y = datasets["petal length (cm)"])
plt.axhline(y=datasets["UCLpental_length"][0], color="r",  linewidth=1)
plt.axhline(y=datasets["LCLpental_length"][0], color="r",  linewidth=1)
plt.show()

png

1
2
3
4
5
# petal width (cm) plot
sns.scatterplot(x= datasets.index, y = datasets["petal width (cm)"])
plt.axhline(y=datasets["UCL_pental_width"][0], color="r",  linewidth=1)
plt.axhline(y=datasets["LCL_pental_width"][0], color="r",  linewidth=1)
plt.show()

png

Box plot

  • Box plot은 최소 정상값(min), 1사분위수(Q1), 중앙값, 3사분위수(Q3), 최대 정상값(max)를 나타내는 시각화 방법

  • 장점
    • 그림을 이용해 데이터의 범위를 빠르게 파악
  • 단점
    • 위치정보를 기반으로 보이기 때문에 분포를 확인하기 어려움

용어

  • median - 중앙값
  • IQR : 25% ~ 75%에 해당한 부분
  • 75th Percentile : 제 3사분위수
  • 25th Percentile : 제 1사분위수
  • Whisker : 최댓값, 최솟값
  • Outlier : 이상치 (Q3+1.5 IQR, Q1-1.5 IQR)
1
2
3
4
plt.boxplot([datasets["sepal length (cm)"], datasets["sepal width (cm)"],\
           datasets["petal length (cm)"], datasets["petal width (cm)"]])
plt.xticks(np.arange(1,5), iris.feature_names, fontsize = 5)
plt.show()

png

 

참고자료

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.