易懂的視覺化呈現 -
由折線圖看行銷活動成長趨勢分析

本文章以廣告為主要進行行銷活動的分析案例,利用易懂的折線圖,檢視各項廣告於不同月份的成效,並說明折線圖在Python上的繪製方法,最後帶您檢視總體與個體行銷活動分析折線圖。

本次實作在繪圖前會先進行的資料處理,主要使用pandas與numpy兩套件,將資料整理至可供繪圖狀態,整理後資料將使用plotly來繪製折線圖。

Plotly為大家熟悉的繪圖套件,繪製出來的圖表可存成網頁檔(.html),透過鼠標的選取可以放大、縮小、查看元素等多項功能,互動性相當高,這是讓plotly成為主流繪圖套件的一大特色。

資料前處理

首先,將pandas與numpy的功能import進來,接者使用pandas載入sales_data.csv檔案,載入後可至右上方的variable explorer檢視變數。

初步檢視資料後,可藉由中括號取出dataframe內要分析的資料欄位,但因為欄位數量超過一個,所以在中括號內,需再使用一個中括號使得多欄位的名稱成為一個list,再套入後,便能成功抓取欄位,如程式碼1。

程式碼1:

sales_data = sales_data[['單價','成本','product','訂單時間','廣告代號all']]

篩選原始銷售資料中所需要的欄位。

取出所需要資料後我們可以採用.dtpyes這個語法查看sales_data這個dataframe各個欄位資料型態,如程式碼2。

程式碼2:

sales_data.dtypes

使用.dtpyes檢視各欄位內資料型態,產出結果如下:

單價 int64
成本 int64
product object
訂單時間 object
廣告代號all object
dtype: object

這時需要檢查各欄位內資料是否都為正確的型態,在執行結果內,時間型態為「object」,因為我們需要將行銷活動成效按照時間來整理,所以在訂單時間的型態應該為日期形式而非物件形式。

轉換日期形式需使用pandas的pd.to_datetime將欄位型態進行轉換,轉換後再次使用.dtypes查看資料欄位,可以看到訂單時間成功轉換為datetime,如執行如程式碼3。

程式碼3:

sales_data['訂單時間'] = pd.to_datetime(sales_data['訂單時間'])

成功轉換過後欄位資料型態,產出結果如下:

單價 int64
成本 int64
product object
訂單時間 datetime64[ns]
廣告代號all object
dtype: object

這次的行銷活動分析主要以「月」為單位,為了能夠查詢不同年份的行銷成效,我們需將訂單時間內的月份與年份另存欄位,以方便進行行銷成效的計算,可使用dt.year 與 dt.month 兩式將年份與月份取出,如程式碼4。

程式碼4:

sales_data['訂單時間(年)'] = sales_data['訂單時間'].dt.year
sales_data['訂單時間(月)'] = sales_data['訂單時間'].dt.month

從訂單時間中提取年與月。

在本次分析除現有的欄位,還需新增利潤與count(次數)兩個欄位,利潤可以幫助我們評估廣告效益,count則是用來計算廣告次數,當需要計算廣告平均效益時可以將利潤除以count,如程式碼5。

程式碼5:

sales_data['利潤'] = sales_data['單價'] - sales_data['成本']
sales_data['count'] = 1

放入利潤與count欄位。

以上就完成了本次分析前的資料處理。

接下來開始進行行銷活動分析,會進行繪製總體與個體的行銷活動分析折線圖。

 

總體行銷活動分析

 

我們首先進行總體分析圖繪製,以2017年的產品四為例,先將產品的銷售資料選取出來,再接者選取2017年的資料便完成了資料選取,如程式碼6。

程式碼6:

Analyze_product = "產品"
product_data = sales_data[sales_data['product'] == Analyze_product]
search_year = 2017
product_data = product_data[product_data['訂單時間(年)'] == search_year]

提取2017年產品資料。

總體行銷活動分析圖需將相同月份的廣告利潤加總,並計算出每個月平均廣告利潤。這時我們可以使用groupby,groupby可以依據我們所選取的欄位進行分組,並將不同組的其餘欄位進行計算。

以本次分析來說我們將選取訂單時間(月)這個欄位做為groupby的依據,接著根據所選取的欄位資料進行分組,一種資料便是一組,而該銷售資料共有12個月份,所以會分成12組。

計算完後就可以開始準備繪製圖表了

本次要計算的欄位為利潤與count,所以我們將利潤與count 兩個欄位放於groupby的後面,並在最後面放入計算方法sum(),將利潤與count計算加總,即可得知每個月的廣告利潤與廣告次數,兩者相除即可得知每月的平均廣告利潤,如程式碼7。

