服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

简单,用 Python 实现 A/B 测试!

日期: 来源:Python开发者收集编辑:小F
A/B测试,通过分析两种不同的营销策略,以此来选择最佳的营销策略,可以高效地将流量转化为销售额(或转化为你的预期目标)。


有助于找到更好的方法来寻找客户、营销产品、扩大影响范围或将目标客户转化为实际客户。


A/B测试是每个学习数据分析同学,都应该知道且去学习的概念。


/ 01 / AB测试


举个例子,我在短视频App上购买流量推广我的视频(挂小黄车买课程),一共推了两次,其中两次的目标受众各不相同。


在分析了两次活动的结果后,我可能倾向于选择第二次的活动目标受众,因为它比第一次活动能够带来更好的销售额或涨粉或播放量。


我们的目标可以是提高销售额、粉丝数或流量等等。


当我们根据以前的营销活动结果选择最佳的营销策略时,这就是A/B测试。


本次使用的数据集是开源数据集,İLKER YILDIZ在Kaggle上提交的A/B测试的数据集。


下面是数据集中的所有特征:


1. Campaign Name: 活动名称

2. Date: 记录日期

3. Spend: 活动花费(单位:美元)

4. of Impressions: 广告在整个活动中的展示次数

5. Reach: 广告在整个活动中的展示人数(唯一)

6. of Website Clicks: 通过广告获得的网站点击次数

7. of Searches: 在网站上执行搜索的用户数量

8. of View Content: 查看网站内容产品的用户数量

9. of Add to Cart: 将产品添加到购物车的用户数量

10. of Purchase: 购买次数


一共是进行了两种类型的宣传营销活动:


1. Control Campaign: 对照活动

2. Test Campaign: 测试活动


通过执行A/B测试找到最适合的营销策略,以此来吸引获得更多的客户。


下面小F就带大家一起来学习下。



/ 02 / 使用Python进行AB测试


先安装相关的Python可视化库plotly,在使用的时候发现报错,所以还要安装statsmodels库。


pip install -i https://pypi.tuna.tsinghua.edu.cn/simple statsmodels
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly

然后导入Python库,读取两种活动的数据文件。


import pandas as pd
import datetime
from datetime import date, timedelta
import plotly.graph_objects as go
import plotly.express as px
import plotly.io as pio
pio.templates.default = "plotly_white"


# 设置value的显示长度为200,默认为50
pd.set_option('max_colwidth', 300)
# 显示所有列,把行显示设置成最大
pd.set_option('display.max_columns', None)
# 显示所有行,把列显示设置成最大
pd.set_option('display.max_rows', None)

# 加载数据
control_data = pd.read_csv("control_group.csv", sep=";")
test_data = pd.read_csv("test_group.csv", sep=";")

来看看这两个数据集的情况。


# 打印对照活动数据
print(control_data.head())

对照活动数据的情况如下。


打印测试活动数据。


# 打印测试活动数据
print(test_data.head())

测试活动数据的情况如下。



/ 03 / 数据准备


发现数据集的列名不太规范,所以对列名进行修改。


# 更改列名
control_data.columns = ["Campaign Name", "Date", "Amount Spent",
                        "Number of Impressions", "Reach", "Website Clicks",
                        "Searches Received", "Content Viewed", "Added to Cart",
                        "Purchases"]

test_data.columns = ["Campaign Name", "Date", "Amount Spent",
                     "Number of Impressions", "Reach", "Website Clicks",
                     "Searches Received", "Content Viewed", "Added to Cart",
                     "Purchases"]

现在让我们看看数据集是否有空值。


# 查看空值
print(control_data.isnull().sum())
print(test_data.isnull().sum())

发现对照活动的数据集有数据缺失,可以用每列的平均值来填充这些缺失值。


# 数据清洗
control_data["Number of Impressions"].fillna(value=control_data["Number of Impressions"].mean(),
                                             inplace=True)
control_data["Reach"].fillna(value=control_data["Reach"].mean(),
                             inplace=True)
