R语言-异常数据处理3
R语言:异常数据处理
前言
异常值也是非常痛恨的一类脏数据,异常值往往会拉高或拉低数据的整体情况,为克服异常值的影响,我们需要对异常值进行处理。首先,我们需要识别出哪些值是异常值或离群点,其次如何处理这些异常值。下面仍然以案例的形式,给大家讲讲异常值的处理:
目录
1、识别异常值
2、找出异常点
3. 其它
1. 单变量异常值检测
一般通过绘制盒形图来查看哪些点是离群点,而离群点的判断标准是四分位数与四分位距为基础。
即离群点超过上四分位数的1.5倍四分位距或低于下四分位数的1.5倍四分位距。
例子:
# 随机产生一组数据
set.seed(1234)
value <- c(rnorm(100, mean = 10, sd = 3), runif(20, min = 0.01, max= 30), rf(30, df1 = 5, df2 = 20))
# 绘制箱线图,并用红色的方块标注出异常值
library(ggplot2)
ggplot(data = NULL, mapping = aes(x = "", y = value)) + geom_boxplot(outlier.colour='red', outlier.shape=15, width=1.2)
通过图可知,有一部分数据落在上四分位数的1.5倍四分位距之上,即异常值,下面通过编程,将异常值找出来。
#计算下四分位数、上四分位数和四分位距
QL <- quantile(value, probs = 0.25)
QU <- quantile(value, probs = 0.75)
QU_QL <- QU-QL
QL;QU;QU_QL
2、找出异常点
which(value > QU + 1.5*QU_QL)
value[which(value > QU + 1.5*QU_QL)]
结果显示,分别是第104、106、110、114、116、118和120这6个点。下面就要处理这些离群点,一般有两种方法,即剔除或替补。剔除很简单,但有时剔除也会给后面的分析带来错误的结果,接下来就讲讲替补。
# 用离异常点最近的点替换
test01 <- value
out_imp01 <- max(test01[which(test01 <= QU + 1.5*QU_QL)])
test01[which(test01 > QU + 1.5*QU_QL)] <- out_imp01
# 用上四分位数的1.5倍四分位距或下四分位数的1.5倍四分位距替换
test02 <- value
out_imp02 <- QU + 1.5*QU_QL
test02[which(test02 > QU + 1.5*QU_QL)] <- out_imp02
# 对比替换前后的数据概览
summary(value)
summary(test01)
summary(test02)
3. 其他
在R语言中,对于多维的数据集来说,当我们可以确定异常点的范围时,我们可以使用函数which()对其进行查找。下面以一个例子说明:
#首先产生两组数据,并假设这两组数据是一对一的
x <- runif(100);
y <- rnorm(100);
plot(x, y);
#现在我们找查找x<0.5且y<0.5的数据都在什么位置
#满足x<0.5的位置
A <- which(x < 0.5);
#满足y<0.5的位置
B <- which(y < 0.5);
#满足x<0.5,y<0.5的位置
intersect(A, B)
引言 近年来,随着人们对统计数据关注度的不断提 高,对统计数据的质量要求也越来越高,而要很好 地保证统计数据质量,其中之一就要关注统计数据 中的异常值。所谓异常值,是指一批数据中有部分 数据与整体中其他数据相比存在明显不一致,也称 为异常数据,或称离群值。异常值的出现可能是由 于记录错误引起的,也可能是由于该数据值不属于 这个数据集。异常值是影响统计数据质量的一个非 常重要的因素,一直以来,我国的统计界以及社会 各界均对此问题给予很高的关注。所以,近年来有 关异常值的理论探讨一直是个热点。但是目前研究 的重点一直放在统计法律制度的健全以及统计工作 程序的完善等方面。虽然这两点确实能提高统计数 据的质量,但对于已经形成的统计数据,在进行统计 分析之前,我们更关注的是统计数据的误差问题, 即所提供的统计数据与客观的社会经济现象实际的 数量特征之间的差距问题。异常值的存在,使得统 计分析的误差大大增大,小则出现差错,大则可能发生事故,甚至可能会导致严重的宏观决策失误。 因此,在利用已得数据进行统计分析之前,必须对 异常值进行探测和检验。 在统计软件方面,常用的统计软件有 SPSS、 SAS、 STAT、 R、 S-PLUS等。 R软件是一个自由、 免费、开源的软件,是一个具有强大统计分析功能 和优秀统计制图功能的统计软件,现已是国内外众多统计学者喜爱的数据分析工具。
本文文章在基于 R语言的基础上,结合具体实例,说明R软件程序包outliers在识别统计数据中异常值的作用.
1 Grubbs法及基于R语言的Grubbs法检验程序举例
1.1 Grubbs法原理 (1)将测量的数据按大小顺序排列。 x 1, x 2, x 3, … , x n (2)设第i个数据可疑,计算 (3)查表 T计算>T表则第i个数据为异常值,否则为正常值。
1.2 基于R语言的Grubbs法检验程序 在 R软件中,用 outliers包中的 Grubbs检验可以 检验出数据集中的1个或2个异常值,具体命令如下: Grubbs.test(x,type=10,opposite=FALSE,two.sided= FALSE) 其中 x是检测数据向量; type=10表示检测一个 异常值, type=11表示检测 2个分别处于两个端点的 异 常 值 , type=20 表 示 检 测 2 个 一 侧 的 异 常 值 ; two.sided表示双边检验。
1.3 应用举例 例1:在一次调查中,收集数据如下: 8.3、5.5、14.0、7.5、4.7、9.0、6.5、10.2、7.7、6.2 请用 Grubbs法判断是否有异常值?如果有,是 哪个? R程序如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages(all.available= TRUE)),graphics=TRUE) +if(nchar(pkg))library(pkg, character.only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.7,9.0,6.5,10.2,7.7,6.2) >grubbs.test(x) R分析输出结果: Grubbs test for one outlier data: x G = 2.2595, U = 0.3697, p-value = 0.03051 alternative hypothesis: highest value 14 is an outlier R分析输出结果分析: 因为p=0.03051<0.05,所以可以判断14为这组数 据的异常值。当然如果经过实际情况分析,判定14 不是异常值,是正常值。而觉得小值有可能是异常 值的话,可以输入命令如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages (all.available= TRUE)),graphics=TRUE) + i f ( n c h a r ( p k g ) ) l i b r a r y ( p k g , c h a r a c t e r. only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.8,9.0,6.5,10.2,7.7,6.2) > grubbs.test(x,opposite=TRUE) R分析输出结果: Grubbs test for one outlier data: x G = 1.1797, U = 0.8282, p-value = 1 alternative hypothesis: lowest value 4.7 is an outlier R分析输出结果分析: 因为 p=1>0.05,所以可以判断 4.7为这组数据的 正常值。
2 dixon法原理及基于R语言的dixon法检验程序举例
2.1 dixon法原理 设数据集为 x1,x2,x3,… ,xn,则其顺序统计量为设 为: x(1)<x(2)<… <x(n)。其中 x(1)为最小值, x(n)为 最大值,当顺序统计量 x(i)是正态分布时, Dixon给 出了不同样本数量n时统计量D的计算公式。当显著 水平 a 为 0.05 或 0.01 时, Dixon 给出了其临界值 D 1a(n)。若某样本的统计量 D>D1-a(n),则 x(n)为异常 值,如果某样本的统计量D′> D1-a(n),则x(1)为异 常值,否则都为正常值。
2.2 基于R语言的Dixon法检验程序 在R软件中,用outliers包中的Dixon检验可以检 验出数据集中的1个或2个异常值,具体命令如下: dixon.test(x,type=10,opposite=FALSE,two.sided =TRUE) 其中 x是检测数据向量; type=10表示检测适用 于数据集为 3~7个数据, type=11表示检测适用于数 据集为8~10个数据,type=21表示检测适用于数据集 为11~13个数据,type=2,2表示检测适用于数据集为14个或14个以上数据,;two.sided表示双边检验。
2.3 应用举例 例2:利用例1中的测量数据集,利用Dixon检验 判断是否有异常值?如果有,是哪个? R程序如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages(all. available= TRUE)),graphics=TRUE) +if(nchar(pkg))library(pkg, character.only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.7,9.0,6.5,10.2,7.7,6.2) > dixon.test(x,type=11) R分析输出结果: Dixon test for outliers data: x Q = 0.4471, p-value = 0.0380 alternative hypothesis: highest value 14 is an outlier R分析输出结果分析: 因为p=0.038<0.05,所以可以判断14为这组数据 的异常值。当然如果经过实际情况分析,判定14不 是异常值,是正常值。而觉得小值有可能是异常值 的话,可以输入命令如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages(all. available= TRUE)),graphics=TRUE) + i f ( n c h a r ( p k g ) ) l i b r a r y ( p k g , c h a r a c t e r. only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.7,9.0,6.5,10.2,7.7,6.2) >dixon.test(x, type=11,opposite=TRUE) R分析输出结果: Dixon test for outliers data: x Q = 0.1296, p-value = 0.7763 alternative hypothesis: lowest value 4.7 is an outlier R分析输出结果分析: 因为p= 0.7763>0.05,所以可以判断4.7为这组数 据的正常值。 综上分析,利用R软件程序outliers包来实现数理 统计中的Grubbs法、dixon法非常容易实现,也便于 根据自己的实际情况调整程序,易学易记,非常直 观,所以在以后的数据处理分析中,要多多利用 R 软件来实现,以提高自己的数据分析能力。
参考资料
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。