卡方檢定 — Python實戰:商務資料結構整理(附Python程式碼)
從事數據分析工作時,統計的知識及應用非常的重要哦~本篇文章將和大家分享常聽到的卡方檢定,以及如何將卡方檢定應用至實務的資料分析中!!
本篇文章的原始資料擷取至某電商資料「chisquare.csv」,該檔案內記載了每一筆消費資料的產品款式、觸及轉換廣告(該電商轉換100%來自網路廣告)、性別等,共約35萬筆資料。我們將透過這個資料集練習如何使用卡方檢定,並進一步思考背後是否具有決策參考價值。
一、讀取資料
首先,先透過程式碼1,將原始資料「chisquare.csv」(點我下載)讀入,如下所示:
程式碼1:
import pandas as pddata = pd.read_csv('chisquare.csv', encoding = 'big5')
產出:
資料內含有許許多多的產品種類,但每一款產品的消費市場生態皆有所差異,不能透過整體資料的結果,直接地推論個別產品的結果也相同,必須個別地進行分析。本章節會以「產品1」作為分析示範標的,透過程式碼2,便可只取出「產品1」的購買資料。
程式碼2:
data = data[data['產品']=='產品1']
產出:
資料中含有的資料十分完備,但為了方便讀者理解卡方檢定的使用方式及應用,這次的檢定中只會使用「廣告」跟「性別」兩個欄位,如程式碼3所示,將其餘欄位刪除。
程式碼3:
data = data.drop(columns = ['Unnamed: 0', '產品', '訂單時間', '會員', '尺寸', '顏色'])
產出:
從圖3的產出可以發現,該電商的原始資料在收集的過程中,遺失了部分資料的紀錄,因此會出現表格內出現「nan」(空值)。遇到這種情況時可透過程式碼4,將有遺失資料的行列給刪除掉。
程式碼4:
data = data.dropna()
產出:
目前整理下來,我們已經將不該作為本次卡方檢定的所有資料都踢除掉了,但也因為不斷做資料踢除的動作,資料集的「Index」順序變得十分不規則(index編號不會自動更新)。透過程式碼5,可以將資料表裡的每一行重新編號,在閱讀資料上會更輕易掌握資料具體位置。
程式碼5:
data = data.reset_index().drop(columns='index')
產出:
恭喜你!
完成這步驟,就代表分析前資料整理已經大致完成。
二、進階資料整理
接下來,要將資料轉換成卡方檢定可以分析的「頻率」,如下所示:
程式碼6:
from collections import Counter
frequency_count = Counter(data['廣告'])
產出:
接著透過程式碼7,將該清單中的廣告名稱取出為清單「f1」;頻率取出為清單「f2」,並整合成資料集「frequency_table」,可以使資料更直觀地閱讀、整理。
程式碼7:
f1 = list(frequency_count.keys())
f2 = list(frequency_count.values())
frequency_table = pd.DataFrame(zip(f1,f2),
columns=['廣告名稱','頻率'])
產出:
由於產品1共使用了45種的廣告行銷,若將全部的廣告用來進行卡方檢定,不但資料處理上會更加繁雜,大量的廣告內容同時呈現在產出報告上,也會使得管理者無法快速掌握如何做為決策參考,因此將取出銷售頻率前三名之「熱門轉換廣告」來進行卡方檢定,透過程式碼8先將資料由頻率大至小排序:
程式碼8:
frequency_table = frequency_table.sort_values(by = '頻率', ascending = False)
產出:
隨後依銷售頻率取出頻率前三大廣告:
程式碼9:
frequency_table = frequency_table.iloc[0:3,:]
產出:
掌握前三名熱門廣告名稱以及頻率後,要將data內的銷售資料整理到只來自這三種廣告。因此首先要先取出這三種廣告的名稱,用以做為後續的篩選,如程式碼10所示:
程式碼10:
ad_name = frequency_table['廣告名稱'].tolist()
產出:
有了廣告名稱後,好的用的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
產出:
從上圖可以看到只有前三名之廣告在新欄位上會被標記為「是」,因此可以透過該欄「是否為熱門廣告」,篩選出符合條件的熱門廣告。如程式碼12所示。
程式碼12:
data = data[data['是否為熱門廣告']=='是']
產出:
加油~距離完成卡方檢定所需使用的資料就只剩最後一步了!
透過程式碼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]
產出:
透過程式碼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]
產出:
最後,透過程式碼15,將「list1」和「list2」整合成資料集,便可作為卡方檢定的資料頻率表-「chi_table」了。
程式碼15:
chi_table = pd.DataFrame(zip(list1, list2), columns=['男性', '女性'],index=[ad_name[0], ad_name[1], ad_name[2]])
產出:
終於整理出進行卡方檢定的有用資料集了!!
我將在下篇文章利用整理後的資料進行卡方檢定,和大家分享如何進一步分析出可供決策參考之管理意涵,敬請期待~
如果喜歡我的文章,請給我多一些掌聲~
讓我有動力繼續撰寫下一篇卡方檢定的管理應用分析!!
完整程式碼:https://reurl.cc/N64r85
作者:徐子皓(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)