用MongoDB分析合肥餐饮业
看了《从数据角度解析福州美食》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了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 |
卧牛山街道拿了头冠,说实在的,我还没去吃过。
用MongoDB分析合肥餐饮业的更多相关文章
- MongoDB分析工具之一:explain()语句分析工具
explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mongo ...
- MongoDB分析工具之二:MongoDB分析器Profile
MongoDB优化器profile 在MySQL 中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB 中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Prof ...
- MongoDB分析工具之三:db.currentOp()
db.currentOp() db.currentOp是个好东西,顾名思义,就是当前的操作.在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/rem ...
- MongoDB监控之一:运行状态、性能监控,分析
为什么要监控? 监控及时获得应用的运行状态信息,在问题出现时及时发现. 监控什么? CPU.内存.磁盘I/O.应用程序(MongoDB).进程监控(ps -aux).错误日志监控 1.4.1 Mong ...
- MongoDB(七)MongoDb数据结构
首先,向数据库插入一条bjson数据 首先是定义文档,然后使用admin用户名密码登录,进入test数据库,向test数据库中插入此文档("表名称和表中的记录") 插入结果,查看m ...
- MongoDb数据结构详解
首先,向数据库插入一条bjson数据 首先是定义文档,然后使用admin用户名密码登录,进入test数据库,向test数据库中插入此文档(“表名称和表中的记录”) 插入结果,查看mongoVUE如下图 ...
- mongdo通用类(C#版)
日前从公司离职,很快,还没休息就步入了现在的公司,开始跟着公司的脚步走. 公司的项目基本都是大数据的,所以在数据库上大部分都是使用Mongodb和Redis,基本都是Nosql型的数据库为主.以前自己 ...
- 大数据下的数据分析平台架构zz
转自http://www.cnblogs.com/end/archive/2012/02/05/2339152.html 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海 ...
- sitecore系统教程之架构概述
Sitecore体验数据库(xDB)从实时大数据存储库中的所有通道源收集所有客户交互.它连接交互数据,为每个客户创建全面,统一的视图,并使营销人员可以使用数据来管理客户的实时体验. xDB架构非常灵活 ...
随机推荐
- [虾扯蛋] android界面框架-Window
从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...
- redis 学习笔记(1)
redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Linux碎碎念
在学习Linux过程中,有许多有用的小技巧.如果放在纸质的笔记本上,平时查阅会相当不方便.现在以一种“碎碎念”的方式,汇集整理在此,目前还不是很多,但随着学习.工作的深入,后续会陆陆续续添加更多的小技 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...
- 换个角度看微信小程序[推荐]
去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...
- Linux.NET实战手记—自己动手改泥鳅(下)
在上回合中,我们不痛不痒的把小泥鳅的数据库从只能供在Windows下运行的Access数据库改为支持跨平台的MYSQL数据库,毫无营养的修改,本回合中,我们将把我们修改后得来的项目往Linux中部署. ...
- 凭吊一下ASP.NET 5,然后跨平台,越跨越开心
ASP.NET 5 is dead ASP.NET 5在今年早些时候被宣判死刑了.但是这并不影响我们之前在ASP.NET 5乃至ASP.NET MVC平台上的经验累积--没错,微软改名部门又立功了!他 ...