美团网数据分析——到底有多少人知道这些餐厅?!

特别声明:本文仅兴趣交流,感兴趣的水友也可以在下面留言,转载请联系作者。

  • 前言

就是出于好玩,也没那么多精力做同行业的数据整合,只是想了解有哪些餐厅一辈子都吃不起、哪些店是当下热门、上海餐饮地理分布情况是怎样的、本文也就围绕着以上几个大点,开始美团数据探索之旅。


  • 分析过程

  • 整个过程一共分为三个步骤:
  1. 数据来源(细节部分不做展开)
  2. 基础分析(可以跳过,一些基本的数据分析方法、流程)
  3. 进阶分析(先来一张热力图,具体内容请看第三章,所有店铺的空间数据分析)
当前层级:12级
  • 1. 数据来源
  • 利用爬虫技术获取了餐饮全分类、地域一级二级分类


  • 在获取每个分类下面的标题、分数、评论、地址、人均、所有代金券数据


  • 然后要把数据存入MySql数据库中
  • 2. 基础分析
  • 先max,min看下异常数据,这些极值会影响最后统计结果,人均价格和评分有0的情况,对最后统计没有意义将这些数据进行剔除
  • 对数据总量和剔除无效后的数据做一个占比展示,那么最后可以使用的数据26793条,占总量89%
from pyecharts import Liquid

liquid = Liquid(title="样本数",subtitle='样本总量29876 剔除均价和评分为0的数据所剩的数量26793')
liquid.add("Liquid", [0.89, 0.7, 0.5, 0.3], is_liquid_outline_show=False)
liquid
  • 好,接下来我们再来看下在这89%的数据中,我们按人均价格降序排解,到底哪几家会脱颖而出~
from pyecharts import Bar,Grid

df = df.head(10)
title = df['title']
avg_price =  df['avg_price']
avg_score = df['avg_score']
comment_num = df['comment_num']

bar = Bar(title="餐饮商家前十排行",subtitle='数据来源神秘组织:*团',width=800,height=400)
bar.add("人均", title, avg_price, mark_point=["min", "max"],mark_line=["average"])
bar.add("评论数", title, comment_num,mark_point=["max"],is_label_show=True, xaxis_rotate=30)

grid = Grid(height=500)
grid.add(bar, grid_bottom="30%")
  • 榜单前10的平均人均消费也达到了1126.4 RMB,其中,最贵的是“黄公子”人均 2665 RMB,不由得让我们对前10的商家起了兴趣,于是上了百度查看了一下

  • 【黄公子】 人均 2665 RMB
    隐藏在老式洋房里的一家人均千元的定制私房菜,仪式感十足,每天只接受10位顾客的预定,简友们谁家宽裕的可以带我去遛遛 =。=


  • 【洋房火锅】人均 901 RMB
    火锅中的劳斯莱斯...A级和牛600~800,涮一片牛肉小两百...我的天...贫穷真的限制我了我的想象 =。=


  • 看完最贵的,那么我们看下最热的,也就是评论数最多的


  • 从数据表中可以看出,整个评论排行榜的前十均被 小吃快餐、自助餐 2类霸榜(其中还剔除了各种xxx分店),有趣的是前十店铺的地址大多都在 嘉定、奉贤、松江、曹路 这些地区都在上海外环以外。这里有些店铺可能存单刷单嫌疑。

from pyecharts import Bar,Grid

sql3 = '''#sql3
select distinct a.sub_id,a.sub_name,
b.poi_id,b.title,b.avg_price,b.avg_score,b.comment_num,b.address from meituan_classify_info as a
inner join meituan_shop_info as b on a.sub_id = b.sub_id and a.class_type = b.class_type
where a.class_type = 1 and a.sub_id not in(24,393,395) and b.avg_price <> 0 and b.avg_score <> 0 
and CONCAT(b.sub_id,b.poi_id) not in ('6342030772','4050576755','6350576755','4052163162','2006068147006','5452800270','4087812358','6387812358','543311762')
order by b.comment_num desc limit 10;
'''
df3 = pd.read_sql(sql3,conn)
data = sorted(df3[['title','comment_num']].values ,key=lambda x: x[1],reverse=True)
attr = [i[0] for i in data]
val = [i[1] for i in data]

