数据分析实战 | A/B测试探寻哪种广告点击率更高?
大家好,我是丁小杰。
本篇是《数据分析实战》系列第三篇,案例来源为《数据分析实战》一书,书中使用的是 R
语言,接下来一段时间,我会用 Python + Tableau/Pyecharts
尽可能的将案例复现出来,以供大家学习。
场景描述
某个促销活动每个月都会开展一次,但和公司其他类似的促销活动相比,该促销活动的用户购买率比较低。通过调查用户购买率低的原因,发现问题可能出在促销广告上。
于是我们准备了两个不同的广告,来验证哪种广告能够带来更高的用户购买率。
A/B测试
A/B 测试能够在多个选项中找出那个能够带来最佳结果的选项。在本例中,我们只要同时投放广告 A 和广告 B,就可以排除其他外部因素的干扰,但要注意用户分组必须遵循随机原则。
在测试过程中,我们收集到了两组广告的曝光数据和点击数据,接下来就可以开始数据分析!
数据描述
ab_test_imp
广告曝光次数信息,87924
行。
字段 | 类型 | 含义 |
---|---|---|
log_date | str | 广告曝光日期 |
app_name | str | 应用名 |
test_name | str | 测试名 |
test_case | str | 测试用例(A/B) |
user_id | numpy.int64 | 用户 ID |
transaction_id | numpy.int64 | 事务 ID |
ab_test_goal
广告点击次数信息,8598
行。
字段 | 类型 | 含义 |
---|---|---|
log_date.g | str | 广告点击日期 |
app_name | str | 应用名 |
test_name.g | str | 测试名 |
test_case.g | str | 测试用例(A/B) |
user_id.g | numpy.int64 | 用户 ID |
transaction_id | numpy.int64 | 事务 ID |
数据分析
数据读取
读取两个数据集。
import pandas as pdimp_df = pd.read_csv('ab_test_imp.csv')
goal_df = pd.read_csv('ab_test_goal.csv')
修改两个数据集的列名。
imp_df.columns = ['广告曝光日期', '应用名', '测试名', '测试用例(A/B)', '用户ID', '事务ID']
goal_df.columns = ['广告点击日期', '应用名', '测试名', '测试用例(A/B)', '用户ID', '事务ID']
显示 ab_test_imp
数据集后五行。
imp_df.tail()
显示 ab_test_goal
数据集后五行。
goal_df.tail()
以曝光数据作为主数据集,连接两个数据集。
all_df = imp_df.merge(goal_df, how='left', on='事务ID', suffixes=('', '_goal'))
all_df.tail()
增加标记列,判断用户是否点击
all_df['是否点击'] = all_df['用户ID_goal'].apply(lambda x:0 if pd.isnull(x) else 1)
提取分析所需的列数据。
all_df = all_df.loc[:, ['广告曝光日期', '测试用例(A/B)', '用户ID', '事务ID', '是否点击']]
all_df.tail()
A/B点击率
数据处理好后,接下来统计一下 A/B 两个广告的点击率。
pivot = all_df.pivot_table(index='测试用例(A/B)',columns=None,values='是否点击',aggfunc=(lambda x: sum(x)/len(x))).reset_index()
pivot
A 的点击率为 是 8% 左右,而 B 的点击率 11.5%。
卡方检验
在讨论二者的差异时,一般采用卡方检验,我们先获取 A/B 广告的点击次数。
import numpy as nppivot = all_df.pivot_table(index='测试用例(A/B)',columns='是否点击',values='用户ID',aggfunc=np.count_nonzero)
pivot
chi2_contingency
用于列联表中变量独立性的卡方检验。
chi2_contingency(observed, correction=True, lambda_=None)
参数
observed
:列联表,本例中为二维数组。correction
:如果为True,并且自由度为1,则应用Yates校正以保持连续性。校正的效果是将每个观察值向相应的期望值调整0.5lambda_
:float或str,可选。默认情况下,此测试中计算的统计量是Pearson的卡方统计量。 lambda_允许使用Cressie-Read功率散度族的统计量来代替。
返回值
chi2
:float,卡方值p
:float,p值dof
:int,自由程度expected
:ndarray,预期频率,基于表的边际总和
from scipy.stats import chi2_contingencykf = chi2_contingency(np.array(pivot))
kf
根据上面结果,p值为 $ 4.04×10^{-69} $ ,
是一个非常小的数值。p 值越接近于 0 差异性越大。通常来说,当 p 值 小于 0.05 时,称为“存在显著性差异”。因此我们可以说:在将两种广告分为 A/B 并 同时投放后,所得到的点击率存在显著性差异。
A/B广告点击时间序列
计算两个广告每日的点击率。
res = all_df.pivot_table(index='广告曝光日期',columns='测试用例(A/B)',values='是否点击',aggfunc=(lambda x: sum(x)/len(x))).reset_index()
res.head()
绘制A/B广告点击率时间序列折线图。
from pyecharts.charts import *
import pyecharts.options as opts
from pyecharts.globals import ThemeTypeline_style = {'normal': {'width': 4,'shadowColor': 'rgba(155, 18, 184, .3)', 'shadowBlur': 10,'shadowOffsetY': 10,'shadowOffsetX': 10,'curve': 0.5 }
}line = (Line(init_opts=opts.InitOpts(theme='ThemeType.CHALK', width='900px')))line.add_xaxis(res['广告曝光日期'].tolist())
line.add_yaxis('A 广告',res['A'].tolist(),yaxis_index=0,is_smooth=True,is_symbol_show=False,linestyle_opts=line_style)
line.add_yaxis('B 广告',res['B'].tolist(),is_smooth=True,is_symbol_show=False,linestyle_opts=line_style)
line.set_series_opts(label_opts=opts.LabelOpts(is_show = False,))
line.set_global_opts(title_opts=opts.TitleOpts(title = 'A / B 广告点击率时间序列变化折线图',pos_left = 'center',pos_top = '2%'),legend_opts=opts.LegendOpts(pos_top = '12%',legend_icon = 'circle'),xaxis_opts=opts.AxisOpts(axislabel_opts={'rotate':90},axisline_opts=opts.AxisLineOpts(is_show=False),),yaxis_opts=opts.AxisOpts(name='点击率 %',axisline_opts=opts.AxisLineOpts(is_show=False),splitline_opts=opts.SplitLineOpts(is_show=True)),tooltip_opts=opts.TooltipOpts(is_show = True,trigger = 'axis',trigger_on = 'mousemove|click',axis_pointer_type = 'shadow'))line.render_notebook()
通过上图可知,广告 B 的点击率在大多数时候都优于广告A。所以,分析结果是,广告B比广告A更容易被用户点击。
这就是今天要分享的内容,记得点赞哦!
案例参考
[1]《数据分析实战》 [日] 酒卷隆志 里洋平/著 肖峰/译
对于刚入门 Python
或是想要入门 Python
的小伙伴,可以通过下方小卡片联系作者,一起交流学习,都是从新手走过来的,有时候一个简单的问题卡很久,但可能别人的一点拨就会恍然大悟,由衷的希望大家能够共同进步。另有整理的近千套简历模板,几百册电子书等你来领取哦!
数据分析实战 | A/B测试探寻哪种广告点击率更高?相关推荐
- 数据分析报告:手机APP 实时竞价广告点击率的影响因素分析
手机APP 实时竞价广告点击率的影响因素分析 摘要:近年来,随着移动互联网和大数据的发展,基于精准定向目标的实时竞价(RTB)广告投放模式逐渐成为移动广告领域的热潮.RTB 广告投放流程中,需求方平台 ...
- python数据分析答案_知到_Python数据分析实战_章节测试答案
摘要: ... 费用本质上是企业资源的流出,是资产的耗费,其目的是为了( ). A:取得收入 B:降低成本 C:增加权益 D:减少负债 正确答案:A 答案解析:费用可能表现为资产的减少,或负债的增加 ...
- 养猫还是养狗,哪一种宠物所受关注度更高?
来自中国和美国的一个对比调查 目录 问题提出 方法描述 结果展示 百度指数--大陆地区 谷歌指数(google trends)--美国本土州 日本 韩国 结语 问题提出 当前宠物市场上,猫狗是两类最主 ...
- 【有利可图网】PS实战教程24:制作一张,高点击率淘宝动效海报!
案例要点: 使用软件: PS.AI(2017版本) 案例难度: 中级(建议有一定PSAI基础的小伙伴练习) 关键词:PS画笔 AI钢笔工具 PS混合模式 PS时间轴(就是平时大家喜欢学的ps动画) 工 ...
- Kaggle实战:点击率预估
版权声明:本文出自程世东的知乎,原创文章,转载请注明出处:Kaggle实战--点击率预估. 请安装TensorFlow1.0,Python3.5 项目地址: chengstone/kaggle_cri ...
- Ctr点击率预估理论基础及项目实战
1.机器学习推荐算法模型回顾 召回(粗排) 利用业务规则结合机器学习推荐算法得到初始推荐结果,得到部分商品召回集 ALS\UserCF\ItemCF\FP-Growth\规则等方式召回 排序(精排) ...
- Kaggle实战——点击率预估
<深度学习私房菜:跟着案例学Tensorflow>作者 版权声明:本文出自程世东的知乎,原创文章,转载请注明出处:Kaggle实战--点击率预估. 请安装TensorFlow1.0,Pyt ...
- 京东水印主图测试教程 教你提升点击转化率
在运营京东店铺过程中,产品主图对于运营来说非常重要.因为产品主图很大程度上直接影响产品的转化率,如果你的店铺搜索流量不理想,就要抓紧时间测试产品主图了. 而搜索产品主图AB测试的核心就是让你的多套主图 ...
- 如何通过A/B测试提升Push推送消息点击率?
618电商节火热进行中,某电商App准备向用户推送一条全局活动消息,运营准备了两个推送文案: 文案A:年中囤货我们更懂你,没有大优惠怎敢惊动你:美妆个户,户外运动,医疗健康,一站式备齐,点击>& ...
最新文章
- 怎么接收layui上传的文件_layui 上传文件_批量导入数据UI的方法
- Java项目:网上商城系统(java+SSM+jsp+mysql+maven)
- 清华浙大年度学生最高奖,都颁向量子物理
- Python中urllib2总结
- Java编程基础-运算符
- YBTOJ洛谷P4869:出现位置(线性基)
- Java工作笔记-判断文件是否被正在被写入
- 2008不可错过的好莱坞电影
- 【网络安全面试题】——如何渗透测试文件目录穿越
- css js 代码怎么隐藏,如何仅使用js代码(和css)隐藏元素?
- 浅谈PHP数字字符串比较
- Nested组件,解决Flutter布局嵌套过深的利器
- java易宝支付接口文档_易宝支付的最新接口文档
- php操作redis实例大全
- Shadow插件化系列(一)简单详解
- 希腊语 - 希腊字母表对应的意思 - 数据挖掘必备
- 目标追踪(二) 滤波初识
- 空间几何变换 之 齐次坐标
- ec,easyclick常用函数大全,集合1
- ls -la /usr/home/guest/ | more