finebi 案例3 健身房数据分析(建模)

打开帆软在线数据分析平台

数据上传上去,分析主题命名为 "finebi 案例3 健身房数据分析"。当我们拿到数据之后,先学会阅读数据。

表数据解读

一共 5 张表,这很符合实际的场景。在实际场景当中,不可能随时都是一个汇总的数据。它更大可能是跟汇总数据关联的好几个表格。

python 复制代码
门店信息表
产品信息表
教练薪酬表
销售额数据表
费用汇总表

我们来观察一下,门店信息表里面有什么呢?地区、门店、城市、店铺面积还有月租金。

产品信息表里面有产品ID、课程种类,以及每课时价格。

教练薪酬表有教练ID、产品ID、每课时薪酬、月固定底薪,以及门店。

销售额数据表里有订单编号、订单日期、门店、产品ID、课时数,以及教练ID。

费用汇总表的字段有门店、财务日期、科目,以及支出。

为什么要建模

建模介绍

刚开始看这一份数据的时候应该觉得,好像整体上并没有什么问题。那么现在思考一个问题,如果计算一下,当前的总销售额的话,应该怎么去计算。现在表有很多,要去计算总销售额,一定是去销售额数据表里面去计算。然后我们会发现,在销售额数据表里能够去计算的指标只有一个,课时数。所以,要计算总销售额,通常要用到销售额数据表里面的课时数,用它去乘以当前的课时单价,而课时单价在产品信息表里面。它当中就有每一个产品对应的价格是多少。

总销售额:课时数(销售额数据表)* 每课时单价(产品信息表)

但是,现在这两个字段分别来源于不同的表,是不能直接计算的。如果就是要计算这个东西,就要用到建模。什么叫做建模?将两张表通过某个字段来进行关联。

在销售额数据表当中,有产品ID以及它对应的卖出去的课时数的,在产品信息表里面,只需要找一下当前产品ID它对应的每课时价格。我们确保产品ID保持一致就可以了。这样可以计算出每一个产品对应的总销售额是多少。

再看一下,有一张表叫做教练薪酬表。它里面有教练ID、产品ID、每课时薪酬、月固定底薪,以及门店。如果要去计算教练应发总工资,所有的这些教练,他们一共要发的工资是多少。应该怎么计算?首先要搞清楚总工资是由什么组成的。由底薪 + 课时费,底薪我们可以拿到,但是课时费无法直接从教练薪酬表里面拿。需要拿着教练薪酬表里面的教练ID和产品ID。注意,每一个教练有多个产品,每个产品的时薪是不一样的。所以这里要带着教练的ID和产品的ID,然后来看一下销售额数据里面,它当中有产品ID,有教练ID。我们把它也去关联一下。

就是薪酬表里的教练ID和销售数据表里的教练ID对应上,薪酬表里的产品ID和销售额数据表的产品ID也对应上。这样就能够根据课时数和时薪计算出当前的课时费是多少。

上述的这么多内容,讲的就是一个事儿,一张表不够的情况。如果我们要计算这些东西,从单一的某一张表里面是实现不了的,这个时候要用某一个东西把我们表当中的一个字段进行关联,这样就可以使用当前表里面字段。这个叫做建模。

建模的话,就涉及到了表关系。

表关系介绍

表关系有:一对一(1:1)、一对多(1:N)、多对多(N:N)、多对一(N:1)。注意,这种一对一,和多对多,很少去用它们。在去做数据分析的时候,更多的是将我们的表关系来处理成一对多的关系(1:N)。

在这里也有一种说法,1 的一方,我们称之为维度表,N 的一方我们称之为事实表/明细表。两者有什么区别或者关系呢?维度表通常是作为筛选条件的,而且要确保里面的值是唯一的并且里面不能有空值。通过维度表可以筛选事实表当中的数据。

回过头看我们当前的示例。我们有产品信息表,在产品信息表当中,每一个产品的ID都是唯一的,所以当前的产品表就可以作为一个维度表。

然后,谁作为事实表?我们看一下销售额数据表,在当前这张表里,每一产品,它是有多个购买记录的。

