python数据分析实例_python数据分析实例(四) 上海餐饮店数据

3f5f404848018fb5d15508cea603d228.png

读取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:UsersAdministratorDesktop')
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])

e3b02298b5ee420a1926fb52cbf420b5.png

三, 删除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)       # 合并性价比指标得分

08bcaf85cbbd31aca3ed5bffe93817fb.png

四, 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)

39a2af50e6996bc4a1925529c6e064bf.png

五, 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)

726d36f73f0ad278e3a5a44f8e99ddde.png

六, 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)

374969adc0e53bd9d850adff8d20b79a.png
#######导入模块
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)

c18cf92286df5808ccaa884e26325a9e.png

七, 上海素菜馆选址 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, 人口密度指标

投影坐标系

此指标已经给出

056cd96b263b2288f932682eea00dd16.png

571a28133e15b3ca8d592f54dd08c450.png

b760b579e4e8932e274a7e73e94a8c69.png

3.2, 道路密度指标

9489fed85b81569adafa930ee23904b4.png

c533306072f8096e19bc054fd3ab1014.png

ed8b661e228998e20f49297a54c45b15.png

3.3, 餐饮热度指标

3815d5fa2f752ad6bb36795b9f40a846.png

ad3b7bc1c175d846a830c38c3e81a8d5.png

3d8411fdef2c4529bd2ae39d92ac6d01.png

d09e4afe99a1141241a93797823b5799.png

da612f20544d80467952a11142f530a9.png

ecb74155b9fba5598a5f4ed89c5ea7fe.png

8d37b7bd926ce7ee1c72619be9b01268.png

3.4, 同类竞品指标

bde1799cefbba036d8e492ee150b6bc6.png

023f4d31ee329242a03bf650895f5699.png

c03362ec9883291a4a1556a04880267c.png

e0066bb6fcbe8b842e8ba942ab0ec80a.png

268bab9c69b6aa1bd3d06575f4a6baa8.png

f0b8670e9124a39c232d796eb1e256a2.png

27d2e7a8c7ec6e2a21e68bf8c625b056.png

1b6f8b561362200ebd6d7e15853595d8.png

3.5, 格子转换成点

8daa3f384a9e67d6d143d32dfa2888f6.png

c4f1700b04bff9410082bf2f54f573cb.png

f981e2fc87b0e5dc1b15f842d38a2ca4.png

76c1374b773d020d499c08627b8272d9.png

49e86a1344ac92b3c5ceae269402b2d6.png

cac08dcc71fdb50314fe63c0bed98493.png

d6ec86ec74395717d18e04734070554f.png

7813a3f7314213ddad5306a9b8604157.png

bf4b7d8e719cb640d558459e671603b5.png

3.6, 导出Qgis数据

新建Excel

3cf6ffd33bf12a4058eef65ec6a9afff.png

fbe6fdc1a29dab7961320fe0a8d082d8.png

e30b845dbdc982ec6e05e93ddc9fa5ef.png
 #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)

7d72cef202d5a98305678862d252bda7.png

76d30245dcd0daad50d342893db734a7.png

——End——

关注公众号“冬瓜书单

可获得此练习数据!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值