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 版权协议,转载请附上原文出处链接和本声明。
