分享

样本数据中异常值(Outliers)检测方法及SPSS & R实现

 生物_医药_科研 2019-01-24


一、概述

异常值检验,又称为离群点分析或者孤立点挖掘。在人们对数据进行分析处理的过程中,经常会遇到少量这样的数据,它们与数据一般模式不一致,或者说与大多数样相比有些不一样,我们称这样的数据为异常数据。

异常数据挖掘涉及两个基本问题。其一,在对一个给定的数据集分析之前必须事先约定满足什么样的数据才是异常数据,也就是异常数据定义的问题。其二,用什么方法来从给定的数据集中将异常数据提取出来。

二、异常数据的定义

关于异常值的问题,最早可以追溯到 18 世纪中叶,当时很多学者就开始关注异常值的问题了。1755 年,Boscovich 在确定地球椭圆率的时候,在所得到的10 个观测值中丢弃了其中的两个极端值,然后再计算剩下的 8 个观测值的平均值。而最早有关异常值的定义,是 Bernoulli 1777 年首先提出的,之后它的定义在一直变化,Hawkins 认为异常值是那些数据集中与众不同的数据,让人怀疑这些数据并非由于随机偏差产生的,而是产生于完全不同的机制,这在一定意义上揭示了异常值的本质;而 Weisberg 将异常值定义为那些与数据集中其余部分不服从相同统计模型的数据,这个定义更符合统计检验的异常数据描述;Samuels将异常值定义为“足够地不同于数据集中其余部分的数据”;Grubbs 将异常值定异常数据是少量的、与众不同的,与大多数数据相比是有偏差的,而且产生这种偏差的原因不是随机的,而是有其更深层次的必然原因,它产生于完全不同的机制。

张德然在吸收归纳前人的研究基础上,将异常值从内涵上分为广义异常值和狭义异常值。广义异常值是指:所获统计数据与真实数据相对误差较大的数据,统指一切失真数据;狭义异常值是指:所获统计数据中部分数据与其余主体数据相比明显不一致的数据,也称离群值。

为了从数据集中识别异常数据,就必须有一个明确的标准。这需要找到数据的内在规律,在一个可接受的误差范围内,满足内在规律的数据就是正常数据,而不满足内在规律的数据就是异常数据。这种数据间的内在规律可以根据数据本身的特点从位置关系、函数关系、规则关系、序列关系等方面来考查。

1位置关系

位置关系是数据间的最常见的一种关系,大多数正常数据具有很大的相似性而符合一个共同模式,在空间上表现在一起的趋势,团结在一个或者多个核心的周围,而那些异常数据则表现得离群,他们总是离所有的核心都很远。

2函数关系

函数关系也是一种常见的数据关系,即大多数数据都符合某个函数模型,因此数据点大多分布在函数曲线附近,而那些异常数据则距离曲线比较远。

3规则关系

如果数据集中某些符合某个规则条件,则称这些数据具有规则关系。具有同一规则关系的正常数据一般会使该规则的结论成立,而如果某个数据具有该规则关系但不能使该结论成立,那么他就是异常数据。

4序列关系

序列关系是指数据集中的某些数据满足某种序列模式,而那些相同条件下不满足序列模式的数据就是异常数据。

三、SPSS中异常值的识别过程

1)采用数据探索过程探测异常值

SPSS菜单实现程序为: 主菜单-->Analyze-->DescriptiveStatistics-->Explore……”选项-->Statistics”按钮-->选中“Outliers”复选框。输出结果中将列出5个最大值和5个最小值作为异常的嫌疑值。

2)采用箱线图(boxplot)探测异常值

盒式图'或叫'盒须图''箱形图'boxplot(也称箱须图(Box-whiskerPlot)须图又称为箱形图,其绘制须使用常用的统计量能提供有关数据位置和分散情况的关键信息,尤其在比较不同的母体数据时更可表现其差异。如下图所示,标示了图中每条线表示的含义,其中应用到了分位值(数)的概念。主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘,四分位数Q3中位数,下四分位数Q1,下边缘,还有异常值



