如何去除r中的异常值


异常值是与数据集中的其他值异常远离的观察值。异常值可能会产生问题,因为它们会影响分析结果。

本教程介绍如何在 R 中识别和删除异常值。

如何识别 R 中的异常值

在删除异常值之前,您必须首先确定什么是异常值。有两种常见的方法可以做到这一点:

1. 使用四分位距。

四分位距 (IQR) 是数据集中第 75 个百分位数 (Q3) 和第 25 个百分位数 (Q1) 之间的差值。它测量平均 50% 值的分布。

如果某个观测值是第三个四分位 (Q3) 上方四分位距的 1.5 倍或第一个四分位 (Q1) 下方四分位距的 1.5 倍,则可以将其定义为离群值。

异常值 = 观测值 > Q3 + 1.5*IQR 或 < Q1 – 1.5*IQR

2. 使用 z 分数。

z 分数告诉您给定值与平均值的标准差有多少。我们使用以下公式来计算 z 分数:

z = (X – μ) / σ

金子:

  • X 是单个原始数据值
  • μ 是总体平均值
  • σ 是总体标准差

如果某个观测值的 z 分数小于 -3 或大于 3,则可以将其定义为离群值。

离群值 = z 分数 > 3 或 < -3 的观测值

如何去除R中的异常值

一旦确定了异常值,您就可以识别它们并将其从数据集中删除。为了说明如何做到这一点,我们将使用以下数据框:

 #make this example reproducible 
set.seed(0)

#create data frame with three columns A', 'B', 'C' 
df <- data.frame(A=rnorm(1000, mean=10, sd=3),
                 B=rnorm(1000, mean=20, sd=3),
                 C=rnorm(1000, mean=30, sd=3))

#view first six rows of data frame
head(df)
         ABC
1 13.78886 19.13945 31.33304
2 9.02130 25.52332 30.03579
3 13.98940 19.52971 29.97216
4 13.81729 15.83059 29.09287
5 11.24392 15.58069 31.47707
6 5.38015 19.79144 28.19184

然后,我们可以使用 z 分数方法或四分位数范围方法定义和删除异常值:

Z分数方法:

以下代码展示了如何计算数据帧每一列中每个值的 z 分数,然后删除至少有一个 z 分数绝对值大于 3 的行:

 #find absolute value of z-score for each value in each column
z_scores <- as.data.frame (sapply(df, function(df) (abs(df-mean(df))/sd(df))))

#view first six rows of z_scores data frame
head(z_scores)

          ABC
1 1.2813403 0.25350805 0.39419878
2 0.3110243 1.80496734 0.05890232
3 1.3483190 0.12766847 0.08112630
4 1.2908343 1.32044506 0.38824414
5 0.4313316 1.40102642 0.44450451
6 1.5271674 0.04327186 0.70295309

#only keep rows in dataframe with all z-scores less than absolute value of 3 
no_outliers <- z_scores[!rowSums(z_scores>3), ]

#view row and column count of new data frame
dim(no_outliers)

[1] 994 3

原始数据框有 1000 行和 3 列。新数据框有 994 行和 3 列,这告诉我们删除了 6 行,因为它们的其中一列中至少有一个 z 分数的绝对值大于 3。

四分位距法:

在某些情况下,我们可能只想识别数据框列中的异常值。例如,假设我们只想删除数据框“A”列中具有异常值的行。

以下代码显示如何从数据框中删除行,其“A”列中的值是第三个四分位数 (Q3) 上方四分位间距的 1.5 倍或第一个四分位 (Q1) 下方四分位间距的 1.5 倍。 。

 #find Q1, Q3, and interquartile range for values in column A
Q1 <- quantile(df$A, .25)
Q3 <- quantile(df$A, .75)
IQR <- IQR(df$A)

#only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3
no_outliers <- subset(df, df$A> (Q1 - 1.5*IQR) & df$A< (Q3 + 1.5*IQR))

#view row and column count of new data frame
dim(no_outliers) 

[1] 994 3

原始数据框有 1000 行和 3 列。新数据框有 994 行和 3 列,这告诉我们删除了 6 行,因为它们在 A 列中至少包含一个异常值。

何时删除异常值

如果存在一个或多个异常值,您必须首先验证它们是否不是数据输入错误的结果。有时,个人在保存数据时只是输入了错误的数据值。

如果异常值是数据输入错误的结果,您可以决定为其分配一个新值,例如数据集的 平均值或中位数

如果该值确实是异常值,并且会对您的整体分析产生重大影响,则您可以选择将其删除。请务必在最终报告或分析中提及您删除了异常值。

其他资源

在本教程中,我们使用rnorm()生成正态分布随机变量的向量,给定向量长度n 、总体平均值μ和总体标准差σ 。您可以在此处了解有关此功能的更多信息。

我们还使用sapply()将函数应用于计算 z 分数的数据框中的每一列。您可以在此处了解有关此功能的更多信息。

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注