天天看點

異常值檢測——絕對中位差MAD(median absolute deviation )一、MAD介紹二、計算MAD方法三、MAD實作剔除異常值四、其它檢測異常值方法參考資料

文章目錄

  • 一、MAD介紹
  • 二、計算MAD方法
  • 三、MAD實作剔除異常值
  • 四、其它檢測異常值方法
  • 參考資料

一、MAD介紹

MAD(median absolute deviation)絕對中位差

在統計學中,MAD是對單變量數值型資料的樣本偏差的一種魯棒性測量,即是用來描述單變量樣本在定量資料中可變的一種标準。

In statistics, the median absolute deviation (MAD) is a measure of statistical dispersion and it is a robust measure of the variability of a univariate sample of quantitative data.

公式:

異常值檢測——絕對中位差MAD(median absolute deviation )一、MAD介紹二、計算MAD方法三、MAD實作剔除異常值四、其它檢測異常值方法參考資料

了解:先計算出資料與資料的中位數之間的偏差,MAD是偏差絕對值的中位數。

MAD與标準差SD( standard deviation)的差別:

MAD是一種魯棒性統計量,比标準差更能适應資料集中的異常值。對于标準差,使用的是資料到均值的距離平方,較大的偏差權重較大,異常值對結果影響不能忽視。對于MAD,少量的異常值不會影響實驗的結果。

用途:MAD常用于異常值檢測

假定實驗資料服從正态分布,讓異常值落在兩側50%的面積内,讓正常值落在中間50%的區域内。

異常值檢測——絕對中位差MAD(median absolute deviation )一、MAD介紹二、計算MAD方法三、MAD實作剔除異常值四、其它檢測異常值方法參考資料

具體解算過程:https://blog.csdn.net/horses/article/details/78749485

二、計算MAD方法

(1)Excel中計算MAD

(2)python計算MAD

代碼:

from statsmodels import robust #import package
df.apply(robust.mad) #use function to calculate MAD
           

根據不同資料類型使用不同的包:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.median_absolute_deviation.html

(3)R語言計算MAD

三、MAD實作剔除異常值

代碼實作:

def mad_based_outlier(points, thresh=3.5): #這裡設定的門檻值3.5
    if len(points.shape) == 1:
        points = points[:,None]
    median = np.median(points, axis=0)
    diff = np.sum((points - median)**2, axis=-1)
    diff = np.sqrt(diff)
    med_abs_deviation = np.median(diff)

    modified_z_score = 0.6745 * diff / med_abs_deviation

    return modified_z_score > thresh
           

四、其它檢測異常值方法

https://www.zhihu.com/question/38066650

(1)數字異常值:是通過IQR(InterQuartile Range)計算得的。

計算第一和第三四分位數(Q1、Q3),異常值是位于四分位數範圍之外的資料點x i:四分位法(箱線圖)k = 1.5

異常值檢測——絕對中位差MAD(median absolute deviation )一、MAD介紹二、計算MAD方法三、MAD實作剔除異常值四、其它檢測異常值方法參考資料
異常值檢測——絕對中位差MAD(median absolute deviation )一、MAD介紹二、計算MAD方法三、MAD實作剔除異常值四、其它檢測異常值方法參考資料

代碼實作:

def percentile_based_outlier(data, threshold=95):
    diff = (100 - threshold) / 2.0
    minval, maxval = np.percentile(data, [diff, 100 - diff])
    return (data < minval) | (data > maxval)
           

(2)Z-score

Z-score是一維或低維特征空間中的參數異常檢測方法。即描述一個值與一組值的平均值之間關系的數值測量。

Z-score假定資料是服從高斯分布的,異常值是分布在兩端的資料,是以是遠離資料的平均值。簡單了解,計算每個資料點和均值、标準偏差的一個關系參數,與設定的門檻值對比,當關系參數絕對值大于這個門檻值的時候,則為異常值,應該剔除掉(門檻值一般設定為2.5、3.0和3.5)。具體的計算公式可見:https://www.zhihu.com/question/38066650

異常值檢測——絕對中位差MAD(median absolute deviation )一、MAD介紹二、計算MAD方法三、MAD實作剔除異常值四、其它檢測異常值方法參考資料

Z-score更多介紹資料:https://www.statisticshowto.com/probability-and-statistics/z-score/

注意:在進行異常值處理之前,需先進行異常值檢驗,比較常用的有兩種方法:

(1)資料服從正态分布,采用3σ原則。

實作代碼:

#插入一列three_sigma來表示是否是異常值
data['three_sigma'] = data['variable'].transform( lambda x: (x.mean()-3*x.std()>x)|(x.mean()+3*x.std()<x))

#篩選出目标變量的異常值
data[data['three_sigma']==True]

#保留正常的資料
correct_data=data[data['three_sigma']==False]
           

(2)資料不服從正太分布,采用箱線圖檢驗。

實作代碼:

#定義一個下限
lower = data['variable'].quantile(0.25)-1.5*(data['variable'].quantile(0.75)-data['variable'].quantile(0.25))

#定義一個上限
upper = data['variable'].quantile(0.25)+1.5*(data['variable'].quantile(0.75)-data['variable'].quantile(0.25))

#重新加入一列,用于判斷
data['qutlier'] = (data['variable'] < lower) | (data['variable'] > upper) 

#篩選異常資料
data[data['qutlier'] ==True]

#過濾掉異常資料
qutlier_data=data[data['qutlier'] ==False]
           

參考資料:https://blog.csdn.net/qq_40195360/article/details/84570503

參考資料

MAD檢測異常值:https://blog.csdn.net/lanchunhui/article/details/80381516

絕對中位差Median Absolute Deviation:https://blog.csdn.net/horses/article/details/78749485

(強推)Pythonic way of detecting outliers in one dimensional observation data:https://stackoverflow.com/questions/22354094/pythonic-way-of-detecting-outliers-in-one-dimensional-observation-data?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

常見的檢測異常值方法:https://www.zhihu.com/question/38066650

(強推)異常值檢測方法彙總:https://blog.csdn.net/qq_40195360/article/details/105380444

(詳細)Test to identify outliers in data series:https://www.pdf-archive.com/2016/07/29/outlier-methods-external/outlier-methods-external.pdf

How to Remove Outliers in Python:https://www.statology.org/remove-outliers-python/

(強推)Univariate Anomaly Detection – A walkthrough in Python:https://www.analyticsvidhya.com/blog/2021/06/univariate-anomaly-detection-a-walkthrough-in-python/