异常检测方法-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.

你可能感兴趣的:(SPSS,异常检测,python,python,统计学,MAD)