📚 本文配套课程 · 数据可视化分析系列
🎬 B 站课程:数据可视化分析:Tableau/SQL 原理与实践 — https://www.bilibili.com/cheese/play/ss8093
主题领域:供应链物料需求预测 ; 2025/01/01更新
最近在阅读制造业大佬刘宝红老师的《供应链的三道防线:需求预测、库存计划、供应链执行》,还推荐给我的制造业客户阅读。前日在飞机上读到“客户集中度分析”,今天就使用客户的生产数据快速实现了一下,感觉还不错。
本文将制造发货的数据,改为Tableau Desktop自带的零售发货数据,介绍一下业务背景及其实现方法。

一、客户TOP与客户“集中度”分析的背景
在《供应链的三道防线》一书中,刘老师解释需求预测的重要性,并提供了多种方法辅助销售人员实现较为精准的需求预测(虽然所有的预测都是错的、有偏差的)。
需求预测的一个极佳起点是历史的发货明细,明细中藏着各种真相,比如客户的进货频率、物料的集中程度、发货数量的偏差等。在预测时,占比较大的关键客户是重点,很多公司的TOP客户往往占据了过半的销售需求,因此找到这些客户并加以预测时关键。
在Tableau中,我们很难计算“销售额占比前20%的客户”,这样这个计算涉及到每个客户的发货数量、排序、累计,这种聚合后的跨行计算是表计算(SQL窗口函数)的专长,需要在聚合表基础上做二次计算才能完成。好在Tableau提供了间接的替代方案,即“顶部集”。 我们可以使用参数、集、条形图、快速表计算快速验证客户的集中程度。
如下所示,我们发现销售额总和前50名的客户,累计占比占公司的22%。不断调整参数,我们可以找到近期的的客户数量。

但是,如果只看“每个客户的销售数量”,然后关注TOP客户,其实是不足以做好预测的。因为预测的单位不是客户,而是产品。从销售的角度看,“给每个具体的客户提供合适的产品”才是合理的销售过程,也是合理的销售单位。
基于此,就需要从“每个客户的产品构成”角度,进一步理解客户的集中度程度。假设一个产品100%的由某个客户所采购(定制化产品),那么预测就可以做到更高的准确性;而如果一个产品的最大客户占比不超过30%,说明客户集中度很低,预测准确性就必然大幅下滑——预测人员很难了解每个客户的需求并加以汇总,误差会随着因素增加而扩大。
这就是“客户集中度”的来源,即借助于每个产品的客户结构,聚焦占比较大的客户提高产品的预测准确性。客户集中度体现了两个关键维度之间的结构化关系——分析的对象是产品(物料),隐秘的结构化构成则是客户,理解这一点是关键。
二、限定每周范围下的(品牌)客户集中度
特别修改:鉴于Tableau默认的超市数据,每周的product name基本都是单一客户,因此V2使用Brand来重新计算“客户集中度”。 Jul 30, 2023
分析始于问题,先按照标准的问题结构,将问题明确如下:
- 过去26周,每周的 (品牌)“客户集中度”
为了简化问题,这里虚拟了一个逻辑指标“客户集中度”,它虽然使用了“客户”,但其实是描述“品牌”的。这就是让整个问题变得难以理解的关键。接下来,先精确地理解分析范围、问题对象、问题答案。这里的关键当然是答案(度量)部分,为此,我们进一步展开如下:
- 过去26周, 每周 的 单一客户销售过半的产品品牌相对于本周所售品牌数之比
在这里,问题答案是单一度量,单一度量是两个子度量的算术计算。接下来,难点就变成了,如何完成两个“子指标”计算。
“本周所销售品牌数量“的指标范围等同于问题的维度(每周),因此分母字段可以使用数据表已有字段直接聚合而来,因此借助于Tableau的拖拽即可快速实现如下的可视化:

难点在于,我们如何筛选另一个“子指标”的聚合对象:单一客户销售过半的品牌。一方面,它包含了聚合(先完成客户的销售总和),另一方面它包含了跨行的占比(单一客户的聚合值需要和所有客户的聚合值计算比例)。
- A=每周、每个品牌、每个客户的销售额总和
- B=每周、每个品牌 的销售额总和
- 如果A/B>=0.5 ,那么返回这个 品牌
- 对上述品牌计数
- 集中度:满足上述条件的 品牌,在本周动销品牌的比例
由于是单一客户在所有客户中的比例,直觉的思路是窗口函数(合计百分比),但合计百分比是对每个客户计算比例,而要相反TOP客户极其困难。从SQL角度看,虽然可以用窗口函数完成,但本题不是窗口计算的电信场景——窗口函数的专用场景是跨行的比较,比如排序、累计计算。合计百分比中的“合计”可以视为是无关方向的特殊窗口函数(partition by)。
而在Tableau中,考虑到表计算必须基于聚合值做二次聚合,且难以返回数据值再次聚合,这里借助于LOD表达式完成。
由于要引入多个全新的维度(品牌、客户),这里要么使用FIXED LOD,要么使用INCLUDE LOD。如下所述,使用include LOD快速完成上述的分子和分母,而后计算比例、返回集中度高的品牌,并再次聚合。