control_data["Website Clicks"].fillna(value=control_data["Website Clicks"].mean(),
                                      inplace=True)
control_data["Searches Received"].fillna(value=control_data["Searches Received"].mean(),
                                         inplace=True)
control_data["Content Viewed"].fillna(value=control_data["Content Viewed"].mean(),
                                      inplace=True)
control_data["Added to Cart"].fillna(value=control_data["Added to Cart"].mean(),
                                     inplace=True)
control_data["Purchases"].fillna(value=control_data["Purchases"].mean(),
                                 inplace=True)

通过合并两个数据集来创建一个新的数据集。


# 合并数据
ab_data = control_data.merge(test_data,
                             how="outer").sort_values(["Date"])
ab_data = ab_data.reset_index(drop=True)
print(ab_data.head())

查看数据集中,两种活动的样本数量是否相同。


# 类型计数
print(ab_data["Campaign Name"].value_counts())

可以看出,每种活动都有30个样本数据,满足样本均衡的条件。



/ 04 / AB测试找到最佳营销策略


01  展示次数-活动花费


首先分析两种活动中「展示次数」和「活动花费」之间的关系。


figure = px.scatter(data_frame = ab_data, 
                    x="Number of Impressions",
                    y="Amount Spent", 
                    size="Amount Spent", 
                    color= "Campaign Name", 
                    trendline="ols")
figure.show()

发现在花费相同的情况下,「对照活动」的展示次数更多。


02  搜索量


两种类型活动的网站总搜索量对比。


label = ["Total Searches from Control Campaign",
         "Total Searches from Test Campaign"]
counts = [sum(control_data["Searches Received"]),
          sum(test_data["Searches Received"])]
colors = ['gold', 'lightgreen']
fig = go.Figure(data=[go.Pie(labels=label, values=counts)])
fig.update_layout(title_text='Control Vs Test: Searches')
fig.update_traces(hoverinfo='label+percent', textinfo='value',
                  textfont_size=30,
                  marker=dict(colors=colors,
                              line=dict(color='black', width=3)))
fig.show()

在网站的搜索量上,「测试活动」略多于对照活动。


03  点击量


两种类型活动的网站总点击量对比。


label = ["Website Clicks from Control Campaign",
         "Website Clicks from Test Campaign"]
counts = [sum(control_data["Website Clicks"]),
          sum(test_data["Website Clicks"])]
colors = ['gold', 'lightgreen']
fig = go.Figure(data=[go.Pie(labels=label, values=counts)])
fig.update_layout(title_text='Control Vs Test: Website Clicks')
fig.update_traces(hoverinfo='label+percent', textinfo='value',
                  textfont_size=30,
                  marker=dict(colors=colors,
                              line=dict(color='black', width=3)))
fig.show()

在网站的点击量上,「测试活动」略多于对照活动。


04  内容产品查看量


两种类型活动的网站内容和产品的查看量对比。


label = ["Content Viewed from Control Campaign",
         "Content Viewed from Test Campaign"]
counts = [sum(control_data["Content Viewed"]),
          sum(test_data["Content Viewed"])]
colors = ['gold', 'lightgreen']
fig = go.Figure(data=[go.Pie(labels=label, values=counts)])
fig.update_layout(title_text='Control Vs Test: Content Viewed')
fig.update_traces(hoverinfo='label+percent', textinfo='value',
                  textfont_size=30,
                  marker=dict(colors=colors,
                              line=dict(color='black', width=3)))
fig.show()

可以看出「对照活动」的内容产品查看量比测试活动多。


虽然差距不是很大,但是由于对照活动的网站点击率相对较低,这便意味着「对照活动的用户参与度(粘性)高于测试活动。


05  加购物车量

两种类型活动,将产品添加到购物车的数量。


label = ["Products Added to Cart from Control Campaign", 
         "Products Added to Cart from Test Campaign"]
counts = [sum(control_data["Added to Cart"]), 
          sum(test_data["Added to Cart"])]
colors = ['gold','lightgreen']
fig = go.Figure(data=[go.Pie(labels=label, values=counts)])
fig.update_layout(title_text='Control Vs Test: Added to Cart')
fig.update_traces(hoverinfo='label+percent', textinfo='value', 
                  textfont_size=30,
                  marker=dict(colors=colors, 
                              line=dict(color='black', width=3)))
fig.show()

尽管「对照活动」的点击率相对较低,但是却有更多的产品被添加到购物车中。


06  活动花费


两种类型的活动花费对比。


label = ["Amount Spent in Control Campaign", 
         "Amount Spent in Test Campaign"]
counts = [sum(control_data["Amount Spent"]), 
          sum(test_data["Amount Spent"])]
colors = ['gold','lightgreen']
fig = go.Figure(data=[go.Pie(labels=label, values=counts)])
fig.update_layout(title_text='Control Vs Test: Amount Spent')
fig.update_traces(hoverinfo='label+percent', textinfo='value', 
                  textfont_size=30,
                  marker=dict(colors=colors, 
                              line=dict(color='black', width=3)))
fig.show()

在测试活动上的花费要高于对照活动。


基于上面的分析,对照活动带来了更多的内容浏览量和产品添加到购物车,「对照活动」比测试活动更有效。


07  销售额


两种类型活动的销售情况对比。


label = ["Purchases Made by Control Campaign", 
         "Purchases Made by Test Campaign"]
counts = [sum(control_data["Purchases"]), 
          sum(test_data["Purchases"])]
colors = ['gold','lightgreen']
fig = go.Figure(data=[go.Pie(labels=label, values=counts)])
fig.update_layout(title_text='Control Vs Test: Purchases')
fig.update_traces(hoverinfo='label+percent', textinfo='value', 
                  textfont_size=30,
                  marker=dict(colors=colors, 
                              line=dict(color='black', width=3)))
fig.show()

在这两种广告活动当中,消费者的购买量仅相差1%左右。


由于对照活动能以更少的营销支出获得了更多的销售,所以在营销策略上,我们可以选择对照活动类型。


最后让我们分析其它指标,看看哪种广告活动的转化率更高。


08  内容产品查看量和点击量


两种类型活动网站内容查看和点击量的关系。


figure = px.scatter(data_frame=ab_data,
                    x="Content Viewed",
                    y="Website Clicks",
                    size="Website Clicks",
                    color="Campaign Name",
                    trendline="ols")
figure.show()

在测试活动中,虽然网站点击率高,但是内容查看量少,所以优先选择「对照活动」。


09  内容产品查看量和添加购物车


分析网站内容查看和添加购物车之间的关系。


figure = px.scatter(data_frame=ab_data,
                    x="Added to Cart",
                    y="Content Viewed",
                    size="Added to Cart",
                    color="Campaign Name",
                    trendline="ols")
figure.show()

再一次的,「对照活动」的效果还是很好,加入购物车的意向较高。


10  添加购物车和销售额

分析添加到购物车的产品数量和销售额之间的关系。


figure = px.scatter(data_frame=ab_data,
                    x="Purchases",
                    y="Added to Cart",
                    size="Purchases",
                    color="Campaign Name",
                    trendline="ols")
figure.show()

虽然对照活动带来了更多的加购物车行为,但「测试活动」的结算率会更高。



/ 05 / 结论


通过A/B测试,我们发现对照活动带来了更多的销售行为和访问者的参与。


用户会从对照活动中查看了更多的产品,使得购物车中有更多的产品和更多的销售额。


但在测试活动中,用户购物车产品的结算率会更高。


测试活动是根据内容查看和添加到购物车会有更多的销售。而对照活动则是整体销量的增加。


因此,测试活动可以用来向特定的受众推销特定的产品,而对照活动可以用来向更广泛的客户推销多种产品。



- EOF -


加主页君微信,不仅Python技能+1

