什麼是異常值?
對于定性變量來說,異常值是出現次數非常少的類别;對于定量變量來說,異常值是明顯大于或小于其他觀測值的數值。
異常值産生的原因: a. 人為錯誤:在資料收集,記錄或輸入過程中導緻的錯誤。
b. 測量誤差: 當使用的測量儀器出現故障時,會引起這種情況,這是異常值最常見的來源。
c. 實驗誤差
d. 資料處理錯誤:某些操作或提取錯誤。
e. 抽樣錯誤
f. 自然異常值:不是人為的(由于錯誤)導緻的。
異常值的類型:
單變量(Univariate)
多變量(Multivariate)
異常值檢測:
單變量:
1. 使用pandas的
describe()
方法來檢視資料的描述統計量。
2. 使用各種可視化方法,如Box plot。
3. 用四分位數檢測。任何超出Q1-1.5 x IQR~Q3+1.5 x IQR範圍的數值都可以被認為是異常值。可以使用
numpy
的 percentile()
方法。
4. 用z值(标準差)檢測。如果資料服從正态分布,那麼距離平均數3個标準差及以上的數值被認為是異常值。
多變量:
1,基于模型的檢測
這種方法一般會建構一個機率分布模型 ,并計算對象符合該模型的機率,把具有低機率的對象視為異常點。如果模型是簇的集合,則異常是不顯著屬于任何簇的對象;如果模型是回歸時,異常是相對遠離預測值的對象。
2,基于近鄰的檢測
确定資料集的有意義的鄰近性度量比确定它的統計分布更容易。這種方法比統計學方法更一般、更容易使用,因為 一個對象的異常點得分由到它的k-最近鄰(KNN)的距離給定。
需要注意的是:異常點得分對k的取值高度敏感。如果k太小,則少量的鄰近異常點可能導緻較低的異常點得分;如果K太大,則點數少于k的簇中所有的對象可能都成了異常點。為了使該方案對于k的選取更具有魯棒性,可以使用k個最近鄰的平均距離。
3,基于密度的檢測
從基于密度的觀點來說,異常點是在低密度區域中的對象。基于密度的離群點檢測與基于鄰近度的離群點檢測密切相關,因為密度通常用鄰近度定義。 一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數。如果該距離小,則密度高,反之亦然。 另一種密度定義是 使用DBSCAN聚類算法使用的密度定義,即一個對象周圍的密度等于該對象指定距離d内對象的個數。
4,基于距離的檢測
原理:計算每個點與中心點的距離,距離較遠的可判斷為異常點。
計算距離的公式有很多,我們這裡采用馬氏距離。
Python實作:
from scipy.spatial import distance
def func_mahalanobis(df,n_outliers):
#n_outliers:異常值的個數,df:Dataframe
#計算出異常值所對應的索引,越靠前的越異常
m_dist_order = pd.Series([float(distance.mahalanobis(df.iloc[i], df.mean(), np.mat(df.cov().as_matrix()).I) ** 2)
for i in range(len(df))]).sort_values(ascending=False).index.tolist()
#假設n_outliers =2,說明你認為有2個異常,然後篩選出來
error_index = m_dist_order[:n_outliers]
error = df.iloc[error_index]
return error
5. 專門的異常點檢測
有兩個專門用于檢測異常點的方法:
One Class SVM
和
Isolation Forest
。
異常值的處理:
1,删除含有異常值的記錄:适用于資料輸入錯誤,異常值資料非常少的情況。
2,變量轉換:比如取自然對數,進行分箱。
3,插值:用平均值,中位數或衆數替換。
4,封頂:對于那些取值超過1.5倍四分位距的數值,可以分别用該變量5%和95%的分位數替代原資料。
5,預測:将異常值先替換為缺失值,再将其視作被解釋變量進行預測。
6,不處理。異常值可能是欺詐檢測中有價值的資訊來源,某天某産品的銷售額異常高,這時通常需要把會把離群值拿出來,單獨做文字說明。用估值代替或删除不是一個好主意。