MarTechApe

View Original

企业实例:看Instacart如何玩转数据科学,优化配送效率!

Instacart正在加速增长。去年,我们在北美从30个市场扩展到了190个市场。同时,我们与顶级超市/杂货店的合作伙伴关系也在推动着各地订单猛增。

用户可以打开app或网站,选择一个喜欢的商店,然后将商品添加到购物车,继而选择配送窗口时间(通常为1小时),最后确认下单。在短短几小时中,任何一个城市都可能会有成千上万的订单要确认。

在人力昂贵的美国,优化配送既可以提高用户体验还可以为企业省下不小的成本。因此Instacart的数据科学团队面临的一大考验就是——配送优化。

具体来说,也就是需要确保客户能在他们选择的时间窗口内收到货品。此外,我们还非常关心配送流程的效率,因为采购员在单位时间内可以完成的订单越多,那收入就越大。

Instacart的订单配送

订单配送问题就是确定每个采购员应该完成哪个订单。Instacart的订单配送有两种模式——全程式(full-service)和交接式(handoff)。

“全程式”配送指的就是,采购员开车/骑车到商店,从货架上挑选好货品、付费结账、然后依次配送,如下图:

而“交接式”配送就是,备货和配送是由不同的人完成的。店内备货员会收集所有的货品并在指定的店内区域摆好。当驾驶员到达商店时,就可以直接拿走多个订单然后前往配送,如下图:

那么问题来了——

我们如何决定,什么时候用“全程式”、什么时候用“交接式”呢?

配送的最大挑战:如何选择最优的配送方案

Instacart的配送调度算法不断更新,并与许多其他系统进行交互作用。而在更新过程中,我们作为数据科学家,面临的挑战之一就是研究如何来衡量由特定的变化所导致的结果—我们怎么知道是该推出一个算法改进方案还是仅对参数进行微调?

下面我就和大家分享一个我们最近的算法修改案例。

为了将订单集中分配到各个不同的配送行程中,我们的现有配送算法是,采用了一个“两步法“——首先,我们在“交接式”配送模式中找到配送旅程用时最短、并且可以按时完成配送的所有路线。然后,我们用“全程式”去配送剩余的其他订单。

我们发现现有的配送算法(这种“两步法”)其实不尽完美,所以我们想测试一种新方法——使用一个“全局优化器”来自动决定到底一个订单适合用”交接式“还是”全程式“,以此为海量订单分配最优的配送方式。下图展现了现有方案(”两步法“)与新方案(”全局优化器“)的直观差异:

新算法好,还是老算法好呢?我们要进行A / B测试吗?

长期以来,A / B测试一直被看作是发现因果关系的“黄金准则”。在客户应用程序设计中,大家广泛使用A / B测试来确定哪种版本(例如,文本大小)可以最大程度地提高我们想要的结果(例如,购买率)。

但在我们的物流系统中应用A/B测试有个根本性问题,我们既无法按配送员也无法按消费者去拆分样本做测试,因为它们都是相互依赖的。比如,两种配送算法可能会被分配给同一个配送员。同样的,一个配送员的订单交付情况也可能会影响其他配送员分配到哪一版的算法。下图展示了两个配送员(shopper)的行经路线。

所以我们可能需要寻找其他方式。

那在这种无法满足A/B测试实验条件的现实环境下,我们有什么A/B测试的变体或是延伸方案吗?让我们逐一检查三种流行的方法,以了解为什么它们不足以证明因果关系。

1. 方法一:模拟(Simulations)

我们用旧金山地区的历史数据去模拟在现有算法(“两步法”模型)和新算法(“全局优化器”)这两种配送算法下,配送效率有什么不同。

我们发现,当使用“全局优化器”时,配送效率确实有所提高(约2.1%)。下图中,实线为现有算法(“两步法”)的模拟,虚线为新算法(“全局优化器”)的模拟。

但是这个模拟的方法并不完美。因为调度引擎只是实时物流系统的一个组成部分,基于历史调度数据拟合出的模型提供的结果质量也只不过代表了模型本身的质量而已。举个例子,模拟中缺少了一个很重要的影响配送效率的因素就是——调度(哪个购物者完成了什么订单)与容量(我们接受了多少个订单)之间的反馈循环。而且,如果想使用模拟的方式来测量一些至关重要的“护栏”指标(例如购物者的幸福感)也将会非常困难。

2. 方法二:前后检验(Before and after analysis)

然而由于在模拟的方法中确实看到了新算法的积极结果,于是我们决定在旧金山启动新算法,以了解在现实中到底会发生什么样的情况,并且用前后检验来监测新算法的效果。在实施新算法的几天后,我们发现配送效率在实地提高了2.9%(新算法启动之前和之后):

那么至此,我们是否就可以说2.9%的效率增加原因完全是算法改变吗?