Groupby使用方法 :

Dataframe名稱.groupby(‘群組欄位名稱’)[‘計算欄位名稱’].計算方法()

程式碼7:

ad_avg_profit = product_data.groupby('訂單時間(月)')[['利潤', 'count']].sum()
ad_avg_profit['平均利潤'] = ad_avg_profit['利潤'] / ad_avg_profit['count']

計算出每月所有廣告帶入的總利潤與平均利潤

下圖為這次繪製的總體分析即為平均廣告利潤圖,可以帶我們檢視「每月全部廣告」的平均利潤。

總體分析圖繪製

首先,將plotly的套件import進來,plotly內的graph_objects是可以讓我們進行繪圖,設置圖表上的各項物件,而offline可以幫助我們將圖檔存取下來,存成圖片檔與網頁檔等…,如需使用互動式的圖表則需存成網頁檔,如程式碼8。

程式碼8:

import plotly.graph_objects as go
import plotly.offline as py

開始設定圖表上各項物件,圖表組成元素有許多以大項可分為trace-圖表內容與layout-圖表背景兩項。

  1. Trace-圖表內容:圖表內的數據呈現方式,如折線圖、散佈圖與長條圖等等,都需透過trace設定。
  2. Layout-圖表背景:設定圖表標題、大小、X軸與Y軸等佈景設定。

基本介紹完後,我們開始設定trace也就是圖表內的參數,我們將各式參數一一解析,來幫助我們繪製圖表。

Trace-圖表內容參數:

  1. go.scatter:繪製散佈圖、折線圖所使用的模式
  2. x、y:數據X軸與Y軸數值設定。
  3. mode:圖表內繪圖樣式。
  4. maker:設定個數值點的參數,如顏色、大小等。
  5. line:設定線的參數,如顏色、大小等。
  6. showlegend:圖例是否開啟。

以上為trace內可設定之參數,本次繪圖我們將hover_month放入每個月份名稱一月份、二月份…,再傳入x軸,其他trace設定如下,可依照自己喜好進行修改,如程式碼9。

程式碼9:

trace = go.Scatter(x= hover_month,
y=ad_avg_profit['平均利潤'],mode='lines+markers',
marker={'color': '#669966'},line={'width': 2},
name ='每月平均廣告利潤',showlegend=True)

Layout-圖表背景參數:

1. go.layout:設定佈景主題,圖表背景、圖表大小、X軸與Y軸等。

2. title:圖表標題。

3. yaxis_title:y軸座標軸標題

4. xaxis:x軸座標軸參數。

5. font:設定圖像中文參數,如大小、顏色。

以上為layout內可設定參數,本次layout設定與繪製圖表結果如程式碼10。

程式碼10:

layout = go.Layout(title={'text': str(search_year)+"年廣告總利潤",'y':0.95,'x':0.5},
yaxis_title='利潤',
xaxis={'title': 'Month'},
width=1800,
height=900,
boxmode='group',
font=dict(size=20,
color="Black"))

設定完trace與layout後,要將所設定參數放於圖表內,這時我們使用go.figure開始繪圖,並將trace與layout參數放入圖表中,如程式碼11。

程式碼11:

ad_figure = go.Figure(data = traces, layout = layout)
ad_figure.show()

這樣圖便繪製完成了。

另外,也可以使用write_image另存圖檔,或者使用py.plot將圖表存成網頁檔,如程式碼12:

程式碼12:

# save as image
ad_figure.write_image(str(search_year)+str(Analyze_product)+'廣告每月利潤'+'.png')
# save as html
py.plot(ad_figure, filename=str(search_year)+str(Analyze_product)+'總廣告每月利潤', auto_open=True)

以上步驟就完成了平均廣告利潤圖。

 

個體行銷活動分析

 

個體行銷活動分析將會帶我們檢視,在不同產品下的各項行銷活動效益,從中挑選出每月最適行銷活動。

每月廣告利潤計算

接者,我們會先計算每月廣告平均利潤,再篩選具有分析價值,也就是高於平均廣告利潤的廣告進行折線圖繪製。

開始計算每月廣告利潤前,我們先將需要的數值設置好:

  1. ad_types:廣告種類,幫助我們選取各個廣告。
  2. ad_profit_df:廣告利潤DataFrame,將計算出來的廣告利潤放置於此。

現在就可以開始計算每個月的利潤額,我們先藉由計算一個廣告的一月份利潤來解釋計算的方法,再使用for迴圈幫助我們計算每一個廣告的各個月份。

