对于酒店、超市、教育培训机构或者是冲值消费的企业,如何计算并展示在某一时间段内的活跃用户数量,可能是困扰这些行业数据分析师的一个头疼问题。
总得来说,这些用户有一个比较明显的特征,那就是他的会籍贯或者学籍,都会有一个开始和结束时间,比如从2017年1月1日到2017年12月31日,他是活跃的会员,但是到2018年1月1号以后,它的会籍过期了,就不再是活跃的会员。那么我们如果要做一张数据表,从2016年1月1号到2018年12月31号,每季度的活跃会员数量统计,那这位会员,只应该出现在2017年的4个季度中,而其它的季度,这位会员不应该出现。
而我们原始数据,一般存的信息,就是这个人的会员号,姓名,手机号…….会籍开始时间,结束时间,数据库更新时间。你会发现,你在Tableau图表中,没有一个可以用于行显示(横轴)的时间。解决这个总是,有两个办法,一个是从数据源上解决,你可以每个月,对当前的活跃会员存一份快照,但是代价是浪费存储空间,如果有很多用户,开销会很大。今天Tay哥要讲另外一种办法,通过Cross Join(笛卡尔积)实现。
除了原始数据,需要再准备一张Excel,包括2013年到2019年12月31号,所有的月,月开始时间,结束时间,为了展示方便,我们可以再加一列季度,数值用201301,201302….. 201912来表示,这张表我们可以命名为MasterDate。
准备好数据,就可以做Cross join了,在Tableau的数据源连接上,点击Add(添加),然后添加Excel数据,和drvk数据,选则Full Join,连接的主键,左侧数据(源数据),点创建计算字段,然后填入1,右侧数据(季度数据),创建计算字段,然后填入1。这样就实现了左侧和右侧数据的Cross Join。
警告!如果数据量比较大,一定要用Live连接,千万不要提聚(Extract)数据,因为Cross Join是两个数据乘积的关系,Cross Join之后,相当于把原来数据的行数,放大到原来的84(7年,每年12个月)倍。想像一下,如果是天,那放大的倍数更加吓人。
在Tableau的工作表中,把Master的Month拉入行,然后在列中,可以Countd(会员号),这时你会发现,每个月的会员数是一样的,因为用到了笛卡尔积,所以需要把每个季度,非活跃会员剔除掉。
创建一个计算字段,命名为IsActive,然后计算中填入如下的公式:
iif([Period Start]<=[Month Start] and [Period End]>=[Month End],true,false)
然后把IsActive拉入到Filter,选择True,这样就得到下面的图表,只有当季活跃用户,才会被统计进入季度活跃会员数。调节Month Start的日期Filter,可以调整想要显示的时间区间。
你会发现,Tableau的性能非常好,瞬间就可以展示出相关的信息,性能一点不比Extract要差。
以此类推,如果你想在图表中显示的时间信息为每个季度,那对应的,你可以做一张包括所有季度的MasterDate,再也不用发愁如何回溯以往活跃用户,定单等信息了,是不是?
好了,今天就说到这里,是不是已经跃跃欲试,自己动手去分析自家的活跃会员数了呢?