当然不能。因为相关性并不意味着因果关系!(前后检验并不是严格的实验方法,因此不能得出因果结论)在没有实验控制的前提下,我们不能排除外部因素对结果的影响——比如那几天的天气条件(天气对于配送行业的影响非常大)。所以我们继续做了下面这一步,来排除天气的影响。

3. 方法三:用不同样本比较不同算法表现

因为我们数据源非常丰富,我们就又去调取了从未进行过该实验的奥克兰地区的数据(注:奥克兰与旧金山相邻)。

分析结果是,在旧金山进行试验的同等时间段内,奥克兰地区的配送效率指标表现稳定,与前期处于一样的水平(橙色线为奥克兰,绿色为旧金山):

奥克兰在地理位置上靠近旧金山;因此,天气因素的影响在一定程度上被抹去。此外,在配送算法更改前后,两个区域中的指标显示出高度相关性:

所以我们基本可以排除天气因素的影响。虽然此时此刻你会很想把回归线的上移归因新算法的启动,但实际上,外部因素还没有彻底排除。因为奥克兰和旧金山还是有很多差别的例如交通状况,客户促销,系统更改等等。

这些A/B测试的替代性尝试虽然能够给我们一些方向性的洞察,但是不能给我们明确的因果推断,因此我们决定重拾那个难题——找出A/B测试的办法。

回到 A / B测试这个“黄金标准”

那么到底有没有可行的样本拆分方法呢?答案是肯定的。我们可以把原本复杂的问题简单化:我们没必要一次性针对全国所有的订单、配送员和消费者进行彻底的优化。例如,我们不可能把旧金山的订单和奥斯汀的订单合并在一个配送旅程中,或者派一个奥斯汀的配送员去旧金山配送。

那么为了使问题更易于处理,我们就可以细分市场并让算法在不同的地区中(我们称为Zone)独立运作

此外,由于我们平台的订单都是当天必达,所以交付系统复杂的运作其实每夜都会完全清零。因此,同一区域的任何两天的情况也都是完全独立的。这意味着我们可以按区域和日期划分样本,并随机分配算法。下表就是我们将两种算法随机分配给30个地区(A是“两步法”,B是“全局优化器”):

新算法效率的样本分布(全局优化器算法)似乎具有较高的均值,但是我们不确定这个差异是否显著:

因此使用R语言中的t-test函数,我们应用两个样本数据结果来确定两组的均值是否有显著的不同:

结果表明,虽然新算法的效率要比现有版本高出2.6%,但在我们认可的显著性水平为0.05(允许的假阳性率5%)而实际p值为0.079时,我们不能拒绝零假设而认为该更改对现有情况具有显著提升效果(0.079>0.05)。

请注意,t检验等效于对因变量效率和组变量版本进行简单线性回归 。通过拟合的线性模型计算出的回归系数与t检验的估计值相同,p值也会非常接近(由于自由度设置的不一样才略微有所不同):

结果表明,虽然新算法的效率要比现有版本高出2.6%,但在我们认可的显著性水平为0.05(允许的假阳性率5%)而实际p值为0.079时,我们不能拒绝零假设而认为该更改对现有情况具有显著提升效果(0.079>0.05)。

请注意,t检验等效于对因变量效率和组变量版本进行简单线性回归 。通过拟合的线性模型计算出的回归系数与t检验的估计值相同,p值也会非常接近(由于自由度设置的不一样才略微有所不同):

但是,如果忽略了重要的自变量,那么简单线性回归的结果可能会不准确。在我们的示例中,确实有许多其他因素可能会影响结果:

  • 区域:地域分布,订单量,商店位置等都可能会对效率产生重大影响。

  • 星期几:消费者行为上的区别比如订购时间和数量,和商店的繁忙程度等方面都取决于星期几。

  • 周数:指这周是增长的第几周。

那我们如何控制这些因素呢?

尝试统计学里的万能钥匙——多元回归

为了进行多元回归,我们在线性回归模型中包含了额外的自变量(都是定性变量):

基于这个模型,在地区,星期几,和周数都被控制了的情况下,算法更改的效果是提升了3.0%的效率,。更值得一提的是,标准误差从0.013减少到了到0.007,而p值甚至降低到了0.0003:

现在我们终于敢得出结论,新算法对效率的积极影响实际上是非常显著的。通过控制其他变量,多元回归显着降低了估计值的标准误差,从而减少了p值和假阴性,提升了结果的准确度。

而也恰恰因为这些原因,这个方法大大缩短了所需的测试运行时间。

测试运行多长时间才算够?

运行一个对照组的代价对于企业来讲可能是非常昂贵的。更好的做法是在实验之前就进行功效分析(Power Analysis),以确定样本大小(在我们的示例中为周数和区域数),从而估算成本。

