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

R语言如何分箱分组统计数值占比并绘制百分比可视化图表

R语言实现方案(基于tidyverse生态)

1. 环境准备与数据构造

直接复用你提供的示例数据逻辑,依赖为数据处理、绘图通用包,未安装可先运行install.packages("tidyverse")和install.packages("scales")完成安装:

library(tidyverse)
library(scales)

# 构造示例数据集
df <- tibble(
  id = c(1,2,5,2,4,6,5,2,8,7),
  accuracy_level = c(10,24,65,72,44,62,58,27,48,37)
)

2. 区间分组与占比统计

提供两种统计口径,可根据业务场景直接选用:

  • 口径1:按原始记录条数统计占比(重复出现的id多次计数,和你举例的0-20区间占比10%的规则完全匹配)
  • 口径2:按去重id统计占比(同一个id多次落在同一区间只计数1次,适合统计覆盖的独立样本占比)
# ------------- 口径1:按原始记录统计 -------------
stat_res <- df %>%
  # 自定义区间断点,左开右闭,可根据实际需求调整breaks值修改区间
  mutate(level_group = cut(
    accuracy_level,
    breaks = c(0,20,40,60,80,100),
    labels = c("0-20", "20-40", "40-60", "60-80", "80-100"),
    include.lowest = T
  )) %>%
  count(level_group, name = "cnt") %>%
  # 补全无数据的区间,避免绘图时缺项
  complete(level_group, fill = list(cnt = 0)) %>%
  mutate(ratio = cnt / sum(cnt))

# 查看统计结果
stat_res
# 输出对应结果:
#  level_group   cnt ratio
#  <fct>       <dbl> <dbl>
#1 0-20            1   0.1
#2 20-40           3   0.3
#3 40-60           3   0.3
#4 60-80           3   0.3
#5 80-100          0   0

# ------------- 口径2:按去重id统计 -------------
stat_res_unique <- df %>%
  mutate(level_group = cut(
    accuracy_level,
    breaks = c(0,20,40,60,80,100),
    labels = c("0-20", "20-40", "40-60", "60-80", "80-100"),
    include.lowest = T
  )) %>%
  distinct(id, level_group) %>% 
  count(level_group, name = "cnt") %>%
  complete(level_group, fill = list(cnt = 0)) %>%
  mutate(ratio = cnt / sum(cnt))

3. 可视化绘制

按要求生成横向条形图,X轴为间隔10%的百分比刻度,Y轴为准确率分组区间:

ggplot(stat_res, aes(x = ratio, y = level_group)) +
  geom_col(fill = "#2c7fb8", width = 0.7) +
  # X轴配置百分比刻度,间隔10%
  scale_x_continuous(
    labels = percent_format(),
    breaks = seq(0, 1, 0.1),
    limits = c(0, 1)
  ) +
  # 条形末端添加数值标签,方便直接读值
  geom_text(aes(label = percent(ratio, accuracy = 1)), hjust = -0.2, size = 3.5) +
  labs(
    x = "id占比",
    y = "accuracy_level分组区间",
    title = "各准确率区间对应id占比分布"
  ) +
  theme_bw() +
  theme(panel.grid.minor = element_blank())
优化参考
  • 如果你的accuracy_level取值范围不是0-100,直接修改cut函数内的breaks断点即可适配,无需调整其他逻辑
  • 若需要展示更细粒度的数据特征,可在条形图基础上叠加抖动散点,展示每个区间内原始accuracy_level的分布,避免分组导致的信息丢失
  • 若需要做交互式汇报,可直接运行plotly::ggplotly(上述绘图对象),将静态图转为可悬浮查看数值的交互图
  • 注意:如果存在同一个id落在多个不同区间的情况(比如示例中id=2同时落在20-40、60-80两个区间),做去重统计前要先明确业务规则:是取该id的最高准确率归类,还是只要出现过就算入对应区间,避免统计口径偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:42:30