본문 바로가기
카테고리 없음

Anomaly Detection_ 3-Sigma Rule

by Foxy현 2023. 4. 11.
728x90
반응형

 

표준편차의 3배 범위인 3*Sigma는 대표적인 이상치(Outlier) 탐지 기법 중 하나입니다. 이 방법은 데이터의 산포를 파악하고, 데이터 전체의 특징을 파악하는 데 유용합니다.


장점으로는, 이 방법은 통계학에서 널리 사용되는 방법 중 하나이기 때문에, 데이터 분석의 표준적인 방법으로 자리 잡았습니다. 또한, 이 방법은 데이터의 분포를 고려하기 때문에 데이터의 특징을 파악하는 데 유용합니다. 이상치를 탐지하는 데도 효과적이며, 데이터의 정규성을 검증하는 데도 사용됩니다.


단점으로는, 이 방법은 데이터의 분포가 정규분포를 따를 때에만 유효합니다. 만약, 데이터가 다른 분포를 따른다면 이 방법은 제대로 작동하지 않을 수 있습니다. 또한, 이 방법은 데이터의 분포를 고려하지 않고, 단순히 범위를 설정하기 때문에, 데이터의 특징을 놓칠 수 있습니다. 또한, 이상치가 아닌데도 이상치로 판단될 수 있는 경우가 있으므로, 이 점을 고려하여 사용해야 합니다.


사용 방법으로는, 데이터의 정규분포를 가정하고, 평균으로부터 표준편차의 3배 이상 떨어진 데이터를 이상치로 판단합니다. 이상치로 판단된 데이터는 제거하거나 다른 값으로 대체할 수 있습니다. 또한, 데이터 분석에서 이상치가 발견된 경우, 해당 이상치의 원인을 파악하고, 조치를 취하는 것이 중요합니다.


아래는 위 이론에 대한 예시 코드입니다.

 

# Pandas 라이브러리를 가져와서, DataFrame의 몇몇 display 옵션을 설정합니다.
import pandas as pd
pd.set_option('display.max_columns',100)
pd.set_option('display.max_row',100)

# 5명의 축구 선수의 체중과 키 정보를 포함하는 DataFrame을 생성합니다.
df = pd.DataFrame({
    "name":['Kane','Son','Skeep','romero','dier'],
    "weight":['90','80','85','83','95'],
    "height":['188','184','178','182','192']
                  })

# 'weight'와 'height' 열의 값을 문자열에서 정수형으로 변환합니다.
df['weight'] = df['weight'].astype(int)
df['height'] = df['height'].astype(int)

# 평균과 표준편차를 사용하여, 체중과 키의 상한 제어 한계(UCL)와 하한 제어 한계(LCL)를 계산합니다.
df['UCL_W'] = df['weight'].mean() + 2*df['weight'].std()
df['LCL_W'] = df['weight'].mean() - 2*df['weight'].std()
df['UCL_H'] = df['height'].mean() + 2*df['height'].std()
df['LCL_H'] = df['height'].mean() - 2*df['height'].std()

# Matplotlib 및 Seaborn 라이브러리를 가져오고, plot 스타일을 'dark_background'로 설정합니다.
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use(['dark_background'])

# Seaborn의 scatterplot() 함수를 사용하여 각 선수의 체중과 키를 시각화합니다.
sns.scatterplot(x=df['name'], y=df['weight'])
sns.scatterplot(x=df['name'], y=df['height'])

# 각 plot에 체중과 키에 대한 UCL 및 LCL을 나타내는 빨간색 수평선을 추가합니다.
plt.axhline(y=df['UCL_W'][0], color='r', linewidth=1)
plt.axhline(y=df['LCL_W'][0], color='r', linewidth=1)
plt.axhline(y=df['UCL_H'][0], color='r', linewidth=1)
plt.axhline(y=df['LCL_H'][0], color='r', linewidth=1)

# 각 plot의 크기를 설정합니다.
plt.gcf().set_size_inches(15,5)

 

위에서 데이터의 정규분포를 가정하고, 평균으로부터 표준편차의 3배 이상 떨어진 데이터를 이상치로 판단한다고 했었는데 빨간선(평균으로부터 표준편차 2배로 설정)을 넘는 것을 확인해보니, 현재 값에는 이상값이 들어있지 않네요. 

 

 

 

 

728x90
반응형