在此基础上,两个“子指标”再次计算,就可以获得(品牌)“客户集中度”指标了。
需要注意的是,最终的视图中,即没有客户、也没有产品,有的只是它们的结构关系,因此这个问题,可以作为结构化分析的关键案例了。

三、限定26周整体范围下的的客户集中度
在上述计算中,分子和分母都被限定了“某一周”的范围,这样理解上较为容易;但是这种计算的“集中品牌”就会在每周都品牌变化,集中度容易受到单周临时计划的影响(比如品牌A的最大客户本周正好没有下单,其他客户非常零散,那么本周就不是“集中品牌”)。
比如下图所示,品牌Eldon在某些周分散,但在12月18日这一周,单一客户Emily贡献了该品牌一半以上的销售,因此本周该品牌就属于高度集中品牌。

能否从整个26周的范围,统一确认一个品牌是否为“客户高度集中”,还是“不集中”呢? 这样在做物料的需求计划时,我们就免于每周的波动,聚焦关键品牌的关键客户。因此,我们也可以把“客户集中度”的分子,设置为“在过去26周范围中,单一客户销售量占比超过50%的品牌”,之后再和本周活跃的物料计算比值。
- 分子:在过去26周完整范围中,单一客户销售量占比超过50%的品牌
- 分母:本周的动销产品数量(SKU)
按照这个理解,我们可以用第二部分的计算略作调整,鉴于既要排除视图中“周”日期的级别,又要引用视图中没有的“产品、客户”级别,所以就是相对于当前问题级别完全独立的详细级别,就需要使用FIXED LOD完成了。 如下计算完成分子:
countd(if { FIXED [Brand,[Customer Name]:SUM([Sales])}/{ FIXED [Brand]:SUM([Sales])} >0.5
then [Brand] end )
使用这个逻辑,需要注意FIXED LOD计算和日期筛选器的优先级,嵌套子查询优先级默认早于where日期筛选,这里借助于Tableau上下文筛选器轻松解决。如下所示:

相比于第二步的方法,使用FIXED LOD获得的比例明显更小,因为消除了周之间的品牌波动。
读者可以思考一下上述两种方法,在企业中的应用场景。
四、将“集中度”改为动态参数并展示细节
1
上述分析是假设超过50%方为“集中”,这种情况下,单个产品超过50%的客户就只可能有一个;如果将集中度修改为0.3或者0.4这样的比例,那么集中的客户可能有两个甚至三个。
因此可以使用参数优化上述内容。

比如品牌 A 在2024年第21周,客户 C1贡献了总规模的33%、客户 C2贡献了40%、其他零星客户贡献了剩余部分,那么按照单客户贡献超过30%的“集中度”来看,两个客户满足条件,可以标记为“集中客户”,当然这个品牌也可以标记为“高度集中品牌”。
2
很多客户的物料波动性比较大,因此可以查看连续26周的集中度情况。同时,可以借助于仪表板为业务用户展示高度集中的品牌及其对应客户情况,从而辅助预测——预测的粒度是“物料*客户”,预测的对象应该是历史上高度集中的物料和客户。
如下图所示,展示了过去26周(上下文筛选),单客户集中度在45%以上的物料比例及其详情。BoxOffice 品牌集中于两个客户,其他则多半是单一客户。

这里的难点是如何筛选,筛选基于集中度的条件,比如跨26周的筛选条件应该排除下面字段中为 null 的部分:
//筛选保留
IF { fixed [brand],[Customer Name]: SUM([Sales]) }
/ {fixed [brand]: SUM([Sales]) } >=[p阈值]
THEN [Customer Name] END
基于 ERP 记录预测,基于 BI分析和确定预测范围,ERP+BI 可以推动更好的数据预测。
喜乐君
Jul 29, 2023 于 G3高铁
Jul 30, 2023
2024-11-30 补充第四部分,择日完善文件
2025-01-01 补充最后一节,增加参数,增加明细
Pingback: 【制造业分析】安全库存分析与Tableau简述 – 喜乐君
评论已关闭。