通过Python实现一个A/B测试详解
小F 人气:0A/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 http://pypi.tuna.tsinghua.edu.cn/simple statsmodels pip install -i http://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测试,我们发现对照活动带来了更多的销售行为和访问者的参与。
用户会从对照活动中查看了更多的产品,使得购物车中有更多的产品和更多的销售额。
但在测试活动中,用户购物车产品的结算率会更高。
测试活动是根据内容查看和添加到购物车会有更多的销售。而对照活动则是整体销量的增加。
因此,测试活动可以用来向特定的受众推销特定的产品,而对照活动可以用来向更广泛的客户推销多种产品。
加载全部内容