無母數檢定:資料量太少或資料非常態分佈嗎?! Python實戰:優化廣告成效?(附Python 程式碼)

徐子皓 Nash Xu
Marketingdatascience
7 min readNov 26, 2020

在上一篇文章中,我們已經將電商的後台原始資料經過整理之後,找出了廣告樣本數最大的三個廣告分別為「自然流量」、「critei」以及「KDP」(如圖一所示),並將資料篩選至只包含這三種廣告的資料了(如圖二所示)。

複習一下上一篇文章吧:【無母數檢定應用 -資料量太少或資料非常態分佈嗎?! Python實戰:商務資料結構整理】(附Python 程式碼)

圖 1 樣本數前三名的廣告名稱
圖 2 處理後資料

請務必不要將這些執行完的資料刪除,因為接下來就要將這些資料加以應用在統計檢定上了。

Photo by: Sajjad Hussain M

一、常態/非常態分佈檢查

記得昨日的文章中,我們提到無母數檢定是用在非常態分佈。因此在開始執行無母數檢定之前,我們需要檢查一下其資料的分佈狀態。

首先,先檢查看看這些資料的分布是否符合常態分配,因此先透過程式碼1將這三類廣告的資料各自取出,如下所示:

程式碼1:

ad1_list = data[data['廣告代號all'] == 'critei']['利潤'].tolist()
ad2_list = data[data['廣告代號all'] == 'KDP']['利潤'].tolist()
ad3_list = data[data['廣告代號all'] == '自然流量']['利潤'].tolist()

分別產出如(圖三、圖四、圖五):

圖 3 「critei」廣告利潤表-ad1_list
圖 4 「KDP」廣告利潤表-ad2_lis
圖 5 「自然流量」廣告利潤表-ad3_list

接著將這三筆資料進行Shapiro常態測試後,可看到這三種廣告的P值都十分地微小,代表顯著不符合常態分配,如程式碼2所示。

程式碼2:

import scipy.stats
scipy.stats.shapiro(ad1_list)
scipy.stats.shapiro(ad2_list)
scipy.stats.shapiro(ad3_list)

產出:

ShapiroResult(statistic=0.9818183183670044,pvalue=1.2465230236902158e-11)
ShapiroResult(statistic=0.9621795415878296,pvalue=3.1705360319920887e-21)
ShapiroResult(statistic=0.9822685122489929,pvalue=2.279967656292392e-21)

二、非常態分佈

由於資料分佈不符合常態分佈,無法直接透過t檢定進行統計分析,因此必須透過無母數檢定來進行分析,如無母數檢定方式如程式碼3所示:

程式碼3:

# 進行Kruskal-Wallis test
from scipy.stats.mstats import kruskalwallis
kruskalwallis(ad1_list, ad2_list, ad3_list)

產出:

KruskalResult(statistic=4.584369300454998,pvalue=0.10104547153612356)

我們將不同廣告的利潤相互作比較,以利了解不同廣告之間所帶來的利潤是否有顯著差異,檢定結果P值約0.1左右,廣義而言不同廣告之間所帶來的利潤是有顯著差異的。

但光得出這樣的結果就足以收工,提交報告了嗎?

當然不夠。即使得出了不同廣告帶來的利潤有顯著差異,也得釐清哪個廣告表現較好、哪個廣告表現較差,才能幫助掌握後續該強化哪些廣告、捨棄哪些廣告。

二、視覺化分析結果

為了方便了解廣告成效差異,本單元將透過繪圖模組「plotly」將不同廣告帶來的「平均利潤」加以視覺化,如程式碼4所示,內部的設定分別為:

1. X:X軸放置的資料,本單元分別將三個廣告作為類別放入其中

2. Y:Y軸放置的資料,本單元放入的資料為平均利潤

3. Mode:可選擇呈現點座標(markers)、線(lines),或兩個都出現

4. Textfont:文字字體設定(字形、大小、顏色等)

5. Line:繪圖線的顏色、粗細

如下所示:

程式碼4:

import plotly.offline as py
import plotly.graph_objects as go
from numpy import mean
fig = go.Figure()
fig.add_trace(go.Scatter(
x= ['critei','KDP','自然流量'],
y= [mean(ad1_list), mean(ad2_list), mean(ad3_list)],
mode="lines+markers",
textfont=dict(
family="sans serif",
size=16,
color="royalblue"),
line=dict(color='royalblue', width=2),
))

再來,透過程式碼5,可進一步設定佈景主題,詳細設定如下:

1. Title:產出圖片的標題、座標位置等

2. xaxis、yaxis:X、Y軸座標名稱

3. width、height:圖片的寬度、高度

4. font:圖片以外的字形、大小、顏色設定

程式碼5:

fig.update_layout(
title={
'text': "<b>廣告效益分析</b>",
'y':0.95,
'x':0.5,
'xanchor': 'center',},
yaxis_title='平均消費金額',
xaxis={
'title': '廣告',
'tickmode': 'linear'
},
width=1800,
height=960,
font=dict(
family="Courier New, monospace",
size=20,
color="lightslategrey"
)
)

設定(程式碼5)完畢後,便可透過(程式碼6)產出,如以下(圖六)所示:

程式碼6:

# 另存互動式網頁檔案
py.plot(fig, filename='無母數檢定-廣告效益分析', auto_open=True)
# 另存圖檔
fig.write_image("C:/Users/user/Desktop/無母數檢定1.1/無母數檢定-廣告
益分析.png")

產出(如圖六):

圖 6 廣告效益分析圖

從圖中可看到,廣告「critei」的平均利潤顯著地落後其他廣告的成效,甚至還小於「自然流量」(不推任何廣告)的利潤。

因此可以推論「critei」帶來的效果不盡理想,可考慮替換成其他廣告;相對地,「KDP」的成效大於「自然流量」,可持續保持推播。

善加運用無母數檢定,能讓您即使在資料量不足或是資料分布不規律的情況下,依然能產出具有價值的分析。

希望我的文章分享,能對您在資料分析上有幫助~

完整程式碼:https://reurl.cc/Q3XMz5

作者:徐子皓(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)

--

--