分享一个超详细的数据分析案例【Python】附ABTest详细介绍_abtest案例
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

z
α
=
−
1.64
z_\alpha = -1.64
zα=−1.64, 检验统计量z = -59.44,该检验为左侧单尾检验,拒绝域为{z<
z
α
z_\alpha
zα},z=-59.44落在拒绝域。
所以我们可以得出结论:在显著性水平为0.05时,拒绝原假设,策略二点击率的提升在统计上是显著的。
假设检验并不能真正的衡量差异的大小,它只能判断差异是否比随机造成的更大。因此,我们在报告假设检验结果的同时,应给出效应的大小。对比平均值时,衡量效应大小的常见标准之一是Cohen’d,中文一般翻译作科恩d值:
d
=
样
本
1
平
均
值
−
样
本
2
平
均
值
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)