就可以通过产品信息表来筛选销售额信息表里面的东西。比如想看一下产品PROD101,当前这一个产品,它总共的销售额是多少。我们就可以筛选产品表当中产品ID = PROD101的值,先看一下它的每课时价格是多少,然后拿着我们筛选出来的内容和它对应的价格,来到销售额数据表里面,针对这个 ID 为 PROD101 的单独筛选出来,然后计算总课时数是多少。

计算出来之后再拿总计课时数乘以产品信息表中的课时价格。

这就是维度表和事实表之间的关系,从一方来筛选多方的数据。我们在去做的时候,在去写这个仪表板的时候,通常也会去在过滤组件里面,添加上维度表里面的字段。比如添加一个产品ID的过滤组件,那就会用的产品信息表里的这个ID给它放上去就可以啦。

总结一下:现在这些表是没有关系的,如果我们计算某一个指标,单用一张表不能计算的到。所以这个时候我们需要去建立一个这样的模型关系,让两张表产生一个关联,产生关联之后我们就能在一个图标当中用多张表里面的字段了。

接下来我们实现一下,捋一捋它们之间的关系。

建模

首先是销售额数据表。它有:订单编号、订单日期、门店、产品ID,课时数以及教练ID。

这是销售数据表,在 finebi 当中怎么建立这个模型呢?打开帆软在线数据分析平台。点击我的分析,新建分析主题,命名为"finebi 案例3 健身房数据分析"。把数据传上去。

左上角有个选项,第二个,这个就是我们建立模型的地方。

点击之后,我们可以看到全部的表格,都在模型视图里。

先点击拖动,把它们排开,为了方便一会去看。排成这个样子。

首先,销售数据表里有很多的字段,在它的上方是产品信息表。销售表和产品信息表之间有没有关系?这俩的产品ID应该是同一个,这俩通过产品ID来关联上。所以我们要确立模型。

在 finebi 当中,直接拖就可以。点住产品信息表,直接将它拖到销售额数据表的上方。当我们拖上去之后,在右侧就会出现一个编辑关系的选项。

用于连接的字段已经告诉用户了,两张表关联的字段就是产品ID。下方还有一个高级设置,我们把它展开。可以看到,两者的关联关系,销售额数据表是多的一方,产品信息表是1的一方。

很显然,产品信息表作为维度表,销售额数据表是事实表。现在,它们的关系已经被成功创建上了。这是第一个。

还要继续,还有其他表没有关联上呢。

再来看,我们的销售额数据表和门店信息表之间有没有什么关系。

发现,门店信息表里的门店,和销售额数据表里的门店是一致的。门店信息表里的门店没有重复值,所以它也能作为维度表关联上销售额数据表当中的门店。回到 finebi,直接拖就行了。点住门店信息表,拖到销售额信息表上方。拖动之后,自动通过门店关联在一起的,展开高级,看一下关系对不对,销售额数据表是 N,门店信息表是 1,没毛病。所以关联创建成功。

再来看,这个费用汇总表,它应该和谁有关系。费用汇总表有门店,除了门店,其他字段在其他表当中都没有对应的字段。所以费用汇总表的关联字段应该是门店。进一步看看,发现费用汇总表里门店的值,每一笔门店都是有多条记录的。

所以费用汇总表应该也是作为 N 的一方去建模。把它通过门店字段,和门店信息表相关联。

看一下,门店信息表是 1 的一方,费用汇总表是 N 的一方。关联字段是门店。非常正确。这会儿,三个关系就已经创建完成了。

最后,看一下教练薪酬表,应该是和谁相关的。看一下这里的字段,如果我们单看教练ID、产品ID以及门店,我们会发现这三个字段都不是唯一的。

但是,如果把这三个字段结合在一起,比如,TR001 教练 + PROD112 产品 + ST1003 门店,这三个结合在一起就是唯一的。

在 finebi 里,不能多个字段同时去建立连接,所以简单一点, 把教练薪酬表和产品信息表建立关系。想计算一下每个产品总计的销售额情况,这里通过产品字段给它们关联上就行。