主页君日常还会在个人微信分享Python相关工具资源精选技术文章,不定期分享一些有意思的活动岗位内推以及如何用技术做业余项目

加个微信,打开一扇窗



推荐阅读  点击标题可跳转

1、18 万美元 offer!ChatGPT 通过谷歌 L3 入职测试

2、常用统计检验 Python 代码!

3、用 ChatGPT 生成 Excel 公式,太方便了!


觉得本文对你有帮助?请分享给更多人

推荐关注「Python开发者」,提升Python技能

点赞和在看就是最大的支持❤️

相关阅读

  • 针对某集团的一次渗透测试

  • 声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试
  • NoSQL 数据库如何选型

  • 作者 | Arslan Ahmad
    译者 | 平川
    策划 | Tina
    什么是 NoSQL 数据库?
    通常,“NoSQL 数据库”是指非关系型数据库。不管它是“non SQL”的缩写,还是“not only SQL”
  • 变温粉末操作流程(旧文重发)

  • 想测试材料高温的稳定性,需要用到变温粉末衍射,操作如下:变温粉末操作流程:首先在普通样品台测试样品;拆掉样品台:用内六角拧开三个螺丝,逆时针旋转,台子很重,不要滑落;安装变温台:将检
  • Nature官宣:新增这类论文,研究成果不重要!

  • 1.新增类别近日,Nature发表社论,里面提到Nature将在发表内容中新增一类研究论文,称为“注册报告”(Registered Reports),旨在鼓励严谨性和可复制性。今年是Nature决定对所有论文进
  • 中国测绘 | 齐聚高精地图赛场,稳步提速向新而行

  • 本文内容转载自:中国测绘学会,版权归原作者及刊载媒体所有,所刊载内容仅供交流参考使用,不代表本刊立场。2022年,针对自动驾驶领域的利好政策频出。北上广深等大城市先后制定了一
  • ChatGPT与自动驾驶底层根技术的融合趋势洞察

  • 作者:Dr. Luo,东南大学工学博士,英国布里斯托大学博士后,是复睿微电子英国研发中心GRUK首席AI科学家,常驻英国剑桥。Dr. Luo长期从事科学研究和机器视觉先进产品开发,曾在某500强I
  • 数字中国下的自然资源数字化转型机遇

  • 日前,中共中央 国务院印发《数字中国建设整体布局规划》(后文简称《规划》)。《规划》的发布指明了未来中国经济社会数字化转型的方向,对产业数字化转型起到重要支撑作用。其中

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • FFmpeg 6.0 发布

  • ↓推荐关注↓OSC开源社区(ID:oschina2013)在 FFmpeg 5.1 发布约 6 个月后,FFmpeg 6.0 "Von Neumann" 现已正式发布。该版本包含了许多新的编码器和解码器、过滤器以及 FFmpeg C
  • 简单,用 Python 实现 A/B 测试!

  • A/B测试,通过分析两种不同的营销策略,以此来选择最佳的营销策略,可以高效地将流量转化为销售额(或转化为你的预期目标)。有助于找到更好的方法来寻找客户、营销产品、扩大影响范
  • Nature Energy:应力控制固态电解质中锂枝晶生长

  • 01导读越来越多的研究报道锂金属负极有可能改善可充电电池的性能。然而,当带有锂金属阳极的电池被充电时,金属锂沉积会产生枝晶,这些锂枝晶不断生长直到连接正极,使得电池发生短
  • Angew|自发质子化实现低温长循环水系铜电池

  • 研究背景目前商业化的锂离子电池由于其电解质的易燃性和凝固点高,存在不可避免的安全风险和低温性能差,相比之下,水系电池由于其固有的安全性和环境友好性而备受关注。此外,通过
  • 一场向应用交付标准的“冲锋”

  • 阿里妹导读在 InfoQ “2022 中国技术力量年度榜单”中,KubeVela 获得了 “十大开源新锐项目” 和 “开发者最喜爱的十大开源项目” 双料大奖。这个开源至今仅两年多的云原生