在优步,我们投入了相当多的资源,让司机的注册体验尽可能简单。在优步的规模上,即使首次出行的注册率(司机转化率)上升1%,也会产生巨大的影响。
2016年12月,Uber数据科学家安德烈·里斯科维奇(Andrey Liscovich)假设,传统的漏斗分析工具不足以研究实际的司机注册体验,因为它们将其视为固定的步骤序列,而在实践中,从注册到首次出行的路径是一个复杂的迷宫,任何两个司机都可能以不同的方式导航。为了更真实地了解用户如何与注册技术交互,他开始了一项跨职能的努力,开发了一个新的漏斗可视化平台,称为Maze,该平台认识到漏斗的潜在复杂性。
通过将Maze应用于司机注册过程中捕获的日志,我们可以可视化司机在注册Uber时所走的实际路径,并确定在此过程中出现的瓶颈。Maze在Uber的应用已经扩展到注册用例之外,现在它被用于可视化许多流程——从乘客上车和下车到用户与我们网站的交互。继续阅读,了解Uber可视化团队是如何开发Maze的,以及为什么这个新的解决方案能够为Uber用户体验提供无与伦比的洞察力。
穿越迷宫:为什么我们要建造一个新工具
在2016年之前,我们将司机注册体验可视化为按固定顺序排列的一系列简单的时间步骤。在这个过程的任何一个步骤中,一定比例的有抱负的司机会退出,或“流失”。
在这个模型中,转化率是每一步转换百分比的乘积。因此,为了提高转化率,我们需要减少用户流失率。这种方法,虽然有价值,但有局限性,因为它没有考虑到订单司机注册事件发生在哪里,或者是否发生过。
驱动程序注册流程有很多入口(例如网页、电子邮件和应用程序),不同地区的入口不同。并不是所有的司机候选人都要经历完全相同的注册过程。即使是那些喜欢的人:如果他们在手机上开始这个过程,然后选择在台式电脑上继续,会发生什么?如果他们暂停申请,两个月后重新开始呢?如果他们后退一步,更改他们已经提交的无关紧要的信息(例如车型、汽车颜色等)怎么办?这些问题的答案对我们的转化率有显著的影响。
皈依的路还很长
当我们开始测量从注册到激活的步数时,即我们能够检测到的所有事件,我们发现司机实际采取的步数存在巨大的可变性。在某些情况下,从注册到第一次旅行需要几十个步骤,但在另一些情况下,需要更长的时间。在某些情况下,驱动程序候选人在从漏斗中退出之前可能要经历数百个事件。
与我们长期以来的假设相反,没有一条最有效的转化途径,而是成千上万条,有短的,有长的,有线性的,有弯曲的。事实上,皈依的过程是一个真正的迷宫。
进入迷宫
为了更好地理解注册过程,我们创建了Maze,这是一个可视化聚合事件序列的工具,使我们能够回答以下问题:
- 有多少车手经历了事件A?
- 有多少人经历了事件A,然后是事件B?
- 有多少人经历了事件A,然后是事件C?
- 有多少人经历了事件A,然后是B,然后是D?
- 有多少人经历了事件A,然后是B,然后是D,但没有C?
通过传统方法(例如,SQL查询)回答这些问题很麻烦,而且容易出错。相反,我们的工具会发现每个事件序列的大小,并直观地表示整个漏斗。
演讲
当用户打开驱动程序应用程序并开始注册时,应用程序会记录他们执行的每个操作,使Maze能够将每个应用程序会话转换为一系列事件。
为了将这些会话作为一个统一的整体来研究,我们使用阳光可视化,一个由同心圆组成的漏斗的视觉表示。(有关此主题的更多信息,请查看前面的内容开源工作在这个领域由克里罗登)。太阳爆发的中心环由多个弧组成,代表所有序列的第一个事件,如果所有序列都从同一事件开始,则可以在一个环中结束。然后,对于每一个额外的步骤,我们绘制一个由一个或几个弧段组成的环,每个弧段对应于一个特定的事件,并且大小与对应该事件的序列成比例。
在Maze UI中,我们可以用光标突出显示特定的路径,它将以准确的顺序表示事件序列,使我们能够轻松地看到它们在该节点下所代表的总会话的比例。
因为序列可能会很长,我们只能在屏幕上显示这么多层,我们还让用户放大某个弧度,重新绘制从那一刻开始的太阳爆发,提供更精确和详细的数据视图。
从那里,我们可以使用UI来细化我们需要的结果。例如,如图3所示,我们可以筛选希望在屏幕上显示的事件。
事实上,我们的UI允许我们进行各种过滤和探索。例如,我们可以应用“序列过滤器”来只保留具有特定顺序的特定事件的序列。
我们还可以将太阳爆发范围缩小到用户会话,在此会话中,成功的数据查询之后,同一查询出现错误。这种类型的规范让我们探索在驱动程序注册过程中可能出现的痛点,使我们能够了解哪里出了问题,并确定如何为未来的用户修复它。
到达迷宫中心:先赢
在Uber,我们的数据科学家使用Maze来测试某些假设并评估其有效性。
例如,在图5中,我们观察到可视化的顶部有一个紫色节点的尖顶,表示在驱动程序注册过程中对某个网页的浏览器后退按钮的单击。紫色的尖顶表示用户无法返回到之前的步骤,这表明浏览器的后退按钮是阻止器。在这个场景中,我们可以看出,在该步骤的驱动程序候选人将继续单击该按钮,直到他们完全放弃该过程或决定按时间顺序继续前进。
迷宫的架构
我们基于React 16和Redux使用Uber的web技术堆栈构建了Maze前端。我们的web架构还集成了一个React客户端和一个Node服务器作为RPC代理,以及集成的性能指标、流量监控和覆盖率报告。
为了大规模地呈现有价值的数据可视化,Maze在响应式用户交互和高性能之间实现了良好定义的平衡。除了Redux框架,我们的系统还应用了分层缓存,具体如下:
- React层缓存: React Store上面的第一层缓存包括状态缓存和React选择器,防止大量的计算和重新渲染。
- 网络工作者:作为浏览器缓存的一部分,Web Worker保存数据备份,用于对不需要访问后端数据库的操作进行即时计算。SharedWorkers允许平滑的用户体验的行动,重新生成整个可视化。
- 节点端内存缓存例如,旧金山所有司机对每次注册活动的每个请求都将导致数百万条数据被收集。这一层缓存确保数据的第一个视图具有较低的开销。
数据处理与可视化
大规模数据可视化可能是一个具有挑战性的过程。Maze通过使我们能够可视化非常大的数据树来解决这个问题。可视化大型事件序列可能会导致深度高达100层的树,每个叶子上可能有数百个分支,这些分支与数百万个节点和数百兆字节的数据相关,这些数据必须在单个请求中下载。
在如此大规模的情况下使用React和Redux是有风险的,因为我们不希望对每个单独的动作分派应用无限的计算。当来自后端响应使用数百兆字节时,维护从还原器到容器和组件的呈现状态对于有限的浏览器资源来说是一种奢侈。
我们使用D3用于在Maze中渲染主要数据的库。如果需要动画或转换,使用由D3触发的真实文档对象模型(DOM)操作可能相对棘手,因为React期望整个DOM结构重新生成以进行状态更新。我们在Maze中应用的解决方法是使用组件内状态和缓存来处理每一组新数据,并且只在需要新的聚合时分派全局数据更新。
通过使用正确的策略对原始数据进行拟合,我们可以获得许多见解。例如,一个典型的问题,“从视图中过滤某种类型的事件”,可能是一个算法问题,“从树中删除具有给定事件类型的节点”。这种情况可以分为以下几个步骤:
- 保存原始数据集
- 将新配件应用到当前数据
- 呈现所有规则的最新视图
从那里,Web Workers执行数据拟合并交付每个计算的结果,这样我们就可以在不查询后端的情况下提供实时用户交互,而原始数据集则在浏览器缓存中共享。
存储和聚合
在实际Maze是一个序列分析工具,可以提供对会话的洞察,其中“会话”可以是骑手旅行、网站访问、新司机的注册程序,或任何与我们平台的真实用户交互。换句话说,Maze收集数千个会话的事件列表,并将其聚合到单个树视图中。
Maze的后端主要处理数据聚合。后端负责数据注册、备份/回填/缓存、聚合、收集会话、验证和质量保证,并在我们的数据库中提供结构良好的数据OLAP用于数据分析的数据库。
对于每个内置数据源,Maze后端通过在预定义的Hive表上运行每日计划的Spark作业来接收数据,以及来自我们的开源流分析平台的实时数据。AthenaX.由于原始数据源非常嘈杂,即使是一个查询请求也需要大量的时间来处理,因此在将数据写入数据库之前会发生数据“预聚合”。这一步确保保存的数据尽可能接近指定的读模式定义。此外,使用这种模式允许我们在元数据上创建自定义过滤器,从而支持更动态的查询。
聚合过程直接为Maze前端提供两个主要结果:用于可视化的聚合数据和详细的会话记录。在典型的交互过程中,Maze用户首先检查可视化中的意外漏斗,然后深入每个单独的会话以获得更大的洞察力。该模式允许Maze后端通过使用Redis作为内存缓存来优化性能。由于这两个结果(具有非常不同的结构)是由相同的数据集构建的,因此不需要分别查询具有数百万个事件的两个结果,从而节省了资源。
利用这些属性,Maze后端可以准确有效地聚合、存储和显示数据。
挑战与改进
Maze最初是根据Uber黑客马拉松的原型开发的。我们的工程师花了很多精力来生产Maze,并提供相对稳定的数据质量和流畅的用户界面。下面,我们概述了在开发这个强大的新可视化工具的下一代时所面临的一些挑战:
- 后端查询调优“直到最后一分钟,决定旧金山所有司机的状态”不是一个简单的问题。我们现在正在使用Maze的第四代聚合逻辑,并积极改进数据注册过程。
- 数据的可伸缩性:在制作迷宫的时候,我们问自己,在线分析处理(OLAP)数据库的最佳存储方法是什么?优步有很多选择,它们都是为不同的目的而设计的。我们花了很多工程上的努力,试图想出适合数据规模和实时需求的变通办法,我们意识到这将是一个持续的过程。即使我们的解决方案使用MemSql在美国,仍有增长空间。
- 动态呈现和内部状态维护:使用D3在web浏览器中呈现数百万个节点是不现实的。通过动态呈现、内部状态维护和浏览器内缓存,我们可以显示非常小的数据片段进行呈现,并对用户隐藏整个冰山。
- JavaScript运行时清理这是一个艰难但合理的决定Immutable.js以及我们解决方案中的其他奇妙的包。在前端,我们关心每一毫秒的性能,并排除可能的阻碍来加速用户体验。
- 和更多的:我们正在进行的其他改进包括全面测试覆盖和集成测试、离线数据模拟、持续改进监控和警报、更高效的可视化、更大规模的用户组和问题集以及无休止的问题解决。
其他的机会
要优化迷宫,我们还有很长的路要走。我们也承认,让产品接近完美的努力永远不会真正结束。然而,将优步的网络技术堆栈从Bedrock迁移到Fusion.js使用webpack而不是gulp.js例如,开发新的数据事务处理程序以减少网络延迟,根据最新的BaseUI设计升级UI组件,集成a /B测试,以及简单地尝试更多可视化,这些都可能对产品本身和工程师有利。
然而,回到Maze最初的目标,我们所处的位置是产品定义良好,数据结构稳定,即使在使用大量实时数据时性能也很高。看着这些品质,一个新的问题浮出水面:我们如何扩展现有的内容,为更多用户提供洞察他们的渠道和转化相关问题的服务?换句话说,我们如何提供更有用的数据,以便用户能够有效地确定漏斗中问题的根本原因?
Uber的一切都是一个漏斗
由于Maze和其他大规模努力解决注册过程中的已知问题,自2016年以来,美国城市的司机注册转化率提高了50%以上。多亏了Maze,我们可以更好地检测和解释注册异常,否则这些异常会在雷达下飞行并保持损坏。
还有许多类似于优步司机注册的其他过程,涉及到人群经历一系列事件,以成功的结果或不太理想的结果结束。在我们发布了Maze的第一个版本几个月后,我们开始向20多个其他用例开放这个工具,比如骑手应用程序会话、Uber Eats、机场接机和Uber Visa卡应用程序。现在,优步的任何负责流程的人都可以将他们的数据输入Maze,并诊断转化情况。
因为我们记录所有内部工具的事件,所以我们也可以使用Maze来了解这些工具是如何使用的。(事实上,使用Maze分析Maze的使用情况是我们做的第一件事之一!)
漏斗就是一切
最初,梅兹只提出了太阳爆发可视化。太阳爆发带来了一些偏差,因为在屏幕上,向外的环比更靠近中心的环占据更多的空间,它们代表着相同的比例。
这种扭曲对迷宫来说效果很好,因为外部弧通常非常小,因此,外层往往是稀疏的。
尽管如此,我们创建了许多太阳爆发的变化和许多其他方法来观察这个数据集,包括反向太阳爆发、变宽太阳爆发、动画太阳爆发、冰柱、节点链接图和聚类序列。我们一直在向我们的工具箱中添加新的数据,因为不同的方式来看待我们的数据可以解锁新的见解,并为我们的用户创造巨大的价值。
![]() |
![]() |
| 马尔可夫链视图 | 两次太阳爆发之间的太阳脉冲动画 |
![]() |
![]() |
| 变宽日爆发 | 不同的着色模式 |
| 图10:我们在Maze中开发的这组实验可视化显示了从各种不同角度的数据见解。 |
迷宫之外
迷宫本身并不是目的。该项目的目标是在一个更大的可视化计划中发挥作用:漏斗健康。使用漏斗运行状况,用户可以从所选事件中定义自己的漏斗,并在漏斗的某些特征表明需要采取行动时接收智能警报。例如,如果我们观察到骑乘者行程会话率大幅下降,或者在部署新应用版本后找到用户摩擦点,Maze可以帮助我们确定采取什么行动。当与其他以漏斗为中心的工具,如流优步的IFTTT引擎、迷宫和漏斗健康将让我们的团队更深入地了解这些情况。
你愿意帮助我们构建下一代漏斗工具吗?我们正在寻找后端,前端而且可视化工程师加入我们!迷宫也依赖于开源工作的可视化的团队.我们一直在寻找贡献者。给我们发邮件在这里更多详情!
应答:Maze最初是由Andrey Liscovich, Jason Libbey和Aniket Pant开发的。最初的产品团队包括Rafi Lurie、Andrey Liscovich、Sam Suen、Yingchao Liu、Sergei Bezborodko、Alan Sheinberg、Bryan Bierce、Tony Jing、Yujia Luo和Hugh Williams。
订阅我们的通讯以跟上优步工程公司的最新创新。










