城市餐饮店铺选址分析
数据下载链接:
链接:/s/1l2-EEMhK0-n8gFPLuOHb1g
提取码:7olt
要求:
1、从三个维度“口味”、“人均消费”、“性价比”对不同菜系进行比较,并筛选出可开店铺的餐饮类型
要求:
① 计算出三个维度的指标得分
② 评价方法:
口味 → 得分越高越好
性价比 → 得分越高越好
人均消费 → 价格适中即可
③ 制作散点图,x轴为“人均消费”,y轴为“性价比得分”,点的大小为“口味得分”(暂时未涉及)
绘制柱状图,分别显示“口味得分”、“性价比得分”
建议用bokeh做图(暂未涉及)
提示:这是现在的重心
① 数据清洗,清除空值、为0的数据
② 口味指标计算方法 → 口味评分字段,按照餐饮类别分组算均值,再做标准化处理
③ 人均消费指标计算方法 → 人均消费字段,按照餐饮类别分组算均值,再做标准化处理
④ 性价比指标计算方法 → 性价比 = (口味 + 环境 + 服务)/人均消费,按照餐饮类别分组算均值,再做标准化处理
⑤ 数据计算之前,检查一下数据分布,去除异常值(以外限为标准)这里排除了高端奢侈餐饮的数据干扰
⑥ 注意,这里先分别计算三个指标,再合并数据(merge)作图,目的是指标之间的噪音数据不相互影响
import osimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltos.chdir(r"D:\项目07城市餐饮店铺选址分析")df = pd.read_excel("上海餐饮数据.xlsx")"""计算口味\单价\性价比指标"""# 数据清洗 1 删除空值 2 删除0值df1 = df[["类别","口味","环境","服务","人均消费"]]df1.dropna(inplace=True)df2 = df1[df1["人均消费"]>0][df1["口味"]>0]df2["性价比"] = (df["口味"]+df["环境"]+df["服务"])/df["人均消费"]# 查看异常值def f0(data):fig,axes = plt.subplots(1,3,figsize=(10,4))data.boxplot(column=["口味"],ax=axes[0])data.boxplot(column=["人均消费"],ax=axes[1])data.boxplot(column=["性价比"],ax=axes[2])f0(df2)# 创建函数 删除异常值def f1(data,col):q1 = data[col].quantile(q=0.25)q3 = data[col].quantile(q=0.75)iqr = q3 -q1t1 = q1 - 3*iqrt2 = q3 + 3*iqrreturn data[data[col]>t1][data[col]<t2][["类别",col]]df_kw = f1(df2,"口味")df_xf = f1(df2,"人均消费")df_xjb = f1(df2,"性价比")# 再次查看fig,axes = plt.subplots(1,3,figsize=(10,4))df_kw.boxplot(column=["口味"],ax=axes[0])df_xf.boxplot(column=["人均消费"],ax=axes[1])df_xjb.boxplot(column=["性价比"],ax=axes[2])# 按类别分组 求均值 标准化处理def f2(data,col):colName = col+"_norm"datagp = data.groupby("类别").mean() #分组 求均值datagp[colName] = (datagp[col] - datagp[col].min())/(datagp[col].max()-datagp[col].min()) #标准化处理datagp.sort_values(by=colName, inplace=True, ascending=False) # by=colName以colName排序, 降序ascending=Falsereturn datagpdf_kw_norm = f2(df_kw,"口味")df_xf_norm = f2(df_xf,"人均消费")df_xjb_norm = f2(df_xjb,"性价比")#合并数据df_final = pd.merge(df_kw_norm,df_xf_norm,left_index=True, right_index=True)df_final = pd.merge(df_final,df_xjb_norm,left_index=True, right_index=True)print("finished!")