bar = Bar()
bar.add('comment_num', attr, val,is_label_show=True,xaxis_rotate=30)
grid3 = Grid(height=500)
grid3.add(bar, grid_bottom="30%")

【燕烤猪蹄店】人均 10 RMB

  • 评论数量第一的竟然是家烤猪蹄店...!! 但为何以如此高的评论数位居榜首?是否存在刷榜行为? 对这块了解的请留言告知~(图3是本尊,喜欢的请点赞!)
  • 对以上几家餐厅感兴趣的可以点餐厅链接↑↑↑

  • 好了,言归正传,分类不同,价格会相差很大,所以不能对所有类别进行全量统计(例如日料和小吃的价格就是天壤之别)下面的箱线图就很好的表达了这些分类的数据分布情况:
from pyecharts import Boxplot

sql = '''select distinct sub_id,sub_name from meituan_classify_info where class_type = 1 and sub_id not in(24,393,395)'''
df = pd.read_sql(sql,conn)

sql2 = '''select distinct poi_id,avg_price,sub_id from meituan_shop_info where class_type = 1 and avg_price <> 0 and avg_score <> 0'''
df2 = pd.read_sql(sql2,conn)

x_axis = []
y_axis = []
for i in df.index:
    sub_id = df.loc[i].values[0]
    sub_name = df.loc[i].values[1]  
    avg_price = df2[df2['sub_id'] == sub_id ]['avg_price'].values
    x_axis.append(sub_name)
    y_axis.append(avg_price)
    
boxplot = Boxplot("菜系数据分布情况")
_yaxis = boxplot.prepare_data(y_axis)   # 转换数据
tp_dict = {k:v for k,v in zip(x_axis,_yaxis)}
idx_tp = sorted([(max(v),k) for k,v in zip(x_axis,_yaxis)])

# 根据max排序
x_ax = []
y_ax = []
for i in idx_tp:
    x_ax.append(i[1])
    y_ax.append(tp_dict[i[1]])
boxplot.add('boxplot', x_ax,y_ax,is_datazoom_show=True, datazoom_type='both',xaxis_rotate=30)

grid = Grid()
grid.add(boxplot, grid_bottom="20%")
  • 分类有很多种,要把菜系和食品的类别区分开(火锅可以是川菜也可以是日料,日料可以是自助也可以是海鲜)所以我们要把分类再细化,这里剔除食品分类,筛选出菜系类别(如:日料、川菜、粤菜、浙江菜、西北菜等)
from pyecharts import Pie

sorted_df = sorted(df4[['sub_name','cnt']].values, key=lambda x:x[1],reverse=True)
attr = [i[0] for i in sorted_df]
val = [i[1] for i in sorted_df]
    
pie = Pie("*团各大菜系店铺数", title_pos='center', width=800)

pie.add("菜系", attr, val, center=[50, 50], is_random=True,
        radius=[35,65], rosetype='radius',legend_orient='vertical',legend_pos='left',
        is_legend_show=True, is_label_show=True)
  • 川湘菜、浙江菜、日料、粤菜、韩料 位居前5,可以说统计结果跟现实中完全吻合,继续对数据进行下钻,接下来就来专门研究下日料的情况。

  • 3. 进阶分析

  • 在做日料店分布之前先来,上海市餐饮整体的一个分布情况,将数据库所有店铺的地址做清洗处理,然后百度地理经纬度坐标

  • 将区域的每个坐标进行分组聚类,然后嵌入百度地图中(具体怎么嵌,请搜索百度地图SDK平台),就生成了下图 :

# 这里有几个知识点,地理坐标系一共分为几类
# 1.GPS设备获取的角度坐标,wgs84坐标
# 2.国测局坐标,gcj02坐标
# 3.百度经纬度坐标,bd09ll坐标
# 由于坐标信息都是经过加密处理,需要统一坐标才能够使用

sql = '''select round(lng,4),round(lat,4),count(*) * 10 from meituan_shop_map
        group by round(lng,4),round(lat,4);'''
