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