如何创建带异常值标签及计数的箱线图或表格?
解决方案:展示异常值内容与计数
一、表格方案(清晰呈现异常值详情)
适合需要明确看到每个变量异常值的具体取值和对应数量的场景,适配离散变量+数值变量的混合数据。
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
相关产品推荐
相关产品推荐

