卡方檢定 — Python實戰:男女大不同,掌握不同廣告的效益(附Python程式碼)
在上一篇文章中,我們將資料經過了一系列的處理後,成功地準備好了一份可供卡方檢定使用的要素交叉頻率表(如圖1所示),接下來將通過該資料進行卡方檢定,並進一步思考背後是否具有決策參考價值。
還請得上一篇文章的資料前處理的內容嗎?!
複習一下吧~
卡方檢定 — Python實戰:商務資料結構整理
一、卡方檢定
本次檢定的目標為「了解針對男女投放不同種類廣告對於銷量是否會有顯著影響」。
因此會個別將每一支熱門廣告的男女銷量列為觀察值(observed),並進一步將觀察值作為卡方檢定的比較標的。
透過程式碼1,將資料集「chi_table」內的資料透過「iloc」的方式選取,「iloc」是pandas.DataFrame的一款附加功能,可用於抓出特定位置的資料,公式如下:
資料集.iloc[第幾列,第幾欄](若使用:符號,代表全選)
運用此技巧,陸續抓出了前三名廣告的男女消費量,並轉換成可供卡方檢定形式的資料格式-array,如下所示:
程式碼1:
import numpy as np
obs = np.array([chi_table.iloc[0,:].tolist(),
chi_table.iloc[1,:].tolist(),
chi_table.iloc[2,:].tolist(),])
產出:
array([[4676, 3180],
[1273, 3236],
[ 978, 1292]])
有了觀察值(obs)後,便可將它代入至卡方檢定中,查看結果,如程式碼2所示:
程式碼2:
import scipy.stats
scipy.stats.chi2_contingency(obs, correction = False)
產出:
(1144.4903264056986,
2.9997380034408637e-249,
2,
array([[3718.38141442, 4137.61858558],
[2134.18811069, 2374.81188931],
[1074.43047489, 1195.56952511]]))
卡方檢定產出的值從頭到尾分別為:檢定值、P值、自由度、檢測內容。如果要判斷廣告跟性別之間所產生的銷售頻率是否有顯著影響的話,只要透過P值觀察是否在顯著區間內即可。利用程式碼3,可將串列中的第二個數值-pvalue取出,取得分析成果。
程式碼3:
p_value = scipy.stats.chi2_contingency(obs, correction = False)[1]
產出:
2.9997380034408637e-249
檢定的結果為P值趨近於0,符合顯著水準內的0.05,因此可以從檢定結果推論出廣告跟性別之間對於銷售量會產生顯著地影響。
但光有這樣的結論,就足以提供給管理當局明確的管理決策參考了嗎?
當然不夠,即使得到了廣告及性別不同對於銷量有顯著影響的結論,但我們仍不知道:
- 對於每個廣告來說,性別的影響力有多大?
- 該廣告對於哪個性別來說影響力更好?
二、事後檢定
這時,我們就必須透過事後檢定,讓其可以更加清楚地掌握對於不同廣告來說,性別對於銷量的影響力使否顯著,而其顯著程度又有多大,如程式碼4所示:
程式碼4:
from scipy.stats import chisquarechisquare(chi_table.iloc[0,:].tolist())[1]chisquare(chi_table.iloc[1,:].tolist())[1]chisquare(chi_table.iloc[2,:].tolist())[1]
產出:
6.489739323992124e-647.28785639051024e-1884.384215086093996e-11
透過事後檢定查看個別廣告的男女性別,對銷量影響的顯著程度有多大,結果回報為三則廣告的p值皆趨近於0,符合廣義顯著範圍的0.05內。因此三則廣告對於男女的銷售量都有顯著的影響。接下來,將透過資料視覺化的方式,讓我們更清楚地掌握資料之間的影響關係。
三、視覺化呈現
得出了每個廣告之間對於性別的顯著程度後,接下來必須提供給管理當局可以一目瞭然的決策參考。此時視覺化呈現就是最好用的幫手,透過製作視覺化圖表可以有效地協助達到目的。
本篇文章使用的繪圖套件為plotly,若對該套件使用方式尚未熟悉者,可參考第三單元的繪圖教學。
透過程式碼5,先輸入基本資料:
程式碼5:
import plotly.offline as py
import plotly.graph_objects as go
fig = go.Figure()
# 男性分布圖
fig.add_trace(go.Scatter(
x= ad_name,
y= chi_table.iloc[:,0].tolist(),
mode="lines+markers",
textfont=dict(
family="sans serif",
size=16,
color="royalblue"),
line=dict(color='royalblue', width=2),
name = '男性'
))
# 女性分布圖
fig.add_trace(go.Scatter(
x= ad_name,
y= chi_table.iloc[:,1].tolist(),
mode="lines+markers",
textfont=dict(
family="sans serif",
size=16,
color="firebrick"),
line=dict(color='firebrick', width=2),
name = '女性'
))
緊接著,透過程式碼6,將佈景主題設定完成。
程式碼6:
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"
)
)
設定完畢後,便可以將產出圖片另存了。
程式碼7:
# 產出另存html檔
py.plot(fig, filename='廣告-性別交叉比較圖', auto_open=True)
# 產出另存png檔
fig.write_image("C:/Users/user/Desktop/卡方檢定/廣告-性別交叉比較圖.png")
產出(如圖2所示):
圖片中的橫軸為不同的熱門廣告,線條的顏色根據性別有所差異,而縱軸便是這些廣告在不同的性別下所對應的銷售頻率高低。
管理當局可以透過產出圖片以及檢定的結果,明確地了解每支廣告所觸及到的性別是否符合期待,或者也可以利用該分析結果,了解將來若須加強推廣男性或女性族群時,選擇那一些廣告,或者是相似度較高的廣告類型。
四、管理決策表
除了提供直觀的圖表呈現以外,條理整齊的表格也適合做為提供給管理階層的產出結果。
透過程式碼8,將每一個熱門廣告的男女銷售量透過for迴圈逐一代入卡方檢定,如果檢定結果P值不小於0.05的話,則會提供「男女推廣效果均勻」結論;若P值小於0.05的話,則會根據男女消費量的大小,做出「針對男性族群推廣較有效」、「針對女性族群推廣較有效」的結論,並回存至交叉比較表「chi_table」中,如下所示:
程式碼8:
# 判斷廣告比重
weight = []
for i in range(0,chi_table.shape[0]):
p = chisquare(chi_table.iloc[i,:].tolist())[1]
if p >= 0.05:
weight.append('男女推廣效果均勻')
else:
a = chi_table.iloc[i,0] # 男性消費量
b = chi_table.iloc[i,1] # 女性消費量
if a>b:
weight.append('針對男性族群推廣較有效')
else:
weight.append('針對女性族群推廣較有效')
# 將結果存至比較表中
chi_table['加強推廣族群'] = weight
產出:
從表中可以讓管理者清楚看到不同情況下的銷售量為何,並提供檢定結果提供的結論是對於哪個性別族群的影響較大,以利管理者透過該表格輕鬆了解廣告成效。
最後,透過程式碼9,將管理決策表另存成csv檔案後,本次的卡方檢定就完成了。
程式碼9:
chi_table.to_csv("C:/Users/user/Desktop/卡方檢定/廣告-性別交叉比較表.csv", encoding='utf-8-sig')
善用卡方檢定,可以幫助了解不同變異數之間的關係。舉凡促銷時間跟上架位至對銷量的差異、不同校系的應屆畢業生英文能力差易等,皆可做為應用,是個非常實用的工具。
希望我的文章對您在統計方法應用於程式及商務分析有所幫助~
喜歡我的文章,請給我掌聲~
您的掌聲是我下一篇文章的動力來源~~
完整程式碼:https://reurl.cc/Y6VOr4
作者:徐子皓(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)