看了《从数据角度解析福州美食》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了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. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  2. UniqueIdentifier 数据类型 和 GUID 生成函数

    UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格 ...

  3. Python的单元测试(一)

    title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...

  4. C++中的命名空间

    一,命名空间(namespace)的基本概念以及由来 1.什么是标识符: 在C++中,标识符可以是基本的变量,类,对象,结构体,函数,枚举,宏等. 2.什么是命名空间: 所谓的命名空间是指标识符的可见 ...

  5. Java多态性——分派

    一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...

  6. AbpZero--1.如何开始

    1.加群 群号:104390185,下载这个文件并解压 用VS2015打开aspnet-zero-1.9.0.1 2.修改Web项目web.config连接字符串 <add name=" ...

  7. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  8. Mybatis批量删除

    <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id i ...

  9. Kotlin与Android SDK 集成(KAD 05)

    作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...

  10. ubuntu+mono+jexus 搭建.net的web平台 实现.net跨平台

    准备工作: vmware 用来安装 ubuntu 下载地址:VMware-workstation-9.0.1-894247.exe.tar 注册码: 1A4P8-DMK0N-FZ431-7K8NH-2 ...