看了《从数据角度解析福州美食》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了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. [虾扯蛋] android界面框架-Window

    从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...

  2. ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)

    前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...

  3. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  4. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Linux碎碎念

    在学习Linux过程中,有许多有用的小技巧.如果放在纸质的笔记本上,平时查阅会相当不方便.现在以一种“碎碎念”的方式,汇集整理在此,目前还不是很多,但随着学习.工作的深入,后续会陆陆续续添加更多的小技 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决

    在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...

  8. 换个角度看微信小程序[推荐]

    去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...

  9. Linux.NET实战手记—自己动手改泥鳅(下)

    在上回合中,我们不痛不痒的把小泥鳅的数据库从只能供在Windows下运行的Access数据库改为支持跨平台的MYSQL数据库,毫无营养的修改,本回合中,我们将把我们修改后得来的项目往Linux中部署. ...

  10. 凭吊一下ASP.NET 5,然后跨平台,越跨越开心

    ASP.NET 5 is dead ASP.NET 5在今年早些时候被宣判死刑了.但是这并不影响我们之前在ASP.NET 5乃至ASP.NET MVC平台上的经验累积--没错,微软改名部门又立功了!他 ...