python数据分析实例—— 上海餐饮店数据

读取excel,matplotlib绘制箱型图,各列去异常值、标准化;bokeh 散点图、柱状图;qgis + bokeh空间散点图

常用函数

data2['tljp_norm'] = (data2['素菜餐饮计数'].max()-data2['素菜餐饮计数'])/(data2['素菜餐饮计数'].max()-data2['素菜餐饮计数'].min()) # 同类竞品指标标准化

一,导入模块及读取excel数据
二, 清除空值、三个指标清除0值 matplotlib箱型图查看异常值 三, 删除3个指标异常值
matplotlib箱型图查看异常值 各列指标标准化
四, X=人均消费 y=性价比 z=口味 bokeh 散点图
五, X=各菜类,Y=口味 bokeh柱状图
六, X=各菜类,Y= 人均消费 bokeh柱状图
七, 上海素菜馆选址 qgis + bokeh空间散点图

一,导入模块及读取excel数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings('ignore') 
# 不发出警告

import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['KaiTi']
mpl.rcParams['font.serif'] = ['KaiTi']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串,中文不显

import os
os.chdir('C:\\Users\\Administrator\\Desktop\\')
df1 = pd.read_excel('上海餐饮数据.xlsx',sheetname=0,header=0)

二, 清除空值、三个指标清除0值 matplotlib箱型图查看异常值

###①数据清洗 + 性价比计算
data_S = df1[['类别','口味','环境','服务','人均消费']]
data_S.dropna(inplace = True)
data_S = data_S[(data_S['口味']>0)&(data_S['人均消费']>0)]
# 筛选数据,清除空值、为0的数据
data_S['性价比'] = (data_S['口味'] + data_S['环境'] + data_S['服务']) / data_S['人均消费']

###②matplotlib箱型图查看异常值
fig,axes = plt.subplots(1,3,figsize = (18,9))
data_S.boxplot(column=['口味'],ax = axes[0])
data_S.boxplot(column=['人均消费'],ax = axes[1])
data_S.boxplot(column=['性价比'],ax = axes[2])

请添加图片描述

三, 删除3个指标异常值 matplotlib箱型图查看异常值 各列指标标准化

##③创建函数 → 删除异常值
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_SS_kw = f1(data_S,'口味')
data_SS_rj = f1(data_S,'人均消费')
data_SS_xjb = f1(data_S,'性价比')

###④处理异常值后再画箱型图看一下
fig,axes = plt.subplots(1,3,figsize = (10,4))
data_SS_kw.boxplot(column=['口味'],ax = axes[0])
data_SS_rj.boxplot(column=['人均消费'],ax = axes[1])
data_SS_xjb.boxplot(column=['性价比'],ax = axes[2])

### ⑤各列指标标准化 + 合并
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())
    data_gp.sort_values(by = col_name, inplace = True, ascending=False)
    return data_gp 

data_SSS_kw_score = f2(data_SS_kw,'口味')
data_SSS_rj_score = f2(data_SS_rj,'人均消费')
data_SSS_xjb_score = f2(data_SS_xjb,'性价比')


data_SSS_final_q1 = pd.merge(data_SSS_kw_score,data_SSS_rj_score,left_index=True,right_index=True)    # 合并口味、人均消费指标得分
data_SSS_final_q1 = pd.merge(data_SSS_final_q1,data_SSS_xjb_score,left_index=True,right_index=True)       # 合并性价比指标得分

请添加图片描述

四, X=人均消费 y=性价比 z=口味 bokeh 散点图

#######导入模块
from bokeh.models import HoverTool
from bokeh.palettes import brewer
from bokeh.models.annotations import BoxAnnotation
from bokeh.layouts import gridplot

from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource


import os
os.chdir('C:/Users/Administrator/Desktop/')
output_file("line111.html")


### 将列名改为英文
data_SSS_final_q1['size'] = data_SSS_final_q1['口味_norm'] * 40  # 添加size字段
data_SSS_final_q1.index.name = 'type'
data_SSS_final_q1.columns = ['kw','kw_norm','price','price_norm','xjb','xjb_norm','size']


## 创建ColumnDataSource数据
source = ColumnDataSource(data_SSS_final_q1)

hover = HoverTool(tooltips=[("餐饮类型", "@type"),
                            ("人均消费", "@price"),
                            ("性价比得分", "@xjb_norm"),
                            ("口味得分", "@kw_norm")
                           ])  # 设置标签显示内容
## 散点图 
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',line_dash = [6,4],fill_alpha = 0.6,
        size = 'size')

#data_SS_rj['人均消费'].describe()
# 设置人均消费中间价位区间
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]
show(result)

请添加图片描述

五, X=各菜类,Y= 口味 bokeh柱状图

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]
show(kw)

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

请添加图片描述

六, X=各菜类,Y= 人均消费 bokeh柱状图

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]
show(price)

请添加图片描述

#######导入模块
from bokeh.models import HoverTool
from bokeh.palettes import brewer
from bokeh.models.annotations import BoxAnnotation
from bokeh.layouts import gridplot

from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource


import os
os.chdir('C:/Users/Administrator/Desktop/')
output_file("line111.html")


### 将列名改为英文
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']


## 创建ColumnDataSource数据
source = ColumnDataSource(data_final_q1)

