看了《从数据角度解析福州美食》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了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分析合肥餐饮业的更多相关文章

  1. MongoDB分析工具之一:explain()语句分析工具

    explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mongo ...

  2. MongoDB分析工具之二:MongoDB分析器Profile

    MongoDB优化器profile 在MySQL 中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB 中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Prof ...

  3. MongoDB分析工具之三:db.currentOp()

    db.currentOp() db.currentOp是个好东西,顾名思义,就是当前的操作.在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/rem ...

  4. MongoDB监控之一:运行状态、性能监控,分析

    为什么要监控? 监控及时获得应用的运行状态信息,在问题出现时及时发现. 监控什么? CPU.内存.磁盘I/O.应用程序(MongoDB).进程监控(ps -aux).错误日志监控 1.4.1 Mong ...

  5. MongoDB(七)MongoDb数据结构

    首先,向数据库插入一条bjson数据 首先是定义文档,然后使用admin用户名密码登录,进入test数据库,向test数据库中插入此文档("表名称和表中的记录") 插入结果,查看m ...

  6. MongoDb数据结构详解

    首先,向数据库插入一条bjson数据 首先是定义文档,然后使用admin用户名密码登录,进入test数据库,向test数据库中插入此文档(“表名称和表中的记录”) 插入结果,查看mongoVUE如下图 ...

  7. mongdo通用类(C#版)

    日前从公司离职,很快,还没休息就步入了现在的公司,开始跟着公司的脚步走. 公司的项目基本都是大数据的,所以在数据库上大部分都是使用Mongodb和Redis,基本都是Nosql型的数据库为主.以前自己 ...

  8. 大数据下的数据分析平台架构zz

    转自http://www.cnblogs.com/end/archive/2012/02/05/2339152.html 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海 ...

  9. sitecore系统教程之架构概述

    Sitecore体验数据库(xDB)从实时大数据存储库中的所有通道源收集所有客户交互.它连接交互数据,为每个客户创建全面,统一的视图,并使营销人员可以使用数据来管理客户的实时体验. xDB架构非常灵活 ...

随机推荐

  1. 在离线环境中发布.NET Core至Windows Server 2008

    在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...

  2. 使用UIBezierPath绘制图形

    当需要画图时我们一般创建一个UIView子类, 重写其中的drawRect方法 再drawRect方法中利用UIBezierPath添加画图 UIBezierPath的使用方法: (1)创建一个Bez ...

  3. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  4. gradle学习笔记(1)

    1. 安装     (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site:     (2) 添加环境变量:             1) 变量名:GRADLE_HOM ...

  5. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

    在NHibernate数据库查询中出现了这个错误,由于是数据库是mysql的,当定义的字段为char(36)的时候就会出现这个错误. [解决方法] 将char(36) 改成varchar(40)就行了 ...

  6. Power BI官方视频(3) Power BI Desktop 8月份更新功能概述

    Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...

  7. 通过三次优化,我将gif加载优化了16.9%

    WeTest 导读 现在app越来越炫,动不动就搞点动画,复杂的动画用原生实现起来挺复杂,如是就搞起gif播放动画的形式,节省开发成本.   背 景 设计同学准备给一个png序列,开发读取png序列, ...

  8. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  9. Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  10. [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)

    前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...