餐饮选址问题

【项目07】 城市餐饮店铺选址分析

1、从三个维度“口味”、“人均消费”、“性价比”对不同菜系进行比较,并筛选出可开店铺的餐饮类型
要求:
① 计算出三个维度的指标得分
② 评价方法:
口味 → 得分越高越好
性价比 → 得分越高越好
人均消费 → 价格适中即可
③ 制作散点图,x轴为“人均消费”,y轴为“性价比得分”,点的大小为“口味得分”
绘制柱状图,分别显示“口味得分”、“性价比得分”

  • 建议用bokeh做图
    提示:
    ① 数据清洗,清除空值、为0的数据
    ② 口味指标计算方法 → 口味评分字段,按照餐饮类别分组算均值,再做标准化处理
    ③ 人均消费指标计算方法 → 人均消费字段,按照餐饮类别分组算均值,再做标准化处理
    ④ 性价比指标计算方法 → 性价比 = (口味 + 环境 + 服务)/人均消费,按照餐饮类别分组算均值,再做标准化处理
    ⑤ 数据计算之前,检查一下数据分布,去除异常值(以外限为标准)
  • 这里排除了高端奢侈餐饮的数据干扰
    ⑥ 注意,这里先分别计算三个指标,再合并数据(merge)作图,目的是指标之间的噪音数据不相互影响

2、选择一个餐饮类型,在qgis中做将上海划分成格网空间,结合python辅助做空间指标评价,得到餐饮选址位置

  • 课程这里以“素菜馆为例”
    课程数据
    ① net_population.shp → 投影坐标系,上海1km²格网内的人口密度数据
    ② road.shp → 投影坐标西,上海道路数据
    要求:
    ① 通过空间分析,分别计算每个格网内的几个指标:人口密度指标、道路密度指标、餐饮热度指标、同类竞品指标
    ② 评价方法:
    人口密度指标 → 得分越高越好
    道路密度指标 → 得分越高越好
    餐饮热度指标 → 得分越高越好
    同类竞品指标 → 得分越低越好
    综合指标 = 人口密度指标0.4 + 餐饮热度指标0.3 + 道路密度指标0.2 +同类竞品指标0.1
    ③ 最后得到较好选址的网格位置的中心坐标,以及所属区域
    • 可以用bokeh制作散点图
      提示:
      ① 道路密度指标计算方法 → 网格内道路长度
      ② 餐饮热度指标计算方法 → 网格内餐饮poi计数
      ③ 同类竞品指标计算方法 → 网格内素菜馆poi计数
      ④ 餐饮poi数据记得投影
      ⑤ 可以以“net_population.shp”为网格基础数据,做空间统计
      ⑥ 在qgis做空间统计之后,网格数据导出点数据,投影成wgs84地理坐标系,导出excel数据,在python做指标标准化等
      ⑦ 在bokeh中做散点图时,注意添加一个size字段,通过最终评分来赋值
      ⑧ 在bokeh中做散点图时,可以给TOP10的点用颜色区分

'''
'''
1、从三个维度“口味”、“人均消费”、“性价比”对不同菜系进行比较,并筛选出可开店铺的餐饮类型
要求:
① 计算出三个维度的指标得分
② 评价方法:
口味 → 得分越高越好
性价比 → 得分越高越好
人均消费 → 价格适中即可
③ 制作散点图,x轴为“人均消费”,y轴为“性价比得分”,点的大小为“口味得分”
绘制柱状图,分别显示“口味得分”、“性价比得分”

  • 建议用bokeh做图
    提示:
    ① 数据清洗,清除空值、为0的数据
    ② 口味指标计算方法 → 口味评分字段,按照餐饮类别分组算均值,再做标准化处理
    ③ 人均消费指标计算方法 → 人均消费字段,按照餐饮类别分组算均值,再做标准化处理
    ④ 性价比指标计算方法 → 性价比 = (口味 + 环境 + 服务)/人均消费,按照餐饮类别分组算均值,再做标准化处理
    ⑤ 数据计算之前,检查一下数据分布,去除异常值(以外限为标准)
  • 这里排除了高端奢侈餐饮的数据干扰
    ⑥ 注意,这里先分别计算三个指标,再合并数据(merge)作图,目的是指标之间的噪音数据不相互影响

