離群點(outlier)是指和其他觀測點偏離非常大的數據點,離群點是異常的數據點,但是不一定是錯誤的數據點。確定離群點對於數據分析會帶來不利的影響,比如,增大錯誤方差、影響預測和影響正態性。
從散點圖上可以直觀地看到離群點,離群點是孤立的一個數據點;從分布上來看,離群點遠離數據集中其他數據點。

在數據處理過程中,檢測離斷點的方法,通常有Z-score 和 IQR。
一,Z-score方法
在介紹Z-score方法之前,先了解一下 3∂原則,這個原則有個前提條件:數據需要服從正態分布。
在3∂原則下,如果觀測值與平均值的差值超過3倍標准差,那么可以將其視為異常值。正負3∂的概率是99.7%,那么距離平均值3∂之外的值出現的概率為P(|x-u| > 3∂) <= 0.003,屬於極個別的小概率事件。
如果數據不服從正態分布,那么可以用遠離平均值的多少倍標准差來描述,倍數就是Z-score。Z-score以標准差為單位去度量某一原始分數偏離平均數的距離,它回答了一個問題:"一個給定分數距離平均數多少個標准差?",Z-score的公式是:
Z-score = (Observation — Mean)/Standard Deviation
z = (X — μ) / σ
Z-score需要根據經驗和實際情況來決定,通常把遠離標准差3倍距離以上的數據點視為離群點,也就是說,把Z-score大於3的數據點視作離群點,Python代碼的實現如下:
import numpy as np import pandas as pd def detect_outliers(data,threshold=3): mean_d = np.mean(data) std_d = np.std(data) outliers = [] for y in data_d: z_score= (y - mean_d)/std_d if np.abs(z_score) > threshold: outliers.append(y) return outliers
二,IQR方法
四分位點內距(Inter-Quartile Range,IQR),是指在第75個百分點與第25個百分點的差值,或者說,上、下四分位數之間的差,計算IQR的公式是:
IQR = Q3 − Q1
IQR是統計分散程度的一個度量,分散程度通過需要借助箱線圖來觀察,通常把小於 Q1 - 1.5 * IQR 或者大於 Q3 + 1.5 * IQR的數據點視作離群點,探測離群點的公式是:
outliers = value < ( Q1 - 1.5 * IQR ) or value > ( Q3 + 1.5 * IQR )
這種探測離群點的方法,是箱線圖默認的方法,箱線圖提供了識別異常值/離群點的一個標准:
異常值通常被定義為小於 QL - l.5 IQR 或者 大於 Qu + 1.5 IQR的值,QL稱為下四分位數, Qu稱為上四分位數,IQR稱為四分位數間距,是Qu上四分位數和QL下四分位數之差,其間包括了全部觀察值的一半。
箱線圖的各個組成部分的名稱及其位置如下圖所示:

箱線圖可以直觀地看出數據集的以下重要特性:
- 中心位置:中位數所在的位置就是數據集的中心,從中心位置向上或向下看,可以看出數據的傾斜程度。
- 散布程度:箱線圖分為多個區間,區間較短時,表示落在該區間的點較集中;
- 對稱性:如果中位數位於箱子的中間位置,那么數據分布較為對稱;如果極值離中位數的距離較大,那么表示數據分布傾斜。
- 離群點:離群點分布在箱線圖的上下邊緣之外。
使用Python實現,參數sr是Series類型的變量:
def detect_outliers(sr): q1 = sr.quantile(0.25) q3 = sr.quantile(0.75) iqr = q3-q1 #Interquartile range fence_low = q1-1.5*iqr fence_high = q3+1.5*iqr outliers = sr.loc[(sr < fence_low) | (sr > fence_high)] return outliers
參考文檔:
