用MongoDB分析合肥餐饮业

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

1. 数据准备

MongoDB简介

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

MySQLMongoDB
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)
id商家名分店名价格评级商圈口味环境服务
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)
id商家名分店名价格评级商圈口味环境服务
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})
id商家名分店名价格评级商圈口味环境服务
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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值