首頁 > 軟體

通過Python實現一個A/B測試詳解

2023-02-01 18:01:22

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

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

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

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

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

到此這篇關於通過Python實現一個A/B測試詳解的文章就介紹到這了,更多相關Python A/B測試內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com