帕累托分析BI实战
在企业精细化运营中,帕累托分析被视为七大基本质量控制工具之一,因可轻松查看最常见的问题,能区分出“极其渺小的大多数”和“至关重要的极少数”,且是优化和改进的有效检测工具。
帕累托分析又称ABC分析法、柏拉图分析、主次因分析法等,通常按照70%、20%、10% 将商品分为ABC3个类别,再根据不同类别商品的贡献度,采用与之相对应的营销方案,推动销量,提升效益。
A类商品,占总销售额的70%,是主要关注。
B类商品,占总销售额的20%,是次要关注。
C类商品,占总销售额的10%,是一般关注。
帕累托原则表明80%的问题都是由众多原因中的20%主要原因引起的。帕累托分析帮助团队分清主次。
00:32一、ExcelBI篇:
本次实战案例,将根据产品的销售额和订单量做帕累托分析。
产品子类别 按销售额
1.导入数据(订单表、产品表、日期表、ABC表)

2.制作帕累托分析图,需要求出各个产品的销售额,在根据销售额从大到小排序后,求出累计销售额,最后根据累计销售额求出累计百分比。下面开始实操步骤:
在产品表,新增列销售额
销售额 = CALCULATE(SUM('订单数据'[销售额]))

累计销售额 = SUMX(FILTER('产品分析','产品分析'[销售额] >= EARLIER('产品分析'[销售额])), '产品分析'[销售额])

累计百分比 = DIVIDE('产品分析'[累计销售额],SUM('产品分析'[销售额]))

ABC分类 = IF('产品分析'[累计百分比]<=0.7,"A",IF('产品分析'[累计百分比]<=0.9,"B","C"))

3. 产品子类别 按销售额帕累托分析,所需要准备数据已经整理完毕,在Excel里面还是通过透视表来实现可视化所需各个模块。

4.最终效果

产品子类别 按订单量
在订单数据表中新增列
订单量 =CALCULAT(SUM('订单数据'[数量]))

累计订单量 = SUMX(FILTER('产品分析','产品分析'[订单量] >= EARLIER('产品分析'[订单量])), '产品分析'[订单量])

累计百分比2 = DIVIDE('产品分析'[累计订单量],SUM('产品分析'[订单量]))

ABC分类2 = IF('产品分析'[累计百分比2]<=0.7,"A",IF('产品分析'[累计百分比2]<=0.9,"B","C"))

最终效果

二、PowerBI篇:
与Excel相比,PowerBI更加灵活、便捷,本次案例实战将从PowerBI软件本身功能的优越性来实现。
1.导入数据(订单表、产品表、日期表)

2.根据帕累托分析需求,分别求出销售额、订单量
销售额 = SUM('订单'[销售额] )
订单量 = SUM('订单'[数量])

3.ABC表 :
ABC =
VAR vItems = DISTINCT( '产品'[子类别] )
RETURN
SELECTCOLUMNS(
vItems ,
"名称" , [子类别]
)

4.求出当前产品子类别的销售额、销售额累计占比和
ABC.销售额 =
VAR vRelation =
TREATAS( { SELECTEDVALUE( 'ABC'[名称] ) } ,'产品'[子类别] )
RETURN
CALCULATE( [销售额] , vRelation )
ABC.销售额积累占比% =
VAR vCurrentValue = [ABC.销售额]
VAR vTable =
CALCULATETABLE(
ADDCOLUMNS( VALUES( 'ABC'[名称] ) , "@Value" , [ABC.销售额] ) ,
ALLSELECTED( )
)
RETURN
DIVIDE(
SUMX( FILTER( vTable , [@Value] >= vCurrentValue ) , [@Value] ) ,SUMX( vTable , [@Value] ) )
5.当前产品子类别的订单量、订单量累计占比
ABC.订单量 =
VAR vRelation =
TREATAS( { SELECTEDVALUE( 'ABC'[名称] ) } ,'产品'[子类别] )
RETURN
CALCULATE( [订单量] , vRelation )
ABC.销售额积累占比% =
VAR vCurrentValue = [ABC. 订单量]
VAR vTable =
CALCULATETABLE(
ADDCOLUMNS( VALUES( 'ABC'[名称] ) , "@Value" , [ABC.订单量] ) ,
ALLSELECTED( )
)
RETURN
DIVIDE(
SUMX( FILTER( vTable , [@Value] >= vCurrentValue ) , [@Value] ) ,SUMX( vTable , [@Value] ) )
6.效果图

