用MongoDB分析合肥餐饮业

时间:2021-07-30 07:34:05

看了《从数据角度解析福州美食》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了Node.js爬虫爬取了合肥的大众点评数据。分析数据库我并没有采用MySQL而是用的MongoDB,是因为爬取的数据存在字段缺失的情况(schema不一致)。

1. 数据准备

MongoDB简介

不同于MySQL,MongoDB是一种Schema-less的NoSQL数据库;与ElasticSearch类似,最小存储单元Document为BSON object。MySQL与MongoDB的基本概念对比

MySQL MongoDB
DB DB
Table Collection
Row Document
Column Field
Joins Embedded documents, linking

MongoDB不支持collection之间join操作,所以应存储待分析的join后的宽表。同时,MongoDB具有灵活的数据模型及可扩展的Schema,支持前后Document的schema不一致。

写操作

Node.js将爬取的json数据写入MongoDB,在写之前对数据做了清洗过滤——将人均价格太离谱的餐馆给剔除掉了:

var MongoClient = require('mongodb').MongoClient;
var fs = require('fs');
// Connection URL
var url = 'mongodb://<user>:<passwd>@<host1>:<port1>,<host2>:<port2>/<db>'; var insertDocuments = function (db, docs, callback) {
// Get the documents collection
var collection = db.collection('dianping');
// Insert documents
collection.insertMany(docs, function (err, result) {
console.log('Inserted', result.result.n, 'documents into the collection');
callback(result);
});
}; var array = fs.readFileSync('data1.json').toString().split('\n')
.filter(function (line) { // filter empty line
return line != '';
}).map(function (line) {
return JSON.parse(line);
}).map(function (doc) {
doc.taste = parseFloat(doc['taste']);
doc.surrounding = parseFloat(doc['surrounding']);
doc.service = parseFloat(doc['service']);
return doc;
})
.filter(function (doc) { // filter dirty data
return doc.price == '' || (doc.price >= 3 && doc.price <= 800)
}); MongoClient.connect(url, function (err, db) {
var docs = array;
console.log("Connected successfully to server");
insertDocuments(db, docs, function () {
db.close();
});
});

Diver用的是官方的,共计写入4979家商户。

2. 数据分析

商家分析

价格最贵的10家餐厅:

db.dianping.find(
{$where: "this.price != ''"},
{id: 1, name: 1, branchName: 1, price: 1, star: 1, taste: 1, surrounding: 1, service: 1, region: 1, _id: 0}).sort({price: -1}).limit(10)
id 商家名 分店名 价格 评级 商圈 口味 环境 服务
32332470 锅德港式肥牛海鲜火锅 499 4.5 三里庵 8.8 9 8.9
56818450 万达威斯汀酒店思悦兹 436 3.5 包河区 7.4 7.7 7.4
3180424 祥记燕鲍翅餐厅 古井店 427 3.5 长江东路 7.2 7.2 7.3
57634649 吉利亚特海洋餐厅 395 3.5 三里庵 7.6 8.6 8
24757164 王品牛排 合肥万象城店 375 5 华润万象城 9.2 9.3 9.3
5666720 王品牛排 合肥银泰店 373 5 淮河路步行街 9.1 9.3 9.3
26976035 白金汉爵大酒店餐厅 366 4 滨湖世纪城 8.2 9 8
13754750 恒悦国际外商俱乐部酒店餐厅 366 3.5 天柱路 7.3 7.3 7.2
23497952 绿地福朋喜来登酒店 聚味中餐厅 300 4 黄望潜 8 8.8 8.1
19630875 富山怀石料理 253 4 1912街区 8.2 8.8 8.4

从上面可以看出,价格贵不一定代表口味好,贵的大部分是酒店餐厅。

最好吃的10家餐馆:

db.dianping.find(
{},
{id: 1, name: 1, branchName: 1, price: 1, star: 1, taste: 1, surrounding: 1, service: 1, region: 1, _id: 0}).sort({taste: -1}).limit(10)
id 商家名 分店名 价格 评级 商圈 口味 环境 服务
19338040 恳的妙手海鲜火锅 139 5 马鞍山南路 9.3 9.3 9.3
5641240 蜀王涮涮锅 长江西路店 57 5 长江西路华联 9.3 9.2 9.3
6228284 海底捞火锅 之心城店 102 5 三里庵 9.2 9.2 9.3
18067370 海底捞火锅 银泰中心店 103 5 淮河路步行街 9.2 9.2 9.3
48232229 蜀王火锅那些年 65 5 三里庵 9.2 9.3 9.3
24757164 王品牛排 合肥万象城店 375 5 华润万象城 9.2 9.3 9.3
14909570 海底捞 蒙城路店 100 5 白水坝 9.2 9.2 9.2
57701010 福记蒸汽海鲜 100 5 元一广场 9.2 9 9.2
5458106 川锅一号 75 5 三孝口 9.2 9.2 9.3
38306310 吞馋·夜食速递 77 5 银泰城 9.2 9.2 9.3

最好吃排行榜中火锅类的餐馆占了8个,合肥人是有多喜欢吃火锅!

“三九”餐厅,即口味、服务、环境评分都在9.0(包含9.0)之上的餐厅:

db.dianping.find(
{taste: {$gt: 9}, surrounding: {$gt: 9}, service: {$gt: 9}},
{id: 1, name: 1, branchName: 1, price: 1, star: 1, taste: 1, surrounding: 1, service: 1, region: 1, _id: 0}).sort({taste: -1})
id 商家名 分店名 价格 评级 商圈 口味 环境 服务
19338040 恳的妙手海鲜火锅 139 5 马鞍山南路 9.3 9.3 9.3
5641240 蜀王涮涮锅 长江西路店 57 5 长江西路华联 9.3 9.2 9.3
6228284 海底捞火锅 之心城店 102 5 三里庵 9.2 9.2 9.3
18067370 海底捞火锅 银泰中心店 103 5 淮河路步行街 9.2 9.2 9.3
48232229 蜀王火锅那些年 65 5 三里庵 9.2 9.3 9.3
24757164 王品牛排 合肥万象城店 375 5 华润万象城 9.2 9.3 9.3
14909570 海底捞 蒙城路店 100 5 白水坝 9.2 9.2 9.2
5458106 川锅一号 75 5 三孝口 9.2 9.2 9.3
38306310 吞馋·夜食速递 77 5 银泰城 9.2 9.2 9.3
8690811 新辣道鱼火锅 蒙城路华联店 72 5 双岗 9.2 9.2 9.2
19659077 煲王粤菜餐厅 83 5 黄望潜 9.1 9.1 9.1
58826504 海底捞火锅 潜山路银泰城店 100 5 蜀山区 9.1 9.2 9.1
66109066 海银海记潮汕牛肉火锅 104 5 1912街区 9.1 9.2 9.2
64050497 花庭里成都火锅 112 5 市府广场 9.1 9.3 9.1
27375462 晋家门 华润万象城店 63 5 华润万象城 9.1 9.1 9.2
5666720 王品牛排 合肥银泰店 373 5 淮河路步行街 9.1 9.3 9.3
45300772 大卫壹番屋 宿州路店 37 5 淮河路步行街 9.1 9.3 9.3
24912528 新石器烤肉 合肥万象城店 66 5 华润万象城 9.1 9.1 9.1
65696913 百辣归川重庆火锅 79 5 蜀山区 9.1 9.2 9.1
17923508 花涧堂云南石锅鱼 90 5 银泰城 9.1 9.2 9.2
22029637 大鮨寿司 合家福店 55 5 马鞍山南路 9.1 9.2 9.1
8931258 豆蔻餐厅. 电影主题店 四牌楼店 55 5 淮河路步行街 9.1 9.1 9.1
56903863 一品焖锅 万达店 76 5 包河区 9.1 9.2 9.2
559223 蜀王火锅 金寨路店 62 5 中科大 9.1 9.1 9.1
32302396 棒约翰比萨 合肥港汇店 76 5 黄望潜 9.1 9.2 9.1
3707974 港鼎汇香港时尚火锅料理 阜南路店 107 5 城隍庙 9.1 9.2 9.1
572662 蜀王火锅 长江东路店 71 5 长江东路 9.1 9.2 9.2
20897019 锅吧回转小火锅 18 5 三里庵 9.1 9.1 9.1

