基于dplyr计算PPG维度下累计销售占比及对应产品数量
搞定帕累托法则验证的两步需求
嘿,我来帮你完成这两个验证帕累托法则的需求!假设你已经有了按PPG、产品维度统计,且算出累计销售额(比如列名叫cum_sales)的DataFrame,下面分步骤实现:
一、基于累计销售额计算销售占比
首先我们需要给每个PPG组计算总销售额,再用累计销售额除以总销售额得到累计占比。这里要确保每个PPG下的产品是按销售额从高到低排序的(毕竟帕累托法则看的是top贡献的产品),如果之前没排序,记得加上排序步骤:
library(dplyr) # 假设你的数据框叫sales_df,包含PPG、product、sales、cum_sales列 sales_df <- sales_df %>% group_by(PPG) %>% # 按销售额降序排列,保证高贡献产品在前 arrange(desc(sales), .by_group = TRUE) %>% # 计算当前PPG的总销售额 mutate(total_sales = sum(sales), # 计算累计销售占比,保留2位小数更直观 cum_sales_pct = round(cum_sales / total_sales * 100, 2)) %>% ungroup()
这样你就会得到一个新列cum_sales_pct,显示每个产品及之前所有产品的累计销售额占该PPG总销售额的百分比。
二、统计贡献特定销售占比的产品数量
接下来我们要统计每个PPG中,累计贡献达到目标占比(比如75%)所需的最少产品数量。核心思路是:在每个PPG组里,找到第一个累计占比≥目标值的行,该行的行号就是我们要的产品数量:
target_pct <- 75 # 可以替换成你需要的任意占比,比如80% product_count_result <- sales_df %>% group_by(PPG) %>% # 筛选出累计占比首次达到或超过目标值的行 filter(cum_sales_pct >= target_pct) %>% # 只取第一个符合条件的行(对应最少的产品数量) slice(1) %>% # 提取产品数量(因为已经排序,行号就是累计的产品数) mutate(product_count = row_number()) %>% # 保留关键结果列 select(PPG, product_count, achieved_pct = cum_sales_pct) %>% ungroup()
额外补充:从原始数据一步到位的流程
如果你还没计算累计销售额,也可以把整个流程合并起来,从原始销售数据直接得到结果:
# 假设原始数据叫raw_sales,包含PPG、product、sales列 target_pct <- 75 full_result <- raw_sales %>% # 先按PPG和产品汇总销售额 group_by(PPG, product) %>% summarise(sales = sum(sales), .groups = "drop_last") %>% # 按销售额降序排列 arrange(desc(sales), .by_group = TRUE) %>% # 计算累计销售额、总销售额、累计占比 mutate(cum_sales = cumsum(sales), total_sales = sum(sales), cum_sales_pct = round(cum_sales / total_sales * 100, 2)) %>% # 统计达到目标占比的产品数量 group_by(PPG) %>% filter(cum_sales_pct >= target_pct) %>% slice(1) %>% mutate(product_count = row_number()) %>% select(PPG, product_count, achieved_pct = cum_sales_pct) %>% ungroup()
这样出来的结果里,每个PPG对应的product_count就是贡献至少75%销售额所需的产品数量啦!
内容的提问来源于stack exchange,提问作者av abhishiek
相关产品推荐
相关产品推荐

