分享一个超详细的数据分析案例【Python】附ABTest详细介绍_abtest案例
+ [如何判断一个样本统计量符合什么分布?](#_53)
+ [不同分布的拒绝域](#_67)
+ - [对称型(Z分布、t分布)](#Zt_68)
- [非对称型(卡方分布、F分布)](#F_73)
必须看的前言
本文全程干货,建议朋友们收藏后慢慢阅读!
另外,我主页上还有不少与ABTest和数据分析相关的博客,感兴趣的朋友可以再去看看,希望能给你带来收获!
一、ABTest
ABTest类似于以前的对比实验,是让组成成分相同(相似)的群组在同一时间维度下去随机的使用一个方案(方案A、或者B、C…),收集各组用户体验数据和业务数据,最后分析出哪个方案最好。
实现步骤
- 现状分析:分析业务数据,确定当前最关键的改进点。
- 假设建立:根据现状分析作出优化改进的假设,提出优化建议。
- 设定目标:设置主要目标,用来衡量各优化版本的优劣;设置辅助目标,用来评估优化版本对其他方面的影响。
- 设计开发:制作若干个优化版本的设计原型。
- 确定分流方案:使用各类ABTest平台分配流量。初始阶段,优化方案的流量设置可以较小,根据情况逐渐增加流量。注意分流时要尽可能做到没有区别。
- 采集数据:通过各大平台自身的数据收集系统自动采集数据。
- 分析ABTest结果:统计显著性达到95%或以上并且维持一段时间,实验可以结束;如果在95%以下,则可能需要延长测试时间;如果很长时间统计显著性不能达到95%甚至90%,则需要决定是否中止试验或重新设计方案。
PS: 先说一下,这里的实现步骤并非权威步骤,不是一定要这么划分。
假设检验
要想充分搞懂ABTest,必须理解它的原理——假设检验。
在一个设计适当的 ABTest中,处理 A 和处理 B 之间任何可观测到的差异,必定是由下面两个因素之一所导致的。
- 分配对象中的随机可能性
- 处理 A 和处理 B 之间的真实差异
假设检验是对 ABTest(或任何随机实验)的进一步分析,意在评估随机性是否可以合理地解释 A 组和 B 组之间观测到的差异。
这里需要介绍一下几个专业术语:
- 零假设:完全归咎于偶然性的假设,即各个处理是等同的,并且组间差异完全是由偶然性所导致的。
事实上,我们希望能证明零假设是错误的,并证明 A 和 B 结果之间的差异要比偶然性可能导致的差异更大。 - 备择假设:与零假设相反,即实验者希望证实的假设。
- 单向检验:在假设检验中,只从一个方向上计数偶然性结果。简单来讲就是最终只需判断大于或者只需判断小于。
- 双向检验:在假设检验中,从正反两个方向上计数偶然性结果。
假设检验的基本思想是“小概率事件”原理,其统计推断方法是带有某种概率性质的反证法。小概率思想是指小概率事件在一次试验中基本上不会发生。反证法思想是先提出检验假设,再用适当的统计方法,利用小概率原理,确定假设是否成立。对于不同的问题,检验的显著性水平α不一定相同,一般认为,事件发生的概率小于0.1、0.05或0.01等,即“小概率事件”。但是,如果说你犯下第一类错误(即拒绝正确的假设:
H
0
H_0
H0是真,但拒绝
H
0
H_0
H0)的成本越高,你的α值就要设置得越小。
接下来介绍假设检验的基本步骤:
- 提出零假设和备择假设;
- 根据备择假设确定检验方向;
简单来说含有不等号的是双向检验,反之则是单向检验; - 选定统计方法。根据资料的类型和特点,可分别选用Z检验、T检验,秩和检验和卡方检验等;
- 选定显著性水平α。但记住判断结论时不能绝对化,应注意无论接受或拒绝检验假设,都有判断错误的可能性。
如何判断一个样本统计量符合什么分布?
如何选定统计方法?那就得判断你的样本统计量符合什么分布了。

上图就是判断一个样本统计量符合什么分布的流程图,非常nice!
下面呢,则是关于Z分布,T分布,卡方分布的简单了解,其中注意考虑多个总体问题时如何计算处理。

接下来再看一下这几种分布的概率密度分布图。

可以看出,T分布与标准正态分布(Z分布)都是以0为对称的分布,T分布的方差大所以分布形态更扁平些。
不同分布的拒绝域
对称型(Z分布、t分布)
双侧检验:
单侧检验:
非对称型(卡方分布、F分布)
卡方分布:
拒绝域:
(卡方分布在左侧的拒绝域特别小,所以拒绝的区间的值也比较少),所以卡方检验的拒绝域一般
放在右侧。F分布同理。


二、项目实战
数据介绍:
从支付宝的两个营销活动中收集的真实数据集。该数据集包含支付宝中的两个商业定位活动日志。由于隐私问题,数据被采样和脱敏。虽然该数据集的统计结果与支付宝的实际规模有偏差,但不影响解决方案的适用性。
主要提供了三个数据集:
- emb_tb_2.csv: 用户特征数据集。
- effect_tb.csv: 广告点击情况数据集。
- seed_cand_tb.csv: 用户类型数据集。
本分析报告的主要使用广告点击情况数据,涉及字段如下:
- dmp_id:营销策略编号(这里我们这么设置1为对照组,2为营销策略一,3为营销策略二)。
- user_id:支付宝用户ID。
- label:用户当天是否点击活动广告(0:未点击,1:点击)。
接下来正式开始实战。
1 数据预处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
data = pd.read_csv('effect\_tb.csv',header = None)
data.columns = ['dt','user\_id','label','dmp\_id'] # 文件中没有字段名
# 日志天数属性用不上,删除该列
data = data.drop(columns='dt')
data

data.info(null_counts = True)

查看数据统计情况,主要是看dmp_id。
data.describe()

接下来查看数据重复情况。
data[data.duplicated(keep = False)]

存在重复项,需要进行去重。
data = data.drop_duplicates()
# 检查是否还有重复项
data[data.duplicated(keep = False)]

从先前操作已知数据类型正常,接下来利用透视表来看各属性是否存在不合理情况。
data.pivot_table(index = 'dmp\_id',columns = 'label',values = 'user\_id',aggfunc = 'count')

从以上看出属性字段无异常取值,无需进行处理。
2 样本容量检验
在进行ABTest前,需检查样本容量是否满足试验所需最小值。
这里需要借助样本量计算工具:https://www.evanmiller.org/ab-testing/sample-size.html
首先需要设定点击率基准线以及最小提升比例,我们将对照组的点击率设为基准线。
data[data["dmp\_id"] == 1]["label"].mean()

对照组的点击率为1.26%,假设我们希望新的营销策略能够让广告点击率至少提升一个百分点,则算得所需最小样本量为2167。
data["dmp\_id"].value_counts()

可得411107和316205远大于2167,满足最小样本量需求。
3 假设检验
我们先查看一下这三种营销策略的点击率情况。
print("对照组: " ,data[data["dmp\_id"] == 1]["label"].describe())
print("策略一: " ,data[data["dmp\_id"] == 2]["label"].describe())
print("策略二: " ,data[data["dmp\_id"] == 3]["label"].describe())

可以看到策略一和策略二相比对照组在点击率上都有不同程度的提升。
其中策略一提升0.2个百分点,策略二提升1.3个百分点,只有策略二满足了前面我们对点击率提升最小值的要求。
接下来需要进行假设检验,看策略二点击率的提升是否显著。
3.1 提出零假设和备择假设
设对照组点击率为
p
1
p_1
p1,策略二点击率为
p
2
p_2
p2,则:
- 零假设
H
0
H_0
H0:
p
1
p_1
p1>=
p
2
p_2
p2,即
p
1
p_1
p1-
p
2
p_2
p2>=0;
- 备择假设
H
1
H_1
H1:
p
1
p_1
p1<
p
2
p_2
p2,即
p
1
p_1
p1-
p
2
p_2
p2<0。
3.2 确定检验方向
由备择假设可以看出,检验方向为单项检验(左)。
3.3 选定统计方法
由于样本较大,故采用Z检验。此时检验统计量的公式如下:
z
=
p
1
−
p
2
(
1
n
1
1
n
2
)
×
p
c
×
(
1
−
p
c
)
z= \frac{p_1-p_2}{\sqrt{( \frac{1}{n_1}+\frac{1}{n_2})\times p_c \times (1-p_c)}}
z=(n11+n21)×pc×(1−pc)
p1−p2其中
p
c
p_c
pc为总和点击率。
3.3.1 方法一:公式计算
# 用户数
n1 = len(data[data.dmp_id == 1]) # 对照组
n2 = len(data[data.dmp_id == 3]) # 策略二
# 点击数
c1 = len(data[data.dmp_id ==1][data.label == 1])
c2 = len(data[data.dmp_id ==3][data.label == 1])
# 计算点击率
p1 = c1 / n1
p2 = c2 / n2
# 总和点击率(点击率的联合估计)
pc = (c1 + c2) / (n1 + n2)
print("总和点击率pc:", pc)

# 计算检验统计量z
z = (p1 - p2) / np.sqrt(pc \* (1 - pc)\*(1/n1 + 1/n2))
print("检验统计量z:", z)

这里我去
α
\alpha
α为0.05,此时我们利用python提供的scipy模块,查询
α
=
0.5
\alpha=0.5
α=0.5时对应的z分位数。
from scipy.stats import norm
z_alpha = norm.ppf(0.05)
# 若为双侧,则norm.ppf(0.05/2)
z_alpha

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。


四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)