“三九”餐厅排行榜的人均价格在¥100上下,可以看出合肥餐饮业的价格保持在相对良心的水平。

分店最多的前15家餐厅:

db.dianping.aggregate([
{$group: {_id: {name: "$name", category: "$category"}, totalBranches: {$sum: 1}}},
{$sort: {"totalBranches": -1}},
{$limit: 15}])
商家名 分类 分店数
老乡鸡 快餐简餐 106
仟吉西饼 面包西点 40
采蝶轩 面包西点 37
肯德基 快餐简餐 36
龙门花甲 小吃 31
肥叔锅贴 生煎/锅贴 25
艾比客 快餐简餐 25
大脸鸡排 小吃 24
岸香咖啡 咖啡厅 22
必胜客 比萨 17
傣妹火锅 更多火锅 16
豪大大鸡排 小吃 16
星巴克 咖啡厅 15
好利来 面包西点 14
良记卷饼王 小吃 14

在上面连锁店中,快餐简餐、面包西点类占了多数;其中,老乡鸡与采蝶轩是本土品牌。在合肥餐饮业的市场竞争,本土品牌还是占优势的。

商圈分析

最多吃货Top 15商圈(商家数量与分类数量):

db.dianping.aggregate([
{$match: {"region": {$not: /.*[区县].*/}}},
{$group: {_id: "$region", categorys: {$addToSet: "$category"}, totalShops: {$sum: 1}}},
{$unwind: "$categorys"},
{$group: {_id: {region :"$_id", totalShops: "$totalShops"}, categorys: {$sum: 1}}},
{$sort: {"_id.totalShops": -1}},
{$limit: 15}])
商圈 商家数 商家分类数
三里庵 245 44
黄望潜 176 42
淮河路步行街 162 34
天鹅湖万达 131 41
包河万达 114 33
滨湖世纪城 92 30
白水坝 84 33
马鞍山南路 82 32
三孝口 76 28
青阳路 75 30
大学城 60 22
明珠广场 53 20
银泰城 52 26
南七里站 49 22
华润万象城 48 22

三里庵拿下了商家数、分类数的双料冠军;但是,在下面的最好吃排行榜上却看不到其踪影了,说明三里庵商圈的餐馆量大却质不高。

最好吃的Top 15商圈(平均口味评分):

db.dianping.aggregate([
{$match: {"region": {$not: /.*[区县].*/}}},
{$group: {_id: "$region", avgTaste: {$avg: "$taste"}, avgSurr: {$avg: "$surrounding"}, AvgSer: {$avg: "$service"}}},
{$sort: {"avgTaste": -1}},
{$limit: 15}])
商圈 平均口味 平均环境 平均服务
卧牛山街道 8.6 8.7 8.7
电子16所 8.5 8.6 8.4
三河镇 8.4 8.1 8.8
华润万象城 8.1 8.5 8.2
淮河路步行街 8.09 8.0 8.0
天鹅湖万达 8.0 8.0 8.0
东风路 8 7.85 7.8
元一哈街 8 7.85 7.9
人民路 7.9 8.0 7.9
阜南路 7.9625 8.125 7.8
银泰城 7.9 8.0 7.9
一中 7.9 7.9 7.9
包河万达 7.9 8.0 7.9
颍上路 7.9 7.93 7.8
市府广场 7.89 7.7 7.7

卧牛山街道拿了头冠,说实在的,我还没去吃过。