作者 | 沅沅
点击查看视频链接
大家好,我是来自阿里巴巴集团阿里云计算平台事业部Dataworks团队的刘乐元,花名叫沅沅,很荣幸能在第十五届D2大会上和大家做一次分享 。我此次分享的主题是《深入剖析海量数据场景下的用户行为分析方案》。
什么是用户行为分析?
我们认为用户行为分析是一系列发现问题、定位分析问题以及验证结果的一个过程。举例来说,有时一个产品的新功能上线,通过用户的流失漏斗我们能够发现用户在某一步操作的时候用户流失很大,这个时候就发现问题了。你会考虑用户为什么流失了,流失去了哪里,这个时候通过行为分析可以去定位并且分析问题。最后通过流失漏斗手段验证问题得到了解决。这样的一整个过程就是用户行为分析。这个时候如果仅仅通过人肉去做用户行为分析,不仅成本高而且容易出现错误或者疏漏,所以我们需要通过工具来辅助我们来完成这个事情。
业界现状
接下来我们先来了解一下业界用户行为分析工具的现状。
先来看一下谷歌分析,谷歌分析作为行业内的泰斗,它在用户行为分析上提供了用户的转化漏斗和用户路径桑基图两个功能。
然后是Growing IO, Growing IO是国内知名的数据增长平台,它在用户行为分析上提供了用户的转化漏斗和基于转化的简易路径图两个功能。
最后是神策数据,神策数据也是国内知名的数据分析平台,它也提供了转化漏斗和用户路径的桑基图。
以上是对三种产品的初略介绍,有兴趣的也可以再深入的进行了解,基于之前说的行为分析有发现问题、定位分析分析问题和验证问题的能力,但听完之后大家是不是总觉得他们少点什么?是的,他们具有初步定位问题和验证结果的能力,但是缺乏深入分析问题的能力。其实用户为什么流失、流失去了哪里才是解决问题最需要关注的。好比你去医院看病,医生告诉你你有病,但是就是不告诉你哪里有病,这样是治不了病的。
讲了三个优秀的产品,那我们有什么呢?
下面简单看一下我们平台的示意图,这个是漏斗图和辅助柱状图。通过漏斗图可以很直观的看到用户在每个环节的到达情况,能帮助我们快速的发现问题。柱状图展现的是操作之间的耗时和操作的次数,因为有些时候单从转化是看不出问题的。这两个指标也是我刚刚提到的更多指标的其中两个。这两个也是对用户行为分析很重要的两个指标,但往往会被大家忽视。
接下来是链路图,问题的发现不仅仅可以在漏斗图中可以体现,在链路图中同样可以体现,并且我们在链路图提供了分析问题的能力。比如你发现在某一步用户流失极大,可以基于该节点进行节点下钻,分析用户流失去了哪里。
技术剖析
看完平台的小部分示意图之后该对我们的能力进行剖析。
行为分析的核心难点有很多,这里主要就分析两个,海量数据分析和链路的可视化展示。
首先是海量数据分析,数据分析场景是非常复杂的,我们先讲一个最简单的场景。
假设我们期望用户的使用链路是A到B到C,然而用户的实际链路五花八门,单从提供的这两份数据,我们最基本的需求,是要得到的是到A的有多少,从A到B的有多少,最后从A到B到C的有多少,这是计算转化率最基本的场景,在只有十几条或者几百条数据的情况下,你说你可以通过nodejs,java等传统的开发语言用循环等可以得到啊,这有什么难的?
我想说事情没有想的那么简单哦!用户行为往往一天都有好几十亿的数据量,你再写循环,你的性能还能不能顶得住?更何况还需分析连续好几天甚至一个月的数据,而且光分析转化是不够的,有时候步长、时长、转化方差标准差等多种指标是很必要的,我们通过复杂的运算提供了十多项的数据指标,这些复杂的运算在海量数据场景下,计算效率和性能值得考究,所以我们需要用大数据开发体系,来支撑这些复杂的场景。
接下来我分析一下我们这套系统的一个简易大数据体系架构,因为这个实际的架构太过复杂我做了简化,帮助大家理解。我们从下往上看,首先在数据的采集层需要将用户的行为数据进行采集之后,进入数据的持久化层,在这一层需要进行数据的预处理和数据的存储,然后到了数据的应用层,首先需要对存储的数据进行分析和计算,具体需要通过开源大数据引擎,hadoop或者阿里云maxcompute大数据引擎对数据进行分析计算,这边我们提供了实时计算和离线计算生成报表,然后将数据导到mysql或者阿里云的rds,提供对外的数据节后。最后上层应用通过接口的调用实现一些可视化展示的工作等。
基于这一套大数据体系架构的优势主要有四点,第一能够支持海量数据的计算和存储;第二是能够满多种时效性的要求,可以实现实时和离线的计算,第三通过多租户的架构实现数据的物理隔离,第四提供优秀的数据的整合能力。
接下来看一下数据的流程图,我们从左往右看,首先是是数据的采集,这一部分我们提供了两种数据采集的方式全自动采集和发送自定义事件;然后对数据进行一个规范和过滤,接下来开始和用户定义的第一个节点进行匹配,匹配上的数据需要做两部分工作,第一部分工作是进行链路的匹配,匹配又分为单次匹配和多次匹配,匹配上的数据需要计算一些指标,这些指标主要是为漏斗图做数据支撑。第二部分工作是需要共建用户的行为树,最后也需要计算一些指标,这些指标是给链路图做数据支撑。基于这套体系我会就链路匹配和我构建用户行为树展开说明。
先看链路的匹配,这个链路的匹配主要给漏斗图、柱状图等做数据支撑。这里会涉及到两份数据,一份是定义的主链路数据,假设你定义的用户使用路径是a-b-c,另一份是用户实际使用的链路,这里举了两条链路。第一步需要对主链路的每个节点添加标识,添加标识的目的是为了简化用户的操作,节约计算资源,对于主链路的三个节点按照顺序添加数字标识,对于用户的实际使用的链路要先进行数据的预处理,包括了字段的规范和数据的过滤等等,然后再添加数字标识别,这个时候能把和主链路无关的节点排除过滤掉,就像第二条链路的D操作,在主链路是没有的,所以后面肯定也匹配不到,所以可以进行排除。然后就可以准备匹配了,实际链路去匹配主链路,要做这个事情通过单纯的sql很难做到,所以需要借助udtf函数,要用这种函数需要把参数也就是这里的主链路数据和实际使用链路的数据进行多行转一行的操作。然后再把处理好的这两份数据传进udtf里面进行主链路匹配。最后匹配出的结果这样的一份数据,这里红色数字就是代表用户的操作在这条链路的位置。接下来需要将一行转多行获得最终的匹配数据,通过链路、操作和位置可以准确的定位一次操作,最后基于这份数据可以和操作的原始数据进行关联,从而可以计算出步长、时长的一些指标。
讲完链路的匹配的实现接下来讲一下如何构建用户的行为树。这个用户行为树主要是给链路图的深入分析能力做数据支撑。现在有两个用户,他们的操作分别是A-B-C-D,A-B-D-C,我们需要将这两个用户操作进行关联,具体来说需要对同一层的同一个节点进行合并并且统计数量,比如这两个用户的前两部操作都是ab所以前两层节点应该合并,并且统计一下数量,所以构建出的用户行为树的逻辑图如图所示。
具体的也是用sql来实现的,第一也是要对每个节点建立标识,建立标识之后需要通过节点的顺序建立父子关系。对于一棵树而言路径是必不可少的,所以需要通过父子关系构建路径,有了父子关系和路径就可以进行合并和统计数量了,最后就会得到一棵树的数据。
在MaxCompute大数据引擎中用户数据超191亿的场景下,计算各种指标的时间只需7分钟,所以可以说在百亿级别的数据量实时计算只需要几分钟。基于第一部分海量数据分析的剖析就到这里结束。
接下来是链路的可视化展示的技术。在这一块做了大量的尝试,踩了很多坑,接下来给大家讲讲我们的心路历程。
这个是我们最初版本的链路图的效果。还有基于某个节点下钻展开的示意图。
别看刚刚那个图比较简陋,但是完成这样的效果需要大量的工作。在这之前我先给大家科普一下几种图的分类。第一,分层图,分层图是一种带有层级关系的有向五环图。第二,复合图,复合图是有组级关系的一种图。第三是分层复合图,它是一种既有分层结构有组级关系的一种图,我们的链路图就是一种复杂的分层复合图。要实现一个比较好的分层复合图,需要完成三部分工作。节点分层、层内排序还有整体的优化。下面我会挑几个有意思的点和大家进分享。
先来看节点分层中的圆形去环路,去环是因为环路的存在会导致分层结果多样化,既不利于分层,又会导致结果的不稳定。通过下图的案例来展示该问题,从图中可以看到A-B-C-A构成了一条环路,那么生成的分层图可以以A为顶层,也可以以B为顶层,又或者以C为顶层,得到三种不同的结果。当环路增多时,那么结果集可能会更多。从过程来看,环路不利于对分层结果的优化,容易在分层过程中陷入循环。从交互体验上来看,每次布局结果都不同会造成不好的用户体验。了解了去环操作的必要性之后,开始对有向图进行去环,去环过程主要包括(1) 检测环路 (2) 打破环路 。第一,检测环路,从任意起点深度优先搜索,如果已访问的节点被再次访问,则说明有环。第二,打破环路。打破环路有许多方法:可以把环内节点收缩为一个节点,或者把环内节点排布在同一层级。收缩成一个节点会误认为是属于同一个分组,排列在同一层级则丢失了环路的层级结构。所以我们这边提出的是一种反转环路中的边去打破环路的方法,具体来说吧检测到环路的节点的的之前的一条边方向反置,如这个图的B-A,反转成A-B,这样环路就打破了。然后就能生成固定的分层结构。在最终渲染的时候把之前反转的边再反转回去就可以了。
再来看节点分层的一个层级分配的处理,对于有向图来说,要形成一种层级图的方式有很多,我们这边首先采用长边路径的算法能快速的给每个节点分配初始层级。比如现在这个图最长边是a-g-h-i-l,然后从最下一层依次往上按照层级排列上去,这样做的目的是能够快速的画出层级。但这这个的缺点有两个,第一会产生不必要的长边,第二节点会堆积在底层。所以还需要使用网络单纯算法迭代的切割长边,用来产生更紧凑的图。
接下来是层内排序中的长边切割的处理,从图上可以看出,现在A-L的这条边已经影响到了G的一个展示,所以需要对这条长边进行切割,具体的需要引入虚拟节点,将AL之间的边断开,然后引入虚拟节点,再将al和虚拟节点进行连接,就能得到最终切割的效果图。
最后再分享一个层内排序中的节点排序,虽然通过长边切割等方法,能够有效的去除层级之间的一些交错边,但是对于节点之间还是会有很多交错的情况,如这个图所示。所以需要对节点重新进行排序。我们采用的是一种启发式的算法来逐步优化交错。首先给出每一层节点的初始化顺序。然后执行一系列迭代尝试改进这个顺序。每次迭代从第一层遍历到最后一层。涉及到两种数据,权重排序,每一层的权重来源于上一层的排序。比如第一步顶点A 的权重是0,他的两个子节点的权重也是0,但是同一层有先后顺序,这里D的顺序是0,G的顺序是1.然后看下一层。也就是第三层,第三层每个节点的权重和父节点的排序相同,因为D的排序是0,所以D的两个子节点F和B的权重都是0,而H的权重等于G的排序,也就是1.所以需要将B和h换个位置。依次类推,看第四层。第四层每个节点的权重等于父节点的排序。这里的I来源于H,所以他的权重是2,C来源于F和B两个节点,所以权重是排序的平均值,是0.5,所以最后c和i需要调换位置。最后一层e只需放在父节点下面即可,这样就能达到交错大大减少的一种渲染图。
经过我们不懈的努力,在复杂场景下的效果图如上,很明显这个图效果不佳,不能满足我们快速分析链路的需求。
后来经过我们的深入分析,用户操作的不确定性和复杂性,所以要通过一张链路图全部进行展示,达到分析问题的能力是不现实的,所以我们转换了思路,将节点下钻的能力重新设计和简化,实现的效果如图所示, 当我们对一个节点进行下钻时,不会把所有的链路进行展示,而只是展示第一层,并且将层内流量最多的6层展示出来,宁外我们会将未回到主链路的这些,也就是流失的操作放在节点底下进行区分,基于这种设计实现了两个效果,第一通过将主链路的流程和流失的流程进行拆分,这个时候你只需要关注你该关注的地方,让分析更加清晰。第二,我们在展示子链路的时候只展示流量最大的前六个,这样能让分析更加聚焦在流量最大的链路上。通过泽阳一个过程,我们也想告诉大家其实有时候碰到难题不一定要执着用技术去解,我们要找到问题的核心诉求,从全面的角度去分析问题。
未来展望
至于未来我们会往智能链路的道路发展 。
语雀,它的产品模式比较特殊,同样一个新建文档的流程会有很多的入口,我可以直接从首页的新建口子去新建,可以进到文档库里去新建,也可以进入知识库里去新建,等等,这种场景下如果去指定链路进行分析,一个是成本高,一个是容易出现遗漏。
那如果有智能链路分析,我们就能实现三个点:
-
我只需要设置某个操作点,或者设置开始和结束点,我就可以分析出用户比较常用的链路,分析成本很低,而且非常完整,不容易出现遗漏
-
判断这些链路是否符合我们的预期,可以从全局的角度更有效地去发现问题,解决问题。举个栗子,比如某条链路我们认为是非常重要的,也是我们认为的主流程,但经过分析我们发现,这条链路几乎没人走,大家更多走了另一条链路,这个时候就可以去分析是主链路出现了问题,还是说用户走的链路就是一条更优的链路,从而可以帮助做决策。
-
通过这些常用链路,我们就可以将用户比较常用的功能或者入口放到更醒目的位置,来提升用户体验
小福利
最后因为这个工具在阿里内部(阿里体验管理平台AEM)广泛使用,目前还未对外公开,所以在分享的最后我们有个福利。
我们会把一整套的分析能力整理成一个大数据的经典案例,放到阿里云上供大家免费使用,届时大家只需要根据我们的需要采集到用户数据存到指定的表内,然后通过我们提供的数据分析能力进行行为分析,产出结果数据,大家可以自己拿到结果,通过可视化方式展现结果,从而搭建整套用户行为分析平台。
这里有一个钉钉群的二维码,有兴趣的同学可以扫码进群,我们一起讨论研究。
🔥第十五届 D2 前端技术论坛 PPT 集合已放出,马上获取
关注「Alibaba F2E」
回复 「PPT」一键获取大会完整PPT