建立好之后检查一下,通过产品ID这个字段进行的关联,教练薪酬表是 N 的一方,产品信息表是 1 的一方。产品信息表是维度表,教练薪酬表是事实表,没毛病。现在这个关系全部建立完成。

写一下这些关系,当前这些表的关系:一共 4 根线,4 个关系。

python 复制代码
门店信息表 : 销售额数据表  # 1:N
门店信息表 : 费用汇总表  # 1:N
产品信息表 : 销售额数据表  # 1:N
教练薪酬表 : 产品信息表  # N:1

核心KPI

销售规模

1、总销售额

这个公式刚刚写过,粘过来。总销售额:课时数(销售额数据表)* 每课时单价(产品信息表)

课时数在销售额数据表里,单价是在产品信息表里。想用新增列的方式,怎么样来计算?是在产品信息表里新增当前总课时还是在销售额数据表里新增单价呢?用哪一种都可以。

python 复制代码
1、在产品信息表里新增当前总课时
2、在销售额数据表里新增单价

先尝试一下第一种,在产品信息表里面新增总课时。用产品信息表里的产品ID作为连接依据,然后让销售额数据表里面的课时数都加过来。它在加过来的时候就会按照产品ID自动去进行一个分组汇总。先添加一下看看。在 finebi 当中,进入到数据,点击产品信息表。

点击上方的其他表添加列。

我们要添加销售额数据表里面的课时数。作为添加的依据是产品ID。当前表的产品ID和销售额数据表里的产品ID,这俩是要保持一致的。然后点击确定。

现在,每一个产品对应的课时数我们已经计算到了。

这个对不对呢?每次做完这个操作之后,都可以在原数据里检验一下。比如我们就看一下产品ID为 PROD101 的产品,看看它一共上了多少课时。回到原数据中,找到销售额数据表。筛选一下,只要产品ID 是 PROD101 的,点击确定。

这样一个产品的课时数就有了,点击课时数字段。最下面有个求和,可以看到值为 1477,和 finebi 当中自动分组汇总出来的课时总数一致。所以经过验证,这个操作是正确的。

再来看一看,如果在销售额数据表里新增课时单价呢?也要用到其他表添加列。理论上的流程是:点击添加字段,找到产品信息表里的每课时单价,然后指定产品ID作为依据。结果发现点不了。

finebi 已经给出原因,由于在产品信息表里已经通过产品ID字段链接并添加进了课时数字段,所以无法再在数据额销售表中去添加产品信息表里的每课时单价的字段。如果在一开始没有通过关联字段在产品信息表当中添加数据额销售表当中的字段,是可以在数据额销售表当中添加每课时单价字段的。

我们先在产品信息表里,将总金额计算一下。点击数据,找到产品信息表,点击新增公式列。

命名为"总销售额",用课时数乘以每课时价格。点击确定。

2、课时数

课时的数量。直接用课时数求个和就行。在产品信息表里,课时数这列,直接用这一列就行。

先把这个图画出来。在 finebi 的组件,点击KPI指标卡,将总销售额和课时数拖进去。

点击文本旁边的小齿轮,根据自己喜好改一下格式插图什么的。美观一点儿。改好之后是这样。

3、产品种类

产品种类应该怎么去求呀?找一下,在产品信息表里面有一个课程种类。这个就是产品种类。

去重计数之后是 8,所以产品种类一共是 8 种。这里还要通过计算字段来实现。点击三个小点,点几添加计算字段。

因为在原数据当中,并没有这样的一个字段来表示它的数量,所以我们要自己计算一下。字段名称命名为"产品种类"。finebi 当中有两个用来计数的,一个是 count_agg,一个是 countd_agg。其中,count_agg 是来计算字段的总记录数,我们要用后面的 countd_agg,因为 countd_agg 是去重计数。把产品信息表的课时种类传进去,点击确定。

现在多了个字段叫产品种类,在组件中,图表类型选择KPI指标卡,把产品种类拖过去。

点击文本旁边的小齿轮,改一下格式,更美观一些。最终效果如下。

成本规模

1、教练薪酬成本

