首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数分人必知必会 | 分析方法:帕累托累计

数分人必知必会 | 分析方法:帕累托累计

作者头像
做数据的二号姬
发布2025-07-02 18:11:33
发布2025-07-02 18:11:33
3480
举报

原创内容

No.756

数分人必知必会 | 分析方法:帕累托累计

来来来,数分狗必知必会继续开唠~

图片由夸克AI绘制

帕累托分析(Pareto Analysis)又称80/20法则,源于意大利经济学家维尔弗雷多·帕累托(Vilfredo Pareto)的财富分配研究(1896年)。他发现:20%的人口掌握了80%的社会财富。这一不均衡规律后被约瑟夫·朱兰引入质量管理领域,发展成识别“关键少数”的核心工具。和排雷托分析相关联的方法就叫做帕累托累计(Pareto Cumulative)。

从纯数学的角度来说,我们应该这样描述帕累托累计(累计分布函数):

xm:最小值阈值(如商品最低销售额)

αα:分布不均匀度(值越小,尾部越厚,资源越集中)

虽然名字叫做二八法则,但实际上帕累托分析的关键在于识别“贡献拐点”(累计曲线由陡升转为平缓的位置)。

抛开具体的业务场景,基本在实际业务实战中也就是这么个策略对照:

实际操作的步骤看起来也比较简单,基本就是这么个四步的策略:① 统计问题类型频率 → ② 按频率降序排列 → ③ 计算累计占比 → ④ 锁定累计≤80%的头部问题。

属于是那种简单但是很有用的分析方法之一,并没有太复杂的数据处理技巧,但是最终呈现的结论又非常直观可操作,说是数分人必会的技术一点都不为过。

接下来是实战相关的内容。

Excel

分析工具首先就是最常见的工具,第一个就来聊下Excel相关的操作方法:

代码语言:javascript
复制
步骤1:对贡献值降序排序 → `=SORT(B2:B100, 2, -1)`  
步骤2:计算累计占比 → `=SUM($C$2:C2)/SUM($C$2:$C$100)`

SORT这个函数是一个用得比较少的函数,可对某个区域或数组的内容进行排序。语法规则上基本如下图所示:

注意事项如下:

Python

如果是Python的话,帕累托累计就更加简单了,就是几行代码的事情:

代码语言:javascript
复制
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函数只是单纯的看起来有点长,实际上处理逻辑也不是很难:

  1. 计算排序序号
代码语言:javascript
复制
Rank = 
RANKX(
    ALLSELECTED('Table'[Product]),  // 按产品清除外部筛选
    CALCULATE(SUM('Table'[Sales])), // 按销售额排序
    , DESC, Dense
)

2. 计算累计销售额

代码语言:javascript
复制
Cumulative Sales = 
VAR CurrentRank = [Rank]  // 获取当前产品排名
RETURN
SUMX(
    FILTER(
        ALLSELECTED('Table'[Product], 'Table'[Sales]),
        [Rank] <= CurrentRank  // 累加排名≤当前产品的值
    ),
    [Sales]
)

3. 计算累计占比

代码语言:javascript
复制
Cumulative % = 
DIVIDE(
    [Cumulative Sales],
    CALCULATE(SUM('Table'[Sales]), ALLSELECTED('Table')  // 动态总销售额
)

4. ABC分类(扩展功能)

代码语言:javascript
复制
ABC Class = 
SWITCH(TRUE(),
    [Cumulative %] <= 0.8, "A",
    [Cumulative %] <= 0.95, "B",
    "C"
)

5.解决跨筛选计算问题

代码语言:javascript
复制
// 修正累计计算(确保不受外部筛选干扰)
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.添加警戒线预警

代码语言:javascript
复制
// 当头部产品占比<75%时触发警告
Alert = 
IF([Cumulative %] FORMAT = "⚠️ 头部产品贡献不足!", "")

其他BI工具建议在底层数据做好计算再进行可视化呈现。

SQL

虽然说一般这种纯分析类的计算不做SQL中进行实现,实现效率偏低,但是我最近因为工具的限制还真的用SQL做了一下帕累托分析。之后会单独开一篇文章讲讲我在这段SQL斗智斗勇的故事,这次就先来说怎么实现吧。

在 SQL 中实现帕累托累计分析,实际上是需通过窗口函数完成排序、累计计算和占比分析的。

代码语言:javascript
复制
-- 创建临时表避免重复计算总值
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代劳。

提示词不能说是没有难度,至少是看了就会,给大家放在这里:

代码语言:javascript
复制
# 帮我写一个SQL,SQL语法符合mysql的语法要求

# 表的字段信息如下:
## 目前有如下字段brand,date,value

# 请按照下面顺序输出字段,字段逻辑说明:
## date,源表字段
## Accumulated Sales,帕累托累计的销售额
## Accumulated Ratio,帕累托累计的销售额占比,展示为百分数形式,保留两位小数

综上,介绍了关于帕累托累计的方法本身和相关实现技术细节,希望可以给大家的日常工作一点小的灵感。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做数据的二号姬 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档