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」,送你十週入門數據分析電子書唷!期待你與我互動起來~
文章推薦
◆跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求
回顧十週入門數據分析系列文:
關注數據君的臉書:
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!