目录
一、项目背景
随着企业日常经营活动的进行,企业内部必然产生了各式各样的数据,如何利用这些数据得出有益的见解,并支持我们下一步的产品迭代以及领导决策就显得尤为重要。
A/B测试是互联网企业常用的一种基于数据的产品迭代方法,它的主要思想是在控制其他条件不变的前提下对不同(或同一、同质)样本设计不同实验水平(方案),并根据最终的数据变现来判断自变量对因变量的影响;A/B测试的理论基础主要源于数理统计中的假设检验部分,此部分统计学知识读者可自行探索。
数据集为两个Excel文件,其中test为某次A/B测试相关数据,city为某城市运营数据。
数据说明
test.xlsx
date:日期
group:组别(控制组/实验组)
requests:订单请求数
gmv:成交总额
coupon per trip:每单优惠券金额
trips:订单数
canceled requests:取消请求数
city.xlsx
date:日期
hour:时点
requests:请求数
trips:订单数
supply hours:可服务时长
average minutes of trips:平均订单时长(分钟)
pETA:顾客预计等待时长
aETA:顾客实际等待时长
utiliz:司机在忙率
test.xlsx数据可以用来判断实验条件对此次A/B测试的结果影响是否显著;city.xlsx数据可以用来探索该城市运营中出现的问题,根据关键结论辅助决策。
二、A/B测试效果分析
1、导入数据
import pandas as pd
test = pd.read_excel(r'C:\Users\asus\Desktop\学习\数据分析实战项目\滴滴运营和ABtest\test.xlsx')
print(test.head())
2计算ROI
计算优惠券投入相对gmv的ROI
test['ROI'] = test['gmv']/(test['coupon per trip']*test['trips'])
print(test.head())
3、requests检验
数据共58条,对照组与实验组各29条,样本量<30。
(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
print(st.levene(requests_A,requests_B))
p值大于0.05,不拒绝原假设,因此认定两组requests齐方差。
(2)requests均值检验
该数据为同一样本实验前后的不同水平,故选择配对样本t检验。
记两组requests均值分别为u1、u2。
零假设H0:u1=u2;备选假设H1:u1≠u2。
显著水平取0.05。
两个独立样本t检验之前需要检验是否齐方差,此处不需要。
import scipy.stats as st
print(st.ttest_rel(requests_A,requests_B))
p值大于0.05,不拒绝原因,因此可认为实验条件对requests影响并不显著。
(3)gmv检验
同理对gmv进行方差检验和均值检验
a、gmv方差检验
gmv_A = test[test.group=='control']['gmv']
gmv_B = test[test.group=='experiment']['gmv']
import scipy.stats as st
print(st.levene(gmv_A,gmv_B))
p值大于0.05,不拒绝原假设,因此两组实验gmv齐方差。
b、gmv均值检验
import scipy.stats as st
print(st.ttest_rel(gmv_A,gmv_B))
p值小于0.05,拒绝原假设,因此可以认定实验条件对gmv有显著影响。
(4)ROI检验
对ROI进行方差检验和均值检验
a、ROI方差检验
ROI_A = test[test.group=='control']['ROI']
ROI_B = test[test.group=='experiment']['ROI']
import scipy.stats as st
print(st.levene(ROI_A,ROI_B))
p值大于0.05,故不拒绝原假设,因此认定两组实验ROI齐方差
b、ROI方差检验
import scipy.stats as st
print(st.ttest_rel(ROI_A,ROI_B))
p值大于0.05,故不拒绝原假设,因此可以认定实验条件对ROI有显著影响。
三、城市运营
1.数据导入
city = pd.read_excel(r'C:\Users\asus\Desktop\学习\数据分析实战项目\滴滴运营和ABtest\city.xlsx')
print(city.head())
查看数据有无缺失值
print(city.info())
2.数据探索
(1)每个时间点的总单量
req_hour = city.groupby(['hour'],as_index=True)['requests'].sum()
print(req_hour)
绘制各时点订单请求柱状图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #遇到中文时要设置字体
req_hour.plot(kind='bar')
plt.xticks(rotation=0)
plt.title('各时点订单请求对比')
plt.show()
由此可知用户在12点发起订单最多,其次是13、11点。
司机运营平台应该加大12点车辆的供应。
(2)每天的单量
req_date = city.groupby(['date'],as_index=True)['requests'].sum()
print(req_date.head())
req_date = city.groupby(['date'],as_index=True)['requests'].sum()
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #遇到中文时要设置字体
req_date.plot(kind='line')
plt.title('每日订单请求变化趋势')
plt.show()
单月订单数随日期变化呈周期性变化,我们猜测4个峰值分别对应4个周末,周末用户出行需求量大。
经验证发现猜想与实际数据吻合,故司机运营运营平台可以加大周末和节假日的车辆供给。
(3)各时间段订单完成率
om_hour = city.groupby(['hour'])[['requests','trips']].sum()
om_hour['rate'] = om_hour['trips']/om_hour['requests']
print(om_hour)
13点客户订单需求量大,但是完成率只有0.47,说明很多订单没有得到及时回应。
可以关注该时点相应订单时长,排查原因。
(4)单月每日订单完成率
om_date = city.groupby(['date'])[['requests','trips']].sum()
om_date['rate'] = om_date['trips']/om_date['requests']
print(om_date)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #遇到中文时要设置字体
om_date.rate.plot(kind='line')
plt.title('每日订单完成率变化趋势')
plt.show()
单月每日订单完成率规律不太明显,但几个谷值基本都出现在周末附近,说明客户出行需求的提升可能导致响应率的降低。
(5)顾客等待时间
eta_hour = city.groupby(['hour'])[['pETA','aETA']].mean()
print(eta_hour)
绘制顾客等待时长复合柱形图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #遇到中文时要设置字体
eta_hour.plot(kind='bar')
plt.title('顾客等待时长')
plt.xticks(rotation=0)
plt.show()
可见,无论哪个时点,用户实际等待时长均明显大于用户预计等待时长。
各时点用户等待时长差异不明显,但13点最高。
一方面应提升用户预计等待时长的准确性,另一方面优化平台派单逻辑等。
(6)司机在忙率
city['busy'] = city['supply hours']*city['utiliz']
print(city.head())
busy_hour = city.groupby(['hour'])[['busy','supply hours']].sum()
busy_hour['utiliz'] = busy_hour['busy']/busy_hour['supply hours']
print(busy_hour)
12点司机在忙总时长是最多的,在忙率也是最高的,用户订单请求也是最多的,说明这个时间段的车辆最少。
(7)订单时长
trip_mean = city.groupby(['hour'],as_index=False)['average minutes of trips'].mean()
print(trip_mean)
12点用户订单需求较多,同时订单时长最长,说明这个时间点是一个非常重要的时间点。
supply_hour = city.groupby(['hour'],as_index=False)['supply hours'].mean()
print(supply_hour)
13点订单量也较大,此时点司机服务时长较短。
为优化用户出行体验,司机运营平台可联合客运部可考虑此时段尽量分配总服务时长较长的司机来接单(经验较为丰富)。