看专家怎么用 Power BI 算零售业务中的连带率,知道差距了

2020-11-02 10:45:01 浏览数 (1)

本文得到:郑老师 授权发布。

上回介绍了有效单据数的几种常见计算逻辑,建议大家能从头重点学习。单据数的计算,已经从根本上破除了简单认知,那么基于单据数的一切指标的计算都需要得到重新规划。这将帮助大家从最简单的认知模式进入更专业的认知模式。

连带率,就是零售业务中的一个重要常见指标,由于单据数的计算被专业化,那么,连带率的计算必然发生调整。本节重点介绍连带率计算的一些注意点。

从逻辑上来看:连带率 = 销售数量 / 单据数。连带率,代表顾客单次平均购买件数,考核的是销售人员的连带销售能力以及后台的商品组合设计能力。到底哪些商品的销售能够计入到连带率的有效考量。

场景1:全部有效法

场景1:全部有效法。门店销售的所有商品均计入连带率计算。用 PowerBI DAX 表示,如下:

代码语言:javascript复制
// 单据数的计算已经给出,这里采用折中的正单有效法

// 先定义:
Core.销量 = SUM( 'Model-Factsales'[数量] )

// 再定义:
单据数2 = 
CALCULATE (  
    DISTINCTCOUNT ( 'Model-Factsales'[单据编号] ),  
    FILTER ( 
        VALUES ( 'Model-Factsales'[单据编号] ), 
        [Core.销量] > 0 
    )
)

// 连带率的计算则有:
连带率1 = DIVIDE( [Core.销量], [单据数2] )

不难发现一个问题:单据数2的计算只保留了正单(销量大于0)的情况,而这与如上的:Core.销量 = SUM( 'Model-Factsales'[数量] )不一致,因为Core.销量的计算并未考虑只保留了正单,其范围与单据2的范围就不统一了,这就不公平了。

场景1 :全部有效法的调整

那么就需要一种适配调整,用 PowerBI DAX 表示,如下:

代码语言:javascript复制
销量 正单有效 =
CALCULATE (
    [Core.销量],
    FILTER ( VALUES ( 'Model-Factsales'[单据编号] ), [Core.销量] > 0 )
)

连带率1.1 = DIVIDE( [销量 正单有效], [单据数2] )

这样,如果单据数采用”正单有效法“,那么连带率需要这样调整来与之对齐。

场景2:赠品剔除法

场景2:赠品剔除法。销量中剔除赠品类或凑单类商品(袜子、内裤等),只计算门店主销商品的销售数量,这样更能准确地考核销售人员的真实连带销售能力。每当门店进行满送、满减活动时,例如满688元送制定裤子一条,满788减100元等等,顾客买到心仪的几件商品后,发现离档位还差十元左右,再花上百元买一件主销货品不划算,这时候往往选择拿双袜子凑单,享受门店活动,这双袜子的销量就应从连带率的计算中剔除。用 PowerBI DAX 表示,如下:

代码语言:javascript复制
销量 剔除赠品 =
CALCULATE ( 
    [Core.销量], 
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" } 
)

连带率2 = DIVIDE( [销量 剔除赠品], [单据数2] )

与场景1中分析的问题类似,只不过这里存在更复杂的不匹配情况:

  • 销量的计算,未考虑正单有效
  • 单据数的计算,未剔除赠品

场景2 :赠品剔除法的调整

与”场景1 “的改进类似,需要对”场景2“的计算做销量和单据数计算的双向优化调整,让销售计算转为正单有效;同时,让单据数的计算剔除赠品。用 PowerBI DAX 表示,如下:

代码语言:javascript复制

// 销量的计算:

销量 剔除赠品 =
CALCULATE ( 
    [Core.销量], 
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" } 
)

销量 正单有效 剔除赠品 =
CALCULATE (
    [销量 剔除赠品],
    FILTER ( VALUES ( 'Model-Factsales'[单据编号] ), [Core.销量] > 0 )
)

// 单据的计算:

单据数2 = 
CALCULATE (  
    DISTINCTCOUNT ( 'Model-Factsales'[单据编号] ),  
    FILTER ( 
        VALUES ( 'Model-Factsales'[单据编号] ), 
        [Core.销量] > 0 
    )
)

单据数2 剔除赠品 =
CALCULATE ( 
    [单据数2], 
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" }
)

// 再计算连带率:

连带率2.1 = DIVIDE ( [销量 正单有效 剔除赠品], [单据数2 剔除赠品] )

这样,赠品剔除后,连带率的计算就更加严谨了。

通过对场景1和场景2的优化,可以看出:

  • 理论的零售中指标计算概念仅仅是理论的,实际中必然会做更精确的调整。
  • 指标的计算调整和优化使得某个指标更加合理和严谨。

由于在场景1和场景2的优化中,是以”正单有效法“的单据数计算作为参考的。同样地,可以将其他的单据计算方法整合进入连带率的计算。接下来,给出这些计算的优化。

场景3:赠品剔除法 负单扣除法

与上述优化,类似,赠品剔除法 负单扣除法的 PowerBI DAX 表示,如下:

代码语言:javascript复制

// 销量的计算:

销量 剔除赠品 =
CALCULATE ( 
    [Core.销量], 
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" } 
)

