R语言中离群值的识别、描述、绘制与移除
haoteby 2025-05-27 14:16 5 浏览
摘要:统计学中离群值被定义为离开大部分观测较远的样本点,多数是由于测量误差而产生。因此,数据分析中离群值的识别和移除(如有必要)是很重要的一个步骤。
鉴定离群值的方法有很多种,包括基于标准差的方法和基于四分位距的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]: yOutliers successfully removed
绘制的图形的例子:
我知道这个脚本还可以添加不少功能和细节,很多地方还能优化。欢迎各位给我提供反馈。
你可以直接在下方留言,或者在Twitter上联系我。
作者 Klodian Dhana
译者 钱亦欣
原文刊载于datascience+网站
链接
:http://datascienceplus.com/identify-describe-plot-and-removing-the-outliers-from-the-dataset/
数据分析网(www.afenxi.com),国内领先的大数据门户,旨在帮助大数据从业人士、爱好者提供大数据新闻资讯、前沿技术、业界观点的信息平台。
- 上一篇:R语言、RStudio的下载、安装与使用
- 下一篇:用R语言画图
相关推荐
- R数据分析:双因素方差分析与交互作用检验
-
Two-wayANOVAtestisusedtoevaluatesimultaneouslytheeffectoftwogroupingvariables(AandB)...
- R数据分析:用R语言做meta分析
-
这里以我的一篇meta分析为例,详细描述meta分析的一般步骤,该例子实现的是效应量β的合并...
- 生存分析看完这篇就够了(R语言代码+线上工具)
-
尔云间一个专门做科研的团队云生信学生物信息学关注我们...
- R语言中离群值的识别、描述、绘制与移除
-
摘要:统计学中离群值被定义为离开大部分观测较远的样本点,多数是由于测量误差而产生。因此,数据分析中离群值的识别和移除(如有必要)是很重要的一个步骤。鉴定离群值的方法有很多种,包括基于标准差的方法和基于...
- R语言、RStudio的下载、安装与使用
-
本文介绍R语言及其集成开发环境...
- [R语言] R语言快速入门教程
-
本文主要是为了从零开始学习和理解R语言,简要介绍了该语言的最重要部分,以快速入门。主要参考文章:R-TutorialR语言程序的编写需要安装R或RStudio,通常是在RStudio中键入代码。但是R...
- 看完这个「R语言课程」合集,我发现R语言也不过如此…
-
小料君看到一个有趣的问答...
- 在R语言中使用正则表达式
-
有时候我们要处理的是非结构化的数据,例如网页或是电邮资料,那么就需要用R来抓取所需的字符串,整理为进一步处理的数据形式。R语言中有一整套可以用来处理字符的函数,在之前的博文中已经有所涉及。但真正的...
- 附代码|详解R语言的高级数据结构
-
有时数据需要比向量更复杂的存储方式。幸运的是,R软件提供了很多的数据结构。常见的有数据框(data.frame)、矩阵(matrix)、列表(list)以及数组(array)。数据框类似于电子表格,矩...
- R语言实战—自学笔记—向量
-
第2章创建数据集2.1数据集的概念数据集:由数据构成的一个矩形数组,行表示观测,列表示变量。...
- R语言从入门到精通:Day7
-
原创小浣熊科研猫是时候关注我们一波了在向reviewer或者导师展示自己的统计分析结果时,一张图往往顶得上千言万语;在刚接触到数据时,图也能帮助我们发现数据中潜在的模式或者其中的异常值,这两个例子...
- 一文教你学会维恩图的绘制——R语言
-
背景介绍维恩图用于展示在不同的事物群组(集合)之间的数学或逻辑联系,尤其适合用来表示集合(或)类之间的“大致关系”,它也常常被用来帮助推导(或理解推导过程)关于集合运算(或类运算)的一些规律。通常每个...
- R语言介绍
-
一、R语言介绍...
- R语言的一些常见初级基本操作
-
基本概念:在R语言里操作和接触的所有东西都称作对象(object)。对象有很多种类可以包含各种类型的数据。R语言里所有的东西都被称为对象,R语言中常见的数据类型有几下几种,分别是字符型(cha...