干货 | 滴滴 数据分析原来是这样做的!
hi,我是 Rilke Yang
这是一篇我关于滴滴的数据实战,之前首发在和鲸,这次投稿到凹凸数据,希望能够帮助到大家~
原文链接:https://www.kesci.com/home/project/5f06b0193af6a6002d0fa357
随着企业日常经营活动的进行,企业内部必然产生了各式各样的数据,如何利用这些数据得出有益的见解,并支持我们下一步的产品迭代以及领导决策就显得尤为重要。
A/B测试是互联网企业常用的一种基于数据的产品迭代方法,它的主要思想是在控制其他条件不变的前提下对不同(或同一、同质)样本设计不同实验水平(方案),并根据最终的数据变现来判断自变量对因变量的影响;A/B测试的理论基础主要源于数理统计中的假设检验部分,此部分统计学知识读者可自行探索。
长话短说,本次实战用到的数据集分为两个Excel文件,其中test.xlsx为滴滴出行某次A/B测试结果数据,city.xlsx为某城市运营数据。
数据说明
test.xlsx | city.xlsx |
---|---|
date:日期 | date:日期 |
group:组别(控制组/实验组) | hour:时点 |
requests:订单请求数 | requests:请求数 |
gmv:成交总额 | trips:订单数 |
coupon per trip:每单优惠券金额 | supply hours:可服务时长 |
trips:订单数 | average minutes of trips:平均订单时长(分钟) |
canceled requests:取消请求数 | pETA:顾客预计等待时长 |
aETA:顾客实际等待时长 | |
utiliz:司机在忙率 |
test.xlsx 数据可以用来判断实验条件对此次A/B测试的结果影响是否显著;city.xlsx 数据可以用来探索该城市运营中出现的问题,根据关键结论辅助决策。
在本文中,我们将使用该数据来做A/B测试效果分析与城市运营分析。
一、A/B测试效果分析
1、数据导入
#A/B测试结果数据导入
import pandas as pd
test = pd.read_excel('/home/kesci/input/didi4010/test.xlsx')
test.head()
2、计算ROI
#计算优惠券投入相对gmv的ROI
test['ROI']=test['gmv']/(test['coupon per trip']*test['trips'])
test.head()
3、requests检验
数据共58条,对照组与实验组各29条,样本量<30。
3.1 requests方差检验
-
记两组requests方差分别为从c1,c2 -
零假设H0:c1=c2;备选假设:H1:c1≠c2 -
显著性水平取0.05
#levene检验requests是否齐方差
requests_A=test[test.group=='control'].requests
requests_B=test[test.group=='experiment'].requests
import scipy.stats as st
st.levene(requests_A,requests_B)
p值大于0.05,不拒绝原假设,因此可认为两组实验requests齐方差。
3.2 requests均值检验
-
该数据为同一样本实验前后的不同水平,因此选用配对样本t检验。 -
记两组requests均值分别为从u1,u2 -
零假设H0:u1=u2;备选假设:H1:u1≠u2 -
显著性水平取0.05
#配对样本t检验(两独立样本t检验之前需检验是否齐方差,此处不需要)
st.ttest_rel(requests_A,requests_B)
p值大于0.05,不拒绝原假设,因此可认为实验条件对requests影响不显著。
4、gmv检验
4.1 gmv方差检验
#levene检验gmv是否齐方差
gmv_A=test[test.group=='control'].gmv
gmv_B=test[test.group=='experiment'].gmv
st.levene(gmv_A,gmv_B)
p值大于0.05,不拒绝原假设,因此可认为两组实验gmv齐方差。
4.2 gmv均值检验
#配对样本t检验(两独立样本t检验之前需检验是否齐方差,此处不需要)
st.ttest_rel(gmv_A,gmv_B)
p值小于0.05,拒绝原假设,因此可认为实验条件对gmv有显著影响。
5、ROI检验
5.1 ROI方差检验
#levene检验ROI是否齐方差
ROI_A=test[test.group=='control'].ROI
ROI_B=test[test.group=='experiment'].ROI
st.levene(ROI_A,ROI_B)
p值大于0.05,不拒绝原假设,因此可认为两组实验ROI齐方差。
5.2 ROI均值检验
#配对样本t检验(两独立样本t检验之前需检验是否齐方差,此处不需要)
st.ttest_rel(ROI_A,ROI_B)
p值小于0.05,拒绝原假设,因此可认为实验条件对ROI有显著影响。
二、城市运营分析
1、数据导入
#导入该城市运营相关数据
city = pd.read_excel('/home/kesci/input/didi4010/city.xlsx')
city.head()
#查看数据有无缺失值
city.info()
2、数据探索
2.1 单量最多的时间点
req_hour = city.groupby(['hour'],as_index=True).agg({'requests':sum},inplace=True)
req_hour
#绘制各时点订单请求柱状图
import matplotlib.pyplot as plt
req_hour.plot(kind='bar')
plt.xticks(rotation=0)
plt.show()
可见,在11、12、13这三个时间点内,12点用户发起订单的需求是最大的,其次是13点,11点。
司机运营平台应考虑加大该时点车辆供应。
2.2 单量最多的日期
req_date = city.groupby(['date'],as_index=True).agg({'requests':sum},inplace=True)
req_date.sort_values('date').head()
#绘制订单请求数随日期变化的折线图
req_date.plot(kind='line')
plt.show()
单月订单请求数随日期的变化呈周期性变化,我们猜测4个峰值分别对应4个周末,周末用户出行需求较大。
经验证发现猜想与数据吻合,因此司机运营平台应考虑加大周末、节假日的车辆供给。
2.3 各时段订单完成率
com_hour = city.groupby(['hour'],as_index=False).agg({'requests':sum,'trips':sum},inplace=True)
com_hour['rate']=com_hour['trips']/com_hour['requests']
com_hour
13点订单需求较多,但订单完成率仅47%,说明较多订单没有得到及时相应。
客运部应重点关注13点订单相应时长,排查具体原因。
2.4 单月每日订单完成率
com_date = city.groupby(['date'],as_index=True).agg({'requests':sum,'trips':sum},inplace=True)
com_date['rate']=com_date['trips']/com_date['requests']
com_date.sort_values('date').head()
#绘制订单完成率随日期变化的折线图
com_date.rate.plot(kind='line')
plt.show()
单月每日订单完成率规律不太明显,但几个谷值基本都出现在周末附近,说明客户出行需求的提升可能导致响应率的降低。
2.5 顾客等待时间
import numpy as np
eta_hour = city.groupby(['hour'],as_index=True).agg({'pETA':np.mean,'aETA':np.mean},inplace=True)
eta_hour
#绘制顾客等待时长复合柱状图
eta_hour.plot(kind='bar')
以上可见,无论哪个时点,用户实际等待时长均明显大于用户预计等待时长。
各时点用户等待时长差异不明显,但13点最高。
客运部一方面应提升用户预计等待时长的准确性,另一方面优化平台派单逻辑等。
2.6 司机在忙率
city['busy'] = city['supply hours']*city['utiliz']
city.head()
busy_hour = city.groupby(['hour'],as_index=False).agg({'supply hours':sum,'busy':sum})
busy_hour['utiliz'] = busy_hour['busy']/busy_hour['supply hours']
busy_hour
12点司机在忙总时长最长,在忙率也最高,用户订单请求也最多,说明车辆总数偏少。
2.7 订单时长
trip_min = city.groupby(['hour'],as_index=False).agg({'average minutes of trips':np.mean})
trip_min
12点用户订单需求较多,同时订单时长最长,说明这个时间点是一个非常重要的时间点。
supply_hour = city.groupby(['hour'],as_index=False).agg({'supply hours':np.mean})
supply_hour
13点订单量也较大,此时点司机服务时长较短。
为优化用户出行体验,司机运营平台可联合客运部可考虑此时段尽量分配总服务时长较长的司机来接单(经验较为丰富)。
3、后续思考方向:
-
提升顾客预计等待时长预测准确度(需要历史数据进行预测) -
加大车辆投入(分车辆不同等级来看,因此可能需要车辆相关信息表) -
优化用户体验(需要客诉相关数据) -
优化平台派单逻辑(需要订单的位置相关数据) -
个性化需求(需要用户属性、及其他行为数据)
本文相关代码下载:
https://alltodata.cowtransfer.com/s/9bb9acdc15ae40
推荐一本书,本周末统一上架
感谢北京大学出版社的大力支持
PS 当当新用户优惠码:DPC3CX
满60-20,亲测可以换手机号使用
本文分享自微信公众号 - 凹凸数据(alltodata)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MOSN v0.15.0 发布,云原生网络代理平台
MOSN 发布 V0.15.0 版本,具体变更如下: 我们很高兴的宣布MOSN v0.15.0发布,恭喜邓茜(@dengqian)成为 MOSN Committer,感谢她为 MOSN 社区所做的贡献。 以下是该版本的变更日志。 新功能 路由 Path Rewrite 支持按照正则表达式的方式配置 Rewrite 的内容@liangyuanpeng 配置新增字段: 扩展配置字段,可通过扩展配置字段自定义启动配置;Dubbo 服务发现配置通过扩展的配置字段实现@cch123 支持 DSL 新特性,可以方便的对请求的处理行为进行控制@wangfakang StreamFilter 新增流量镜像功能的扩展实现@champly Listener 配置新增对 UDP 的支持@dengqian 配置格式支持 Yaml 格式解析@GLYASAI 路由支持 HTTP 重定向配置@knight42 优化 支持 istio 的 stats filter,可以根据匹配条件进行 metrics 的个性化记录@wzshiming Metrics 配置支持配置 Histogram 的输出百分比@champly S...
- 下一篇
一个反射问住一大堆人
点击蓝色字免费订阅,每天收到这样的好信息 单单是问反射有什么用,其实最常用的就两个: 根据类名创建实例(类名可以从配置文件读取,不用new,达到解耦) 用Method.invoke执行方法 但是这些其实不难理解,难的是反射本身。如果有兴趣可以往下看: 由于反射本身确实抽象(说是Java中最抽象的概念也不为过),所以我当初写作时也用了大量的比喻。但是比喻有时会让答案偏离得更远。前阵子看了些讲设计模式的文章,把比喻都用坏了。有时理解比喻,竟然要比理解设计模式本身还费劲...那就南辕北辙了。所以,这一次,能不用比喻就尽量不用,争取用最实在的代码去解释。 主要内容: JVM是如何构建一个实例的 .class文件 类加载器 Class类 反射API JVM是如何构建一个实例的 下文我会使用的名词及其对应关系 内存:即JVM内存,栈、堆、方法区啥的都是JVM内存,只是人为划分 .class文件:就是所谓的字节码文件,这里称.class文件,直观些 假设main方法中有以下代码: Person p = new Person(); 很多初学者会以为整个创建对象的过程是下面这样的 javac...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路