R语言-异常数据处理4

R语言中离群值的识别、描述、绘制与移除

前言

  统计学中离群值被定义为离开大部分观测较远的样本点,多数是由于测量误差而产生。因此,数据分析中离群值的识别和移除(如有必要)是很重要的一个步骤。

  鉴定离群值的方法有很多种,包括基于标准差的方法和基于四分位距的Tukey法。本文我将使用不依赖余数据分布类型的Tukey法做演示,该方法的另一个优势是无需考虑数据均值和方差,而这两个统计量恰恰很容易被极端值(离群值)影响。

  脚本

  我写了一个脚本来识别、描述、绘制并移除离群值。我先利用箱线图来鉴定样本点是否为离群值。在R中可以使用boxplot.stats()$out命令来绘制这个图,该图能利用Tukey法将游离在1.5倍四分位距外的样本点单独绘制出来。在描述数据时,我喜欢汇报数据中离群值的百分比和其均值,同时我也会分别计算包含和移除离群值后数据的均值。而在各种数据图中,箱线图和直方图值最能体现离群值的存在感,因此在下面的脚本中,我将绘制包含和移除离群值的这两类图形。最后,在Selva的帮助下,我添加了一个简单问题(是/否)来询问是否要保留离群值。如果选择是,那么离群值将被NA取代。

  脚本如下:


outlierKD <- function(dt, var) {
     var_name <- eval(substitute(var),eval(dt))
     tot <- sum(!is.na(var_name))
     na1 <- sum(is.na(var_name))
     m1 <- mean(var_name, na.rm = T)
     par(mfrow=c(2, 2), oma=c(0,0,3,0))
     boxplot(var_name, main="With outliers")
     hist(var_name, main="With outliers", xlab=NA, ylab=NA)
     outlier <- boxplot.stats(var_name)$out
     mo <- mean(outlier)
     var_name <- ifelse(var_name %in% outlier, NA, var_name)
     boxplot(var_name, main="Without outliers")
     hist(var_name, main="Without outliers", xlab=NA, ylab=NA)
     title("Outlier Check", outer=TRUE)
     na2 <- sum(is.na(var_name))
     cat("Outliers identified:", na2 - na1, "\n")
     cat("Propotion (%) of outliers:", round((na2 - na1) / tot*100, 1), "\n")
     cat("Mean of the outliers:", round(mo, 2), "\n")
     m2 <- mean(var_name, na.rm = T)
     cat("Mean without removing outliers:", round(m1, 2), "\n")
     cat("Mean if we remove outliers:", round(m2, 2), "\n")
     response <- readline(prompt="Do you want to remove outliers and to replace with NA? [yes/no]: ")
     if(response == "y" | response == "yes"){
          dt[as.character(substitute(var))] <- invisible(var_name)
          assign(as.character(as.list(match.call())$dt), dt, envir = .GlobalEnv)
          cat("Outliers successfully removed", "\n")
          return(invisible(dt))
     } else{
          cat("Nothing changed", "\n")
          return(invisible(var_name))
     }
}

  你可以直接运行这些代码,只要把其中的数据集和变量的名称替换下。

#source("http://goo.gl/UUyEzD")
outlierKD(dat, variable)

  一个例子:

Outliers identified: 58 
Propotion (%) of outliers: 3.8 
Mean of the outliers: 108.1 
Mean without removing outliers: 53.79 
Mean if we remove outliers: 52.82 
Do you want to remove outliers and to replace with NA? [yes/no]: y
Outliers successfully removed

  绘制的图形的例子:

R%E8%AF%AD%E8%A8%80-%E5%BC%82%E5%B8%B8%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%864-outliersRplot.bmp

参考资料

转载于:https://www.cnblogs.com/cloudtj/articles/5868262.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值