用Python分析統(tǒng)計(jì)必勝客餐廳
在之前的一篇文章100行代碼爬取全國所有必勝客餐廳信息,我講到如何爬取必勝客官網(wǎng)中全國各大城市餐廳的信息。雖然餐廳數(shù)據(jù)信息被抓取下來,但是數(shù)據(jù)一直在硬盤中“躺尸”。不曾記得,自己已經(jīng)第 n 次這么做了。說到這里,要追溯到自己的大學(xué)時(shí)光。
自己從大學(xué)開始就接觸 Python,當(dāng)時(shí)是自己的好奇心很強(qiáng)烈。好奇為什么 Python 不需要瀏覽器就能抓取網(wǎng)站數(shù)據(jù)。內(nèi)心感嘆到,這簡直是太妙了。自己為了體驗(yàn)這種抓取數(shù)據(jù)的樂趣,所以寫了很多的爬蟲程序。
隨著自己知識(shí)面地拓展,自己了解到數(shù)據(jù)分析這領(lǐng)域。自己從而才知道爬取到的數(shù)據(jù),原來背后還隱藏的一些信息。自己也是在學(xué)習(xí)這方面的相關(guān)知識(shí)。這篇文章算是數(shù)據(jù)分析的處女稿,主要內(nèi)容是從數(shù)據(jù)中提取出必勝客餐廳的一些信息。
01環(huán)境搭建
百度前端技術(shù)部開源一個(gè)基于 Javascript 的數(shù)據(jù)可視化圖表庫。其名字為 ECharts。它算是前端數(shù)據(jù)可視化的利器,能提供直觀,生動(dòng),可交互,可個(gè)性化定制的數(shù)據(jù)可視化圖表。
國內(nèi)有個(gè)大神突發(fā)奇想,這么好用的庫如果能和 Python 結(jié)合起來就好了。于是乎,pyecharts 庫就應(yīng)運(yùn)而生。因此,pyecharts 的作用是用于生成 Echarts 圖表的類庫。本文中的所有圖標(biāo),自己都是利用 pyecharts 生成的。
安裝該庫也很簡單,使用 pip 方式安裝。
- pip install pyecharts
02數(shù)據(jù)清洗
數(shù)據(jù)清洗工作是數(shù)據(jù)分析必不可少的步驟。這一步是為了清洗一些臟數(shù)據(jù)。因?yàn)榭赡芫W(wǎng)站本身就有空數(shù)據(jù),或者匹配抓取網(wǎng)站信息時(shí),有些混亂的數(shù)據(jù)。這些都需要清除掉。
我之前是將數(shù)據(jù)寫到一個(gè) json 文件中,我先將數(shù)據(jù)讀取出來。然后把 json 文本數(shù)據(jù)轉(zhuǎn)化為字典類型。
- def get_datas():
- """ 從文件中獲取數(shù)據(jù) """
- file_name = 'results.json'
- with open(file_name, 'r', encoding='UTF-8') as file:
- content = file.read()
- data = json.loads(content, encoding='UTF-8')
- # print(data)
- return data
接著對(duì)字典進(jìn)行遍歷, 統(tǒng)計(jì)每個(gè)城市的餐廳總數(shù)。
- def count_restaurants_sum(data):
- """ 對(duì)字典進(jìn)行遍歷, 統(tǒng)計(jì)每個(gè)城市的餐廳總數(shù) """
- results = {}
- for key, value in data.items():
- results[key] = len(value)
- # print(key, len(value))
- return results
再將字典中的每個(gè) key-value 轉(zhuǎn)化為元組,然后根據(jù) value 進(jìn)行倒序排序。
- restaurants_sum = sorted(restaurants_sum.items(), key=lambda item: item[1], reverse=True)
最后根據(jù)顯示結(jié)果,手動(dòng)刪除一些臟數(shù)據(jù)。
- def clean_datas(data):
- """
- 清除臟數(shù)據(jù)。
- 經(jīng)過分析發(fā)現(xiàn) ('新區(qū)', 189), ('南區(qū)', 189), ('朝陽', 56) 是臟數(shù)據(jù), 必勝客官網(wǎng)的地區(qū)選項(xiàng)中就有這三個(gè)名字
- [('新區(qū)', 189), ('上海市', 189), ('南區(qū)', 189), ('北京市', 184), ('深圳', 95),
- ('廣州', 86), ('杭州', 78), ('天津市', 69), ('朝陽', 56), ('蘇州', 54)]
- """
- data.remove(('新區(qū)', 189))
- data.remove(('南區(qū)', 189))
- data.remove(('朝陽', 56))
- return data
到此,數(shù)據(jù)工作已經(jīng)完成。
03數(shù)據(jù)分析
我們已經(jīng)拿到了經(jīng)過清洗的數(shù)據(jù),我們簡單對(duì)數(shù)據(jù)進(jìn)行打印,然后繪制直方圖。
- def render_top10():
- """
- 繪制直方圖顯示 全國必勝客餐廳總數(shù) Top 10 的城市
- 根據(jù)清洗過后數(shù)據(jù)的結(jié)果, Top 城市如下
- ('上海市', 189), ('北京市', 184), ('深圳', 95), ('廣州', 86), ('杭州', 78),
- ('天津市', 69), ('蘇州', 54), ('西安', 52), ('武漢', 51), ('成都', 48)
- """
- attr = ["上海", "北京", "深圳", "廣州", "杭州", "天津", "蘇州", "西安", "武漢", "成都"]
- values = [189, 184, 95, 86, 78, 69, 54, 52, 51, 48]
- bar = Bar("全國各大城市必勝客餐廳數(shù)量排行榜")
- bar.add("總數(shù)", attr, values, is_stack=True, is_more_utils=True)
- bar.render("render_bar.html")
繪制出來的結(jié)果如下:
不難看出,一線城市擁有必勝客的餐廳數(shù)比較多,省會(huì)城市擁有餐廳數(shù)要比非省會(huì)城市要多。
我們繼續(xù)繪制餅狀圖,看看北上廣深的餐廳數(shù)在全國的占比。
- def render_top10_percent():
- """
- 繪制餅狀圖 顯示北上廣深餐廳數(shù)在全國中的比例
- """
- configure(global_theme='macarons')
- attr = ["上海", "北京", "深圳", "廣州", "其他城市"]
- value = [189, 184, 95, 86, 1893] # 根據(jù) count_other_sum() 計(jì)算出來的
- pie = Pie("北上廣深餐廳數(shù)的占比")
- pie.add("", attr, value, is_label_show=True, is_more_utils=True)
- pie.render("render_pie.html")
繪制出來的結(jié)果如下:
從數(shù)據(jù)上看,北上廣深的餐廳數(shù)占據(jù)全國餐廳數(shù)的 22.64%。其他二三線城市共占據(jù) 77.36%。說明必勝客餐廳不僅主打大城市路線,還往二三四線城市發(fā)展,擴(kuò)展領(lǐng)域。
作者:極客猴,熱衷于 Python,目前擅長利用 Python 制作網(wǎng)絡(luò)爬蟲以及 Django 框架。