教练薪酬成本 = 底薪 + 课时单价 * 课时数量。先来观察一下,底薪、课时单价还有课时数量分别在什么地方。

底薪在教练薪酬表里,在这个表里我们可以看到有一个月固定底薪。课时单价也是在教练薪酬表当中。在这个表当中我们可以拿到两个字段。课时数是在销售额数据表当中。现在要么在销售额数据表中新增课时数和月固定底薪,要么就是在教练薪酬表当中新增课时数。

建议在教练薪酬表当中新增课时数。

因为如果在销售额数据表里面增加底薪和单价,每一个教练在当前这张表里面其实是有多条记录的,在去计算的时候,就会把底薪重复地进行计算。所以推荐在教练薪酬表中新增课时数。

现在回到 finebi,在数据,找到教练薪酬表。点击其他表添加列。添加字段是销售额数据表当中的课时数,匹配依据是教练ID和产品ID。注意,这里的关联字段是两个。教练和产品都对应上了,才能找到这个教练教的这个产品的课时数。这两个字段都匹配上,然后点击确定。

这样,每个教练对应的课时数都有了。这个乘以单价,再加上月固定底薪,教练薪酬成本就有了。当然,这个月固定底薪需要教练去重之后才能算。月固定底薪后面单独算。先把课时单价*课时数量算出来,这个部分也叫提成。

总提成计算

教练薪酬的提成部分。找到数据里的教练薪酬表,点击新增公式列,命名为"教练薪酬提成"。输入公式,课时单价*课时数,点击确定。我们可以看到新增的提成列。

接下来我们需要一列来计算教练薪酬提成的总和,点击新增汇总列。列名命名为"教练薪酬总提成",汇总字段选择教练薪酬提成,汇总方式选择求和,点击确定。

总底薪计算

由于我们需要对教练ID进行去重操作,这样会丢失数据,为了有备无患,我们需要将教练薪酬表复制一份,新表命名为"教练_薪酬表"。

步骤:1. 先复制一份数据做分组汇总(得到去重后的教练底薪表)。2. 再通过左右合并,把总和匹配回原表。

点击教练薪酬表旁边的三个小点,点击复制,就会出现一个一摸一样的表,名字叫教练薪酬表1。

点击三个点,点击重命名,新表命名为"教练_薪酬表"。

我们将教练_薪酬表进行分组汇总操作。点击分组汇总。

将教练ID拖入到分组里,将月固定底薪拖入到汇总里,点击月固定底薪字段右侧倒三角,选择平均(默认是求和,需要改一下),最终变成这个样子。

接下来我们求总底薪。点击上方新增汇总列。

列名命名为"教练薪酬总底薪",字段选择月固定底薪,汇总方式选择求和,点击确定。

我们可以看到薪酬的总底薪。

之后我们采取左右合并的方法,把总和匹配回原表。点击教练薪酬表,点击左右合并。

点击教练_薪酬表,选择教练ID和教练薪酬总底薪这两个字段,然后点击确定。

合并依据是教练ID。

然后我们就可以算出教练薪酬成本。点击新增公式列,列名命名为"教练薪酬成本"。教练薪酬成本 = 教练薪酬总提成 + 教练薪酬总底薪。点击确定,然后我们可以看到新增列的所有数值均为教练薪酬总成本。

新增一个指标组件,在图表类型当中,找到KPI指标卡并点击。

将教练薪酬表的教练薪酬总成本拖进来。

点击文本旁边的小齿轮,稍微改改格式和图标,更加美观一些。

由于它是数值字段,会自动聚合,还需要点击字段右侧倒三角,将汇总方式由求和改为平均。因为我们在之前求这个总成本的时候,一列下来的每一个数值都已经是总成本了,所以要改为平均。

最后的效果如下。

2、运营费用支出

运营费用支出,实际就是费用汇总表里面的。只需要针对支出做一个汇总就可以了。新增一个组件,在图表类型里点击KPI指标卡。将费用汇总表里面的支出直接拖入进去。

改一下字段名字,叫运营费用支出。点击文本旁边的小齿轮,美观一下,最后效果如下。

3、租金成本