'''

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource

from bokeh.models import HoverTool
from bokeh.palettes import brewer
from bokeh.models.annotations import BoxAnnotation
from bokeh.layouts import gridplot

"""
1.加载数据
"""
import os
os.chdir('/Users/liyili2/Downloads/datas/python_wei/03/01-restaurant/')
df1=pd.read_excel('上海餐饮数据.xlsx',sheetname=0)
print('finished!')

'''
2.计算口味、客单价、性价比指标
'''
#len(df1)
#columns_list=df1.columns.tolist()
data1=df1[['类别','口味','环境', '服务', '人均消费']]
data1.dropna(inplace=True)
data1=data1[(data1['口味']>0)&(data1['人均消费']>0)]
data1['性价比']=(data1['口味']+data1['环境']+data1['服务'])/data1['人均消费']
#数据清晰+性价比计算

def f1():
    fig,axes=plt.subplots(1,3,figsize=(10,4))
    data1.boxplot(column=['口味'],ax=axes[0])
    data1.boxplot(column=['人均消费'],ax=axes[1])
    data1.boxplot(column=['性价比'],ax=axes[2])
    
#创建函数:制作箱形图,查看异常值
def f2(data,col):
    q1=data[col].quantile(q=0.25)
    q3=data[col].quantile(q=0.75)
    iqr=q3-q1
    t1=q1-3*iqr
    t2=q3+3*iqr
    return data[(data[col]>t1)&(data[col]<t2)][['类别',col]]

#创建函数2:清除异常值
data_kw=f2(data1,'口味')
f1()
data_kw.boxplot()
data_rg=f2(data1,'人均消费')
data_rg.boxplot()
data_xjb=f2(data1,'性价比')
data_kw.boxplot()

def f3(data,col):
    col_name=col+'_norm'
    data_gp=data.groupby('类别').mean()
    data_gp[col_name]=(data_gp[col]-data_gp[col].min())/(data_gp[col].max()-data_gp[col].min())
    data_gp.sort_values(by=col_name,inplace=True,ascending=False)
    return data_gp
    
#创建函数3:标准化指标并排序
data_kw_score=f3(data_kw,'口味')
data_rg_score=f3(data_rg,'人均消费')
data_xjb_score=f3(data_xjb,'性价比')
#指标标准化得分

data_final_q1 = pd.merge(data_kw_score,data_rg_score,left_index=True,right_index=True)    # 合并口味、人均消费指标得分
data_final_q1 = pd.merge(data_final_q1,data_xjb_score,left_index=True,right_index=True)       # 合并性价比指标得分
# 合并数据

data_final_q1.head()

#(3)绘制图表辅助分析
from bokeh.layouts import gridplot
#因为口味的数值太小了,放大点便于观察
data_final_q1['size'] = data_final_q1['口味_norm'] * 40  # 添加size字段
data_final_q1.index.name = 'type'
data_final_q1.columns = ['kw','kw_norm','price','price_norm','xjb','xjb_norm','size']

#创建数据
source = ColumnDataSource(data_final_q1)
hover = HoverTool(tooltips=[("餐饮类型", "@type"),
                            ("人均消费", "@price"),
                            ("性价比得分", "@xjb_norm"),
                            ("口味得分", "@kw_norm")
                           ])  # 设置标签显示内容

# 构建绘图空间
result = figure(plot_width=800, plot_height=250,
                title="餐饮类型得分情况" ,
                x_axis_label = '人均消费', y_axis_label = '性价比得分', 
                tools=[hover,'box_select,reset,xwheel_zoom,pan,crosshair']) 

#绘制散点图
result.circle(x = 'price',y = 'xjb_norm',source = source,
         line_color = 'black',line_dash = [6,4],fill_alpha = 0.6,
        size = 'size')


price_mid = BoxAnnotation(left=40,right=80, fill_alpha=0.1, fill_color='navy')   
result.add_layout(price_mid)
# 设置人均消费中间价位区间
result.title.text_font_style = "bold"
result.ygrid.grid_line_dash = [6, 4]
result.xgrid.grid_line_dash = [6, 4]


# 绘制柱状图-vbar
data_type = data_final_q1.index.tolist()# 提取横坐标

# 柱状图1
kw = figure(plot_width=800, plot_height=250, title='口味得分',x_range=data_type,
           tools=[hover,'box_select,reset,xwheel_zoom,pan,crosshair'])

kw.vbar(x='type', top='kw_norm', source=source,width=0.9, alpha = 0.8,color = 'red')   
kw.ygrid.grid_line_dash = [6, 4]
kw.xgrid.grid_line_dash = [6, 4]


# 柱状图2
price = figure(plot_width=800, plot_height=250, title='人均消费得分',x_range=kw.x_range,
              tools=[hover,'box_select,reset,xwheel_zoom,pan,crosshair'])
price.vbar(x='type', top='price_norm', source=source,width=0.9, alpha = 0.8,color = 'green') 
price.ygrid.grid_line_dash = [6, 4]
price.xgrid.grid_line_dash = [6, 4]

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

推荐阅读更多精彩内容

  • 我还上学的时候,身边大部分女孩子们都表示自己没有什么事业心,以后能开一家自己的咖啡店或者烘焙店,平时做做饮料甜点,...
    娜某人阅读 1,658评论 0 5
  • 项目需求: 为了在上海市各类型餐饮店铺中选择综合评分最高,消费者心中性价比最好的餐饮类型;以及在上海市区域内寻找该...
    LanceYama阅读 4,466评论 1 7
  • 一双颤巍巍的双手,愈抖愈烈, 手中的威士忌像迎着海风一般荡漾。 他是一个得了帕金森的钢琴家。 在酒吧里度过他最后的...
    从一而终_f4c1阅读 92评论 0 1
  • 一 你是我的一念执着 是沧海中的沧海 是一粟中的一粟 你满满当当地途径 我盛放的生命 二 有时会不自觉地想起你 嘴...
    纳尼1212956阅读 162评论 0 1
  • 《悲伤成河》 别回头 会动摇我的心 雨那么大 像我此刻的心情 悲伤成河 怎么办 看着你远去的背影 好想拥你入怀 我...
    悠悠灵水大人阅读 104评论 0 2