【Educoder數據挖掘實訓】異常值檢測-3σ法
開挖!
這個異常值檢測基于的是兩點:
- 數據往往遵循正態分布
- 在正態分布中, [ μ ? 3 σ , μ + 3 σ ] [\mu - 3\sigma, \mu +3\sigma] [μ?3σ,μ+3σ]包含了正態分布中 99.74 % 99.74\% 99.74%的數據。
所以一個很容易想到的方法就是舍棄在上述區間之外的數。
代碼實現也比較容易,跟上一個實訓箱線圖代碼實現一般無二。
只需要借住 S e r i e s Series Series中的函數 m e a n mean mean計算平均值、 s t d std std計算標準差即可。
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import numpy as npdata = pd.read_csv("src/death.csv", index_col='Unnamed: 0')data = data.dropna(axis=1, thresh=data.shape[0] * 0.2)
data = data.dropna(axis=0, thresh=data.shape[1] * 0.2)a = pd.isna(data).sum()
cols = [x for i, x in enumerate(a.index) if a[i] > 0]mode_list = 'FIPS Admin2'
for i in cols:if mode_list.find(i) != -1:data[i] = data[i].fillna(data[i].mode().iloc[0])else:data[i] = data[i].fillna(data.mean()[i])cols = '2008/10/20,2008/11/20,2008/12/20'.split(',')
x = data[cols]########## Begin ##########
# 3σ 原則檢測異常值
bar, sigma = x.mean(), x.std()outliers_index = (x < bar - 3 * sigma) | (x > bar + 3 * sigma)
# 刪除異常值x = x[~outliers_index]# 打印各列異常值個數
print(outliers_index.sum())########## End ##########