↑ 點擊上方 “凹凸數據” 關注 + 星標 ~
每天更新
作者簡介
HeoiJin:立志透過數據看清世界的產品策劃,專注爬蟲、數據分析、產品策劃領域。
萬物皆營銷 | 資本永不眠 | 數據恆真理
CSDN:https://me.csdn.net/weixin_40679090
前言
失蹤人口終於想起了他的博客賬號密碼。
在上一篇商業分析實戰《只會環比下降3%的數據分析師還有救嗎?》,我們用母嬰產品的數據集,詳解了多維度單指標如何進行分析。
那麼本篇將與大家探討進階版——多維度多指標的數據該如何進行分析。
項目準備
語言:Python 3.7
IDE:Pycharm
相關庫:pandas 0.25.3、matplotlib 3.2.1、pyecharts 1.6.2、seaborn 0.10.0
其他:chromedriver 83.0.4103.39、Edge 83.0.478.37
分析框架:5w2h,銷售額=UV*轉化率*客單價
PS:老規矩代碼僅展示核心知識點部分,源碼和數據集在文末
瞭解數據,梳理指標
數據字段梳理
數據集來自“和鯨”的天貓訂單綜合分析[1],只有一個文件report.csv,包含7個字段,共28010條數據,具體字段爲:
訂單編號
總金額:訂單總金額,本文假設爲商品的標價,共866種
買家實際支付金額:最終成交金額,分爲已付款和未付款兩種情況
已付款情況下:買家實際支付金額 = 總金額 - 退款金額
未付款情況下:買家實際支付金額 = 0
收貨地址:買家的收貨地址,記錄維度爲省市,共記錄了31個省市
訂單創建時間:2020年2月1日 至 2020年2月29日
訂單付款時間:2020年2月1日 至 2020年3月1日
退款金額:付款後申請退款的金額,如果沒有退款,退款金額爲0
指標維度梳理
在天貓母嬰商品的分析當中,僅銷售量作爲結果指標,所有的分析圍繞這個結果指標即可。但通過上面的字段梳理可知,除了成交金額作爲結果指標外,還有一系列的過程指標,那麼就需要對指標間的關係做邏輯梳理。
這裏我們引入電商的分析中最經典的公式:銷售額 = UV * 轉化率 * 客單價
指標梳理:
UV:在本數據集中,沒有客戶id作爲UV數據,但我們可以把訂單創建數量作爲UV的數據
轉化率:轉化流程爲訂單創建 -> 訂單付款 -> 訂單成交 -> 訂單全額成交
客單價:平均每單的售價,在本數據集當中,亦可以理解爲各個產品的銷量情況
維度梳理:
時間維度:(周/日)訂單創建/付款時間
地域:各省市
產品:假設每一種金額對應唯一的產品時,總金額便可以作爲產品品類的標識
數據清洗理
進行處理之前,先通過info函數對數據情況進行初步瞭解
觀察可知,除訂單付款時間之外,均沒有缺失值。付款時間缺失的原因是用戶在訂單創建後跳失,缺失也是存在業務意義,暫不處理空值。
另外,訂單創建時間和訂單付款時間的格式是object,需轉化爲時間格式,方便後續操作。Demo:
df['訂單創建時間']=pd.to_datetime(df['訂單創建時間'])
先看結果指標,確定現狀
對於任何商業組織及其行爲,最終目的都是獲利,而在不考慮成本的情況下,收入便是最重要的結果指標。在本數據集中,第一步自然是要知道銷售額的情況。
實現方法:
以訂單付款時間爲分組條件,對買家實際支付金額求和
用
matplotlib
繪製折線圖
從上圖可得知幾個重點信息:
整體的銷售額爲190萬
4號出現局部峯值,5-8號持續型下降,每日成交額低於萬級水平
10-16日共一週時間的銷售額幾乎低於千級,需要特別留意數據的真實性
17日後出現持續型增長,25日出現本月峯值
但僅憑上面的信息並不足以支撐決策,因此我們對案例增加些背景假設:
本月的銷售額目標是220萬
除10-16日之外,所有數據的採集均沒有錯誤
10-16日的實際日均銷售額爲2萬
在增加假設後,我們可以得知本月的真實銷售額爲200萬,距離目標還差20萬。接下來將從公式中的三個指標來拆解是什麼環節出現問題,應該如何提升銷售額。
拆解結果指標,進一步鎖定問題
用戶行爲路徑整體轉化率
從字段梳理中可以得知用戶行爲路徑爲:訂單創建 -> 訂單付款 -> 訂單成交 -> 訂單全額成交。而轉化率的計算方法有兩種:
絕對轉化率:每一個環節的訂單數除以初始環節的訂單數
相對轉化率:每一個環節的訂單數除以上一個環節的訂單數
兩種計算方式有各自的適用場景,個人理解在瞭解整體情況時絕對轉化率更適合,而加入維度進行對比時,相對轉化率則更適合。因此本環節中,使用絕對轉化率進行計算。
實現方式:
正常的groupby函數並不能幫助我們對特定列進行復雜的篩選,因此需要手動計算各環節的訂單數。
求出各環節的訂單數
訂單創建/付款:計次
訂單實際成交:篩選出買家實際支付金額大於0的所有行
訂單全額成交:篩選出買家實際支付金額等於總金額的所有行
求轉化率:用本環節的訂單數除以訂單創建數
用pyecharts
繪製漏斗圖
rates = pd.Series({
'創建':df['訂單創建時間'].count(),
'付款':df['訂單付款時間'].count(),
'實際成交':df[df['買家實際支付金額']>0].shape[0],
'全額成交':df[df['買家實際支付金額']==df['總金額']].shape[0],
},name='訂單量').to_frame()
# 絕對轉化率=各環節訂單數/訂單創建數
rates['整體轉化率']=rates['訂單量'].apply(lambda x: round(x*100/rates.iloc[0,0],3))
# 可視化部分
c=(
Funnel()
.add(
'轉化率',
[list(z) for z in zip(rates.index,rates['整體轉化率'])],
# 設置標籤位置及數據展現形式
label_opts=opts.LabelOpts(position='inside',formatter='{b}:{c}')
)
.set_global_opts(title_opts=opts.TitleOpts(title='整體轉化率'))
)
# 轉存
make_snapshot(snapshot,c.render(),'轉化率.png')
根據TrustData的報告顯示,淘寶平時的訂單成功率(指提交訂單支付的支付成功率)爲97.4%[2]。若以此作爲標準,本次分析當中的付款轉化率85.99%低於預期標準,實際成交及全額成交的環節轉化率甚至不到7成。屬於比較低的水平。
下一步的分析將鎖定哪些區域轉化率低,具有什麼特徵。
訂單創建量每日走勢
實現方法:
以訂單付款時間(頻率:日)爲分組條件,對訂單創建時間計次
用
matplotlib
繪製折線圖
按照現有的轉化率情況進行估算,10-16日的日均訂單創建量約爲300+,即2月的整體訂單創建數爲2萬6千左右。在轉化率及客單價均不變的情況下,訂單創建數至少要增加多6k才能達到目標值。
值得注意17號後,訂單創建量不斷上升,峯值甚至接近上升前峯值的7倍。下一步的分析將通過不同區域的訂單創建情況,找到哪些區域需要提升訂單創建數。
實際交易量前10的產品情況
實現方法:
篩選買家實際支付金額大於0的所有行
對總金額所在列求次,並降序排序
求出所有品類的佔比情況
將除銷量前10之外的其他產品合併爲其他品類
利用
matplotlib
繪製餅圖
df=df[df['買家實際支付金額']>0]
hot_=pd.DataFrame({
'銷量':df['總金額'].value_counts(),
'全額付款銷量':df[df['買家實際支付金額']==df['總金額']]['總金額'].value_counts()
}).sort_values(by='銷量',ascending=False)
hot_['全額付款佔比']=hot_['全額付款銷量']/hot_['銷量']
hot_['佔比(%)']=hot_['銷量'].apply(lambda x : round((x/hot_['銷量'].sum())*100,2))
銷量前10的產品銷量已經佔到了總銷量的55%。在分析這類榜單類或者佔比類的圖表時,以下信息非常關鍵:
整體排行:是否有哪些產品排在前列/沒有排在前列是出乎意料的事
趨勢:銷量排行變化情況,什麼產品增長最快,什麼產品表現平庸,什麼產品開始下滑
產品佈局:
走量類的產品銷量是否多於品牌類產品
同一產品線的高中低端產品的銷量分佈情況,探究客戶的消費需求偏向
這部分的分析考驗數分們對業務中產品佈局、產品策略規劃等業務知識的熟悉程度。目前我們並沒有更多數據和標準支撐分析,不再展開。
初次彙報
與業務部門的首次彙報溝通,我們並不需要明確所有細分維度的問題,重點在於拉齊認知,讓業務部門對現狀有客觀的理解,並商討出下一步的分析方向即可。我們通過5w2h框架
對現有信息進行整理:
現狀:2月整體的銷售額爲200萬,距離目標220萬還差20萬
原因:轉化率及UV不達標,低價商品佔比高:
轉化率情況:付款成功率爲85.99%,低於行業水平的97.4%,實際成交和全額成交的轉化率分別爲67.67%和65.83%。
UV情況/訂單創建情況:2月訂單創建數爲2萬6千個。在轉化率及客單價不變的情況下,需要增加至3萬2千個才能達到目標值。
客單價/品類銷售情況:目前銷售前5的產品分別爲37(2654件)、69(1776件)、119(1221件)、45(919件)、53(875件),銷量前10的產品已佔總銷量的55%。
在拉齊認知之後,便可以進一步規劃深入分析的方向。我們可以先與業務團隊溝通,將他們認爲的造成問題的原因以MECE原則
整理爲決策樹,再逐點假設檢驗。而本文的着重,是通過多維度多指標的交叉分析,找到更具體的問題。因此,根據上述問題及現有數據,我們下一步分析方向爲:
各個省市的成交額分佈情況
各個省市的訂單創建量變化情況
各個省市的成交轉化率變化情況
各個省市的各品類銷量及轉化率情況
多維度交叉分析,找到解題思路
省市間的銷量會有明顯的差異,且在實際的商業環境當中,我們的資源有限,並不能照顧到所有的區域,一定要有取捨。
因此我們先通過了解各個省市的實際成交額情況來判斷哪些省市是重點區域,再針對重點區域對比分析三個重要指標的情況,從而定位到更具體的問題,找到針對性的解決思路。
各個省市銷售額情況
實現方法:
挑選出實際支付金額大於0的所有行
以收貨地址爲分組條件,對買家實際支付金額求和,並降序排序
用
pyecharts
繪製地圖分佈
amount=df[df['買家實際支付金額'] > 0].groupby('收貨地址')['買家實際支付金額'].sum().sort_values(ascending=False)
# 處理省份名稱爲pyecharts可識別的形式
_x=[i.replace('省','').replace('自治區','') for i in amount.index]
_x=[x if len(x)<4 else x[:2] for x in _x]
# 計算最大值作爲pyecharts色塊分組中的最大值
max_=int(amount['實際成交數'].max())
c=(
Map()
.add(
'訂單數',[list(i) for i in zip(_x, amount['實際成交數'].to_list())],'china'
)
.set_global_opts(
title_opts=opts.TitleOpts(title='各地區實際成交訂單數'),
visualmap_opts=opts.VisualMapOpts(max_=max_,is_piecewise=True)
)
)
從圖及數據可以得知,銷售額前5分別爲上海、北京、江蘇省、廣東省、浙江省,下面的分析將針對這五個省市開展,其他區域的分析思路類似。
重點城市各項指標變化情況
實現方法:
新建列“成交情況”,記錄所有實際成交(買家實際支付金額大於0)的訂單。如有實際成交則賦值爲1,否則爲0
利用收貨地址和訂單付款時間(頻率:周)分組,對訂單創建時間計次並命名爲訂單創建數,對成交情況求和並命名爲訂單成交數
篩選銷量前五的省市:[ 上海,廣東省,北京,江蘇省,浙江省 ]
求出實際成交的轉化率
# 找到有實際成交的所有行
df['成交情況']=0
df.loc[df[df['買家實際支付金額']>0].index.to_list(),'成交情況']=1
df.loc[df[df['買家實際支付金額']==df['總金額']].index.to_list(),'全價成交']=1
# 分組求和
df_=df.groupby(by=['收貨地址',pd.Grouper(key='訂單付款時間',freq='W')]).agg(
訂單創建數=('訂單創建時間', 'count'),
訂單成交數=('成交情況', 'sum')
)
df_head3=df_.loc[['上海','廣東省','北京','江蘇省','浙江省']]
# 求轉化率
df_head3['實際成交轉化率']=df_head3['訂單成交數']/df_head3['訂單創建數']
print(f'{"-" * 15}銷量前5的省市訂單創建量量情況{"-" * 15}\n')
print(df_head3['訂單創建數'].unstack())
print(f'\n{"-" * 15}銷量前5的省市的轉化率情況{"-" * 15}\n')
print(df_head3['實際成交轉化率'].unstack())
從上圖中我們可以得知幾個信息:
在春節過後,疫情最爲嚴重的那段時間,每座城市的訂單創建數及最終成交的轉化率都是非常低,幾乎是每創建兩個訂單,就有一個訂單被退回。而在疫情逐漸明朗後,各項指標均有回升,但依然低於標準值97%。
上海的訂單創建數及實際成交數都是最多的,轉化率的表現也是最好的,因此作爲標杆。
北京及廣東是重點區域。兩個區域是除上海之外銷量最多的,但轉化率基本低於平均值,特別是廣東,雖訂單創建量排名第二,但銷售額卻排名第四。
江蘇和浙江爲次重要區域。兩個區域雖訂單創建量相對較低,但轉化率接近均值,銷售額情況也較爲樂觀,江蘇的銷售額甚至高於廣東。
下一步,我們結合產品維度,對比上海、北京、廣東這三個區域的在2月17-3月1日期間不同品類銷售情況及對應的轉化率情況,從而找出具有針對性的優化建議。
結合產品維度交叉分析
實現思路:
提取收貨地址在北上、廣東且時間在2月17-3月1日之間的所有數據
新建列“成交情況”,用於記錄所有實際成交(買家實際支付金額大於0)的訂單。如有實際成交則賦值1,否則賦值0
以收貨地址和訂單付款時間(頻率爲周)爲分組條件,對訂單創建時間計次並命名爲訂單創建數,對成交情況求和並命名爲訂單成交數
篩選每個省市的銷量前5的產品
求轉化率
df=df[(df['收貨地址'].isin(['北京','上海','廣東省']))&(df['訂單創建時間']>'2020-02-16')]
df['成交情況']=0
df.loc[df[df['買家實際支付金額']>0].index.to_list(),'成交情況']=1
df_=df.groupby(by=['收貨地址','總金額']).agg(
訂單創建數=('訂單創建時間', 'count'),
訂單成交數=('成交情況', 'sum')
)
# 篩選每個省市的銷量前5
df1=df_.reset_index().groupby('收貨地址').apply(lambda x: x.nlargest(5,'訂單創建數',keep='all')).set_index(['收貨地址','總金額'])
a=df1['訂單成交數'].unstack()
a.loc['上海',[21,53]]=df_.loc['上海'].loc[[21,53]]['訂單成交數']
b=df1['訂單創建數'].unstack()
b.loc['上海',[21,53]]=df_.loc['上海'].loc[[21,53]]['訂單創建數']
對照我們的標杆上海區域,爲北京、廣東兩個區域的不同產品提出不同的優化目標,例如:
北京:
針對37產品:在價格不變的情況下,提升100個訂單創建數,成交轉化率提升至70%
廣東:
針對69產品:在價格及訂單創建數量不變的情況下,提升成交轉化率至75%
至於如何提升,我們需要對比三個區域在業務活動上的差異,比如渠道差異、推廣活動差異、用戶行爲引導差異等等。在得知了業務活動上的差異後,我們就可以做針對性的ABtest
或者其他的調整,最終從UV、轉化率、客單價三個方面入手提升收入。
覆盤&反思
文章思路覆盤
我們從銷售額情況入手瞭解2月的整體經營情況,發現銷售額離目標約有20萬元的差距
通過一個公式三個指標拆解銷售額,梳理UV、轉化率、客單價各項指標的情況,定位進一步分析的方向
對不同區域的銷售額情況進行簡單瞭解,篩選核心的區域,加入產品維度進行多維度多指標交叉分析,制定有針對性的優化目標
當然,文章作爲案例還是有很多值得斟酌的地方,特別是在針對產品銷量提升的建議上,並沒有考慮到產品的佈局情況,這可能會出現同產品線中,低利潤商品銷量上升但高利潤商品銷量下降,從而導致最終銷售額下降的怪圈。
反思
標準!標準!標準!
數據本身沒有任何意義,數據+標準纔是價值的所在。這篇文章鴿了這麼久,就是因爲一直沒有找到合適的標準去衡量分析結果的好壞。從業務的角度看,沒有了標準,就變成了一篇爲了分析而分析,毫無商業價值的報告。
對於沒有條件的孩子,走起來比站在原地強。
意識到因爲沒有標準導致分析無法深入從而一直拖稿的問題後,我做了兩件事:
看行業分析報告找標準。儘管行業報告的真實性有待考究,僅憑一句樣本沒有代表性,就能推翻的行業報告的結論。以此作爲判斷標準實屬下策,但下策總比束手無策強。
按照現有思路先把文章寫出來。受到自己上一篇文章的影響,想在動手前明確完整的分析思路,不走多餘的路。但實際數據分析並非一蹴而就,而是一個不斷優化迭代的過程,先完成再完美。
那麼本次分享就到這裏啦,希望各路大神不吝賜教。
我是HeoiJin,不要期待有下篇!
完整代碼及數據集
github:https://github.com/heoijin/BAproject
奶牛快傳(推薦):https://alltodata.cowtransfer.com/s/87c0fd7e2a084d
百度網盤:https://pan.baidu.com/s/1sRhbgi-VpU16bllCVISV2A 提取碼:q4xs
參考文章
[1]
數據集:: https://www.kesci.com/home/project/5eb60fd0366f4d002d7792d5/fork
[2]TrustData信諾數據:2015年雙十一中國移動互聯網電商行業發展分析報告: https://www.useit.com.cn/thread-10658-1-1.html
新書兌換限時300積分,閱讀原文直達
剛看了下,京東目前仍然是618的活動(滿100-50),積分夠的同學直接300積分兌換,安排~