看了一些数据分析的案例,自己上手完成了这个对北京五个主城区餐饮类的数据分析,主要从店铺的类型,评分和热门评论等信息提炼分析了北京各类餐饮的分布及特点。也顺便当作吃货们寻找北京美食的一份小指南吧。
数据来源于美团·美食
-
分析流程
1. 获取数据与数据清洗
2. 数据的描述性分析
-
1. 获取数据与数据清洗
- 从美团网上爬取了北京朝阳区,海淀区,丰台区,西城区和东城区的店铺信息。包括店铺名称、评分、评价数、人均消费、地址以及热门评论,后面为了方便区分,自动分配了ID号。
![](https://img.haomeiwen.com/i13639953/4cc56b03971790d3.jpg)
-
数据获得后,利用python进行了数据的清洗,大致进行了字段的拆分、删除,异常值/缺失值的处理,剔除了没有统计意义的数据。最后将清洗过的数据导入到MySQL数据库中。
-
爬取的数据共4364条,去除重复和清洗过后的坏值,总共有4299条有效数据,约占比98.5%。
-
2. 数据的描述性分析
-
首先,按照人均消费降序排列,看看北京这五个城区中人均消费较高的餐厅是哪些?
from pyecharts import Bar,Grid
name1 = data1['name'].iloc[0:10]
per_ca = data1['per_capita'].iloc[0:10] # 人均
com_counts1 = data1['comments_counts'].iloc[0:10] # 评论数
bar = Bar("餐饮人均消费前十")
bar.add("人均",name1,per_ca,xaxis_rotate=20,mark_line=['average'],mark_point=['max'])
bar.add("评论数",name1,com_counts1,xaxis_rotate=20,mark_line=['average'],mark_point=['max'])
grid = Grid()
grid.add(bar,grid_bottom='22%',grid_left='20%')
![](https://img.haomeiwen.com/i13639953/2d46e58592ebddcf.gif)
- 人均排名第一的是一家卖营养海鲜的店家,但我想找的是餐厅,于是我就点进了下一家,“和木The Home(前门店)”,装修确实不错,消费体验一定很好。
和木The Home(前门店) 人均 1184 元
![]()
-
再看些接地气的,符合大众消费水平的,按照评论数降序找到了前十名的热门商家。
-
人气高的店铺类型大多是小吃和烧烤这两类,价格普遍较低,回头客多。
价格是消费者消费的一个重要参考因素,接下来看看其他类型的店铺的人均消费数据分布情况。
# sql选取中位数
set @ROW_NUMBER:=0;
set @median_group:='';
select median_group, avg(per_capita) as median
from
(select
@ROW_NUMBER:=
case when @median_group = type then @ROW_NUMBER + 1 else 1
end as count_of_group,
@median_group:= type as median_group,
name,
per_capita,
type,
(select count(*)
from beijing_all
where a.type = type) as totle_of_type
from
(select name,per_capita,type
from beijing_all
order by type,per_capita) as a) as b
where count_of_group between totle_of_type*0.5 and totle_of_type*0.5 + 1
group by median_group;
'''
pyecharts可直接绘制箱线图,但需要用prepare_data()将原数据进行转换。
'''
![](https://img.haomeiwen.com/i13639953/d03ea33010134d85.gif)
- 之前热门店面的小吃和烧烤属于地方特色,分类比较笼统。而中国有八大菜系,那么这些餐饮商家按照菜系的类别细分一下,看看在北京的这五个区分布是什么样的。
sql_shop = "select type, count(*) counts from
(select * from beijing_all where (locate('菜',type)>0 or locate('餐',type)>0) and type not in
(select type from beijing_all where locate('小吃快餐',type)>0 or locate('创意菜',type)>0 or locate('自助餐',type)>0
or locate('特色菜',type)>0)) as a group by type order by counts desc"
data_shop = pd.read_sql(sql_shop,conn)
from pyecharts import Pie
pie_name = data_shop['type'].tolist()
pie_values = data_shop['counts'].values.tolist()
pie = Pie("各大菜系店铺数")
pie.add("",pie_name,pie_values,radius=[35,70],
center=[35,50],rosetype='radius',
is_label_show=True,legend_orient='vertical',
legend_pos="right")
![](https://img.haomeiwen.com/i13639953/d584d0f19f1b7af1.gif)
- 川湘菜,北京菜,西餐,日本菜,粤港菜占据北京这五个城区的店铺数量的七成以上。进一步的,那么从食客的评论来看看以日本菜和西餐为首的外国美食在国内吸引着他们的特点都有哪些?下面筛选了外国美食店铺评论中出现次数较多的关键词。
from pyecharts import WordCloud
word = data_foreignfood['comment1']
word_values = data_foreignfood['count3']
wordcloud = WordCloud()
wordcloud.add("",word,word_values,shape='triangle')
![](https://img.haomeiwen.com/i13639953/6b40729d2d4ef536.gif)
-
总结了在西餐店消费后,点评中出现次数靠前的评论:优雅的环境,热情的服务,再加上美味的食物,会让消费者在就餐时会有非常好的体验。现在看来想抓住食客的胃,光是有美食是不够的。
-
但是,在处理数据的时候发现,西餐分类中有不少是类似汉堡披萨这样的西式快餐店面,为了区分西式快餐和比较正式西餐厅之间的区别,我采用了比较粗糙的分类方法。一般传统西餐的人均会普遍高于快餐店,于是随机取了几家快餐店的人均消费价格,平均一下大概是100块左右,以这个价格划线,尽可能的刨去不超过这个标准的西式快餐店,最后的分类结果符合预期。
-
在筛选后的名单里提取店铺热评,然而评论里频率靠前的还是:环境优雅、味道赞和服务热情。发现结果和分类之前并没有太大区别。可能因为数据还是不够多,并没有挖掘出更多有用的信息。
![](https://img.haomeiwen.com/i13639953/c64b771d1eda9d93.png)
- 那么下面从消费者角度想找出在北京这五个区中,好吃、不贵、这种性价比高的店铺。从评分,人均消费,评论数三个角度综合筛选出了高性价比的店铺。
由于三者处在不同的数量级,利用:
离差标准化,使结果映射到 [0,1] 之间,将人均消费逆序加权处理,再结合评论数和得分,加和后计算得到最后的评分。
select
type,name,score,per_capita,comments_counts,address,(tran_per + tran_com + tran_sco) as sum
from
(select type,name,score,per_capita,comments_counts,address,
(1 - (per_capita - min_per)/(max_per - min_per))*10 as tran_per,
(comments_counts - min_com)/(max_com - min_com)*10 as tran_com,
(score - min_sco)/(max_sco - min_sco)*10 as tran_sco
from
beijing_all,
(select
max(ifnull(per_capita,0)) max_per,
min(ifnull(per_capita,0)) min_per,
max(ifnull(comments_counts,0)) max_com,
min(ifnull(comments_counts,0)) min_com,
max(ifnull(score,0)) max_sco,
min(ifnull(score,0)) min_sco
from beijing_all) as trans) as total
where tran_sco >= 7
order by sum desc;
- 下面是按照评分总结展示靠前的店铺。仅从展示出来的名单来看,高性价比的店铺中有不少是连锁店。那么是不是具有连锁性质的店面普遍排名靠前呢,还是只是个别几家存在这个现象?这需要再搜集一些信息来进一步分析,这里就不细究了。
高性价比店铺(部分)
- 那么高性价比中的店铺类型分布又是如何呢, 最后统计了北京这五个区中高性价比店铺类型的数量分布情况(部分)
![](https://img.haomeiwen.com/i13639953/e92bcfa39a465cc4.png)
-
热门店铺的热门评论
# 热门店铺的热评
select comment1,ifnull(count1,0)+ifnull(count2,0) count3
from
(select comment1,count(comment1) count1 from beijing_all_good_all_comments group by comment1) a1
left join
(select comment2,count(comment2) count2 from beijing_all_good_all_comments group by comment2) a2
on comment1 = comment2
union
select comment2,ifnull(count1,0)+ifnull(count2,0) count3
from
(select comment1,count(comment1) count1 from beijing_all_good_all_comments group by comment1) a1
right join
(select comment2,count(comment2) count2 from beijing_all_good_all_comments group by comment2) a2
on comment1 = comment2
order by count3 desc;
-
不足:
- 爬取数据的时候发现,美团网页版的信息与美团app的信息稍有差别,这使得分析的结果会有误差。
- 样本数量偏少。对有些问题不能很好的深入挖掘。
- 如果数据量较大时,所使用的sql语句可能效率会下降,没有考虑sql语句的性能优化。
最后放上本项目中其他提数的sql语句
![](https://img.haomeiwen.com/i13639953/e0068230074f069b.png)
参考:
网友评论