【问题标题】:Calculating cumulative proportion sales product count计算累计比例销售产品个数
【发布时间】:2018-02-22 19:30:05
【问题描述】:

我有一个数据框,它的销售额为 ppg 产品级别,我想知道有多少产品对销售的特定百分比(例如 75%)有贡献,例如测试帕累托原理。

数据是

    df= structure(list(Ppg = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("p1", 
"p2"), class = "factor"), product = structure(c(1L, 2L, 3L, 4L, 
1L, 2L, 3L), .Label = c("A", "B", "C", "D"), class = "factor"), 
    sales = c(50, 40, 30, 80, 100, 70, 30)), .Names = c("Ppg", 
"product", "sales"), row.names = c(NA, -7L), class = "data.frame")





  > df
  Ppg product sales
1  p1       A    50
2  p1       B    40
3  p1       C    30
4  p1       D    80
5  p2       A   100
6  p2       B    70
7  p2       C    30

我使用 dplyr 检索了累积总和

df %>% group_by(Ppg) %>% summarise(sale = sum(sales) %>% mutate(c1 = cumsum(sales))

          Ppg product sales    c1
  <fctr>  <fctr> <dbl> <dbl>
1     p1       A    50    50
2     p1       B    40    90
3     p1       C    30   120
4     p1       D    80   200
5     p2       A   100   100
6     p2       B    70   170
7     p2       C    30   200

有什么办法

i) 计算销售额比例(基于 cumsum)

ii) 有多少不同的产品对特定百分比的销售额做出了贡献。

ppg p1 的示例,2 种不同的产品(A 和 B 组合占销售额的 75%)

所以最后像下面这样的东西是理想的

ppg Number_Products_towards_75%
p1   2
p2   1

【问题讨论】:

  • 这个问题的答案取决于产品的顺序,对吧?您可以使用它们给出的顺序吗?
  • @Jonathan ,是的,没错,我会在找到cumsum之前安排它

标签: r dplyr summary cumulative-sum


【解决方案1】:

假设您可以使用产品当前所处的顺序来回答您的问题(因为重新排序行会得到不同的结果):

对于 1,您可以通过额外的变异获得结果。只需将累积总和除以该组中所有销售额的总和即可:

df %>% 
  group_by(Ppg) %>% 
  mutate(c1 = cumsum(sales)) %>%
  mutate(percent = c1 / sum(sales))

得到你:

# A tibble: 7 x 5
# Groups: Ppg [2]
  Ppg    product sales    c1 percent
  <fctr> <fctr>  <dbl> <dbl>   <dbl>
1 p1     A        50.0  50.0   0.250
2 p1     B        40.0  90.0   0.450
3 p1     C        30.0 120     0.600
4 p1     D        80.0 200     1.00 
5 p2     A       100   100     0.500
6 p2     B        70.0 170     0.850
7 p2     C        30.0 200     1.00 

对于 2,然后您可以使用 mutate 添加一列以判断该产品是否低于阈值并汇总以计算低于阈值的产品(然后在计数中添加一个,因为再添加一个会使您超过它) .

threshold <- 0.5

df %>% 
  group_by(Ppg) %>% 
  mutate(c1 = cumsum(sales)) %>%
  mutate(percent = c1 / sum(sales)) %>%
  mutate(isbelowthreshold = percent < threshold) %>% # add a column for if it's below the threshold
  summarize(count = sum(isbelowthreshold) + 1) # we need to add one since one extra product will put you over the threshold

让你:

# A tibble: 2 x 2
  Ppg    count
  <fctr> <dbl>
1 p1      3.00
2 p2      1.00

但这又取决于产品的顺序。考虑先将它们从最高值到最低值排序?类似的东西

df %>% 
    group_by(Ppg) %>%
    arrange(Ppg, desc(sales))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2023-01-19
    • 2018-09-24
    • 1970-01-01
    • 2020-06-10
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多