R z-score 方法检测异常值

  • Post author:
  • Post category:其他


z-score 反应数值相对均值偏离多少标准差,本文利用z-score检测异常值。



z-score

z-score 的计算公示为:


z = (X – μ) / σ

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

我们可以定义异常检测标准:如果z-score 小于

-3

或 z-score 大于

3


异常值 = 观测值的z-score >3 或者 观测值的z-score <-3



准备数据

library(tibble)
library(dplyr)

#make this example reproducible 
set.seed(0)

#create data frame with three columns A', 'B', 'C' 
df <- tibble(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)

# A tibble: 6 x 3
#       A     B     C
#   <dbl> <dbl> <dbl>
# 1  8.12  23.4  27.3
# 2 10.6   23.3  24.2
# 3  7.49  17.4  34.9
# 4 14.8   20.6  31.6
# 5 11.0   20.2  29.8
# 6  7.54  15.0  32.1

我们可以使用z-score或

四分位距方法检测异常值

。本文我们讲解z-score方法。



z-score方法


# 定义z-score计算函数
zs <-function(x){
  (abs(x-mean(x))/sd(x))
}

# 按列计算每个元素的z-score
df %>% mutate(across(c(1:3), zs) ) -> z_scores
head(z_scores)
# A tibble: 6 x 3
#       A      B      C
#   <dbl>  <dbl>  <dbl>
# 1 1.28  0.254  0.394 
# 2 0.311 1.80   0.0589
# 3 1.35  0.128  0.0811
# 4 1.29  1.32   0.388 
# 5 0.431 1.40   0.445 
# 6 1.53  0.0433 0.703 

# 选择z_scores数据中三个元素值中的任何一个都不大于3的记录
z_scores %>% filter(!(A >3 | B >3 | C>3)) -> no_outliers
dim(no_outliers)  
# 994行数据正常,其他6行有异常值
# [1] 994   3

z_scores %>% filter((A >3 | B >3 | C>3)) -> outliers
# 查看异常值数据
outliers

# # A tibble: 6 x 3
#       A     B      C
#   <dbl> <dbl>  <dbl>
# 1 0.634 0.352 3.10  
# 2 3.29  0.801 0.881 
# 3 1.96  1.07  3.25  
# 4 1.77  1.32  3.07  
# 5 3.07  0.705 1.30  
# 6 3.23  0.923 0.0999



何时删除异常值

当发现异常值时,首先要验证是否人为错误,毕竟人工操作错误在所难免。如果确定是人为错误,我们可以替换为均值或中位数。

当该值确实不是人为造成的异常值。如果它对整体分析有重大影响,我们可以选择删除它,但要确保在最终报告或分析中提及删除了异常值。当然也有可能有了重大发现😊。



版权声明:本文为neweastsun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。