上个月瑞幸咖啡的酱香拿铁火出圈,让瑞幸再一次出现在聚光灯下,上一次还是财务造假的时候。
这几年国内咖啡市场火热,带动瑞幸在内的很多咖啡品牌飞速发展,从2013年到2023年,预计中国人均咖啡消费量上涨了238%,现在全国合计咖啡门店数量已超10万家,且以每年上万家的数量在增长。
瑞幸咖啡的崛起让我们想到咖啡界的标杆-星巴克,星巴克几乎是过去十几年咖啡的代名词,也是城市白领们的生活方式。
现在出现的现象是,但凡有星巴克门店的地方,几百米内几乎都有瑞幸门店的身影,有的甚至两三个形成包围之势。
下面通过可视化看板和Python数据分析来对比星巴克和瑞幸门店在数量、区域分布上的差异及关联关系。
主要有两点发现:
1、星巴克更集中于长三角、珠三角、京津冀等沿海经济发达地区,特别是一二线城市;瑞幸相比星巴克较为分散,在很多三四线及以下城市也有门店。
2、瑞幸门店选址集中在星巴克周边,数据显示方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店。
此次分析任务用到的工具有下秒数据机器人、Python、shapely。
下秒数据机器人是一个集成数据集、数据清洗、数据分析、数据可视化及看板搭建的云数据平台,这次分析用到的星巴克和瑞幸门店数据集都存放在下秒数据机器人。
我们会在数据集基础上进行数据看板开发,也会通过API接口让Python直接调用数据来分析和可视化。
❝平台链接:
http://nexadata.cn/mobileSetMessage
❞
Python用来连接下秒机器人的数据接口,并对数据进行处理和分析。
shapely是Python的第三方库,用来处理经纬度数据,可以判断不同地理坐标之间的距离和包含关系。
因为要对比分析星巴克和瑞幸门店数量和位置,所以数据集主要字段有门店名称、经度、纬度、城市。
❝注:数据集时间为2022年,有20%左右的数量误差
❞
全国星巴克咖啡门店数据集:全国瑞幸咖啡门店数据集:
两个数据集都存放在下秒数据机器人平台上,通过数据视图可以直接查看和使用数据集,后面我们用来搭建数据看板。
因为后面需要Python来处理数据,所以需要通过API数据接口来获取数据,操作起来非常方便,留着后面备用。
import requests
headers = { "x-token": "你的鉴权token" }
response = requests.get("http://app.chafer.nexadata.cn/openapi/v1/sheet/sht22nId5uouP2/records?size=1&page=1", headers = headers)
print(response.json())
在下秒数据机器人上搭建看板比较简单,首先创建流程任务,并选择星巴克和瑞幸两个数据视图。
然后创建看板,编辑设计图表,和我们在一般在BI软件上操作相似。
这里有十几种图表形式,基本可以满足大部分可视化场景。
截至数据集时间(2022年),星巴克全国门店数量预计4442,瑞幸咖啡全国门店数量预计3904,星巴克门店数比瑞幸多14%。
从量级上来看两者已经很接近,而且瑞幸正以可怕的增长速度扩张门店,以我家附近的商圈为例,去年还只有一家瑞幸,今年已经有三家。
星巴克无论从选址位置、开店成本、门店面积、店员数量上来说都比瑞幸要苛刻一些,瑞幸主打外卖+外带,这也是除市场需求因素外,瑞幸能快速扩张的原因。
星巴克门店数量前五的城市是:上海、北京、杭州、深圳、广州。在前二十城市中,长三角有6个,珠三角有5个,京津冀2个。
上海的星巴克门店数量668,是第二名北京2倍之多,同时上海也是全球星巴克门店数量最多的城市,看来魔都人民对咖啡的喜爱名不虚传。
杭州的星巴克数量仅次与上海、北京,高于深圳、广州,杭州的互联网和电商从业者们也比较喜欢星巴克。
瑞幸门店数量前五的城市是:上海、北京、广州、深圳、杭州,与星巴克前五城市一样,但排序略有差异。
在前二十城市中,长三角有6个,珠三角有2个,京津冀2个。
星巴克主要聚集在沿海一二线城市,而瑞幸在内陆城市快速占领市场,瑞幸前20的城市中已经有了合肥、昆明、郑州,而星巴克前20里并没有出现这三个省会城市。
因此瑞幸门店的分布更加分散,没有过度集中在一线城市。
通过星巴克门店热力图也能看到,红色高密度区主要集中在沿海地区,内陆则呈现点状式分布,比较稀疏。
瑞幸门店分布则更加均匀,除沿海地区,华中地区湖南、安徽、湖北、湖南等也有比较多的门店。
上海是全国咖啡消费需求最大的城市,我们看看星巴克门店在上海的分布情况。
整体上星巴克门店集中在上海市区内环范围,往外以点线式分散,郊区五大新城、浦东机场、虹桥枢纽也是较为集中的区域。
瑞幸在上海市区内环的集中度没有星巴克那么明显,整体数量上也少很多。
前面我们通过在下秒机器人上搭建可视化看板,分析了星巴克和瑞幸门店在全国的分布情况,区域差异还是相当明显。
下面再深入分析星巴克和瑞幸门店的关联关系,我们知道瑞幸咖啡是后起之秀,据说很多门店的选址依据主要看周边是否有星巴克。
那全国范围每个星巴克门店周边平均有多少个瑞幸门店呢?这次从方圆500米范围看看瑞幸在星巴克周边的聚集情况。
我们使用Python和其第三方库shapely来进行处理数据,shapely主要用来处理地理坐标数据。
第一步:导入所需要的库
# 导入相关库
import pandas as pd
import requests
import time
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
第二步:从API中抽取数据
# 抽取星巴克和瑞幸门店数据,通过下秒机器人API调用
# 抽取星巴克门店数据
headers = { "x-token": "tk7a2980431688455e8976e4bad4d13d6a" }
starbucks_list = []
for i in range(1,10):
response_1 = requests.get("http://app.chafer.nexadata.cn/openapi/v1/sheet/sht22nId5uouP2/records?size=500&page={0}".format(i), headers = headers)
starbucks = response_1.json()['data']['list']
starbucks = pd.DataFrame(starbucks)
time.sleep(1)
starbucks_list.append(starbucks)
starbucks = pd.concat(starbucks_list)
# 抽取瑞幸门店数据
luckin_list =[]
for j in range(1,9):
response_2 = requests.get("http://app.chafer.nexadata.cn/openapi/v1/sheet/sht22nIeomVmYy/records?size=500&page={0}".format(j), headers = headers)
luckin = response_2.json()['data']['list']
luckin = pd.DataFrame(luckin )
luckin_list.append(luckin)
time.sleep(1)
luckin = pd.concat(luckin_list)
第三步:判断星巴克门店方圆500米范围内的瑞幸门店数
# 根据星巴克咖啡店坐标绘制半径为XX米的地理区域
def circle(data,radius):
# radius 表示区域半径
# 给定地理坐标
center_latitude = float(data['维度'])
center_longitude = float(data['经度'])
# 创建圆形区域
center_point = Point(center_longitude, center_latitude)
circle = center_point.buffer(radius/111300)
# 创建多边形区域
polygon = Polygon(circle.exterior)
return polygon
# 根据经纬度构建坐标点
def point(data):
# 给定地理坐标
center_latitude = float(data['维度'])
center_longitude = float(data['经度'])
# 创建坐标点
center_point = Point(center_longitude, center_latitude)
return center_point
# 判断瑞幸咖啡店是否在星巴克方圆500m范围内
def is_inside(data):
polygon = data['Polygon']
# 判断坐标是否在区域内
n = 0
luckin_city = luckin[luckin['城市']==data['城市']]
for point in luckin_city['Point']:
is_inside = polygon.contains(point)
# 打印判断结果
if is_inside:
n = n + 1
return n
# 根据星巴克门店坐标位置绘制方圆半径为500米的地理区域
starbucks['Polygon'] = starbucks.apply(circle,axis=1,args=(500,))
# 根据瑞幸门店经纬度构建坐标点
luckin['Point'] = luckin.apply(point, axis=1)
# 判断瑞幸门店是否在星巴克门店方圆500米范围内
starbucks['Luckin_numbers'] = starbucks.apply(is_inside, axis=1)
数据处理后如下:
第四步:分析数据
# 方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店
starbucks['Luckin_numbers'].mean()
输出:0.6
# 方圆500米范围内,最多的星巴克门店周边有7个瑞幸门店
starbucks['Luckin_numbers'].max()
输出:7
# 方圆500米范围内,星巴克门店周边平均瑞幸门店数各城市排名
# 最多的是临沂市平均每个星巴克门店周边有1.8个瑞幸门店
city_list = []
for city in pd.unique(starbucks['城市']):
avg_luckin_numbers = starbucks[starbucks['城市']==city]['Luckin_numbers'].mean()
starbucks_nums = starbucks[starbucks['城市']==city]['名称'].count()
city_list.append([city,starbucks_nums,avg_luckin_numbers])
df = pd.DataFrame(city_list,columns=['city','starbucks_nums','avg_luckin_numbers'])
df.sort_values(by=['avg_luckin_numbers'],axis=0,ascending=False)
输出:
看来瑞幸确实与星巴克有着不解的缘分,难怪我们会看到星巴克周边那么多的瑞幸门店。
星巴克门店养成了周边用户喝咖啡的习惯,或者说这里喝咖啡的用户比较多,星巴克才来这里开店,那么在星巴克周边再开瑞幸咖啡,就可以低成本获取一大波潜在用户,尽管有竞争,还是非常值得的。
我们通过可视化看板和Python数据分析展示了星巴克和瑞幸咖啡门店的区域分布、关联关系,其实还有很多值得分析挖掘的地方。
比如说有些城市星巴克门店周边的瑞幸门店非常少,或者几乎没有,那原因是什么?是潜在的机会还是要规避的深坑?
如果大家有兴趣可以试一试。
数据和代码地址:
http://nexadata.cn/mobileSetMessage
可点击阅读原文获取数据和代码