看了《从数据角度解析福州美食》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了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. Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境

    一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...

  2. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  3. 通过ProGet搭建一个内部的Nuget服务器

    .NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统统交给NuGet,添加组件/删除组件/以 ...

  4. webpack的使用

    1.webpack是什么? 打包前端项目的工具(为项目提高逼格的东西). 2.webpack的基本命令 webpack#最基本的启动webpack命令 webpack-w #提供watch方法,实时进 ...

  5. clr 元数据

    clr相关编译器编译生成的托管模块由四部分组成:PE32或32+头.clr头.元数据.IL代码. 元数据和IL代码完全对应,保持一致(:>)性. 元数据有很多用途: VS的智能感知,自动补全: ...

  6. 谈一谈NOSQL的应用,Redis/Mongo

    1.心路历程 上年11月份来公司了,和另外一个同事一起,做了公司一个移动项目的微信公众号,然后为了推广微信公众号,策划那边需要我们做一些活动,包括抽奖,投票.最开始是没有用过redis的,公司因为考虑 ...

  7. Handler

    1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...

  8. Spring7:基于注解的Spring MVC(下篇)

    Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...

  9. Kinect开发文章目录

    整理了一下去年为止到现在写的和翻译的Kinect的相关文章,方便大家查看.另外,最近京东上微软在搞活动, 微软 Kinect for Windows 京东十周年专供礼包 ,如果您想从事Kinect开发 ...

  10. ABP源码分析四十:ZERO的Application和Tenant

    ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, ses ...