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

如何创建带异常值标签及计数的箱线图或表格?

解决方案:展示异常值内容与计数

一、表格方案(清晰呈现异常值详情)

适合需要明确看到每个变量异常值的具体取值和对应数量的场景,适配离散变量+数值变量的混合数据。

1. 统计所有变量的异常值信息

遍历数据集变量,分别针对数值型、离散型变量统计异常值的数量和具体取值:

# 定义函数:获取单个变量的异常值统计信息
get_outlier_info <- function(x, var_name) {
  if (is.numeric(x)) {
    # 数值型变量用箱线图规则识别异常值
    out_vals <- boxplot(x, plot = FALSE)$out
    out_count <- length(out_vals)
    out_unique <- unique(out_vals)
  } else {
    # 离散变量以低频率类别为异常值(可自定义阈值)
    freq_table <- table(x)
    out_threshold <- quantile(freq_table, 0.05) # 取频率前5%的类别
    out_cats <- names(freq_table[freq_table < out_threshold])
    out_count <- sum(freq_table[freq_table < out_threshold])
    out_unique <- out_cats
  }
  data.frame(
    变量名 = var_name,
    异常值数量 = out_count,
    异常值取值 = paste(out_unique, collapse = ", ")
  )
}

# 应用函数到整个数据集
outlier_table <- do.call(rbind, lapply(names(dataDK), function(col) {
  get_outlier_info(dataDK[[col]], col)
}))

# 查看结果
print(outlier_table)

2. 筛选存在异常值的变量

如果只需要聚焦有异常值的条目:

outlier_table_filtered <- outlier_table[outlier_table$异常值数量 > 0, ]
print(outlier_table_filtered)

二、箱线图方案(可视化+异常值计数标注)

针对异常值较多的场景,避免点标注拥挤,改用图旁标注异常值计数的方式,同时保留分布展示。

1. 基础R实现(多图合并)

# 筛选数值型变量(示例中仅年龄,可扩展)
num_vars <- names(dataDK)[sapply(dataDK, is.numeric)]

# 设置多图布局,调整边距预留计数标注空间
par(mfrow = c(2, 2), mar = c(4, 4, 3, 2))

for (var in num_vars) {
  x <- dataDK[[var]]
  # 绘制箱线图,可选择隐藏默认异常值点避免拥挤
  boxplot(x, main = var, outline = FALSE)
  # 计算异常值数量
  out_count <- length(boxplot(x, plot = FALSE)$out)
  # 在图右上角标注异常值计数
  mtext(paste("异常值数:", out_count), side = 3, line = -1, adj = 0.9, cex = 0.8)
  # 用小点展示异常值分布(可选)
  points(jitter(rep(1, out_count)), out_count, pch = 16, cex = 0.5)
}

# 恢复默认绘图布局
par(mfrow = c(1,1))

2. ggplot2实现(更灵活的可视化)

用ggplot2实现更美观的多变量箱线图,同时标注异常值计数:

library(ggplot2)
library(tidyr)

# 转换数据为长格式
data_long <- pivot_longer(dataDK, cols = num_vars, names_to = "变量", values_to = "取值")

# 预先计算每个变量的异常值数量
outlier_counts <- sapply(num_vars, function(var) {
  length(boxplot(dataDK[[var]], plot = FALSE)$out)
})
count_df <- data.frame(变量 = names(outlier_counts), 异常值数 = outlier_counts)

# 绘制带计数标注的箱线图
ggplot(data_long, aes(x = 变量, y = 取值)) +
  geom_boxplot(outlier.size = 0.5) + # 缩小异常值点避免拥挤
  geom_text(data = count_df, aes(x = 变量, y = Inf, label = paste("异常值:", 异常值数)),
            vjust = 1.5, size = 3) +
  theme_bw() +
  labs(title = "变量分布与异常值计数")

内容的提问来源于stack exchange,提问作者rr19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:55:32