cur.execute(sql)
result = cur.fetchall()
# 将坐标聚类,清洗
hotmap = [{"lng": float(i[0]), "lat": float(i[1]), "count": int(i[2])} for i in result]

  • 15层级图中可以获取到很多信息,人口密集程度,商业繁华程度侧面就不说了,主要一下三点:
    当前层级:15级
  1. 明显的两大区域,分别是以静安寺为中心向南京西路延伸段、人民广场至南京路延申段,两大商业区餐饮商铺成均匀及延续分布,说明不仅店多而且分布广。

  2. 次级区域分别有,上海火车站(不夜城)、中山公园、八佰伴、长寿路
    说明这些地区也有相当部分市场。

  3. 高热集中区域有,陆家嘴、环球港、中山公园、华东大学、马当路地铁站,铜川路等,这些高热特征他们都分布在地铁枢纽区域,地域小店铺分布密集。


  • 12层级图中环以外区域,从10点方向逆时针主要有几个明显区域:
    当前层级:12级

    安亭镇、南翔镇、华漕镇、九亭镇、莘庄镇、曹行镇、周浦镇、张江镇、川沙镇、金桥镇、曹路镇,都是以人口较密区域成散点式分布


  • 10层级图上海餐饮分布总览:
    当前层级:10级

    左下3个大片红色区域由外向内分别是:金山、奉贤、松江
    右下大红色是:惠南
    上面岛屿是:崇明


  • 终于到了上海日料分布情况的环节
    当前层级:12级

    热力图呈现大面积黄色区域为古北、天山地区,那边日本企业较多,所以日料店也相对较多,其次就是静安寺、人名广场、徐家汇、八佰伴等商圈


  • 好了,地理坐标系的分析就到此告一段落,接下来尝试找出最好吃的日料店,由于评论,价格,评分的数值不在一个维度中,那么我们先要对这些数值进行收敛处理,处理步骤如下:
  1. 点评极值差异相当大,那么用log20去对评论进行收敛,log基数越大表示对数据变动大小越不敏感。
  2. 价格虽越贵越好吃的概率较大,但为了找到性价比最高的店,这里将价格作为降权处理
  3. 评分最大5分最小0分,将0分提出,也同样对其进行收敛处理
  4. 对3个指标的线性加权,再用算法进行归一化处理(var - min) / (max - min) 就得到了最后的评分
select
    poi_id, title
    ,(result - min_rst) / (max_rst - min_rst) as convergence
    ,comment_num ,comnt ,avg_price ,price ,avg_score ,score, result , max_rst , min_rst
from(
    select 
        poi_id, title
        ,comment_num
        ,ifnull(log(20,comment_num),0) as comnt
        ,avg_price
        ,log10(avg_price) as price
        ,avg_score
        ,ifnull(log2(avg_score),0) as score
        ,ifnull(log(20,comment_num),0) - log10(avg_price) + ifnull(log2(avg_score),0) as result
    from meituan_shop_info
    where sub_id = 20059 and avg_price <> 0
) as x 
left join 
(
    select 
    max(ifnull(log(20,comment_num),0) - log10(avg_price) + ifnull(log2(avg_score),0)) as max_rst
    ,min(ifnull(log(20,comment_num),0) - log10(avg_price) + ifnull(log2(avg_score),0)) as min_rst
    from meituan_shop_info
    where sub_id = 20059 and avg_price <> 0
) as y on 1 = 1
where x.avg_price > 500
order by convergence desc

  • 所有日料店加权计算后评分后,筛选出300RMB以上的日料店,吃货们自己去百度搜下吧,就不逐个介绍了
300-500日料推荐


  • 【舞泽】人均 313 RMB
    很多料理都是采用蒸的方法来烹饪的,「生冻雪蟹」「蒸海鲜」「帝王蟹」「茶泡饭」都是特色,这些我都是听说的,等赚到钱了一定要去吃一下~

舞泽


  • 数据提取的一些简单脚本,初学者可以看下



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 邵亚军焦点解决网络中级第11期持续分享第205天 心理学有个词叫做“选择性关注”,就是当我们有了一句话,或者观点后...
    花仙子8822阅读 1,078评论 0 0
  • 灯光球场,能坐的已满,围观者众多。 今天的赛事,有令人拍案叫绝的三分球大放异彩。在有限的时间里,不...
    渊旷奚阅读 210评论 1 2
  • 学简笔画之前自己临摹的大多是卡通人物,但不懂其中的绘画技巧,都是没有构图直接下笔,导致有时会画得不对称,上了课之后...
    ai自嘲的丸子阅读 398评论 1 2