You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速识别箱线图(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:39:57