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

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测试,我们发现对照活动带来了更多的销售行为和访问者的参与。

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

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

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

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
性格色彩测试是一种常用的心理测试方法,用于了解个体的性格特征。下面是一个简单Python 实现: ```python # 定义题目和答案 questions = [ "1. 我通常是一个外向、爱交际的人。", "2. 我更喜欢独自工作而不是团队合作。", "3. 我倾向于按部就班地完成任务,不愿意冒险尝试。", "4. 我喜欢尝试新事物,乐于冒险。", "5. 我在处理问题时通常会考虑多种方案。", "6. 我比较容易感到紧张和焦虑。", "7. 我更喜欢按照计划安排好的生活方式。", "8. 我通常是一个细节-oriented 的人。", "9. 我倾向于寻求别人的意见,而不是自己做决定。", "10. 我喜欢和别人合作,共同完成任务。", ] answers = [ {"A": 1, "B": 4}, {"A": 4, "B": 1}, {"A": 2, "B": 3}, {"A": 3, "B": 2}, {"A": 4, "B": 1}, {"A": 1, "B": 4}, {"A": 3, "B": 2}, {"A": 2, "B": 3}, {"A": 4, "B": 1}, {"A": 1, "B": 4}, ] # 计算得分 score_A = score_B = 0 for i in range(len(questions)): print(questions[i]) answer = input("请选择 A 或 B:") if answer == "A": score_A += answers[i]["A"] score_B += answers[i]["B"] elif answer == "B": score_A += answers[i]["B"] score_B += answers[i]["A"] else: print("输入无效!请选择 A 或 B。") continue # 输出结果 print("A 得分:", score_A) print("B 得分:", score_B) if score_A > score_B: print("你的性格倾向于 A 型。") else: print("你的性格倾向于 B 型。") ``` 该测试中,共有 10 个问题,每个问题有 A 和 B 两个选项,每个选项对应一个分数。回答 A 的问题对应的分数加到 A 类型的得分中,回答 B 的问题对应的分数加到 B 类型的得分中。最后比较 A 类型得分和 B 类型得分的大小,得出测试结果。 需要注意的是,这只是一个简单的性格色彩测试,结果并不一定准确,需要结合其他因素进行综合分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值