卡方檢定 — Python實戰:商務資料結構整理(附Python程式碼)

徐子皓 Nash Xu
Marketingdatascience
9 min readNov 17, 2020

從事數據分析工作時,統計的知識及應用非常的重要哦~本篇文章將和大家分享常聽到的卡方檢定,以及如何將卡方檢定應用至實務的資料分析中!!

本篇文章的原始資料擷取至某電商資料「chisquare.csv」,該檔案內記載了每一筆消費資料的產品款式、觸及轉換廣告(該電商轉換100%來自網路廣告)、性別等,共約35萬筆資料。我們將透過這個資料集練習如何使用卡方檢定,並進一步思考背後是否具有決策參考價值。

一、讀取資料

首先,先透過程式碼1,將原始資料「chisquare.csv」(點我下載)讀入,如下所示:

程式碼1:

import pandas as pddata = pd.read_csv('chisquare.csv', encoding = 'big5')

產出:

圖 1 原始資料示意圖「data」

資料內含有許許多多的產品種類,但每一款產品的消費市場生態皆有所差異,不能透過整體資料的結果,直接地推論個別產品的結果也相同,必須個別地進行分析。本章節會以「產品1」作為分析示範標的,透過程式碼2,便可只取出「產品1」的購買資料。

程式碼2:

data = data[data['產品']=='產品1']

產出:

圖 2 「產品1」原始資料

資料中含有的資料十分完備,但為了方便讀者理解卡方檢定的使用方式及應用,這次的檢定中只會使用「廣告」跟「性別」兩個欄位,如程式碼3所示,將其餘欄位刪除。

程式碼3:

data = data.drop(columns = ['Unnamed: 0', '產品', '訂單時間', '會員', '尺寸', '顏色'])

產出:

圖 3 整理欄位後資料

從圖3的產出可以發現,該電商的原始資料在收集的過程中,遺失了部分資料的紀錄,因此會出現表格內出現「nan」(空值)。遇到這種情況時可透過程式碼4,將有遺失資料的行列給刪除掉。

程式碼4:

data = data.dropna()

產出:

圖 4 刪除含遺失值行列後,保留資料皆十分完整

目前整理下來,我們已經將不該作為本次卡方檢定的所有資料都踢除掉了,但也因為不斷做資料踢除的動作,資料集的「Index」順序變得十分不規則(index編號不會自動更新)。透過程式碼5,可以將資料表裡的每一行重新編號,在閱讀資料上會更輕易掌握資料具體位置。

程式碼5:

data = data.reset_index().drop(columns='index')

產出:

圖 5 資料重新編號後,閱讀上更輕易掌握資料確切位置

恭喜你!

完成這步驟,就代表分析前資料整理已經大致完成。

二、進階資料整理

接下來,要將資料轉換成卡方檢定可以分析的「頻率」,如下所示:

程式碼6:

from collections import Counter
frequency_count = Counter(data['廣告'])

產出:

圖 6 各廣告產生的銷售頻率表-frequency_count

接著透過程式碼7,將該清單中的廣告名稱取出為清單「f1」;頻率取出為清單「f2」,並整合成資料集「frequency_table」,可以使資料更直觀地閱讀、整理。

程式碼7:

f1 = list(frequency_count.keys())
f2 = list(frequency_count.values())
frequency_table = pd.DataFrame(zip(f1,f2),
columns=['廣告名稱','頻率'])

產出:

圖 7 廣告名稱清單「f1」
圖 8 廣告造成的銷售頻率「f2」
圖 9 廣告銷售頻率表-frequency_table

由於產品1共使用了45種的廣告行銷,若將全部的廣告用來進行卡方檢定,不但資料處理上會更加繁雜,大量的廣告內容同時呈現在產出報告上,也會使得管理者無法快速掌握如何做為決策參考,因此將取出銷售頻率前三名之「熱門轉換廣告」來進行卡方檢定,透過程式碼8先將資料由頻率大至小排序:

程式碼8:

frequency_table = frequency_table.sort_values(by = '頻率', ascending = False)

產出:

圖 10 排序後廣告銷售頻率表

隨後依銷售頻率取出頻率前三大廣告:

程式碼9:

frequency_table = frequency_table.iloc[0:3,:]

產出:

圖 11 頻率前三名的廣告銷售頻率表

掌握前三名熱門廣告名稱以及頻率後,要將data內的銷售資料整理到只來自這三種廣告。因此首先要先取出這三種廣告的名稱,用以做為後續的篩選,如程式碼10所示:

程式碼10:

ad_name = frequency_table['廣告名稱'].tolist()

產出:

圖 12 頻率前三名廣告名稱-ad_name

有了廣告名稱後,好的用的for 迴圈又派上用場了,將資料集「data」中的每一筆資料逐一透過for迴圈判斷是否為頻率前三之熱門廣告的結果存至清單「save」中,以利後續的資料刪減,如程式碼11所示,並將判斷結果「save」回存至「data」中。

程式碼11:

save = []
for i in range(0,data.shape[0]):
a = data.iloc[i,0]
if ad_name[0] == a:
save.append('是')
elif ad_name[1] == a:
save.append('是')
elif ad_name[2] == a:
save.append('是')
else:
save.append('否')
data['是否為熱門廣告'] = save

產出:

圖 13 整理後data

從上圖可以看到只有前三名之廣告在新欄位上會被標記為「是」,因此可以透過該欄「是否為熱門廣告」,篩選出符合條件的熱門廣告。如程式碼12所示。

程式碼12:

data = data[data['是否為熱門廣告']=='是']

產出:

圖 14 熱門廣告銷售頻率表

加油~距離完成卡方檢定所需使用的資料就只剩最後一步了!

透過程式碼13,將三種熱門廣告的男性銷售頻率分別取出為「M_1」、「M_2」、「M_3」(Male, NO.1、2、3),並組合成list1,如下所示:

程式碼13:

M_1 = data[data['廣告']==ad_name[0]][data['性別']=='MALE'].shape[0]M_2 = data[data['廣告']==ad_name[1]][data['性別']=='MALE'].shape[0]M_3 = data[data['廣告']==ad_name[2]][data['性別']=='MALE'].shape[0]list1 = [M_1, M_2, M_3]

產出:

圖 15 熱門廣告前三名之男性銷量

透過程式碼14,將三種熱門廣告的女性銷售頻率分別取出為「F_1」、「F_2」、「F_3」(Female, NO.1、2、3),並組合成list2,如下所示:

程式碼14:

F_1 = data[data['廣告']==ad_name[0]][data['性別']=='FEMALE'].shape[0]F_2 = data[data['廣告']==ad_name[1]][data['性別']=='FEMALE'].shape[0]F_3 = data[data['廣告']==ad_name[2]][data['性別']=='FEMALE'].shape[0]list2 = [F_1, F_2, F_3]

產出:

圖 16熱門廣告前三名之女性銷量

最後,透過程式碼15,將「list1」和「list2」整合成資料集,便可作為卡方檢定的資料頻率表-「chi_table」了。

程式碼15:

chi_table = pd.DataFrame(zip(list1, list2), columns=['男性', '女性'],index=[ad_name[0], ad_name[1], ad_name[2]])

產出:

圖 17 廣告-性別交叉比較表:chi_table

終於整理出進行卡方檢定的有用資料集了!!
我將在下篇文章利用整理後的資料進行卡方檢定,和大家分享如何進一步分析出可供決策參考之管理意涵,敬請期待~

如果喜歡我的文章,請給我多一些掌聲~

讓我有動力繼續撰寫下一篇卡方檢定的管理應用分析!!

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

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

--

--