資料視覺化的事前準備
-萃取精華資料中的精華-系列5(附Python程式碼)
行銷活動效益知多少?顧客回購了嗎? -萃取精華資料中的精華-系列5(附Python程式碼)
歡迎回來「行銷活動效益知多少?顧客回購了嗎?」系列的第五篇文章,本篇文章要跟大家分享核心架構中「外部迴圈」的部分,如何將資料前處理後的精華資料,再做進一步的萃取成為我們最終資料視覺化的重要元素。
前情提要:
前三篇文章,已經跟大家分享了資料前處理的重要性以及如何在複雜的資料中取出關鍵資料,並且如何將關鍵資料內容建立成一個會員消費紀錄資料庫,也把「會員消費紀錄資料庫」彙整出後續「資料視覺化」所會使用到的基本元素。
第四篇文章,向大家說明了資料視覺化想法、視覺化的程式碼核心架構以及講解核心架構中「內部迴圈」如何取出每個月不同客群的每人平均利潤。
現在,就開始趕快開始萃取精華中的精華吧!
外部迴圈
以下就開始解釋程式碼架構中外層迴圈(橘色區塊)的部分。
外層迴圈程式碼的一開始以【for ad_num in range(len(ad_pd1)):】對應到圖1的橘色第一個區塊方格【外層迴圈:】,此段程式碼的涵義是公司在系列1上所使用的廣告種類「ad_pd1」的長度(41),一樣可以從len(ad_pd1)的產出結果得知,在外面包上range()之後,for迴圈中的’ad_num’ 會從0開始執行,執行完一次就換到1,以此類推程式碼將會按照順序地跑到40,總共41次,此處的41次就分別代表是41個不同廣告,以下依然是以廣告「critei」做舉例。
外層迴圈程式碼(1)、(2)都必須縮排在第一個橘色方格內,程式碼才能執行成功唷,下方開始解釋外層迴圈程式碼。
1. 外層迴圈程式碼(1)
看完程式碼架構(圖1)之後,是否對於外層迴圈程式碼(1)的位置感到疑問呢?以下為大家解釋為何要放置這段程式碼以及為何要放在這個位置。
每個廣告的內容在內層迴圈做資料處理的時候必須是互相獨立的狀態,否則所有廣告的資料都會混在一起,會造成繪圖的資料錯誤,因此在跑內層迴圈之前都必須將所要存放資料的清單清空一次,好讓每個廣告資料都是歸在屬於自己的清單中,如程式碼1所示。
程式碼1:
ad_total=[]
ad_total_mon = []
ad_total_mon = pd.DataFrame(ad_total_mon)
產出:
建立好提供後續儲存的ad_total(List),ad_total_mon(DataFrame),如圖2所示。
圖 2、ad_total與ad_total_mon尚未存取任何資料前的狀態
2. 外層迴圈程式碼(2)
在前一篇系列文章【行銷活動效益知多少?顧客回購了嗎? -資料視覺化設計-系列4】內層迴圈程式碼執行結束後我們得到了單一廣告每個月份不同客群的資料後,即將進行的是計算每個月各自的所有客群加總起來的利潤,並且把index重新排序。
是否不知道計算出所有客群加總起來的利潤的原因呢?
因為後續要產出每個月份的「每人平均利潤」來查看不同月份的利潤表現,所以在此求出每月的總利潤也就是每人平均利潤的「分子」,並且儲存在一個名為「mon_tt_profit」的DataFrame中,如程式碼2所示。
程式碼2:
# 計算每個月份利潤的總和
mon_tt_profit = ad_total_mon.groupby('月份')['利潤'].sum()
mon_tt_profit = mon_tt_profit.reset_index()
產出:
廣告critei各月份的總利潤(mon_tt_profit),如圖3所示
接下來要計算出每人平均利潤的「分母」,每個月購買的總人數,儲存在一個名為「mon_tt_people」的DataFrame中,如程式碼3所示。
程式碼3:
# 計算每個月份購買人數
mon_tt_people = ad_total_mon.groupby('月份')['人數'].sum()
mon_tt_people = mon_tt_people.reset_index()
產出:
廣告critei各月份的總購買人數(mon_tt_people),如圖4所示。
我們獲得分子(廣告critei每個月份總利潤)跟分母(廣告critei每個月份購買的總人數)之後馬上就可以計算出我們的每個月平均利潤,如程式碼4所示。
程式碼4:
# 計算月份人均利潤
mon_tt_profit[‘平均利潤’] = round(mon_tt_profit[‘利潤’] /
mon_tt_people[‘人數’])
產出:
新增平均利潤欄位後的「mon_tt_profit」,如圖5所示。
在這邊要問問正在讀此篇文章的你,看完圖5中的月份欄位是否發現了甚麼呢?沒錯,月份順序不是按照1到12月去排序的,或許又有另一個疑問,沒有按照順序排難道會有甚麼影響嗎?會的!如果沒有按照順序排的話折線圖(月每人平均利潤)的線會從DataFrame排序最前面的row開始連,如果是圖5的話則會從10月開始連,整體的線會穿來穿去的相當凌亂,導致在判讀的時候會有點困難,因此以下要開始解決順序的問題。
因此首先我們可以簡單查看一年中有帶來利潤的是哪幾個月,並且存取在一個串列之中,供後續使用,如程式碼5所示。
程式碼5:
# 存取該廣告有利潤的月份
mon_list = ad_total_mon['月份'].unique().tolist()
產出:
廣告critei有帶來利潤的月份,如圖6所示。
接下來,將10、11、12月份的資料另外存在一個名為oct_nov_dec的DataFrame之中(若該廣告無10、11、12份的資料則會存成空的DataFrame),目的是為了將資料補在DataFrame的最後面,如程式碼6所示。
程式碼6:
# 先把 10 11 12月的資料存下來
oct_nov_dec = []
oct_nov_dec = pd.DataFrame(oct_nov_dec)
for i in ['10月','11月','12月']:
oct_nov_dec= pd.concat([oct_nov_dec,mon_tt_profit[mon_tt_profit['月份']== i]])
產出:
將10、11、12月份資料另外存在「oct_nov_dec」,如圖7所示、
接下來把mon_tt_profit中順序卡在最前面的10、11、12月份的資料刪除後,再將oct_nov_dec的DataFrame使用concat的方法補上mon_tt_profit,這樣不但沒有少資料並且資料也會是按照1到12月的順序呈現,符合我們的需求,方法如程式碼7所示。
程式碼7:
# 把原本的順序在前面10 11 12月資料刪除
if '10月' in mon_list:
mon_tt_profit.drop(mon_tt_profit.loc[mon_tt_profit['月份']=='10月'].index, inplace=True)
if '11月' in mon_list:
mon_tt_profit.drop(mon_tt_profit.loc[mon_tt_profit['月份']=='11月'].index, inplace=True)
if '12月' in mon_list:
mon_tt_profit.drop(mon_tt_profit.loc[mon_tt_profit['月份']=='12月'].index, inplace=True)
# 在尾端補上 10 11 12月資料
mon_tt_profit = pd.concat([mon_tt_profit,oct_nov_dec])
產出:
「mon_tt_profit」調整月份順序後資料,如圖8所示。
得出每個月份的平均利潤且解決完排列順序的問題之後,接下來要計算的是「一年的平均利潤」,那為甚麼我們要計算一年的平均利潤呢?因為要比較每個月的表現哪一個月是高於平均,哪一個月是低於平均,藉由判斷後可以針對不同狀況來做不一樣的處理策略。
繪製折線圖(年每人平均利潤)所需的元素是要在每個月都有年每人平均利潤的值,才能成功呈現期望的圖形,因此在此使用小小的for 迴圈將年每人平均利潤補12次,將繪圖所需的資料補齊,如程式碼8所示。
程式碼8:
# 年平均資料
mon_mean_profit =[]
for i in range(12):
mon_mean_profit.append(round(mon_tt_profit.groupby(‘月份’)[‘平均利潤’].sum().mean()))
產出:
繪製折線圖(年每人平均利潤)所需資料,如圖9所示。
以上就將所有繪圖所需的資料通通整理完畢!恭喜各位堅持到最後一刻,我們目前已經完成資料視覺化程式碼的99%,只差繪圖的程式碼,就即將大功告成了!
下一篇文章將會解說繪圖(plotly)的部分,只需要短短幾行設定,就能執行出直觀並且具有涵義的圖,並且會跟大家說明如何判斷圖形中的管理意涵,就讓我們趕快繼續看下去吧!
請點擊下方系列文章連結了解更多!
Thinking smarter makes you work smarter
如果你喜歡我的文章的話,請給我一點拍手~
如果你覺得喜歡又實用的話,請給我更多的拍手!
程式碼:行銷活動效益知多少?顧客回購了嗎? -萃取精華資料中的精華-系列5(附Python程式碼)
作者:張友志 (臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)
行銷活動效益知多少?顧客回購了嗎?-取出關鍵資料-系列1(附Python 程式碼)
行銷活動效益知多少?顧客回購了嗎? -建立會員消費紀錄資料庫-系列2(附Python程式碼)
行銷活動效益知多少?顧客回購了嗎?-彙整資料視覺化所需的基本元素-系列3(附Python程式碼)
行銷活動效益知多少?顧客回購了嗎? -資料視覺化設計-系列4(附Python程式碼)
更多實戰案例及情境好文推薦
行銷經理的經驗也可以科學化 - 用「K-means」演算法進行市場區隔 (附Python程式碼)
行銷經理的經驗也可以科學化 - 用「K-means」演算法進行市場區隔 (附Python程式碼) 對機器學習演算法有所研究的人一定都聽過「聚
用資料分析的方法來探討 - 如何成為資料科學家?-系列1
用資料分析的方法來探討 - 如何成為資料科學家? 相信大家都有耳聞過「21世紀最性感的職業 — 資料科學家」,這是源自《哈佛商業評論》(Ha
讓機器學習分析影響公司營收的「關鍵變數」(附Python程式)
讓機器學習分析影響公司營收的「關鍵變數」(附Python程式) 我們在精準行銷模型-系列1的文章 — 誰會簽約?以「精準行銷模型」評估顧客帶