如何去除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 分数的数据框中的每一列。您可以在此处了解有关此功能的更多信息。