原创内容
No.756
数分人必知必会 | 分析方法:帕累托累计
来来来,数分狗必知必会继续开唠~
图片由夸克AI绘制
帕累托分析(Pareto Analysis)又称80/20法则,源于意大利经济学家维尔弗雷多·帕累托(Vilfredo Pareto)的财富分配研究(1896年)。他发现:20%的人口掌握了80%的社会财富。这一不均衡规律后被约瑟夫·朱兰引入质量管理领域,发展成识别“关键少数”的核心工具。和排雷托分析相关联的方法就叫做帕累托累计(Pareto Cumulative)。
从纯数学的角度来说,我们应该这样描述帕累托累计(累计分布函数):

xm:最小值阈值(如商品最低销售额)
αα:分布不均匀度(值越小,尾部越厚,资源越集中)
虽然名字叫做二八法则,但实际上帕累托分析的关键在于识别“贡献拐点”(累计曲线由陡升转为平缓的位置)。
抛开具体的业务场景,基本在实际业务实战中也就是这么个策略对照:

实际操作的步骤看起来也比较简单,基本就是这么个四步的策略:① 统计问题类型频率 → ② 按频率降序排列 → ③ 计算累计占比 → ④ 锁定累计≤80%的头部问题。
属于是那种简单但是很有用的分析方法之一,并没有太复杂的数据处理技巧,但是最终呈现的结论又非常直观可操作,说是数分人必会的技术一点都不为过。
接下来是实战相关的内容。
Excel
分析工具首先就是最常见的工具,第一个就来聊下Excel相关的操作方法:
步骤1:对贡献值降序排序 → `=SORT(B2:B100, 2, -1)`
步骤2:计算累计占比 → `=SUM($C$2:C2)/SUM($C$2:$C$100)`SORT这个函数是一个用得比较少的函数,可对某个区域或数组的内容进行排序。语法规则上基本如下图所示:

注意事项如下:

Python
如果是Python的话,帕累托累计就更加简单了,就是几行代码的事情:
import pandas as pd
# 数据加载与排序
df = pd.read_csv("data.csv")
df_sorted = df.sort_values(by='销售额', ascending=False)
# 计算累计占比
df_sorted['累计占比'] = df_sorted['销售额'].cumsum() / df_sorted['销售额'].sum()
# 标记ABC类
df_sorted['类别'] = ['A'if p <= 0.8else'B'if p <= 0.95else'C'for p in df_sorted['累计占比']]虽然Python本身有点上手的门槛,但如果是做帕累托累计的话,几乎是几种分析方法中最简单的一种了。
BI工具
如果是PowerBI的话,DAX函数只是单纯的看起来有点长,实际上处理逻辑也不是很难:
Rank =
RANKX(
ALLSELECTED('Table'[Product]), // 按产品清除外部筛选
CALCULATE(SUM('Table'[Sales])), // 按销售额排序
, DESC, Dense
)2. 计算累计销售额
Cumulative Sales =
VAR CurrentRank = [Rank] // 获取当前产品排名
RETURN
SUMX(
FILTER(
ALLSELECTED('Table'[Product], 'Table'[Sales]),
[Rank] <= CurrentRank // 累加排名≤当前产品的值
),
[Sales]
)3. 计算累计占比
Cumulative % =
DIVIDE(
[Cumulative Sales],
CALCULATE(SUM('Table'[Sales]), ALLSELECTED('Table') // 动态总销售额
)4. ABC分类(扩展功能)
ABC Class =
SWITCH(TRUE(),
[Cumulative %] <= 0.8, "A",
[Cumulative %] <= 0.95, "B",
"C"
)5.解决跨筛选计算问题
// 修正累计计算(确保不受外部筛选干扰)
Cumulative Sales =
VAR TotalSales = CALCULATE(SUM('Table'[Sales]), ALLSELECTED('Table'))
VAR CurrentSales = SUM('Table'[Sales])
RETURN
SUMX(
FILTER(
ADDCOLUMNS(ALLSELECTED('Table'[Product]),
"ItemSales", CALCULATE(SUM('Table'[Sales]))
),
[ItemSales] >= CurrentSales // 按销售额倒序累加
),
[ItemSales]
)6.添加警戒线预警
// 当头部产品占比<75%时触发警告
Alert =
IF([Cumulative %] FORMAT = "⚠️ 头部产品贡献不足!", "")其他BI工具建议在底层数据做好计算再进行可视化呈现。
SQL
虽然说一般这种纯分析类的计算不做SQL中进行实现,实现效率偏低,但是我最近因为工具的限制还真的用SQL做了一下帕累托分析。之后会单独开一篇文章讲讲我在这段SQL斗智斗勇的故事,这次就先来说怎么实现吧。
在 SQL 中实现帕累托累计分析,实际上是需通过窗口函数完成排序、累计计算和占比分析的。
-- 创建临时表避免重复计算总值
WITH TotalSales AS (
SELECT
SUM(sales) AS total
FROM orders
WHERE order_date >'2023-01-01'-- 动态筛选条件
)
SELECT
o.product_id,
o.sales,
DENSE_RANK() OVER (ORDERBY o.sales DESC) AS rank,
-- 累计计算(兼容低版本SQL)
(SELECTSUM(sales)
FROM orders o2
WHERE o2.sales >= o.sales) AS cumulative_sales, -- 替代窗口函数
ROUND(
(SELECTSUM(sales) FROM orders o2 WHERE o2.sales >= o.sales)
/ t.total,
4
) AS cumulative_percent,
CASE
WHEN (SELECTSUM(sales) FROM orders o2 WHERE o2.sales >= o.sales) / t.total <=0.8
THEN'A'
... -- 同前分类逻辑
ENDAS abc_class
FROM orders o
CROSSJOIN TotalSales t -- 关联总值
ORDERBY o.sales DESC;各种开窗各种排序这种复杂的东西要是自己写真的是要了老命了,但好消息是这种程度的复杂SQL可以请AI代劳。
提示词不能说是没有难度,至少是看了就会,给大家放在这里:
# 帮我写一个SQL,SQL语法符合mysql的语法要求
# 表的字段信息如下:
## 目前有如下字段brand,date,value
# 请按照下面顺序输出字段,字段逻辑说明:
## date,源表字段
## Accumulated Sales,帕累托累计的销售额
## Accumulated Ratio,帕累托累计的销售额占比,展示为百分数形式,保留两位小数综上,介绍了关于帕累托累计的方法本身和相关实现技术细节,希望可以给大家的日常工作一点小的灵感。