异常值检测——绝对中位差MAD(median absolute deviation )

文章目录

  • 一、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 )_第1张图片
理解:先计算出数据与数据的中位数之间的偏差,MAD是偏差绝对值的中位数。

MAD与标准差SD( standard deviation)的区别:
MAD是一种鲁棒性统计量,比标准差更能适应数据集中的异常值。对于标准差,使用的是数据到均值的距离平方,较大的偏差权重较大,异常值对结果影响不能忽视。对于MAD,少量的异常值不会影响实验的结果。

用途:MAD常用于异常值检测
假定实验数据服从正态分布,让异常值落在两侧50%的面积内,让正常值落在中间50%的区域内。
异常值检测——绝对中位差MAD(median absolute deviation )_第2张图片
具体解算过程: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 )_第3张图片
在这里插入图片描述
代码实现:

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 )_第4张图片
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/

你可能感兴趣的:(#,统计学,异常值检测)