異常值是指數據中個別值的數值明顯偏離其余的數值,有時也稱為離群點,檢測異常值
就是檢驗數據中是否有錄入錯誤以及是否含有不合理的數據。
異常值的存在對數據分析十分危險,如果計算分析過程的數據有異常值,那么會對結果
會產生不良影響,從而導致分析結果產生偏差乃至錯誤。
比如在分析銀行欺詐案例時,核心就是要發現異常值,這個時候異常值對我們是有用的。
再比如,在統計某個城市的平均收入的時候,有人月收入是好幾個億,這個時候這個人就是
一個異常值,這個異常值會拉高城市的整體平均收入,因此可能會得到一個不真實的分析結
果。
常用的異常值檢測主要為具體業務法、3σ原則和箱線圖分析三種方法。
1、具體業務法
根據你對業務的理解,然后對每一個指標設定一個合理的范圍,一旦超過這個范圍,則
認為是異常值。
比如收入,一般來說都是正數,如果出現小於 0,則認為是異常值;
再比如年齡,正常的年齡可能在 100 以內,如果出現年齡是好幾百的,那么也認為是異
常值。
1 # 如何確定哪些為異常值? 2 # 1、具體業務法 3 # 根據具體的情況,設置一個具體的范圍,設置上下閾值,來判定是否為異常值 4 # 如: 銷量 > 0 , 價格 > 0, 身高: [30,230] 5 # 年齡: (0,130) 6 7 # # 判定身高 8 # # 自定義 判定身高的 函數 --數據異常值的剔除 9 # def juti_yewu(data): 10 # """ 11 # 根據具體業務法 來進行數據的 異常值剔除 12 # :param data: 身高數據---series 13 # :return: bool_mask(bool數組) 14 # """ 15 # # 確定上限 16 # up = 230 17 # # 確定下限 18 # low = 30 19 # 20 # # bool數組 21 # # --如果為True,即滿足在身高數據(30,230)之間, 22 # # --如果為False,即為超過該范圍,則為異常值 23 # bool_mask = (data < up) & (data > low) 24 # 25 # return bool_mask 26 # 27 # 28 # # 構建身高數據、驗證具體業務法 29 # height = pd.Series(data=[180, 190, 18, 240, 150, 155.5], 30 # index=['stu0', 'stu1', 'stu2', 'stu3', 'stu4', 'stu5']) 31 # 32 # print('height:\n',height) 33 # # 返回一個bool數組 34 # bool_mask = juti_yewu(height) 35 # # 進行篩選 36 # height = height[bool_mask] 37 # print('剔除玩異常值之后的數據為:\n',height)
2、3σ原則
3σ原則又稱為拉依達法則。該法則就是先假設一組檢測數據只含有隨機誤差,對原始
數據進行計算處理得到標准差,然后按一定的概率確定一個區間,認為誤差超過這個區間的
就屬於異常值。
這種判別處理方法僅適用於對正態或近似正態分布的樣本數據進行處理,如下表所示,
其中σ代表標准差,μ代表均值,x=μ為圖形的對稱軸。
數據的數值分布幾乎全部集中在區間(μ-3σ,μ+3σ)內,超出這個范圍的數據僅占不
到 0.3%。故根據小概率原理,可以認為超出 3σ的部分數據為異常數據。

1 # 2、3sigma原則 2 # 3sigma原則適用於 服從正態分布的數據 3 # 如果數據服從正態分布---> 99.73%的數據---(u-3a,u+3a)之間 4 # u --均值 5 # a --標准差 6 # 剩下的0.27%的數據可以認為是異常的 7 8 def three_sigma(data): 9 """ 10 使用3sigma原則進行異常值的剔除 11 :param data: series--需要剔除異常值的數據 12 :return: bool_mask(bool數組) 13 """ 14 # 確定上限 15 up = data.mean() + 3 * data.std() 16 # 確定下限 17 low = data.mean() - 3 * data.std() 18 19 # 確定滿足條件的bool數組 20 bool_mask = (data < up) & (data > low) 21 22 return bool_mask
3、箱線圖分析
箱型圖提供了識別異常值的一個標准,即異常值通常被定義為小於 QL-1.5IQR 或大於
QU+1.5IQR 的值。
QL 稱為下四分位數,表示全部觀察值中有四分之一的數據取值比它小。
QU 稱為上四分位數,表示全部觀察值中有四分之一的數據取值比它大。
IQR 稱為四分位數間距,是上四分位數 QU 與下四分位數 QL 之差,其間包含了全部觀察
值的一半。
箱線圖依據實際數據繪制,真實、直觀地表現出了數據分布的本來面貌,且沒有對數據
做任何限制性要求,其判斷異常值的標准以四分位數和四分位數間距為基礎。
四分位數給出了數據分布的中心、散布和形狀的某種指示,具有一定的魯棒性,即 25%
的數據可以變得任意遠而不會很大地擾動四分位數,所以異常值通常不能對這個標准施加影
響。鑒於此,箱線圖識別異常值的結果比較客觀,因此在識別異常值方面具有一定的優越性。
代碼實現:
1 # 3、箱線分析法 2 # qu ---上四分位數---75%位置的數值 3 # ql ---下四分位數---25%位置的數值 4 # iqr ---四分位間距--- (qu - ql) 5 # 利用箱線分析法---(ql - 1.5*iqr, qu + 1.5*iqr)之間的數據屬於正常的,超過這個區間的數據屬於異常值 6 def box_analysis(data): 7 """ 8 利用箱線分析法來剔除異常值 9 :param data: series 10 :return: bool_mask 11 """ 12 # 確定 qu 13 qu = data.quantile(q=0.75) 14 # 確定 ql 15 ql = data.quantile(q=0.25) 16 17 # 確定 iqr 18 iqr = qu - ql 19 20 # 確定 上限 21 up = qu + 1.5 * iqr 22 23 # 確定下限 24 low = ql - 1.5 * iqr 25 26 # bool_mask 27 bool_mask = (data < up) & (data > low) 28 29 return bool_mask 30 31 # 調用,---bool數組---索引