本站分享:AI、大数据、数据分析师培训认证考试,包括:Python培训Excel培训Matlab培训SPSS培训SAS培训R语言培训Hadoop培训Amos培训Stata培训Eviews培训

R语言-异常数据处理3_R语言

r语言 cdadata 4491℃

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.5y<0.5的数据都在什么位置
    #满足x<0.5的位置
    A <- which(x < 0.5);
    #满足y<0.5的位置
    B <- which(y < 0.5);
    #满足x<0.5y<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)。若某样本的统计量=””>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 软件来实现,以提高自己的数据分析能力。

转载请注明:数据分析 » R语言-异常数据处理3_R语言

喜欢 (1)or分享 (0)