三、Python BI篇:
导入数据(导入本次实战案例所用到的第三方库):
import pandas as pd
df1 = pd.read_excel('D:/大叔学BI/Demo DataSource.xlsx', '订单数据')
df2 = pd.read_excel('D:/大叔学BI/Demo DataSource.xlsx', '产品数据')
查看数据结构

2.合并产品数据和订单数据表:
df3 = pd.merge(df1, df2, left_on='产品ID', right_on='产品ID', how='left')

3.根据df3求出产品子类别的销售额:
plt_df = pd.DataFrame(df3.groupby('子类别')['销售额'].sum())
plt_df = plt_df.rename_axis('产品子类别').reset_index()

4.将目标数据导入为series元组
data = pd.Series(plt_df['销售额'].values, index=plt_df['产品子类别'])

5.对数组进行降序排列
data.sort_values(ascending=False, inplace=True)
df = data.to_frame()
df.columns = ['销售额']
df['销售额'] = df['销售额'].astype(int)

6.求出累计百分比
p = data.cumsum() / data.sum()
df['累计百分比'] = p.to_frame()
df = df.rename_axis('产品子类别').reset_index()
df['累计百分比'] = df['累计百分比'].round(2)

7.据df3求出产品子类别的销售量:
plt_df1 = pd.DataFrame(df3.groupby('子类别')['数量'].sum())
plt_df1 = plt_df1.rename_axis('产品子类别').reset_index()

8.将目标数据导入为series元组
data1 = pd.Series(plt_df1['数量'].values, index=plt_df['产品子类别'])

9.对数组进行降序排列
data1.sort_values(ascending=False, inplace=True)
df6 = data1.to_frame()
df6.columns = ['订单量']

10.求出累计百分比,并保留两位小数
p1 = data1.cumsum() / data1.sum()
df6['累计百分比'] = p1.to_frame()
df6 = df6.rename_axis('产品子类别').reset_index()
df6['累计百分比'] = df6['累计百分比'].round(2)

11.制作帕累托图所需数据已经准备好了,开始导入制图用到的第三方库
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Page, Pie
from pyecharts.commons.utils import JsCode
柱形图:
bar = (
Bar(
init_opts=opts.InitOpts(width="1500px", height="350px")
) # 设置图表大小
.add_xaxis(df['产品子类别'].tolist()) # 设置柱形图的X轴
.add_yaxis(
series_name="销售额", # Y轴系列名称
y_axis=df['销售额'].tolist(),
label_opts=opts.LabelOpts(is_show=True, position='top', formatter="{c}"), # 数字标签显示方式
itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color1_function), opacity=0.5) # 柱形图颜色
)
.extend_axis( # 设置次坐标轴
yaxis=opts.AxisOpts(
name="",
type_="value",
min_=0,
max_=1,
is_show=True)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="产品子类别 按 销售额帕累托分析", # 主标题
title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF"),
subtitle="", # 副标题
pos_left='1%', # 位置
pos_right='1%'
),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), # 鼠标交叉十字显示
legend_opts=opts.LegendOpts(is_show=False, pos_top="4%"), # 图例
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=25)), # X轴文字旋转
yaxis_opts=opts.AxisOpts( # 显示Y轴网格
type_="value",
axislabel_opts=opts.LabelOpts(color="#FFFFFF"),
axistick_opts=opts.AxisTickOpts(is_show=True), # 坐标轴上的刻度是否显示
axisline_opts=opts.AxisLineOpts(is_show=False), # Y轴线不显示
splitline_opts=opts.SplitLineOpts(is_show=False) # Y轴网格是否显示
)
)
)
折线图:
line = (
Line(
init_opts=opts.InitOpts(width="1500px", height="350px") # 设置图表大小
)
.add_xaxis(df['产品子类别'].tolist()) # 设置线形图的X轴)
.add_yaxis(
"",
df['累计百分比'], # 系列数据
symbol_size=10, # 标识大小
yaxis_index=1, # 主坐标轴还是次坐标轴
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(name="自定义标记点",
coord=[df.index[5], # 数据坐标
df['累计百分比'][5]],
value=df['累计百分比'][5])]), # 数据值
linestyle_opts=opts.LineStyleOpts(width=3, color='#28527a'), # 线宽度
itemstyle_opts=opts.ItemStyleOpts(border_width=3, border_color='#28527a', color='#28527a') # 标记的颜色和宽度
) # 标记重点
# .set_global_opts(
# yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 是否显示数据标签
)
图形组合:
bar.overlap(line)
