分享一个超详细的数据分析案例【Python】附ABTest详细介绍_abtest案例
从支付宝的两个营销活动中收集的真实数据集。该数据集包含支付宝中的两个商业定位活动日志。由于隐私问题,数据被采样和脱敏。虽然该数据集的统计结果与支付宝的实际规模有偏差,但不影响解决方案的适用性。
非对称型(卡方分布、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
平
均
值
标
准
差
d=\frac{样本_1平均值-样本_2平均值}{标准差}
d=标准差样本1平均值−样本2平均值
这里的标准差,由于是双独立样本的,需要用合并标准差(pooled standard deviations)代替。也就是以合并标准差为单位,计算两个样本平均值之间相差多少。双独立样本的合并标准差可以如下计算:
s
=
(
(
n
1
−
1
)
×
s
1
2
(
n
2
−
1
)
×
s
2
2
)
n
1
n
2
−
2
s=\frac{((n_1-1)\times s^2_1+(n_2-1)\times s^2_2)}{n_1+n_2-2}
s=n1+n2−2((n1−1)×s12+(n2−1)×s22)
其中s是合并标准差,n1和n2是第一个样本和第二个样本的大小,s1和s2是第一个和第二个样本的标准差。减法是对自由度数量的调整。
# 合并标准差
std1 = data[data.dmp_id ==1].label.std()
std2 = data[data.dmp_id ==3].label.std()
s = np.sqrt(((n1 - 1)\* std1\*\*2 + (n2 - 1)\* std2\*\*2 ) / (n1 + n2 - 2))
# 效应量Cohen's d
d = (p1 - p2) / s
print('Cohen\'s d为:', d)
一般上Cohen’s d取值0.2-0.5为小效应,0.5-0.8中等效应,0.8以上为大效应。
3.3.2 方法二:Python函数计算
import statsmodels.stats.proportion as sp
# alternative='smaller'代表左尾
z_score, p = sp.proportions_ztest([c1, c2], [n1,n2], alternative = "smaller")
print("检验统计量z:",z_score,",p值:", p)
用p值判断与用检验统计量z判断是等效的,这里p值为0,同样也拒绝零假设。
至此,我们可以给出报告:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-23zWAiUo-1712903485449)]
更多推荐
所有评论(0)