租金成本是在门店信息表里的,它当中有店铺的面积和月租金。

我们只需要把面积和月租金乘一下就可以了。在数据当中,进入到门店信息表,点击新增公式列,命名为"租金成本"。公式为:店铺面积 * 月租金,点击确定。

执行之后会生成一列租金成本列,我们只需要对这一列进行聚合即可。

新增组件,在图表类型当中点击KPI指标卡。将门店信息表里的租金成本拖入到组件当中。

由于是数值字段,拖进去之后会自动聚合求出总值,所以我们不用再去计算了。只需要点击文本旁边的小齿轮,更改一下样式即可。最终效果如下。

盈利效率

1、净利润

python 复制代码
净利润 = 销售总额 - 教练薪酬总成本 - 总支出 - 租金总成本
销售总额

首先,销售总额的计算。在产品信息表当中,有一个字段是总销售额,它是通过课时数和每课时价格相乘得到的每种课程的全部课时的销售额,而销售总额是所有课程的全部课时的销售额。所以我们需要在产品信息表当中,新增一列,对总销售额进行求和,最后得到销售总额。

点击新增汇总列,命名为"销售总额"。汇总字段选择总销售额,汇总方式选择求和,点击确定。

之后我们就得到了销售总额。

总支出

在费用汇总表里面有一个字段是支出。

想求出所有门店所有项目的全部支出总和,也就是总支出,就要对这一列进行汇总。点击上方新增汇总列,命名为"总支出"。汇总字段选择支出,汇总方式选择求和,点击确定。

最后我们得到了总支出。

教练薪酬总成本

这个在之前我们已经计算过了,它就在教练薪酬表里,直接用这个字段就行了。

租金总成本

在门店信息表当中,我们之前计算过租金成本。把这一列汇总即可得出租金的总成本。

点击新增汇总列,命名为"租金总成本"。汇总字段选择租金成本,汇总方式选择求和,点击确定。

之后我们得到租金总成本。

计算净利润

4 个字段在不同的表中,这个东西应该怎么来计算呢。如果再到数据源去,单独的一张表当中,把这三列给加上去,这种太麻烦了。直接在组件当中,使用添加计算字段的方式,销售总额 - 总支出 - 教练薪酬总成本 - 租金总成本,可是如果直接这么计算,会显示"主题内不支持跨表计算"。因为直接这么计算是列里各个值互相计算。需要使用聚合函数来计算。使用聚合函数可使一列的值变为一个值。(求和、平均、最大、最小等等,我们这里用最大值即可)

点击三个小点,点击添加计算字段。列名命名为"净利润"。MAX_AGG(​销售总额​)-MAX_AGG(​总支出​)-MAX_AGG(​教练薪酬总成本​)-MAX_AGG(​租金总成本​)。点击确定。

然后我们可以看到在跨表字段的那个部分多了我们刚刚计算出来的净利润,把它拖进去。

点击文本旁边的小齿轮,换一换图表,改一下格式,更加好看一些。最终效果如下。

2、单门店平均销售额

单门店平均销售额 = 销售总额 / 门店数

销售总额在产品信息表当中,由于刚刚已经计算过了,存在了一整列当中且数值均相同,所以取最大值就能取到单个值。

然后是门店数,门店在门店信息表当中。

由于明确确定了门店信息表中的门店,它的信息是唯一的,所以用 count_agg 就可以了。

回到组件当中,点击这三个小点,然后点击添加计算字段。

字段命名为"单门店平均销售额",公式为:MAX_AGG(​销售总额​)/COUNT_AGG(​门店​),点击确定。然后就可以看到添加的计算字段。

我们把这个跨表字段拖入到组件当中。点击文本旁边的小齿轮,修改一下样式。最终效果如下。

3、每课时平均毛利

每课时平均毛利 = 总利润 / 总课时

其实刚刚计算的净利润就是总利润,用这个除以总课时就可以了。点击三个小圆点,点击添加计算字段,命名为"每课时平均毛利",然后用净利润 / 总课时。总课时是对课时求一个和,在销售额数据表里面,把课时数求一个和。公式为:​净利润​/SUM_AGG(​课时数​),点击确定。

