数据分析实战 | A/B测试探寻哪种广告点击率更高?

简介: 数据分析实战 | A/B测试探寻哪种广告点击率更高?

场景描述


某个促销活动每个月都会开展一次,但和公司其他类似的促销活动相比,该促销活动的用户购买率比较低。通过调查用户购买率低的原因,发现问题可能出在促销广告上。

于是我们准备了两个不同的广告,来验证哪种广告能够带来更高的用户购买率。

A/B测试

A/B 测试能够在多个选项中找出那个能够带来最佳结果的选项。在本例中,我们只要同时投放广告 A 和广告 B,就可以排除其他外部因素的干扰,但要注意用户分组必须遵循随机原则。

image.png

在测试过程中,我们收集到了两组广告的曝光数据和点击数据,接下来就可以开始数据分析!


数据描述


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 pd
imp_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()
复制代码

image.png

显示 ab_test_goal 数据集后五行。

goal_df.tail()
复制代码

image.png

以曝光数据作为主数据集,连接两个数据集。

all_df = imp_df.merge(goal_df, how='left', on='事务ID', suffixes=('', '_goal'))
all_df.tail()
复制代码

image.png

增加标记列,判断用户是否点击

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()
复制代码

image.png


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
复制代码

image.png

A 的点击率为 是 8% 左右,而 B 的点击率 11.5%。


卡方检验

在讨论二者的差异时,一般采用卡方检验,我们先获取 A/B 广告的点击次数。

import numpy as np
pivot = all_df.pivot_table(index='测试用例(A/B)',
                           columns='是否点击',
                           values='用户ID',
                           aggfunc=np.count_nonzero)
pivot
复制代码

image.png

chi2_contingency 用于列联表中变量独立性的卡方检验。chi2_contingency(observed, correction=True, lambda_=None)


参数

  • observed:列联表,本例中为二维数组。
  • correction :如果为True,并且自由度为1,则应用Yates校正以保持连续性。校正的效果是将每个观察值向相应的期望值调整0.5
  • lambda_ :float或str,可选。默认情况下,此测试中计算的统计量是Pearson的卡方统计量。 lambda_允许使用Cressie-Read功率散度族的统计量来代替。


返回值

  • chi2:float,卡方值
  • p:float,p值
  • dof:int,自由程度
  • expected:ndarray,预期频率,基于表的边际总和
from scipy.stats import chi2_contingency
kf = chi2_contingency(np.array(pivot))
kf
复制代码

image.png

根据上面结果,p值为 4.04×10−694.04×10^{-69}4.04×1069 , 是一个非常小的数值。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()
复制代码

image.png


绘制A/B广告点击率时间序列折线图。

from pyecharts.charts import *
import pyecharts.options as opts
from pyecharts.globals import ThemeType
line_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()
复制代码

image.png

通过上图可知,广告 B 的点击率在大多数时候都优于广告A。所以,分析结果是,广告B比广告A更容易被用户点击。



相关文章
|
18天前
|
消息中间件 数据挖掘 Kafka
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
64 5
|
6天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
34 3
|
11天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
25 1
|
15天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
31 2
|
16天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
27 2
|
7天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
1月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
296 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
152 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
3月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
77 2
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
176 4

热门文章

最新文章