算法学习
、4对1辅导
、论文辅导
、核心期刊
项目的代码和数据下载
可以通过公众号
滴滴我
项目描述
店铺选址分析,对于一个新店的地址选择要考虑诸多因素,如客流量,交通情况,店铺租金,周边竞店,以及根据竞店消费水平预测客单价等等,而改数据几显然只有店铺位置数据,那么我们就从这份数据来分析一下这个店铺的选址都有什么特点可作为参考
表和字段介绍
该数据表dicos_store.csv
一共有3403
条数据,共10
个字段,分别为loc_number
、state
、city
、neighborhood
、loc_name
、address_raw
、hours_of_operation
、phone
、latitude
、longitude
。
表数据如下:
1、数据读取和清洗
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from pyecharts.charts import Bar,Line,Scatter,Grid,Map,Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from warnings import filterwarnings
filterwarnings('ignore')
dicos_store = pd.read_csv(r'dicos_store.csv')
print("数据大小:",dicos_store.shape)
print('列名称:',dicos_store.columns)
print('统计重复数据:',dicos_store[['loc_name','address_raw']].duplicated().sum())
# 删除重复数据
dicos_store.drop_duplicates(['loc_name','address_raw'],inplace = True)
print('删除重复数据后的数据大小:',dicos_store.shape)
统计重复数据: 210
删除重复数据后的数据大小: (3192, 10)
print('统计缺失值:')
dicos_store.isnull().sum()
处理 city列中的数据,为方便统计统一将 “市”去掉
dicos_store['city'] = dicos_store['city'].str.replace('市','')
result = dicos_store['city'].value_counts()[:10].reset_index()
result.columns = ['city','total_store']
result.sort_values(by = 'total_store',inplace = True)
b = (
Bar()
.add_xaxis(result['city'].tolist())
.add_yaxis('',result['total_store'].tolist(),color = 'CadetBlue')
.set_global_opts(title_opts = opts.TitleOpts(title = '店铺数量前十的城市'),
xaxis_opts = opts.AxisOpts(is_show = False)) #隐藏x轴
.set_series_opts(label_opts = opts.LabelOpts(position = 'right'))
.reversal_axis()
)
b.render_notebook()
2、全国店铺的分布情况
如果您是在本地运行那么使用之前先确保已经安装了 folium
,安装语句 :pip install folium
或者 conda install folium -c conda-forge
列举folium的重要参数:
-
location
:经纬度,list 或者 tuple 格式,顺序为 latitude, longitude -
zoom_start
:缩放值,默认为 10,值越大比例尺越小,地图放大级别越大 -
control_scale
:Bool型,控制是否在地图上添加比例尺,默认为 False 即不添加 -
tiles
:显示样式,默认 “OpenStreetMap”,也就是开启街道显示 -
crs
:地理坐标参考系统,默认为 “EPSG3857”
import folium
latitude = 35.3
longitude = 100.6
incidents = folium.map.FeatureGroup()
# 将数据一一添加到地图上
for lat ,lng in zip(dicos_store['latitude'],dicos_store['longitude']):
incidents.add_child(
folium.CircleMarker(
[lat,lng],
radius = 5,# 设置标记大小
color = 'yellow', #建议设置一个亮眼的颜色
fill = True,
fill_color = 'red',
fill_opacity = 0.1 #设置填充颜色的透明度
)
)
zh_map = folium.Map(location = [latitude,longitude],zoom_start = 5)
zh_map.add_child(incidents)
上图是可以放大来看的,放大后现店铺是呈一簇一簇在各个城市分布的,尤其是重庆市和成都市,如图
那么下图就是重点来分析重庆市
3、重庆市的店铺分布
chong_q = dicos_store[dicos_store['city']=='重庆']
latitude = 29.57
longitude = 106.55
incidents = folium.map.FeatureGroup()
for lat,lng,in zip(chong_q['latitude'],chong_q['longitude']):
incidents.add_child(
folium.CircleMarker(
[lat,lng],
radius = 5, # 设置标记大小
color = 'yellow',
fill = True,
fill_color = 'red',
fill_opacity = 0.4
))
cq_map = folium.Map(location = [latitude,longitude],zoom_start = 10)
cq_map.add_child(incidents)
4、统计重庆市各店铺间方圆1KM内的竞店数量
通过 geodesic 计算两个经纬度之间的距离,单位是 KM
chong_q['latitude_longitude'] = list(zip(chong_q['latitude'].tolist(),chong_q['longitude'].tolist()))
后续会调用到genpy
包,没有安装的话,安装命令是pip install genpy
from geopy.distance import geodesic
longitude = chong_q['latitude_longitude'].tolist()
def dist_km(s):
l_km = []
for i in longitude:
l = geodesic(s,i).km
if 0< l <= 1:
l_km.append(l)
return l_km
chong_q['distance'] = chong_q['latitude_longitude'].apply(lambda x : dist_km(x))
chong_q['c_store'] = chong_q['distance'].apply(lambda x : len(x)) # 统计店铺数量
x_data = chong_q.groupby('c_store').c_store.count().index.astype('str') + ' 家'
y_data = chong_q.groupby('c_store').c_store.count().values.tolist()
c = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
.add('',[list (z) for z in zip(x_data,y_data)],radius = ["30%","75%"],rosetype = 'radius')
.set_global_opts(title_opts = opts.TitleOpts(title = '方圆1KM内的竟店数量'))
.set_series_opts(label_opts = opts.LabelOpts(formatter ="{b} {c} ({d}%)",color = ['#0f2027'],font_size = 12))
)
c.render_notebook()
0家:表示店铺在 1KM内没有竟店,只有它自己,1家表示 1KM内有1家竟店即 1KM内有 2家店,以此类推;
可见 56.93% 的店铺在1KM范围内是只有它自己,并没有其他竞店,周边1KM内存在1家竞店的店铺有 28家 占 20.44% ;