城市餐饮店铺选址分析(一)
项目①项目目的
从三个维度“口味”、“人均消费”、“性价比”对不同菜系进行比较,并筛选出可开店铺的餐饮类型
项目要求
① 计算出三个维度的指标得分
② 评价方法:
口味 → 得分越高越好
性价比 → 得分越高越好
人均消费 → 价格适中即可
③ 作图:
制作散点图,x轴为“人均消费”,y轴为“性价比得分”,点的大小为“口味得分”
绘制柱状图,分别显示“口味得分”、“性价比得分”
数据预览
本次项目的目的是,筛选出在上海可以开店铺的餐饮类型,数据来源是上海市的餐饮数据,通过对餐饮数据进行数据清洗、异常值清除等一系列操作,分析哪种类型的餐饮更适合开,数据如下上海餐饮数据.xlsx
上海餐饮数据.xlsx
载入数据
本项目中,使用的分析工具是,首先我们需要导入项目分析所需要的文件,代码如下:
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
'''
(1)加载数据
'''
import os
os.chdir('C:\\Users\\RaingEye\\Desktop\\数据分析项目实战\\城市餐饮店铺选址分析\\')
df1 = pd.read_excel('上海餐饮数据.xlsx', sheetname = 0)
在工具中,分析数据的结果,在左上角显示店铺选址,如下图:
双击右上角‘df1’即可查看当前载入的数据,如下图:
计算口味、客单价、性价比指标
在中,处理数据既可以是在左边写代码,也可以在右下方以交互式的形式来完成,如果在左边代码框内,写处理数据的代码,则会保存到文件中,而在右边交互式窗口中则不会保存代码,但是结果在后续可以调用国内领先的AI写作系统,如图所示:
上图中,将df1中所需要的数据去除,存在变量data1中,然后将所有的控制去掉,接下来为了避免结果异常,需要将data1中口味和人均消费为0的数据去掉,并且计算性价比的值,如下图中,去掉空值和值为0的数据以后,data1的数据减少了一半左右,为了方便后续学习,在交互式窗口中写的代码,在代码文件中也写一遍,但需要将其注释掉:
完成上边的任务后,数据中还可能存在异常值,在此可以通过创建箱型图,来查看异常值,为了方便后续的调用,此时在代码文件中编写箱型图的函数,在交互式窗口中调用,如图:
作出箱型图以后,发现有异常值,需要将异常值删掉,同样定义一个函数f2(),在函数中求1分位、3分为和IQR的值,然后求出上边t2和下边界t1的值,筛选出异常边界范围内的值,如图所示:
在将异常值处理以后,需要进行不同类别餐饮的标准化处理,进行排序店铺选址,得到指标标准化的分,如下如代码:
在此之前,通过数据标准化,通过性价比指标计算方式,得到了性价比数据,并且惊醒了标准化处理,得到了三个标准化后的数据,然后我们需要使用merge函数,将三个数据进行合并,代码如下图:
制作图表
在做完上文的数据处理以后,现在开始将数据做成图表,以作为辅助分析工具使用;在此需要导入作图的工具包,为了使图之间有联动效果,作图的辅助标记等,需要导入、、三个函数,由于生成的图表是“”类型,保存图表的是一个HTML 文件,还要设置保存图表的网页名称;
按照题目得要求,生成图表中点的大小为口味得分,同时在这里因为‘’的为中文,这里需要将其设置为英文,如下图:
现在开始生成图图表,我们需要生成的图表是散点图与柱状体的联动图,代码如下:
'''
绘制图表, 辅助分析
'''
from bokeh.layouts import gridplot
from bokeh.models import HoverTool
from bokeh.models.annotations import BoxAnnotation
output_file('project07_h1.html')
data_final_q1['size'] = data_final_q1['口味_norm']*40
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 = 300, title = '餐饮类型得分',
x_axis_label = '人均消费', y_axis_label = '性价比得分',
tools = [hover, 'box_select, reset, xwheel_zoom, crosshair, pan'])
result.circle(x = 'price', y = 'xjb_norm', source = source,
size = 'size', line_color = 'black', line_dash = [6, 4],
fill_alpha = 0.7)
price_mid = BoxAnnotation(left = 40, right = 80, fill_alpha = 0.1, fill_color = 'navy')
result.add_layout(price_mid)
#散点图
data_type = data_final_q1.index.tolist()
kw = figure(plot_width = 800, plot_height = 300, title = '口味得分',
x_range = data_type, tools = [hover, 'box_select, reset, xwheel_zoom, crosshair, pan'])
kw.vbar(x = 'type', top = 'kw_norm', source = source,
width = 0.8, alpha = 0.7, color = 'red')
price = figure(plot_width = 800, plot_height = 300, title = '人均消费得分',
x_range = data_type, tools = [hover, 'box_select, reset, xwheel_zoom, crosshair, pan'])
price.vbar(x = 'type', top = 'price_norm', source = source,
width = 0.8, alpha = 0.7, color = 'blue')
#柱状图
p = gridplot([[result], [kw], [price]])
show(p)
最终结果.html
手机浏览,点击图片保存二维码到相册,然后打开微信扫一扫选择本二维码图片就可以进入,电脑端微信“扫一扫”二维码,进入找聊天搭子平台,里面有找饭搭子、找对象、找陪伴服务等等