城市餐饮店铺选址分析

步骤

准备

打开spyder
        准备数据

image

查看数据
        分析需求

分析程序

导入模块

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

加载数据

# 加载数据


import os
os.chdir('E:\\Data_analysis\\Project\\01\\')
# 创建工作路径

df1 = pd.read_excel('上海餐饮数据.xlsx')
df1_length = len(df1)
df1_columns = df1.columns.tolist()
print('数据量为%i条' % len(df1))
print(df1.head())

筛选数据,清除空值、为0的数据

data1 = df1[['类别','口味','环境','服务','人均消费']]
data1.dropna(inplace = True)  # 去掉空数据
data1 = data1[(data1['口味']>0)&(data1['人均消费']>0)]
# 筛选数据,清除空值、为0的数据

计算性价比指数

data1['性价比'] = (data1['口味'] + data1['环境'] + data1['服务']) / data1['人均消费']
# 计算性价比指数

用箱型图看异常值

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])

image

创建函数 → 用分位数方法过滤掉异常区间

def f1(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_kw = f1(data1,'口味')
data_rj = f1(data1,'人均消费')
data_xjb = f1(data1,'性价比')
# 数据异常值处理

创建函数 → 标准化指标并排序

def f2(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()) #0-1标准化
    data_gp.sort_values(by = col_name, inplace = True, ascending=False)
    return data_gp
# 创建函数 → 标准化指标并排序

data_kw_score = f2(data_kw,'口味')
data_rj_score = f2(data_rj,'人均消费')
data_xjb_score = f2(data_xjb,'性价比')
# 指标标准化得分

合并数据

data_final_q1 = pd.merge(data_kw_score,data_rj_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()

作图程序

导入模块

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
# 导入模块
output_file('dianpuxuanzhi.html')

创建ColumnDataSource数据

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)
# 创建ColumnDataSource数据

鼠标滑动时标签显示的内容

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

散点图

画圆圈时加上虚线line_dash = [6,4] 会报错
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',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]

柱状图1

data_type = data_final_q1.index.tolist()# 提取横坐标

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]
# 柱状图1

柱状图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]
# 柱状图2

显示图表

p = gridplot([[result],[kw], [price]])
# 组合图表
show(p)

image

QGIS作图

准备

打开qgis
        添加地图资源
            上海市行政区

image

道路数据
            人口网格数据
                打开属性表
                    样式选择为‘渐进’
                    模式选为‘分位数’
        设置为投影坐标系
            UTM zone 51N

计算道路指标

点击 矢量->分析工具->计算线条总长度
            设置输出文件地址文件名
            点击确定开始计算(计算时间会比较长)
            计算完成后查看属性表 多出了 长度

加载经纬度数据

文件要是csv格式的
        点击左侧工具栏的 ‘添加文本数据图层’
            选择我们的csv数据文件
            文件格式选择为 csv格式
            横坐标设为 Lng列
            纵坐标设为Lat列
            点击创建
                在弹出让你 选参考坐标系 时,点击取消
                创建成功后能看到地图上出现很多圆点
            右键该文件 另存为 其他名称(canyin),保存时选择投影坐标系
        点击 矢量->分析工具->计算多边形内点的个数
            输出计数字段名称设为 cy_count
            输出shape文件 自己浏览一个文件夹去保存
            点击保存
                保存成功后就会多出 cy_count字段

同类竞争

右键自己保存的canyin 选择属性表
            点击‘使用表达式选择要素’
                选择 “字段”->“类别”
                点击“全部唯一”选择“素菜”
                此时左边表达式为   "类别"  = '素菜' 
                属性表中 选择“显示选中要素”
                右键 canyin另存为 canyin_sucai 
                    保存时勾选“仅保存选中的要素”
        再保存一个分析工具
            点击 矢量->分析工具->计算多边形内点的个数
                输出计数字段名称设为 sc_count
                输出shape文件 自己浏览一个文件夹去保存
                点击保存
                    保存成功后就会多出 sc_count字段
        把多边形转变为点
            点击 矢量->几何工具->多边形质心
                选择 sucai_count
                保存为 point_res
                点击确定
            右键point_res另存为point_res_wgs84
                保存时选择默认坐标系
            右键 point_res选择属性表
                点击“字段计算器”
                    输出字段名称 设为 “Lng"
                    输出字段类型 设为 “小数(实数)”
                    双击 几何图形->$x
                以同样方式导出 lat 维度 几何图形->$y

image

全选属性表
            新建csv文件
            把属性表数据复制进csv中

继续spyder分析

导入模块
    加载数据
    标准化并计算最终得分
    绘制散点图

image