电商漏斗如何跑得快

在电商系统中,漏斗转化分析是很重要的数据分析计算。电商的用户在系统中会进行多个操作事件,例如页面浏览、搜索、加购物车、下单、付款等。这些事件有一定的先后顺序,事件顺序越靠后,完成该事件的用户数量越少,就像是一个漏斗。漏斗转化分析通常先要统计各个操作事件的用户数量,在此基础上再做转化率等进一步的计算。漏斗转化分析涉及的数据量巨大,计算也非常复杂,常常会出现性能问题。

为了让电商漏斗跑的更快,我们要从计算和数据的特征来入手。电商系统用户数量众多,每个用户的操作事件都被记录下来,会形成非常大的事件表,一般都需要外存存储。漏斗分析参与计算的总数据量很大,可以达到几千万甚至上亿行。而每个用户的数据量却并不是很大,只有几条到几千条。

同时,漏斗分析对操作事件的计算虽然复杂,但都是以用户为单位进行的。不同用户之间的事件无关,对一个用户的计算一般不涉及其他用户的事件。所以,我们最好是将一个个用户的数据分别加载到内存中进行计算,这样可以降低计算的复杂度,有效提高性能。

对于一个用户来说,多个操作事件是要按照时间顺序计算的,属于比较典型的时序计算。有些情况下,事件的时序计算逻辑特别复杂,需要写多步骤代码才能实现,就更需要逐个用户做处理了。

为了能够按顺序依次读取每个用户的数据进行计算,要预先将事件表的数据按照用户有序存储在硬盘上。做漏斗分析计算时,先将一个用户的数据全部读入内存,按时间排序后再做事件的时序计算。比如先找到页面浏览的事件,再找后边有没有加购物车的事件。如果有,而且和页面浏览的时间间隔小于7天,这个用户就是完成了两个步骤的用户。这个用户计算完成后,再逐个读取其他用户的数据进行计算,直到将数据全部读完即可。

这样做,只需要对数据遍历一次就可以完成漏斗转化分析,计算速度快且占用的内存空间很小。而且,这样的计算逻辑,完全符合我们的自然思维习惯,可以降低写代码的难度。

虽然预先对事件表做排序比较慢,不过排序工作是一次性的,且事件表只要按照用户有序存储一份即可,不会出现冗余。

关系数据库和大数据技术普遍采用的 SQL 语言是基于无序集合理论的,不能严格保证每组数据连续存放,所以不能直接应用上面说的用户和时间有序算法。如果我们用 Java 等高级语言实现上述计算方法,那么代码量会非常巨大,而且很难通用。

专业的数据计算引擎 esProc SPL 支持数据物理有序存储,很容易的实现上述计算方法。而且,SPL 封装了大量的数据计算函数,可以用很简捷的代码实现漏斗分析计算。假设事件表 T 包含的字段为:事件编号 id,用户号 uid,时间 etime,事件类型 eventtype,计算三步漏斗的 SPL 代码大致是下面这样:


A

B

1

=["PageView","ProductDetail","Confirm"]

=file("T.ctx").open()

2

=B1.cursor(uid,etime,eventtype;etime>=date("2022-10-10") && etime<date("2022-10-25") && A1.contain(eventtype) && …)

3

=A2.group(uid).(~.sort(etime))


4

=A3.new(~.select@1(eventtype==A1(1)):first,~:all).select(first)

5

=A4.(A1.(t=if(#==1,t1=first.etime,if(t,all.select@1(eventtype==A1.~ && etime>t && etime<t1+7).etime, null))))

6

=to(A1.len()).("count(~("/~/")):STEP"/~).concat@c()

=A5.groups(;${A6})

A1:三个事件类型,也可以通过参数传入。B1:打开组表 T.ctx。

A2:建立游标,过滤出满足时间段、事件类型等条件的数据,过滤条件都可以通过参数传入。

A3 到 B5,按照前面所说的方法,循环对每个用户进行时序计算,最后汇总出三个步骤的用户数。

这里给出的是三步漏斗转化分析,如果要实现更多步骤计算,只要在 A1 的事件类型序列中增加后续步骤的事件类型即可,例如:["SiteView","PageView","Login","ProductDetail","Confirm"]。如果通过参数传入事件类型序列,代码就可以不做任何变动。

漏斗分析计算通常要先按照时间条件过滤,全部数据涉及时间跨度较长,但过滤后数据对应时间的跨度则相对较短。前面我们将整个事件表按照用户有序存放,就不能快速按时间过滤了。SPL 还提供了双维有序结构,可以做到事件表整体上对时间有序(从而实现快速过滤),同时还可以做到访问时对用户有序(从而方便地逐个取出用户数据进行后续计算),看起来相当于实现了时间和用户两个字段同时有序,可以非常明显的让漏斗分析跑的快起来。具体介绍参见:双维有序结构提速大数据量用户行为分析