箱形图中识别异常值标准:异常值被定义为小于(Q11.5)/QR(四分位距)或大于(Q3+1.5/QR(四分位距)的值。虽然这种标准有点任意性,但它来源于经验判断,经验表明它在处理需要特别注意的数据方面表现不错。这与识别异常值的经典方法有些不同。众所周知,基于正态分布的3σ法则或z分数方法是以假定数据服从正态分布为前提的,但实际数据往往并不严格服从正态分布。它们判断异常值的标准是以计算数据批的均值和标准差为基础的,而均值和标准差的耐抗性极小,异常值本身会对它们产生较大影响,这样产生的异常值个数不会多于总数0.7%。显然,应用这种方法于非正态分布数据中判断异常值,其有效性是有限的。箱形图的绘制依靠实际数据,不需要事先假定数据服从特定的分布形式,没有对数据作任何限制性要求,它只是真实直观地表现数据形状的本来面貌;另一方面,箱形图判断异常值的标准以四分位数和四分位距为基础,四分位数具有一定的耐抗性,多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不能对这个标准施加影响,箱形图识别异常值的结果比较客观。由此可见,箱形图在识别异常值方面有一定的优越性。

Spss中箱线图绘制有两种方法:一种是利用上述的数据探测过程,在“Explore”对话框中单击“Plots”,通过“Boxplots”方框可以确定箱线图的生成方式。“Factor levels together”复选框表示将要为每个因变量创建一个箱线图,“Dependent together”复选框表示将为每个分组变量水平创建箱线图,“None”复选框表示不创建箱线图。二是直接利用SPSS中的画图功能实现箱线图,SPSS给出了两种箱线图,一种是基本箱线图,另一种是交互式箱线图。基本箱线图的SPSS菜单实现为:点击主菜单中的“Graphs”选项,在弹出的一级菜单中选择“Boxplot……”选项。交互式箱形图的SPSS菜单实现为:点击主菜单中的“Graphs”选项,在弹出的一级菜单中点击“Interactive”选项,在弹出的二级菜单中选择“Boxplot……”选项。箱线图中的“○”表示可疑的异常值,此处异常值的确定采用的是“五数概括法”,即:变量值超过第75百分位点和25百分位点上变量值之差的1.5(箱体上方)或变量值小于第75百分位点和25百分位点上变量值之差的1.5(箱体下方)的点对应的值。

3)采用Z分标准化法(3σ法):±3σ 以外的数据为高度异常值,应予剔除。

4SPSS中异常值的剔除

发现异常值后,把大于等于最小异常值或小于等于最大异常值的值用Data主菜单里的Cases Select子菜单里的条件设置按钮,就可以自动剔除异常值。

四、R语言中异常值得识别过程

(1)单变量异常检测

本部分展示了一个单变量异常检测的例子,并且演示了如何将这种方法应用在多元数据上。在该例中,单变量异常检测通过boxplot.stats()函数实现,并且返回产生箱线图的统计量。在返回的结果中,有一个部分是out,它结出了异常值的列表。更明确点,它列出了位于极值之外的胡须。参数coef可以控制胡须延伸到箱线图外的远近。在R中,运行?boxplot.stats可获取更详细的信息。

如图呈现了一个箱线图,其中有四个圈是异常值


如上的单变量异常检测可以用来发现多元数据中的异常值,通过简单搭配的方式。在下例中,我们首先产生一个数据框df,它有两列xy。之后,异常值分别从xy检测出来。然后,我们获取两列都是异常值的数据作为异常数据。

在下图中,异常值用红色标记为'+'




类似的,我们也可以将xy为异常值的数据标记为异常值。下图,异常值用'x'标记为蓝色。


当有三个以上的变量时,最终的异常值需要考虑单变量异常检测结果的多数表决。当选择最佳方式在真实应用中进行搭配时,需要涉及领域知识。

(2)使用LOFlocaloutlier factor,局部异常因子)进行异常检测

LOF(局部异常因子)是用于识别基于密度的局部异常值的算法。使用LOF,一个点的局部密度会与它的邻居进行比较。如果前者明显低于后者(有一个大于1 LOF值),该点位于一个稀疏区域,对于它的邻居而言,这就表明,该点是一个异常值。LOF的缺点就是它只对数值数据有效。lofactor()函数使用LOF算法计算局部异常因子,并且它在DMwRdprep包中是可用的。下面将介绍一个使用LOF进行异常检测的例子,k是用于计算局部异常因子的邻居数量。下图呈现了一个异常值得分的密度图。


接着,我们结合前两个主成份的双标图呈现异常值。在如上代码中,prcomp()执行了一个主成分分析,并且biplot()使用前两个主成分画出了这些数据。在上图中,x和y轴分别代表第一和第二个主成份,箭头表示了变量,5个异常值用它们的行号标记出来了。我们也可以如下使用pairsPlot显示异常值,这里的异常值用'+'标记为红色。

Rlof包,对LOF算法的并行实现。它的用法与lofactor()相似,但是lof()有两个附加的特性,即支持k的多元值和距离度量的几种选择。如下是lof()的一个例子。在计算异常值得分后,异常值可以通过选择前几个检测出来。注意,目前包Rlof的版本在MacOS X和Linux环境下工作,但并不在windows环境下工作,因为它要依赖multicore包用于并行计算。

(3)通过聚类进行异常检测

另外一种异常检测的方法是聚类。通过把数据聚成类,将那些不属于任务一类的数据作为异常值。比如,使用基于密度的聚类DBSCAN,如果对象在稠密区域紧密相连,它们将被分组到一类。因此,那些不会被分到任何一类的对象就是异常值。我们也可以使用k-means算法来检测异常。使用k-means算法,数据被分成k组,通过把它们分配到最近的聚类中心。然后,我们能够计算每个对象到聚类中心的距离(或相似性),并且选择最大的距离作为异常值。

如下是一个基于k-means算法在iris数据上实现在异常检测。



在上图中,聚类中心被标记为星号,异常值标记为'+'

备注:

LOF算法擅长检测局部异常值,但是它只对数值数据有效。Rlof包依赖multicore包,在Windows环境下失效。对于分类数据的一个快速稳定的异常检测的策略是AVF(Attribute Value Frequency)算法。

一些用于异常检测的R包包括:

extremevalues包:单变量异常检测

mvoutlier包:基于稳定方法的多元变量异常检测

outliers包:对异常值进行检测



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多