1. 程式人生 > 其它 >異常檢測方法-MAD

異常檢測方法-MAD

技術標籤:SPSS異常檢測pythonpython統計學MAD

絕對中位差(MAD,median absolute deviation)方法是近年來受到青睞的異常值檢測方法。

MAD 定義為,一元序列Xi同其中位數偏差的絕對值的中位數(deviation,偏差本身有正有負):

MAD=median(|X_i-median(X)|)

假定資料服從正態分佈,我們讓異常點(outliers)落在兩側的 50% 的面積裡,讓正常值落在中間的 50% 的區域裡:

正態分佈下,±0.67449包含50%面積,而1/0.67449≈1.4826,因此:

MAD_c=1.483*MAD

正態分佈相關請參考:python標準正態分佈表(scipy.stats)

根據Leys(2013)的描述,其原理可分為以下步驟:

  • 第一,求出變數A的中位數MA;
  • 第二,使用變數A減去中位數MA,得到變數B;
  • 第三,對新變數B取絕對值,得到變數C;
  • 第四,求出變數C的中位數MC;
  • 第五,將MC校正為MAD,MAD=MC*1.4826;
  • 第六,使用變數A的中位數加減MAD的倍數:MA±倍數*MAD,超出此範圍的數值被認為是異常值。

在第六步中,Leys(2013)本人建議使用2.5倍的MAD進行異常值的判斷。

使用MAD法進行異常值檢測的主要理由有兩個Leys(2013):

  • 第一,MAD法對樣本量不敏感,即使是在8個樣本的資料中依然可行;
  • 第二,MAD法對異常值不敏感,不會因為特殊的異常值而導致估計的嚴重偏差。

實現程式碼如下:

from scipy.stats import norm

def mad_based_outlier(points, thresh=3.5):
    med = np.median(points, axis=0)
    abs_dev = np.absolute(points - med)
    med_abs_dev = np.median(abs_dev)
    # Z-score 是非標準正態分佈標準化後的 x即z=(x-u)/d,norm.ppf(0.75)=0.674。
    mod_z_score = norm.ppf(0.75) * abs_dev / med_abs_dev
    return mod_z_score > thresh

參考:

  • Leys, C., Ley, C., Klein, O., Bernard, P.,& Licata, L. (2013). Detecting outliers: Do not use standard deviationaround the mean, use absolute deviation around the median. Journal ofExperimental Social Psychology, 49(4), 764-766.