问题
【项目07】 城市餐饮店铺选址分析
1、从三个维度“口味”、“人均消费”、“性价比”对不同菜系进行比较,并筛选出可开店铺的餐饮类型
要求:
① 计算出三个维度的指标得分
② 评价方法:
口味 → 得分越高越好
性价比 → 得分越高越好
人均消费 → 价格适中即可
③ 制作散点图,x轴为“人均消费”,y轴为“性价比得分”,点的大小为“口味得分”
绘制柱状图,分别显示“口味得分”、“性价比得分”
- 建议用bokeh做图
提示:
① 数据清洗,清除空值、为0的数据
② 口味指标计算方法 → 口味评分字段,按照餐饮类别分组算均值,再做标准化处理
③ 人均消费指标计算方法 → 人均消费字段,按照餐饮类别分组算均值,再做标准化处理
④ 性价比指标计算方法 → 性价比 = (口味 + 环境 + 服务)/人均消费,按照餐饮类别分组算均值,再做标准化处理
⑤ 数据计算之前,检查一下数据分布,去除异常值(以外限为标准) - 这里排除了高端奢侈餐饮的数据干扰
⑥ 注意,这里先分别计算三个指标,再合并数据(merge)作图,目的是指标之间的噪音数据不相互影响
答案
1
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 23 11:03:15 2019
@author: HASEE
"""
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(r'E:\软件自学\数据分析--网易微专业\【非常重要】Python数据分析师微专业_项目资料\项目07城市餐饮店铺选址分析')
df1 = pd.read_excel('上海餐饮数据.xlsx',sheetname=0)
'''
(2) 筛选数据,只留['类别','口味','环境','服务','人均消费'],并删除null和0,得到data1
'''
data1=df1[['类别','口味','环境','服务','人均消费']]
data1.dropna(inplace=True)
#发现数据的特点,人均消费为0的数据包含了前三个字段 口味 环境 服务 =0的所有情况
#所有只用bool索引令‘人均消费’>0即可
data1=data1[(data1['人均消费']>0)]
'''
(3) 给data1添加字段‘性价比’
'''
data1['性价比']=(data1['口味']+data1['环境']+data1['服务'])/data1['人均消费']
'''
(4) 创建箱形图函数box 用于观察'口味','人均消费','性价比'三个字段各自的异常值
'''
def box():
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])
box()
'''
(5) 创建清洗函数clear 用于清洗'口味','人均消费','性价比'三个字段各自的异常值(大于外限的数据视为异常值)
注意:三个字段的异常值不是统一的,即口味的异常数据,性价比不一定异常,所以三列要分开清洗
'''
def clear(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]])
data_taste = clear(data1,'口味')
data_expend = clear(data1,'人均消费')
data_ratio = clear(data1,