保姆级的实操教程。跟着操作你能得到一个高频使用的指标拆解(杜邦分析)模板,用于销售异动分析。
初识PowerBI
打开PowerBI后,我们可以看到丰富的操作分区:
- 功能区:类似于Excel的导航栏,有各种功能,包括导入数据
- (可视化图表区)图表类型、图表设计:有许多内置的图表,以及图表对应的可视化设计区域
- 数据字段:导入的数据、新建的度量值等数据字段会显示在这里用于与图表交互
- 功能页切换:在这里切换到不同的功能页面进行报表设计、数据处理、建模。
业务需求
销售额异动原因分析是常见的业务需求场景,为了让运营能自主完成,此次案例借助杜邦分析法实现指标销售额的拆解,并通过同比指标判断异常原因。
在产品落地层,该BI报表需要便于运营对不同时间段、不同产品类别的销售变动进行原因分析。基于该业务需求,形成了下图中的报表设计页面。
为了便于教程中的对应讲解,把画布中的报表设计分成:页面标题区、分析维度区、指标拆解区、经营成效分析区。接下来的内容将逐一完成这些区域的设计。
使用场景
按“以终为始”的落地思维,在开始实现报表之前,需要先对产品最终落地的使用场景进行讨论,才能倒推出所需要的功能、数据。
按业务需求,报表需要实现按时间维度及产品维度对销售数据进行分析的功能。
时间维度
如图,在分析维度区中的“分析时间”切片器,筛选2021年1月1日至2021年3月31日。
指标拆解区和经营成效分析区呈现的销售数据就是2021年1季度、2020年1季度及它们之间的同比。
其中,产品类别表现中,呈现的是2021年1季度产品类别的销售数据。
时间×产品维度
如图,在分析维度区中的“分析时间”切片器,筛选2021年1月1日至2021年3月31日,在“产品类别表现”表格中选中办公用品,则指标拆解区和经营成效分析区呈现的就是2021年1季度、2020年1季度的办公用品销售数据及同比。
其中,产品类别表现中,呈现的是2021年1季度办公用品的销售数据。
回到落地场景中,业务会结合产品维度进行分析,但是每次操作时应该看哪个产品类别呢?所以,业务还会需要到产品类别的数据表现,来帮助做初步的判断。
因此,在这里,分析维度区中以”产品类别表现”的表格形式作为产品维度筛选的依据,具体内容是分析产品的销售结构。
明确了业务需求及最终要交付的报表后,就可以着手开始报表制作。
接入数据
首先,需要接入业务数据。
PowerBI提供了丰富的数据源接口,比较常用的是Excel、SQL,可以按需使用。
数据源
在业务需求的讨论中,可以明确所需的业务数据是销售表及产品表。
产品表Model-DimProduct:用于记录不同产品的数据,例如类别、子类别、产品名称、对应的品牌及标签价。其中,spu可以简单理解为产品型号。
销售表Model-FactSales:用于记录客户的订单数据,例如订单ID、订单日期、客户ID、订单对应的产品sku(可以简单理解为产品规格)、产品spu、商品件数及订单金额。
其中,sku是spu是下一级,例如 iphone13 是spu,而不同颜色规格的 iphone 13 black 是sku,还可以是不同容量的 iphone 13 256G。
新建日期表
对于涉及时间分析的场景,需要新建日期表,通过对日期表中时间字段的筛选,计算不同时间段下的销售指标。
切换到“数据”功能页,在功能区中找到表工具-新建表功能。
在代码区输入日期表的通用Dax代码,即可。
日期表 = ------------------------------------------------------------------制作日期表的相关参数,可根据需要修改VAR YearStart = 2020 //起始年度VAR YearEnd = 2023 //结束年度VAR WeekNumberType = 2VAR WeekDayType = 2 -----------------------------------------------------------------RETURNGENERATE ( CALENDAR( DATE( YearStart , 1 , 1 ) , DATE( YearEnd , 12 , 31 ) ), VAR Year = YEAR ( [Date] ) VAR Month = MONTH ( [Date] ) VAR Quarter = QUARTER( [Date] ) VAR Day = DAY( [Date] ) VAR YearMonth = Year * 100 + Month VAR Weekday = WEEKDAY( [Date] , WeekDayType ) VAR WeekOfYear = WEEKNUM( [Date] , WeekNumberType ) RETURN ROW ( "年" , Year , "季" , Quarter , "月" , Month , "日" , Day , "日期编码" , Year * 10000 + Month * 100 + Day ))
得到的日期表如图所示。
数据建模
数据准备好后,切换到“模型”功能页,进行数据建模工作。
在业务需求中,我们明确了时间、产品类别的分析维度,因此,结合“维度建模”的方法论,需要以日期表、产品表作为维度表,以销售表作为事实表进行分析,使它们之间形成1对多、单向的表间关系,得到的数据模型如下:
- 日期表('Model-DimDates'[Date]) → 销售表 ('Model-FactSales'[订单日期])
- 产品表('Model-DimProduct'[spu]) → 销售表 ('Model-FactSales'[spu])
如何操作?
用鼠标把日期表Model-DimDates中的Date字段,拖拽到销售表 Model-FactSales中的订单日期字段位置,如图所示,松开鼠标即可完成关联。同理需要完成销售表和产品表之间的关联。
新建度量值 | 写Dax
接下来切换到“数据”功能页,开始可视化报表中度量值的准备。
指标拆解区
该区域是此报表中的核心,涉及的指标及公式:
- 销售额 = 订单数 × 客单价
- 订单数 = 销量 × 连带率
- 客单价 = 件单价 × 连带率
其中,连带率衡量的是每次客户购买时的平均商品数量。
接下来逐个分析如何新建度量值。
本期指标
销售额
销售额可以通过把订单表中的金额做累加实现。
销售额 = sum('Model-FactSales'[订单金额])
如何操作?只需在表工具中,点击“新建度量值”,在代码区输入语句即可。
订单数
在零售业务中,对订单的处理逻辑需要按日合并,也就是说,假设客户A在2022年6月1日内消费了多笔订单,业务上也认为客户A在2022年6月1日仅消费了一笔。
因此,统计订单数不能直接使用订单ID,需要重新对每笔订单按客户ID和日期做标记,形式是:客户ID+空格+订单日期,这样,对每个客户同一天的多个消费订单都有相同的订单标记。
新建列
选择销售表Model-FactSales,在功能区-表工具中,选择“新建列"。
输入订单标记的公式即可。
其中,CONCATENATE是对两个字符串进行拼接,而订单标记有三个字符串,所以应用了两次CONCATENATE。
订单标记 = CONCATENATE(CONCATENATE('Model-FactSales'[客户 Id], " "), FORMAT('Model-FactSales'[订单日期],"YYYY-MM-dd"))
订单数计算
此时,通过对订单表中的订单标记字段进行去重计数,就能得到订单数指标。
订单数 = DISTINCTCOUNT ( 'Model-FactSales'[订单标记] )
客单价
DIVIDE是Dax中的除法函数,利用它,基于前面提及的公式:把销售额除以订单数,即可得到客单价指标。
客单价 = DIVIDE ( [销售额], [订单数] )
销量
对订单表中商品件数进行求和即可得到销量指标。
销量 = SUM ( 'Model-FactSales'[商品件数] )
连带率
基于前面提及的公式:把销量除以订单数,即可得到连带率指标。
连带率 = DIVIDE ( [销量], [订单数] )
件单价
基于前面提及的公式:把销售额除以销量,即可得到件单价指标。
件单价 = DIVIDE ( [销售额], [销量] )
同期指标
利用Calculate+时间智能函数SAMEPERIODLASTYEAR,就可以轻松计算同期数据。
同期销售额 = CALCULATE([销售额],SAMEPERIODLASTYEAR('Model-DimDates'[date]))同期订单数 = CALCULATE ( [订单数], SAMEPERIODLASTYEAR('Model-DimDates'[Date] ))同期客单价 = DIVIDE ( [同期销售额], [同期订单数] )同期销量 = CALCULATE ( [销量], SAMEPERIODLASTYEAR('Model-DimDates'[Date] ))同期连带率 = DIVIDE ( [同期销量], [同期订单数] )同期件单价 = DIVIDE ( [同期销售额], [同期销量] )
同比指标
同比的计算公式,例如销售额同比 = (本期销售额 - 同期销售额) / 同期销售额,经过通分可以优化成:
销售额同比 = 本期销售额 / 同期销售额 -1
基于此,就可以得到如下同比指标的计算公式:
销售额同比 = DIVIDE ( [销售额], [同期销售额] ) - 1订单数同比 = DIVIDE ( [订单数], [同期订单数] ) - 1客单价同比 = DIVIDE ( [客单价], [同期客单价] ) - 1销量同比 = DIVIDE ( [销量], [同期销量] ) - 1连带率同比 = DIVIDE ( [连带率], [同期连带率] ) - 1件单价同比 = DIVIDE ( [件单价], [同期件单价] ) - 1
经营成效分析区
基于公式,累计客单价 = 销售额 / 人数,就可得到度量值计算语句:
人数 = DISTINCTCOUNT ( 'Model-factsales'[客户 Id] )累计客单价 = DIVIDE ( [销售额], [人数] )
其中,客单价与累计客单价指标的区别在于,前者是每个客户单次订单的平均金额,而后者是每个客户多次订单的累计金额。客单价的使用场景可以是每次活动前的选品,而累计客单价则衡量客户的消费能力。
分析维度区
分析维度区的作用在于选择不同维度进行筛选计算,其中,时间维度可以直接通过日期表中的字段进行筛选,不需要新建度量值。
而产品类别维度其实一般来说也是直接使用产品表的字段即可,但是为了展示通过表格筛选数据的效果,同时,也是为业务提供更好的报表使用体验,这里也新建了产品相关的度量值。
销量占比
在产品类别表现表中,同步销量占比来分析产品类别的销售结构。这里的计算逻辑稍微更复杂了一些。
总体的公式:销量占比 = 销量 / 总销量
其中,为了消除上下文的限制,使用ALL函数选择了所有的产品,这样放到产品类别表现中,得到的结果就是某个类别的销量,占所有类别销量的比例。
销量占比 = DIVIDE ( [销量], CALCULATE ( [销量], ALL ( 'Model-DimProduct' ) ) )
销量占比同比
结构分析中,同样需要通过同比看销量结构的变化。而比例、占比、百分比类型的指标做同比时,一般不说提升/降低了百分之多少,而是通过提升/降低了多少个百分点来表示。
例如2022年办公用品销量占比20%,而2021年办公用品销量占比10%,一般不说2022年办公用品销量占比同比提升100%,而是说2022年办公用品销量占比同比提升了10个百分点。
在介绍PowerBI核心概念的文章中,我们说“利用SQL的思维去看PowerBI有助于我们理解它的运行逻辑”,在这里就得到了印证:回到度量值的语句中,要展示多少个百分点的语句逻辑其实跟SQL中相似,例如SQL写百分数的语句是:
SELECT CONCAT(CAST(ROUND((3/21)*100,2) AS CHAR),'%') AS '百分比' FROM TABLE
在PowerBI中,写销量占比同比需要先用FORMAT函数对计算结果进行格式化,再利用CONCATENATE 将数字结果和单位“个百分点”拼接起来。
销量占比同比 = CONCATENATE ( FORMAT ( ( [销量占比] - [同期销量占比] ) * 100, "0.0" ),"个百分点" )
至此,我们就完成了所有度量值的建立。
数据可视化
接下来切换到“报表”功能页,开始可视化报表的操作。
指标拆解区&页面标题区
新建卡片
这里的报表指标主要以“卡片”的形式实现。
从可视化-图表类型中,找到“卡片图”,然后把“销售额”指标拖拽到卡片图的“字段”位置即可。
同样的原理,新建所有需要的卡片。
调整格式
新建图表后,读者会发现新建的图表和笔者的样子不一致。那是因为,我已对图表进行了格式设计,以优化业务使用时的可视体验。
如何做呢?点击需要调整的图表,在图表设计区域,进入格式栏。
里面可以对图表进行不同的可视化设计,例如把边框去掉、调整数据标签中的字体类型及大小,就能得到如图中“人数同比”的卡片样式。
分析维度区
时间维度
日期的筛选是通过切片器实现的。
在可视化-图表类型中找到切片器,拖拽到画布中,把日期表Model-DimDates中的Date拖拽到“字段”中即可。
产品维度
产品类别表现是一个表格,按如图的顺序把表格字段、及度量值拖拽到“值”的位置即可。
页面标题区
最后,作为完整的分析报表,需要有标题。
导航背景
在功能区找到形状-矩形,插入后调整格式中的填充等设置即可。
标题|文本框
接着,在功能区相同的位置找到文本框,插入、填写标题后对格式进行调整即可。
落地交付
至此,我们就完成了报表页面的制作,效果如图所示。
报表更新
最后留下一个小课题需要你去探索:报表如何实现更新?
提示:尝试先把数据源手动做修改,例如在Excel或者SQL上修改订单金额,然后回到PowerBI,在功能区找到“刷新”,点击一下,看看数据是不是都更新了呢?