用Python實現一個A/B測試!

數據分析那些事
18 min readFeb 20, 2023

--

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測試找到最適合的行銷策略,以此來吸引獲得更多的客戶。

下面就帶大家一起來學習下。

/ 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測試,我們發現對照活動帶來了更多的銷售行為和訪問者的參與。

使用者會從對照活動中查看了更多的產品,使得購物車中有更多的產品和更多的銷售額。

但在測試活動中,使用者購物車產品的結算率會更高。

測試活動是根據內容檢視和新增到購物車會有更多的銷售。而對照活動則是整體銷量的增加。

因此,測試活動可以用來向特定的受眾推銷特定的產品,而對照活動可以用來向更廣泛的客戶推銷多種產品。

文章來源:法納斯特
文章連結:https://mp.weixin.qq.com/s/xmmH538Ukvd4XnFQA8HaMQ

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

餅圖變形記,肝了3000字,收藏就是學會!

MySQL必須掌握4種語言!

太實用了!4種方法教你輕鬆製作互動式儀表板!

跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求

妙呀!一行Python程式碼

回顧十週入門數據分析系列文:

關注數據君的臉書:

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!

--

--

數據分析那些事
數據分析那些事

Written by 數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

No responses yet