如何快速识别箱线图(Boxplot)中的异常值?
如何自动识别指定列的所有异常值(基于箱线图规则)
首先明确箱线图判定异常值的标准公式:
- 先算出目标列的第一四分位数(Q1)和第三四分位数(Q3)
- 四分位距IQR = Q3 - Q1
- 异常值范围:小于
Q1 - 1.5*IQR或者大于Q3 + 1.5*IQR的值
不用手动猜阈值,直接写个通用函数就能搞定任意列的异常值识别:
library(dplyr) find_outliers <- function(data, col_name) { # 计算四分位数和IQR q_vals <- quantile(data[[col_name]], probs = c(0.25, 0.75), na.rm = TRUE) q1 <- q_vals[1] q3 <- q_vals[2] iqr_val <- q3 - q1 # 标记异常值 data %>% mutate(outlier_flag = case_when( .data[[col_name]] < q1 - 1.5*iqr_val ~ "outlier", .data[[col_name]] > q3 + 1.5*iqr_val ~ "outlier", TRUE ~ "not outlier" )) } # 用mtcars的mpg列测试 result <- find_outliers(mtcars, "mpg") # 查看异常值行 result %>% filter(outlier_flag == "outlier")
运行这个函数后,你会看到mpg列里只有33.9这个值被标记为异常值,完全符合箱线图的判定逻辑,比手动猜33、10这种阈值靠谱多了。
如果只想提取异常值的具体数值,也可以给函数加个返回选项:
find_outliers <- function(data, col_name, return_values = FALSE) { q_vals <- quantile(data[[col_name]], probs = c(0.25, 0.75), na.rm = TRUE) q1 <- q_vals[1] q3 <- q_vals[2] iqr_val <- q3 - q1 if (return_values) { return(data[[col_name]][data[[col_name]] < q1 - 1.5*iqr_val | data[[col_name]] > q3 + 1.5*iqr_val]) } else { data %>% mutate(outlier_flag = case_when( .data[[col_name]] < q1 - 1.5*iqr_val ~ "outlier", .data[[col_name]] > q3 + 1.5*iqr_val ~ "outlier", TRUE ~ "not outlier" )) } } # 直接获取mpg的异常值 find_outliers(mtcars, "mpg", return_values = TRUE)
这样不管是标记整行还是提取异常值,都能一键完成,再也不用手动调阈值了。
内容的提问来源于stack exchange,提问作者Pikada
相关产品推荐
相关产品推荐