從產品資料中取出一個廣告資料再取出月份資料,使用groupby將利潤與次數使用sum()進行加總,並使用利潤除以次數,就可以算出該廣告月份的平均利潤,如程式碼13。

程式碼13:

select_month = product_data[product_data['訂單時間(月)'] == 1]
select_ad = select_month[select_month['廣告代號all']== ad_types[0]]
select_ad = select_ad.groupby('廣告代號all')[['利潤', 'count']].sum()
select_ad['平均利潤'] = select_ad['利潤'] / select_ad['count']

可以看到廣告代號 criteti 一月份廣告效益分析。

知道如何計算後,我們就需將該計算方法放入for迴圈計算每個廣告在每個月份的平均利潤,計算完成後將每個廣告的平均利潤取出。

這時需注意如果該廣告在該月份沒有資料的話,dataframe就會是空白的,所以可以先用if 建立一個判別式,如果不為空白,再放入至profit這個list內,接者將廣告與廣告平均利潤形成一個dataframe,並與原先的ad_profit_df進行合併。

合併的方法採用merge,merge使用方法如下:

pd.merge(dataframe1,dataframe2,on='根據該欄位進行合併',how ='如何進行合併')

因為這次合併是要將計算出來的廣告平均利潤合併到原先的廣告利潤dataframe,所以how = ‘left ‘,意思是如果左右兩邊沒有符合的資料,將會保留左邊的dataframe資料,在本次實作中,就是保留ad_profit_df這個dataframe內的資料,如程式碼14:

程式碼14:

for month in range(1,13):
# 選擇月份
select_month = product_data[product_data['訂單時間(月)'] == month]
profit = []
# 選擇廣告
for ad in ad_types:
select_ad = select_month[select_month['廣告代號all']== ad]
select_ad = select_ad.groupby('廣告代號all')[['利潤', 'count']].sum()
select_ad['平均利潤'] = select_ad['利潤'] / select_ad['count']
# 取出平均利潤
if not select_ad.empty:
ad_profit = select_ad['平均利潤'][0]
elif select_ad.empty:
ad_profit= None
profit.append(ad_profit)
month_profit = {"廣告代號": ad_types,str(month)+'月份' : profit} #+"月份"
month_profit = pd.DataFrame(month_profit)

 

 

 

 

ad_profit_df = pd.merge(ad_profit_df, month_profit, on=‘廣告代號’, how=‘left’)

 

 

採用程式碼14計算出每一月份各廣告之平均利潤。

在繪製折線圖之前我們需要知道,折線圖是可以幫助我們了解廣告在各個月份的表現,所以需先將具有分析價值的廣告選取出來。

而有價值的廣告篩選方法是將其定義為:該廣告一年的平均利潤需大於所有廣告的平均利潤,即視為具有分析價值得廣告。藉此來決定不在同月份如何進行行銷活動廣告。

那讓我們開始進入廣告篩選!

 

廣告篩選

一年的總廣告平均利潤可以使用圖六所計算每月平均利潤取平均值,並將每月廣告利潤dataframe進行轉置,方便我們進行每個廣告平均值計算,如程式碼15。

程式碼15:

ad_year_avg_profit = ad_avg_profit['平均利潤'].mean()
ad_profit_df = ad_profit_df.set_index('廣告代號')
ad_profit_df = ad_profit_df.T

將每月廣告利潤資料進行轉置,方便進行後續計算。

準備好資料後,將各廣告欄位內的數值使用mean()計算平均值,接者篩選出具有分析價值的廣告,也就是高於總廣告利潤平均值的廣告,如程式碼16。

程式碼16:

for i in ad_profit_df.columns:
if ad_profit_df[i].mean() > ad_year_avg_profit:
print(i+' 廣告具有分析價值')
elif ad_profit_df[i].mean() < ad_year_avg_profit:
ad_profit_df = ad_profit_df.drop(columns = i )

藉由程式碼16判斷廣告是否有分析價值,產出如下:

critei 廣告具有分析價值KDPOD 廣告具有分析價值自然流量 廣告具有分析價值B2KMK 廣告具有分析價值B2KPOD 廣告具有分析價值B2KP 廣告具有分析價值B2K 廣告具有分析價值qdwit 廣告具有分析價值

篩選完後,我們再將每月廣告利潤dataframe轉置,以利進行後續分析與繪圖,如程式碼17。

程式碼17:

ad_profit_df = ad_profit_df.T

再次將dataframe進行轉置。

繪製每月廣告效益分析圖

