一、3σ原則
3σ原則又稱為拉依達准則,該准則具體來說,就是先假設一組檢測數據只含有隨機誤差,對原始數據進行計算處理得到標准差,然后按一定的概率確定一個區間,認為誤差超過這個區間的就屬於異常值。
正態分布狀況下,數值分布表:
數值分布 | 在數據中的占比 |
---|---|
(μ-σ,μ+σ) | 0.6827 |
(μ-2σ,μ+2σ) | 0.9545 |
(μ-3σ,μ+3σ) | 0.9973 |
注:在正態分布中σ代表標准差,μ代表均值,x=μ為圖形的對稱軸
import pandas as pd import numpy as np # 定義3σ法則識別異常值函數 def three_sigma(Ser1): ''' Ser1:表示傳入DataFrame的某一列。 ''' rule = (Ser1.mean()-3*Ser1.std()>Ser1) | (Ser1.mean()+3*Ser1.std()< Ser1) index = np.arange(Ser1.shape[0])[rule] outrange = Ser1.iloc[index] return outrange
# 導入數據並調用three_sigma df = pd.read_csv('./data.csv',encoding= 'gbk') three_sigma(df['counts']).head()
二、箱線圖檢測異常值
和3σ原則相比,箱線圖依據實際數據繪制,真實、直觀地表現出了數據分布的本來面貌,且沒有對數據作任何限制性要求(3σ原則要求數據服從正態分布或近似服從正態分布),其判斷異常值的標准以四分位數和四分位距為基礎。四分位數給出了數據分布的中心、散布和形狀的某種指示,具有一定的魯棒性,即25%的數據可以變得任意遠而不會很大地擾動四分位數,所以異常值通常不能對這個標准施加影響。鑒於此,箱線圖識別異常值的結果比較客觀,因此在識別異常值方面具有一定的優越性。
箱型圖提供了識別異常值的一個標准,即異常值通常被定義為小於QL-1.5IQR或大於QU+1.5IQR的值。其中,QL稱為下四分位數,表示全部觀察值中有四分之一的數據取值比它小;QU稱為上四分位數,表示全部觀察值中有四分之一的數據取值比它大;IQR稱為四分位數間距,是上四分位數QU與下四分位數QL之差,其間包含了全部觀察值的一半。
# 定義箱線圖識別異常值函數 def box_plot(Ser): ''' Ser:進行異常值分析的DataFrame的某一列 ''' Low = Ser.quantile(0.25)-1.5*(Ser.quantile(0.75)-Ser.quantile(0.25)) Up = Ser.quantile(0.75)+1.5*(Ser.quantile(0.75)-Ser.quantile(0.25)) index = (Ser< Low) | (Ser>Up) Outlier = Ser.loc[index] return(Outlier)
# 調用 box_plot(df['counts']).head(8)
或許我們還可以統計Ser中的非空值個數:
def box_plot_null(Ser): ''' Ser:進行異常值分析的DataFrame的某一列 函數將Ser中的異常值賦值None ''' Low = Ser.quantile(0.25)-1.5*(Ser.quantile(0.75)-Ser.quantile(0.25)) Up = Ser.quantile(0.75)+1.5*(Ser.quantile(0.75)-Ser.quantile(0.25)) index = (Ser< Low) | (Ser>Up) Ser.loc[index] = None return(Ser)
box_plot_null(df['counts']).notnull().sum()