在其他条件相同的情况下,当样本方差越大时,需要的样本量就越大。下面显示了针对不同样本量的多变量和简单回归的效果估计的抽样分布:

每个分布都是通过运行500次 A/A测试生成的(都使用同一个版本A,但用的是两个不同的模型)。在每次运行中,A / B测试实则被用于测试两个相同的变量,区域和日期(这两个变量是随机分配的)来输出一组估计值。

  • 所有分布都以0为中心并不是巧合。两个完全相同的版本之间实际的效果差异就是0。

  • 在样本大小相等的情况下,多元回归得出结果具有较低的离散程度。

  • 实验时间越长,方差越趋于减小。

使用抽样分布,我们可以确定在0.05的显著度和0.8的效力下,不同周数下可检测到的影响的大小(需要至少80%的拒绝正确率,以证明原零假设是错误的,改变有实际影响):

为了检测1%的效果差异,使用多元回归实验需要大约4周。而简单回归呢?跑8周都无法达到相同水平的统计意义和效力!这解释了为什么在我们的示例中,多元回归找到了简单回归没有检测到的信息。如果没有多元回归,我们的革新的步伐将会慢的多呀!

最终结果

除了首要指标(即效率)以外,我们还比较了一组辅助指标和“护栏”指标,用以绘制图案并识别危险信号。为了防止与“多重比较”相关的高错误发现率,我们使用了Bonferroni校正法。结果表明,“全局优化”算法确实可以显著提高效率并提高购物者的满意度:

在一个动态,相互依存且杂音很多的系统中,A / B测试与多元回归分析相结合的方法让我们能够用最低的成本量化我们关心的特定指标,从而衡量某个变化的结果。它使我们的交付物流引擎完成了严谨的进化,并能够在如今强调数据驱动和自动化的时代中不断发展。

本文是Instacart使用A/B测试与多元回归衡量配送算法更新效果的实验总结。我们在里面看到了美国生鲜配送业是如何灵活使用各类统计方法来优化配送方案的。如果你也想身临其境地感受美国科技公司如何使用A/B测试进行复杂现实环境的实验,实现产品优化,那么千万不要错过MarTechApe的《A/B测试企业级实战训练营》!让学员在两个月的时间里,使用百万量级原始数据,搭建完整的A/B测试流程。

在过去开办的两期《训练营》中,我们为顶尖科技公司输送数据能力强、实验经验丰富、统计基础扎实的数据人才。不论你本来是什么背景,都能通过这门课程,打开盛行“测试文化”的互联网高科技公司的大门!

以下为往期学员的战绩榜:

《A/B Testing Bootcamp》往期学员拿到的面试机会以及全职工作OFFER包括Facebook、Amazon、TikTok、Viagogo、GSK、Walmart、Pinterest、Chegg、Wish、Twitch、Plymouth Rock、Nintendo等互联网科技公司。

戳下图了解项目详情!

你将获得

  • 真枪实弹的A/B测试项目实操,百万量级真实数据+五大应用案例,从零学会A/B测试的里里外外!

  • 为你建立一个完整的、专业的、深度还原大公司的的A/B测试项目,让你在面试时可以自信展示自己亲自做的案例,成功拿下offer!

  • 从0到100真实操作A/B测试项目的全套流程:数据清洗、数据自动化处理、实验设计、实验执行、结果分析、报告展示

  • 经历真实工作场景中的、各大互联网科技公司里使用的A/B测试流程,以及适应不同商业场景的各类实验/准实验方法。学会工作中最重要的分析方法!

  • 深度学习A/B测试实战中常见的测试陷阱及避免方法。

  • 牢固掌握公司里A/B测试项目中的实际SQL与Python应用,为A/B测试搭建数据库、清理数据、创建数据集。

  • 学会用Python自动化实现A/B测试,为你的老板提高100%的工作效率!

  • 接受系统的统计训练,打下坚实牢固的统计基础,彻底明白A/B测试的统计原理、分析方法、实验设计方法、抽样准则。

  • 各大互联网、科技公司A/B testing面试题解题步骤示范与详细解析。对互联网科技公司的深度剖析和指标介绍,让你自如面对各类面试考验!

  • 专业的Bootcamp经历简历模版认证证书,可以晒到LinkedIn等求职网站,大大提高面试邀请率!

  • 福利升级:训练营以往只内推成功从训练营中毕业的学生。但在疫情期间,所有A/B测试实战训练营学员,均可获得全职或实习岗位的内推机会!

长按二维码,添加小助手为好友,回复“AB”,即可报名《A/B测试实战训练营》:

小助手(微信ID:yvonne91_wsn)

你是否能在更好的公司做更优秀的自己?投资自己,全方位提升能力,为自己增添被验证有效的宝藏项目经历!赶快报名吧!