繪圖前,先展示我們本次要繪製每月廣告效益分析,可以看到在執行的過程中,我們將具分析價值的廣告其每月利潤,利用折線圖的方式呈現出來。並且將每月的最高利潤點標示出來,除了繪製圖表,我們還產出每個月份中利潤最高的廣告,以幫助執行人員進行決策。

首先,我們就可以將各廣告每月平均利潤從ad_profit_df取出放置進trace。因為一次要繪製許多的trace,這時可以使用for迴圈將每個廣告利潤輸入進traces。同時也需查看有多少個廣告,我們可以先設定線條顏色一併匯入至for迴圈,如程式碼18。

程式碼18:

traces = []
colors = ['#990066','#FFCC00','#000033','#663300','#FF6600','#663333','#CC6666','#FF6666',
'#339900']
for i in range(len(ad_profit_df.index)):
print(i)
pl_y = ad_profit_df.iloc[1,:].tolist()
color = colors[i]
trace = go.Scatter(x=hover_month,y= pl_y,
marker= {'color': colors[i]},
mode='lines+markers',line={'width': 2},
name = ad_profit_df.index[i]+'廣告')
traces.append(trace)

使用程式碼18的執行,就可以繪製出每月利潤折線圖了。

接著,將進行廣告推薦清單製作,方法相當直觀,選取較高的廣告利潤,而此清單不只幫助我們進行最適廣告的選取,並能標示於圖表中,讓圖表更加直觀。

 

廣告推薦清單

首先,我們開始製作每月廣告推薦清單。

選取的方式相當易懂,先將ad_profit_df月份利潤從高到低排序,並將前五個視為推薦廣告清單,接者我們選取第一個每月的利潤最高點作為推薦廣告,因為最高點需要在圖表上標示出來,所以需取出最高點的利潤額數字,如程式碼19。

程式碼19:

recommend_ad = [] # 最高利潤廣告名稱
recommend_ad_profit = [] # 最高利潤廣告利潤額
recommend_ad_list = [] # 前五大利潤廣告
for i in ad_profit_df.columns:
ad_profit_df = ad_profit_df.sort_values(i,ascending =False)
recommend_ad.append(ad_profit_df[i].index[0])
recommend_ad_list.append(ad_profit_df[i].index[[0,1,2,3,4]].tolist())
recommend_ad_profit.append(ad_profit_df[i][0])

最適廣告標示

取出最高利潤點後,我們需將最高點標示輸入至traces,需要注意因為是標示點,並非是折線圖,所以我們需要將mode= marke,接續我們設定layout,並將layout與traces放入圖表參數,接者可以使用與第一張圖表相同的方式存成圖片與網頁檔,每月廣告效益分析圖就完成了,如程式碼20。

程式碼20:

max_point = go.Scatter(x= hover_month,
y=recommend_ad_profit,
marker=dict(size = 20, color='rgba(255,235,205,0.5)',line=dict(color='#666666',width=2)),
hovertext=recommend_ad,
mode='markers',
name = "每月最適廣告")
traces.append(max_point)
layout = go.Layout(title={'text': str(search_year)+"年每月廣告效益分析",'y':0.95,'x':0.5},
yaxis_title='利潤',
xaxis={'title': '月份'},
width=1800,
height=900,
boxmode='group',
font=dict(size=20,color="lightslategrey"))
ad_figure = go.Figure(data = traces, layout = layout)
ad_figure.show()

行銷活動推薦清單製作

最後,我們將所選取出來的推薦清單進行合併並輸出,讓行銷人員可以擁有一份清單,幫助他們進行決策,將recommend_ad_list轉為dataframe並將hover_month設為index就成功完成推薦清單,並可以將此清單存為csv,如程式碼21。

程式碼21:

recommend_ad_list = pd.DataFrame(recommend_ad_list,index =hover_month)
recommend_ad_list.to_csv(str(search_year)+'年各月份推薦廣告名單.csv',encoding = 'utf-8-sig')

即可產出每月廣告推薦清單。

產出圖表後搭配折線圖,可以幫助主管階層做決策,同時也可以讓行銷活動操作人員有一清單進行行銷活動操作。

以上為本篇文章對於整個行銷活動成長分析的內容,本次的文章內容分析流程完整,學習起來會花一些時間,但這些工具卻對評估各項廣告效益有相當的助益,希望對您也會有幫助!!

~如果喜歡我的文章,也幫我拍拍手~
~我會繼續分享相關的文章給大家~

Github-完整程式碼

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

 

更多實戰案例及情境好文推薦

回到頂端