项目①

项目目的

从三个维度“口味”、“人均消费”、“性价比”对不同菜系进行比较,并筛选出可开店铺的餐饮类型

项目要求

① 计算出三个维度的指标得分
② 评价方法:
口味 → 得分越高越好
性价比 → 得分越高越好
人均消费 → 价格适中即可
③ 作图:
制作散点图,x轴为“人均消费”,y轴为“性价比得分”,点的大小为“口味得分”
绘制柱状图,分别显示“口味得分”、“性价比得分”

  • 建议用bokeh做图

    项目提示

    ① 数据清洗,清除空值、为0的数据
    ② 口味指标计算方法 → 口味评分字段,按照餐饮类别分组算均值,再做标准化处理
    ③ 人均消费指标计算方法 → 人均消费字段,按照餐饮类别分组算均值,再做标准化处理
    ④ 性价比指标计算方法 → 性价比 = (口味 + 环境 + 服务)/人均消费,按照餐饮类别分组算均值,再做标准化处理
    ⑤ 数据计算之前,检查一下数据分布,去除异常值(以外限为标准)

  • 这里排除了高端奢侈餐饮的数据干扰
    ⑥ 注意,这里先分别计算三个指标,再合并数据(merge)作图,目的是指标之间的噪音数据不相互影响


数据预览

本次项目的目的是,筛选出在上海可以开店铺的餐饮类型,数据来源是上海市的餐饮数据,通过对餐饮数据进行数据清洗、异常值清除等一系列操作,分析哪种类型的餐饮更适合开,数据如下上海餐饮数据.xlsx
上海餐饮数据.xlsx

载入数据

本项目中,使用的分析工具是Spyder,首先我们需要导入项目分析所需要的文件,代码如下:

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import warnings
  5. warnings.filterwarnings('ignore')
  6. #导入作图核心文件
  7. from bokeh.plotting import figure, show, output_file
  8. from bokeh.models import ColumnDataSource
  9. '''
  10. (1)加载数据
  11. '''
  12. import os
  13. os.chdir('C:\\Users\\RaingEye\\Desktop\\数据分析项目实战\\城市餐饮店铺选址分析\\')
  14. df1 = pd.read_excel('上海餐饮数据.xlsx', sheetname = 0)

在Spyder工具中,分析数据的结果,在左上角显示,如下图:
图片.png双击右上角‘df1’即可查看当前载入的数据,如下图:
图片.png

计算口味、客单价、性价比指标

在Spyder中,处理数据既可以是在左边写代码,也可以在右下方以交互式的形式来完成,如果在左边代码框内,写处理数据的代码,则会保存到文件中,而在右边交互式窗口中则不会保存代码,但是结果在后续可以调用,如图所示:图片.png
上图中,将df1中所需要的数据去除,存在变量data1中,然后将所有的控制去掉,接下来为了避免结果异常,需要将data1中口味和人均消费为0的数据去掉,并且计算性价比的值,如下图中,去掉空值和值为0的数据以后,data1的数据减少了一半左右,为了方便后续学习,在交互式窗口中写的代码,在代码文件中也写一遍,但需要将其注释掉:
图片.png 完成上边的任务后,数据中还可能存在异常值,在此可以通过创建箱型图,来查看异常值,为了方便后续的调用,此时在代码文件中编写箱型图的函数,在交互式窗口中调用,如图:
图片.png 作出箱型图以后,发现有异常值,需要将异常值删掉,同样定义一个函数f2(),在函数中求1分位、3分为和IQR的值,然后求出上边t2和下边界t1的值,筛选出异常边界范围内的值,如图所示:
图片.png
在将异常值处理以后,需要进行不同类别餐饮的标准化处理,进行排序,得到指标标准化的分,如下如代码:
图片.png
在此之前,通过数据标准化,通过性价比指标计算方式,得到了性价比数据,并且惊醒了标准化处理,得到了三个标准化后的数据,然后我们需要使用merge函数,将三个数据进行合并,代码如下图:
图片.png

制作图表

在做完上文的数据处理以后,现在开始将数据做成图表,以作为辅助分析工具使用;在此需要导入作图的工具包,为了使图之间有联动效果,作图的辅助标记等,需要导入gridplot、HoverTool、BoxAnnotation三个函数,由于生成的图表是“output_file”类型,保存图表的是一个HTML 文件,还要设置保存图表的网页名称;
按照题目得要求,生成图表中点的大小为口味得分,同时在这里因为‘data_final_q1’的columns为中文,这里需要将其设置为英文,如下图:
图片.png
现在开始生成图图表,我们需要生成的图表是散点图与柱状体的联动图,代码如下:

'''
绘制图表, 辅助分析
'''
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)

图片.png
最终结果project07_h1.html