hover = HoverTool(tooltips=[("餐饮类型", "@type"),
                            ("人均消费", "@price"),
                            ("性价比得分", "@xjb_norm"),
                            ("口味得分", "@kw_norm")
                           ])  # 设置标签显示内容
## 散点图 
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',line_dash = [6,4],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]
# 绘制柱状图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]


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

请添加图片描述
七, 上海素菜馆选址 qgis + bokeh空间散点图
3.0, Qgis

‘’’

2、选择一个餐饮类型,在qgis中做将上海划分成格网空间,结合python辅助做空间指标评价,得到餐饮选址位置

  • 课程这里以“素菜馆为例”

课程数据

① net_population.shp → 投影坐标系,上海1km²格网内的人口密度数据

② road.shp → 投影坐标西,上海道路数据

要求:

① 通过空间分析,分别计算每个格网内的几个指标:人口密度指标、道路密度指标、餐饮热度指标、同类竞品指标

② 评价方法:

人口密度指标 → 得分越高越好

道路密度指标 → 得分越高越好

餐饮热度指标 → 得分越高越好

同类竞品指标 → 得分越低越好

综合指标 = 人口密度指标0.4 + 餐饮热度指标0.3 + 道路密度指标0.2 +同类竞品指标0.1

③ 最后得到较好选址的网格位置的中心坐标,以及所属区域

  • 可以用bokeh制作散点图

提示:

① 道路密度指标计算方法 → 网格内道路长度

② 餐饮热度指标计算方法 → 网格内餐饮poi计数

③ 同类竞品指标计算方法 → 网格内素菜馆poi计数

④ 餐饮poi数据记得投影

⑤ 可以以“net_population.shp”为网格基础数据,做空间统计

⑥ 在qgis做空间统计之后,网格数据导出点数据,投影成wgs84地理坐标系,导出excel数据,在python做指标标准化等

⑦ 在bokeh中做散点图时,注意添加一个size字段,通过最终评分来赋值

⑧ 在bokeh中做散点图时,可以给TOP10的点用颜色区分

‘’’

3.1, 人口密度指标

投影坐标系

此指标已经给出
请添加图片描述
请添加图片描述
请添加图片描述

3.2, 道路密度指标
请添加图片描述
请添加图片描述
请添加图片描述
3.3, 餐饮热度指标
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
3.4, 同类竞品指标

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
3.5, 格子转换成点
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
3.6, 导出Qgis数据

新建Excel
请添加图片描述
请添加图片描述
请添加图片描述

 #4.0, 导入模块
#######导入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings('ignore') 
# 不发出警告

#from bokeh.models import HoverTool
#from bokeh.palettes import brewer
#from bokeh.models.annotations import BoxAnnotation
#from bokeh.layouts import gridplot

from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource
#4.1, 加载数据
# 加载数据

import os
os.chdir('C:/Users/Administrator/Desktop/')
output_file("line1.html")

df2 = pd.read_excel('result_point.xlsx',sheetname=0,header=0)
#4.2, 指标标准化
## 指标标准化
data2 = df2.fillna(0)
data2.columns = ['人口密度', '道路长度', '餐饮计数', '素菜餐饮计数', 'lng', 'lat']
data2['rkmd_norm'] = (data2['人口密度']-data2['人口密度'].min())/(data2['人口密度'].max()-data2['人口密度'].min()) # 人口密度指标标准化
data2['cyrd_norm'] = (data2['餐饮计数']-data2['餐饮计数'].min())/(data2['餐饮计数'].max()-data2['餐饮计数'].min()) # 餐饮热度指标标准化
data2['tljp_norm'] = (data2['素菜餐饮计数'].max()-data2['素菜餐饮计数'])/(data2['素菜餐饮计数'].max()-data2['素菜餐饮计数'].min()) # 同类竞品指标标准化
data2['dlmi_norm'] = (data2['道路长度']-data2['道路长度'].min())/(data2['道路长度'].max()-data2['道路长度'].min()) # 道路密度指标标准化
## 指标标准化
data2['final_score'] = data2['rkmd_norm']*0.4 + data2['cyrd_norm']*0.3 + data2['tljp_norm']*0.1 + data2['dlmi_norm']*0.2
data_final_q2 = data2.sort_values(by = 'final_score',ascending=False).reset_index()
#4.3, 添加size字段, 不同color字段
data_final_q2['size'] = data_final_q2['final_score'] * 20
data_final_q2['color'] = 'green'
data_final_q2['color'].iloc[:10] = 'red'
#4.4, 创建ColumnDataSource数据
source = ColumnDataSource(data_final_q2)
#4.5, 制作空间散点图
hover = HoverTool(tooltips=[("经度", "@lng"),
                            ("纬度", "@lat"),
                            ("最终得分", "@final_score"),
                           ])  # 设置标签显示内容
p = figure(plot_width=800, plot_height=800,
                title="空间散点图" , 
                tools=[hover,'box_select,reset,wheel_zoom,pan,crosshair']) 
## 构建绘图空间

p.square(x = 'lng',y = 'lat',source = source,
         line_color = 'black',fill_alpha = 0.5,
        size = 'size',color = 'color')
p.ygrid.grid_line_dash = [6, 4]
p.xgrid.grid_line_dash = [6, 4]
# 散点图
show(p)

请添加图片描述
请添加图片描述

猜你喜欢

转载自blog.csdn.net/m0_67575344/article/details/125167470