// 销量 按 负单扣除 计算:

销量 负单扣除 剔除赠品 =
VAR X =
    CALCULATE (
        [销量 剔除赠品],
        FILTER ( VALUES ( 'Model-Factsales'[单据编号] ), [Core.销量] > 0 )
    )
VAR Y =
    CALCULATE (
        [销量 剔除赠品],
        FILTER ( VALUES ( 'Model-Factsales'[单据编号] ), [Core.销量] < 0 )
    )
RETURN
    X   Y

// 单据数 按 负单扣除:

单据数3 = 

    VAR X =
    CALCULATE ( 
        DISTINCTCOUNT ( 'Model-Factsales'[单据编号] ), 
        FILTER ( VALUES ( 'Model-Factsales'[单据编号] ), [Core.销量] > 0 )
    ) 

    VAR Y =
    CALCULATE ( 
        DISTINCTCOUNT ( 'Model-Factsales'[单据编号] ),
        FILTER ( VALUES ( 'Model-Factsales'[单据编号] ), [Core.销量] < 0 )
    )

    RETURN X - Y

单据数3 剔除赠品 =
CALCULATE ( 
    [单据数3], 
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" } 
)

连带率3 =
DIVIDE ( [销量 负单扣除 剔除赠品], [单据数3 剔除赠品] )

这里需要注意的是[销量 负单扣除 剔除赠品]写法,本质是找到整单销量为正的单据的销售数量以及整单销量为负的单据的退货数量,然后把整单销量为负的单据的退货数量也做扣减,因为负单的整单退货数字本身为负,所以这里使用 “ ”,而不是像前文计算有效单据数时使用 “ - ”。而整单销量为 0 的单据不做考虑。仔细想来,这套逻辑虽然比较绕,但本质就是最简单的[Core.销量]的计算逻辑,销货做加法,退货做减法,所以:

代码语言:javascript复制
销量 负单扣除 剔除赠品 = [销量 剔除赠品]

回归最初。所不同的是在单据数的计算上,一销一退两张单据并没有累计为 2 张,而是通过精准的计算逻辑抵消为 0。

注意

再次强调:

代码语言:javascript复制
销量 负单扣除 剔除赠品 = [销量 剔除赠品]

内在的逻辑等价性,需要仔细体会上述推导过程。

场景4:赠品剔除法 见负作废法

与上述优化,类似,赠品剔除法 见负作废法的 PowerBI DAX 表示,如下:

代码语言:javascript复制
// 销量的计算:

销量 剔除赠品 =
CALCULATE ( 
    [Core.销量], 
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" } 
)

销量 见负作废 剔除赠品 =
VAR vOrderInvalid =
    CALCULATETABLE (
        VALUES ( 'Model-Factsales'[单据编号] ),
        'Model-Factsales'[数量] <= 0
    )
RETURN
    [销量 剔除赠品] - CALCULATE ( [销量 剔除赠品], vOrderInvalid )

// 单据数的计算:

单据数4 =
VAR vOrdersAll = DISTINCTCOUNT ( 'Model-Factsales'[单据编号] )
VAR vOrdersInvalid = 
    CALCULATETABLE ( 
        VALUES ( 'Model-Factsales'[单据编号] ), 'Model-Factsales'[数量] <= 0
    )
RETURN 
    vOrdersAll - COUNTROWS ( vOrdersInvalid )

// 进一步有:

单据数4 剔除赠品 =
CALCULATE ( 
    [单据数4],
    NOT 'Model-Dimproduct'[中分类] IN { "袜子", "内裤" } 
)

连带率4 = DIVIDE ( [销量 见负作废 剔除赠品], [单据数4 剔除赠品] )

总结

按照不同的场景,对连带率的计算会得到不同的结果,以样本数据来看,观察以下的差异:

通过单据数和连带率两个核心指标的思考和用 PowerBI DAX 给出的过程,可以发现这是在零售分析的理论逻辑下,不断优化以更加接近现实。

对于客单价的计算,也是遵循同样的逻辑:客单价 = 销售额 / 单据数。如果销售额剔除了赠品的影响,单据数也要剔除赠品的影响;单据数对退换货做了处理,销售额也要做相同处理,保持分子分母计算口径的统一。小伙伴们可以仿照连带率的计算逻辑,动手计算不同场景下,客单价的计算公式。

以上就是关于单据数、连带率计算的讲解,有些复杂,也有点烧脑,但却精准定义了商业问题的来龙去脉。如果没有 PowerBI DAX 辅助,而是纯手工一步步运算或者仅仅靠 Excel 的公式,这个工作量不仅很大,而很大层面上,在精准定义后的计算会非常慢,导致不可用,而且容易出错。

如果使用简单的计算规则近似计算结果,数据量大时差异并不明显,但数据量小时,差异是巨大的。这也进一步证明了 PowerBI DAX 的强大和其极具实用性的应用价值。学好商业分析,从搞懂基本指标的业务含义、计算逻辑和计算口径开始。

更多使用 PowerBI 解决零售行业业务场景的案例,已经制作成《零售行业通用业务模型》,并录制成系列课程,方便小伙伴们系统提升,欢迎 阅读原文至云课堂 试听学习!

下集预告:你真的知道公司有多少家门店吗?如何准确计算门店数。

0 人点赞