玩FineBI不用这个函数,你真亏了!

楼主
定义IT与业务配合新模式,释放数据价值!
FineBI6.0的升级带来了一个全新的函数---DEF函数,据说它能够解决分析师新建指标的难题;近期也有不少用
户来找我咨询“这个函数,到底该怎么玩?”不管之前是否听说过这个函数,各位看官今天不妨花个5分钟,听我
和你唠一唠DEF函数。

一、算指标,我真的emo了

做数据分析,你一定遇到过这个情况:数据处理的差不多了,正准备进行一场行云流水的可视化分析,结果一
个指标在组件里不会算,卡壳了。头疼了半天,最后还是回到数据集去做处理。一天的好心情就此宣告结束。
如果你还是没什么印象,那看看以下几个场景:
1、使用快速计算配置的组内占比,但是维度比较多,包含几个层级,没办法算出我实际想要的组内占比。
(指定维度级别的计算)
2、我想计算近三个月销售额的平均值,比如5月的就计算3、4、5三个月的平均值,6月的就计算4、5、6三个月
的平均值,以此类推。这其实是行间的滚动计算。组件内不太好做,数据集里处理也是相当麻烦。
具体以前怎么解决,我们先不讨论,但本来流畅的分析因为一个指标算不出而被打断,真的是令人难受的一件事。
今天咱们聊的DEF函数的价值就在于此:提供指定维度级别的计算、行间计算以及嵌套视图计算的强大能力,
让你在新建指标的过程不再受阻。

二、别把DEF函数想得太复杂

指定维度?行间计算?有些不太理解,没关系,咱们先简单学习下它,DEF,即define的缩写,意为定义你想要
的所有指标。在当前FineBI6.0版本中,你可以在分析主题的数据层以及在组件中创建计算字段时使用它。
  • 函数语法:DEF(聚合指标, [维度1,维度2,...], [过滤条件1, 过滤条件2,...]) ,其中维度和过滤条件可以缺省。
他由三个参数构成,首先是定义计算的方式,即语法中的“聚合指标”。第二个是执行聚合计算时的维度,第三个
则是计算前对数据的过滤条件。这里举两个例子帮助大家理解:

1、计算每个省份不同产品的销售总额:DEF(sum_agg(销售额),[省份,产品]);参数2-维度中我们选择了【省份】
和【产品】两个字段,因此基于这两个维度对参数1中的【销售额】字段进行【sum_agg】计算,即求和。

2、计算2013年各省的销售总额:DEF(sum_agg(销售额),[省份],[年份=2013]);参数2-维度中选择了【省份】,
于是基于“省份”对参数1中的【销售额】字段进行【sum_agg】计算,同时,由于参数3-过滤条件中,限制了年
份要2013年,所以只得出2013年的销售总额。
 
RFM客户价值分析大家并不陌生。这一分析最主要的部分是新建三个指标,即R-最近一次消费时间,
F-最近一段时间内消费频次,M-最近一段时间内消费金额。然后基于这些特征,将客户的重要性进行划分。
 
假设我们基础明细表拥有以下字段【合同ID】【合同金额】【公司名称】【签单时间】,你要如何用def求出每个客户公司
的RFM?
  • F-每个客户的购买频次:维度是客户,因此参数2-维度应该是【公司名称】,接着要思考如何求出购买次数这一指标,

我们可以通过对合同id计数来实现。经过这样的思考后,很容易就写出来了:DEF(COUNT_AGG(合同ID),[公司名称])

  • M-每个客户的贡献的销售额:维度依旧是客户,而这次要求出的指标是这个客户贡献的销售额总量。应该是对销售

额进行求和,不难得出:DEF(SUM_AGG(合同金额),[公司名称])

  • 最后R-每个客户的最后一次购买日期该怎么求?就留给大家作为课后题自己思考吧~

三、让DEF更进一步------Earlier

DEF函数已经发布有一段时间了,研究过的小伙伴可能会注意到与他配合使用的另一个函数-Earlier。Earlier带来了
“选取当前行”的能力,接下来我们通过刚才说的转化率的场景来认识他。
我想求出每一节点的转化率,即 当前节点客户数量/上一节点客户数量,听起来很容易,但是实际操作的时候,
马上就愣住了:“我要怎么取到上一行到数据呢?”,这就是一种行间的计算,我在这里给大家推荐一种做法,希望能带来
一些启发。
首先,通过一个简单的def函数求出每个关键节点的客户数量:DEF(SUM_AGG({客户数}),{关键节点})
然后,通过def函数求出每个节点对应的序号:
DEF(COUNTD_AGG({关键节点})+1,[{关键节点}],[{每个节点的客户数量}>EARLIER({每个节点的客户数量})])
看起来是个很复杂的公式,我们一点一点来理解他。counted_agg(关键节点)+1:对关键节点进行计数,并且结果+1。
难理解的在于公式中过滤条件这一参数:{每个节点的客户数量}>EARLIER({每个节点的客户数量},它看起来像是自己
大于自己,乍一看完全不明白其中的逻辑。为了便于大家理解,如下图,我先在这里额外添加一列辅助列【客户数量1】
回到这个式子,{每个节点的客户数量}>EARLIER({每个节点的客户数量},还记得我们说过earlier是选取当前行吗?
从第一行来看,这个大于号的意思是,【客户数量1】比【客户数量】字段的当前行(即39521)大的节点。可以看到
【客户数量1】字段六行数据均不大于39521,因此符合条件的节点数量为0。又因为我们在counted结果后写了一
个“+1”,所以最后【排名】字段在第一行输出了1的结果。
同理,计算第二行时只有39521这个数据比33008大,+1后输出2,以此类推,最终可以根据客户数量为节点进行排序。
得出序号后,就可以通过DEF(SUM_AGG(${每个节点的客户数量}),[${关键节点}],${排序}+1=EARLIER(${排序}))
求出对应的上一节点数量,以此进一步求得转化率。

四、小结

今天我们聊了很多高级分析,高级函数,但数据分析本身并不是越高级越复杂越好。函数也好,分析方法也罢,说到底都
是帮助我们发现问题,解决问题的工具。DEF函数亦是如此,它可以让你在一些场景更快得到需要的指标。但并不是说我
们所有的分析都要用它来解决,不要让工具限制我们的思考。
较低的上手门槛和没有上限的分析能力一直是我们的追求,未来我们也将不断封装常用的def函数计算供大家直接使用,
借此带来更好的分析体验。也欢迎大家前往我们的FineBI社区论坛,同更多数据分析爱好者进行交流。

 

 

分享扩散:

沙发
发表于 2023-4-25 20:18:46
收藏 点赞 转发 学习了
板凳
发表于 2023-4-28 10:26:50
https://edu.fanruan.com/video/488 借楼推一下DEF免费课程学习地址~
地板
发表于 2023-4-28 17:27:12
相当烧脑。不过好像对def函数更了解了,下次试试
5楼
发表于 2023-5-10 16:42:33
好像比较有用,但是从数据角度,与其这么复杂的公式嵌套使用,如果能在数据集部分就算好,是不是更直观一些。
如果公式用错了,算出的数据都不确定是否准确
6楼
发表于 2023-9-12 16:17:30
所以大佬们,每个客户最后一次购买日期怎么求呀
7楼
发表于 2024-12-10 17:43:04
牛,学到了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表