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

1. 数据准备

MongoDB简介

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

DBDB
TableCollection
RowDocument
ColumnField
JoinsEmbedded 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)
32332470锅德港式肥牛海鲜火锅4994.5三里庵8.898.9
56818450万达威斯汀酒店思悦兹4363.5包河区7.47.77.4
3180424祥记燕鲍翅餐厅古井店4273.5长江东路7.27.27.3
57634649吉利亚特海洋餐厅3953.5三里庵7.68.68
24757164王品牛排合肥万象城店3755华润万象城9.29.39.3
5666720王品牛排合肥银泰店3735淮河路步行街9.19.39.3
26976035白金汉爵大酒店餐厅3664滨湖世纪城8.298
13754750恒悦国际外商俱乐部酒店餐厅3663.5天柱路7.37.37.2
23497952绿地福朋喜来登酒店聚味中餐厅3004黄望潜88.88.1
19630875富山怀石料理25341912街区8.28.88.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)
19338040恳的妙手海鲜火锅1395马鞍山南路9.39.39.3
5641240蜀王涮涮锅长江西路店575长江西路华联9.39.29.3
6228284海底捞火锅之心城店1025三里庵9.29.29.3
18067370海底捞火锅银泰中心店1035淮河路步行街9.29.29.3
48232229蜀王火锅那些年655三里庵9.29.39.3
24757164王品牛排合肥万象城店3755华润万象城9.29.39.3
14909570海底捞蒙城路店1005白水坝9.29.29.2
57701010福记蒸汽海鲜1005元一广场9.299.2
5458106川锅一号755三孝口9.29.29.3
38306310吞馋·夜食速递775银泰城9.29.29.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})
19338040恳的妙手海鲜火锅1395马鞍山南路9.39.39.3
5641240蜀王涮涮锅长江西路店575长江西路华联9.39.29.3
6228284海底捞火锅之心城店1025三里庵9.29.29.3
18067370海底捞火锅银泰中心店1035淮河路步行街9.29.29.3
48232229蜀王火锅那些年655三里庵9.29.39.3
24757164王品牛排合肥万象城店3755华润万象城9.29.39.3
14909570海底捞蒙城路店1005白水坝9.29.29.2
5458106川锅一号755三孝口9.29.29.3
38306310吞馋·夜食速递775银泰城9.29.29.3
8690811新辣道鱼火锅蒙城路华联店725双岗9.29.29.2
19659077煲王粤菜餐厅835黄望潜9.19.19.1
58826504海底捞火锅潜山路银泰城店1005蜀山区9.19.29.1
66109066海银海记潮汕牛肉火锅10451912街区9.19.29.2
64050497花庭里成都火锅1125市府广场9.19.39.1
27375462晋家门华润万象城店635华润万象城9.19.19.2
5666720王品牛排合肥银泰店3735淮河路步行街9.19.39.3
45300772大卫壹番屋宿州路店375淮河路步行街9.19.39.3
24912528新石器烤肉合肥万象城店665华润万象城9.19.19.1
65696913百辣归川重庆火锅795蜀山区9.19.29.1
17923508花涧堂云南石锅鱼905银泰城9.19.29.2
22029637大鮨寿司合家福店555马鞍山南路9.19.29.1
8931258豆蔻餐厅. 电影主题店四牌楼店555淮河路步行街9.19.19.1
56903863一品焖锅万达店765包河区9.19.29.2
559223蜀王火锅金寨路店625中科大9.19.19.1
32302396棒约翰比萨合肥港汇店765黄望潜9.19.29.1
3707974港鼎汇香港时尚火锅料理阜南路店1075城隍庙9.19.29.1
572662蜀王火锅长江东路店715长江东路9.19.29.2
20897019锅吧回转小火锅185三里庵9.19.19.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}])
三里庵24544
黄望潜17642
淮河路步行街16234
天鹅湖万达13141
包河万达11433
滨湖世纪城9230
白水坝8433
马鞍山南路8232
三孝口7628
青阳路7530
大学城6022
明珠广场5320
银泰城5226
南七里站4922
华润万象城4822

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

最好吃的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.68.78.7
电子16所8.58.68.4
三河镇8.48.18.8
华润万象城8.18.58.2
淮河路步行街8.098.08.0
天鹅湖万达8.08.08.0
东风路87.857.8
元一哈街87.857.9
人民路7.98.07.9
阜南路7.96258.1257.8
银泰城7.98.07.9
一中7.97.97.9
包河万达7.98.07.9
颍上路7.97.937.8
市府广场7.897.77.7

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

05-08 08:10