前些天有個朋友向我求救,他們公司最近要針對餐飲行業做數據分析,併為某些商家做出線上營銷方案。但是他一頭霧水,不知道該從哪方面下手。
我提醒他,是否先從商家的線上評價作為數據分析的入口例如美團、大眾點評、餓了麼等等。
朋友點頭稱是:”是個好主意,但是具體怎麼做呢?“
於是我花了點時間用Python幫他做了一個基於線上商家評價的數據分析演示。
本章知識點:
- 商家評價數據源的獲取
- pyecharts 柱狀圖數據分析
- pyecharts 餅圖數據分析
- Python的Counter使用方法
商家評價數據源的獲取
首先我們要找到合適的商家評價,在本文以大眾點評的數據為例,我隨機選擇一家餐廳的評價數據作為數據源。
因為隱私的關係,我隱去了商傢俱體的店名和地址,最終我通過線上的API接口拿到了一部分用戶評價數據,用於本次演示,如果出於真正的商業目的需要獲得更完整的數據,還需要大家自己去想辦法。
拿到的商家評價演示數據如下:
需要注意的是,我們需要對返回的數據內容做一下處理,把數據裡的true、false、null分別轉換為Python語言所需要的True、False和None。原因在於這裡線上數據API接口返回時是按照javascript的數據類型來的(true、false、null)。
數據清洗了之後,我們發現這個數據在Python其實就是一個大的字典,那麼我們按照字典的格式對其中的數據進行解析即可。
現在我給這個大字典命名為review_data,並保存為data.py文件,方便在正式的數據分析程序裡進行import使用。
隨後我新建了一個名為analysis.py的文件用於數據分析,並導入剛才的數據源測試一下數據是否正常。
OK,至此我們的數據準備工作已經做好,開始進行實戰吧。
個性化的pyecharts柱狀圖
首先我們來獲取概要性的數據分析,就是用戶對於該商家的整體印象嘛,這部分數據在review_data的summarys裡,讓我們寫一段程序把它取出來進行展示。
最後圖表顯示效果如下:
看來這家店菜品比較新鮮、牛肉也不錯、老顧客也相對較多,不過分量好像挺少,哈哈。
接著我們來解析下我們的代碼:
程序入口從18行開始,Page組件就不多說了,上一章講過,作用是在一個頁面裡顯示多個圖表。
get_summarys()函數主要用於創建一個商家整體評價的柱狀圖,需要講的是第10行和12行
我們發現sumarrys的數據其實是一個list(列表)包含著多個dict(字典)數據。
那麼我們的柱狀圖希望得到的格式數據應該是下面這樣:
X軸數據 [‘菜品健康’,'牛肉贊','回頭客'] ,X軸數據用於顯示名稱。
Y軸數據[51,32,29],Y軸數據用於顯示數量。
所以我們就用Python的列表推導式分別得到了X,Y軸的數據。
<code> summary_name_list = [i.get
('summaryString'
)for
iin
summarys] summary_count_list = [i.get
('summaryCount'
)for
iin
summarys]/<code>
關於add_yaxis()函數里有個category_gap需要解釋一下,它的作用是設置同一系列的柱間距離,默認為類目間距的 20%,可設固定值。在這裡我設置為80%,就顯得柱子比較遠,看起來更清晰一點。
拿到X,Y軸的數據後就沒什麼好說的了,直接添加即可。
關於Python列表推導的內容請查看我之前的教程。
個性化的pyecharts餅圖
接下來我想獲取該商家的用戶打分比例,我們知道在很多點評網站上,用戶的分數從1-5顆星星不等。
那麼在本文中這些數據是怎麼體現的呢?
通過分析數據,我們可以發現每個用戶的評論裡都包含一個叫star的數據,這裡就是用戶的打分,30分代表3星。
現在我們寫一段代碼來把打分數據做成餅圖。
在截圖裡為了看起來方便我隱藏了之前get_summarys()函數,大家只需要關心get_star()函數即可。
最終圖表效果如下:
可以發現這家店的評價其實偏低,2星和3星加起來佔了很大一部分,5星評價只有30%。
現在來解釋一下代碼:
Python的Counter使用方法
其實餅圖大家在上一章已經學過了,我在這裡著重講一下Counter庫。
Counter庫是Python自帶的一個計數工具,主要用於對序列裡的數據進行計數,非常方便快捷,不用我們自己造輪子了。
以上三行代碼可以很快幫助我們明白Counter的用途,經過它的統計,我們可以發現列表裡10數字有2個,其他數字只有1個。
那麼回到剛才的打分數據裡,我們通過
<code>all_star = [i.get
('reviewDataVO'
).get
('reviewData'
).get
('star'
)for
iin
all_review]/<code>
這段代碼獲取到了所有的打分數據。看起來像這樣:
<code>[30
,50
,10
,20
,35
,50
,30
,20
,50
,20
]/<code>
那麼我們可以很方便的用Counter對其進行統計即可。
<code>stars
= dict(Counter(all_star))/<code>
在這裡之所以要用dict對Counter結果進行轉換成字典,是為了方便我們獲取字典的keys和values,正好可以作為餅圖所需的數據。大家也可以通過其他方式獲取所需內容,不用拘泥於這一種方式。
餅圖所需數據
最後的數據壓縮代碼裡:
<code>data = zip(list
(stars.keys()),list
(stars.values()))/<code>
stars.keys()和starts.values()其實分別就是分數和該分數的個數
stars這個字典原始數據如下:
<code>{30:
2
,
50:
3
,
10:
1
,
20:
3
,
35:
1
}
/<code>
之所以要用list把keys()和values()的結果轉換成列表,也是因為直接獲取字典的keys()和values()得到的數據沒辦法直接使用,需要先轉換成列表才行。
到現在為止,我們基本上可以熟練的使用本章學到的知識來對數據進行各種分析了。
最後我得到了四個圖表,用於對一家店鋪的初步數據分析。
因為篇幅有限,我就不在本文裡提供全部源碼了,對這個例子感興趣的朋友可以私信我獲取源碼。
總結:
通過對pyecharts的深度學習,以及Python自帶的各種統計工具的配合使用,我們可以做出更多有價值的數據分析案例,當這些案例慢慢成型後,就變成了一套完整的商業解決方案,希望大家可以從中得到啟發,也歡迎繼續關注我的Python數據分析系列,學習更多有價值的數據分析方法。
歡迎關注我 “紙飛機編程”,獲取更多有趣的Python編程信息。