# 导入项目所需的模块
import pandas as pd
from pyecharts.charts import *
from pyecharts import options as opts
# 使用pandas读取数据
df = pd.read_csv('directory.csv')
df.head()
查看缺失值
df.isnull().sum()
del df['Phone Number']
del df['Postcode']
df.isnull().sum()
删除空值
df.dropna(inplace= True)
地理热力图
-
从热力图分布来看,星巴克门店主要还是集中于美国,其次在亚洲的日本,韩国,中国沿海地区也有不少分布;
-
非洲,大洋洲几乎看不到星巴克门店的存在,当然这其中的原因,有的是出于该地区的消费水平考虑,星巴克不愿去开设门店,比如非洲地区,有的是因为当地居民瞧不上星巴克这种“商业咖啡”,比如澳大利亚
#通过`pd.merge()`将数据进行关联,获取门店的所属国家信息;
country_df = pd.read_excel('./abb_country.xlsx')
df_new = pd.merge(df,country_df,left_on='Country',right_on='abb',how = 'left')
# 数据分组计数,计算每个国家的门店数
df_t = df_new.groupby(['Coun'])['Brand'].count().reset_index()
df_t.head()
df_t.columns = ['Coun', '计数']
data_pair = [i for i in zip(df_t['Coun'],df_t['计数'])]
绘制星巴克全球门店
# 新建一个Map
chart = Map(
init_opts=opts.InitOpts(
theme='roma',
width='680px',
height='600px'
)
)
# # 添加数据
chart.add(
"门店", # 系列名称
data_pair,
maptype = "world", # 地图类型——世界地图
is_roam=False, # 关闭缩放,即不能通过滚轮放大缩小
zoom=1.2, # 地图显示缩放比例
is_map_symbol_show=False, # 不显示地图上的小红点
label_opts=opts.LabelOpts(is_show=False) # 标签设置(国家的名称)
)
chart.set_global_opts(
# 标题设置
title_opts=opts.TitleOpts(
title="星巴克全球门店覆盖", # 主标题
subtitle='数据截止日期:2021年9月' # 副标题
),
# 图例设置
legend_opts=opts.LegendOpts(is_show=False),
# 视觉组件
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 显示视觉组件的图例
is_piecewise=True, # 颜色分段显示
orient='vertical', # 图例的布局,设置为垂直布局
pos_left='2%', # 图例显示位置
pos_top='40%',
range_text=[
'门店数量', ''], # 文本
pieces=[{'min': 1000},
{'min': 500,
'max': 1000},
{'min': 100,
'max': 500},
{'max': 100}], # 设置数值的分段
range_color=["#CCD3D9", "#E6B6C2", "#D4587A", "#DC364C"] # 颜色范围
),
)
chart.render_notebook()
城市分布
# 按中国城市分组计数
temp = df.groupby('City')['Brand'].count().reset_index()
temp.columns = ['City','计数']
data_pair = [i for i in zip(temp['City'],temp['计数'])]
data_pair.sort(key=lambda x: x[1], reverse=True) # 进行排序 降序
top_city = data_pair[:20][::-1] # 取20个 并且倒取
# 新建一个Bar
chart = Bar(
init_opts=opts.InitOpts(
theme='light',
width='980px',
height='900px'
)
)
# 添加x轴数据
chart.add_xaxis([x[0] for x in top_city])
# # 添加y轴数据
chart.add_yaxis(
"",
[x[1] for x in top_city],
# 标签设置
label_opts=opts.LabelOpts(
is_show=True, # 显示标签
position='insideRight', # 显示位置
formatter='{c}' , # 显示内容 {c}显示数值
)
)
chart.set_global_opts(
title_opts=opts.TitleOpts( # 标题设置
title="星巴克门店最多20个城市",
subtitle='数据截止日期:2017年2月'),
)
# # xy轴翻转
chart.reversal_axis()
chart.render_notebook()
门店所有权占比¶
- Company Owned:公司独资直营,这也是星巴克门店最多的经营方式;
- Licensed: 许可经营;
- Joint Venture: 合资经营,比如:国内江浙沪地区的星巴克最早就是由星巴克与统一集团联手经营,17年7月的时候星巴克已收回所有权;
- Franchise:授权经营,类似麦当劳的经营模式;
# 分组计数,计算门店不同所有权的门店数量
df_t = df.groupby('Ownership Type')['Brand'].count().reset_index()
df_t.columns = ['经营方式', '计数']
data_pair = [i for i in zip(df_t['经营方式'],df_t['计数'])]
# 数据排序
data_pair.sort(key=lambda x: x[1], reverse=True) # 进行排序 降序
# 新建一个饼图
chart = Pie(
init_opts=opts.InitOpts(
theme='light',
width='680px',
height='500px',
bg_color='white'
)
)
# 添加数据
chart.add(
'',
data_pair,
radius=["10%", "45%"], # 内外径设置
rosetype="area", # 通过半径展示占比
label_opts=opts.LabelOpts(formatter="{b}: {d}%") # 标签设置
)
chart.set_global_opts(
# 标题设置
title_opts=opts.TitleOpts(
title="星巴克门店门店所有权分布",
subtitle='数据截止日期:2017年2月'),
# 图例设置
legend_opts=opts.LegendOpts(
is_show=True,
pos_left='left',
pos_top='10%',
orient='vertical',
),
)
chart.render_notebook()
星巴克国内门店最多10个城市
# 使用pandas读取数据
df = pd.read_csv('directory.csv')
df_20 = df[df['Country']=='CN'].groupby('City')['Brand'].count().reset_index().sort_values('Brand',ascending=False).head(20)
df_20.columns = ['City','计数']
data_pair = [i for i in zip(df_20['City'].to_list(),df_20['计数'].to_list())]
top_city = sorted(data_pair, key=lambda x: x[1], reverse=True)[:10][::-1]
# 新建一个Bar
chart = Bar(
init_opts=opts.InitOpts(
theme='chalk',
width='980px',
height='900px'
)
)
# 添加x轴数据
chart.add_xaxis([x[0] for x in top_city]) # 元组的0索引
# 添加y轴数据
chart.add_yaxis(
"",
[x[1] for x in top_city], # 元组的1索引
# 标签设置
label_opts=opts.LabelOpts(
is_show=True, # 显示标签
position='insideRight', # 显示位置
formatter='{c}' # 显示内容 {c}显示数值
)
)
chart.set_global_opts(
title_opts=opts.TitleOpts( # 标题设置
title="星巴克国内门店最多10个城市",
subtitle='数据截止日期:2017年2月'),
xaxis_opts=opts.AxisOpts(is_show=False), # x轴位置显示在上方
)
# xy轴翻转
chart.reversal_axis()
chart.render_notebook()
星巴克国内门店分布
# 新建GEO实例
geo = Geo(
init_opts=opts.InitOpts(
theme='dark',
width='980px',
height='600px'
)
)
data_pair = []
for idx, row in df[df['Country']=='CN'].iterrows(): #
# 需要添加自定义坐标点(坐标的那个点 ,经度,维度 )
geo.add_coordinate(row['Store Number'], row['Longitude'], row['Latitude'])
# 点数据存放再datapair中
data_pair.append([row['Store Number'], 1]) # 1 表示一个数
# 添加地图
geo.add_schema(
maptype="china",
zoom=1.5, # 地图缩放比例
)
geo.add(
'', # 系列名称
data_pair,
type_='heatmap', # type选择heatmap
is_large=True, # 当图表数据量大时可设置为True,进行优化
blur_size=4, # 光晕大小
point_size=3, # 点的大小 可参考文章https://blog.csdn.net/qq_27484665/article/details/117395302
)
geo.set_global_opts(
# 标题设置
title_opts=opts.TitleOpts(
title="星巴克国内门店分布", pos_top='3%', pos_left='center',
title_textstyle_opts=opts.TextStyleOpts(color='red', font_size=20) # 标题字体风格设置
),
# 视觉组件设置,默认通过颜色完成映射
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 关闭组件框的显示
max_=10, # 映射数据的范围最大值
range_color=['blue', 'blue', 'green', 'yellow', 'red'] # 颜色范围
),
)
# print(data_pair)
geo.render_notebook()
由图可见,星巴克在中国主要分布在沿海地区以及四川、重庆、武汉和北京