点击确定之后,把这个计算字段拖进来。

点击文本旁边的小齿轮,设置一下格式样式,更好看一些,最终效果如下。

目前为止我们已经把核心KPI上面的所有指标计算出来了。在计算这些内容的时候,如果可以通过新建列的方式也可以用新建列,如果可以用计算字段的方式,也可以用计算字段。两种方式都能达到想要的效果,但是两者是有区别的。如果是用新建列的话,它会修改原本的数据,但是计算字段不会,计算字段是一个动态的值,在 finebi 中可能不是很明显,但是在 powerbi 当中,就可以体会到度量值(对应 finebi 中的计算字段)的好处。

这个案例主要研究如何去建模,以及如何去计算关键指标,就 ok 啦。

销售、成本、以及门店分析

在核心KPI都计算好之后,我们可以从销售额以及成本的角度对门店数据进行分析。

不同种类销售额占比

新建一个组件,命名为"不同种类销售额占比"。将产品信息表当中的课程种类和总销售额拖入到组件当中。然后点击图形属性当中的玫瑰图。

点击半径旁边的小齿轮,选择实心。

这个顺序看上去有点儿问题,需要将里面的内容进行排序。找到颜色当中的课程种类,对它进行排序,对它进行升序,升序的依据是总销售额,按照数值来排序。

这样我们就得到了不同种类销售额占比的玫瑰图。

门店规模地图

在门店信息表当中有城市字段,我们把它转换为地理字段。点击字段右侧倒三角,点击地理角色,选择城市。然后点击确定,不用管那 4 个没匹配到的城市。

然后我们在图表类型当中选择点地图。

将刚刚转变为地理角色的城市,经度纬度都拖入到组件当中。

把店铺面积拖入到大小当中。然后点击大小旁边的小齿轮,半径调整到 15。

将门店面积也拖入到颜色当中。点击颜色旁边的小齿轮,渐变方案选择夕照,取消勾选图例。

我们给它增加一下闪烁效果。点击店铺面积旁边的小齿轮,点击特殊显示里面的闪烁动画。

闪烁间隔时间设置为两秒,点击确定。之后就可以看到有闪烁效果的地图啦。

门店规模越大,地图上小圆点的半径就越大。

仪表板与分析报告

首先拖入一个文本组件,打上"健身房数据分析报告"这几个字,字号调大一些,上下居中,左右居中,横向拉满。然后把上面做好的所有的 KPI 指标全部铺满。一行 4 个,一共两行。

接下来我们把玫瑰图以及地图的组件拖入到看板当中,并且左边留有一部分空间,用来放文本组件,在文本组件中我们可以写上分析思路以及对于这两个图表理解之后的结论。

如果想美化一下,颜色风格更好看一些,可以点击上面的仪表板样式自行更改。我这里就不改了。

最终成品:https://demo.fanruan.com/webroot/decision/v5/design/report/458873b6a22c48dda8565bb9bd0de0d5/view

相关推荐
GIS数据转换器2 小时前
空间智能赋能城市低空数字底座及智能网联系统建设方案
大数据·人工智能·信息可视化·数据挖掘·无人机
tobias.b2 小时前
什么是大数据
大数据
2301_764441332 小时前
使用Python 和 Streamlit 构建的多维度游戏玩家数据分析
python·游戏·数据分析
得物技术2 小时前
Claude在得物App数仓的深度集成与效能演进
大数据·人工智能·llm
云境天合小科普2 小时前
禽类疾病检测仪:快速筛查,精准锁定病原体
大数据
Elastic 中国社区官方博客2 小时前
Observabilty:自动化错误分诊 - 从被动到自主
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索
zhojiew2 小时前
使用flink agent框架实现流式情感分析的示例
大数据·flink·wpf
AI-小柒2 小时前
DataEyes聚合平台新API接入实战指南:从0到1打通实时数据链路
大数据·运维·开发语言·人工智能·python·自动化·lua
xinyaozixun3 小时前
大国酿造 匠韵启程——燕京A10高端新品暨代言人官宣正式发布
大数据·人工智能