10月份瑞幸咖啡的酱香拿铁火出圈,让瑞幸再一次出现在聚光灯下,上一次还是财务造假的时候。
这几年国内咖啡市场火热,带动瑞幸在内的很多咖啡品牌飞速发展,从2013年到2023年,预计中国人均咖啡消费量上涨了238%,现在全国合计咖啡门店数量已超10万家,且以每年上万家的数量在增长。
瑞幸咖啡的崛起让我们想到咖啡界的标杆-星巴克,星巴克几乎是过去十几年咖啡的代名词,也是城市白领们的生活方式。
现在出现的现象是,但凡有星巴克门店的地方,几百米内几乎都有瑞幸门店的身影,有的甚至两三个形成包围之势。
下面通过可视化看板和Python数据分析来对比星巴克和瑞幸门店在数量、区域分布上的差异及关联关系。
主要有两点发现:
1、星巴克更集中于长三角、珠三角、京津冀等沿海经济发达地区,特别是一二线城市;瑞幸相比星巴克较为分散,在很多三四线及以下城市也有门店。
2、瑞幸门店选址集中在星巴克周边,数据显示方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店。
数据集 因为要对比分析星巴克和瑞幸门店数量和位置,所以数据集主要字段有门店名称、经度、纬度、城市。
❝ 注:数据集时间为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())
星巴克、瑞幸全国门店数对比 截至数据集时间(2022年),星巴克全国门店数量预计4442,瑞幸咖啡全国门店数量预计3904,星巴克门店数比瑞幸多14%。
从量级上来看两者已经很接近,而且瑞幸正以可怕的增长速度扩张门店,以我家附近的商圈为例,去年还只有一家瑞幸,今年已经有三家。
星巴克无论从选址位置、开店成本、门店面积、店员数量上来说都比瑞幸要苛刻一些,瑞幸主打外卖+外带,这也是除市场需求因素外,瑞幸能快速扩张的原因。
星巴克分布全国Top20城市
星巴克门店数量前五的城市是:上海、北京、杭州、深圳、广州。在前二十城市中,长三角有6个,珠三角有5个,京津冀2个。
上海的星巴克门店数量668,是第二名北京2倍之多,同时上海也是全球星巴克门店数量最多的城市,看来魔都人民对咖啡的喜爱名不虚传。
杭州的星巴克数量仅次与上海、北京,高于深圳、广州,杭州的互联网和电商从业者们也比较喜欢星巴克。
瑞幸分布全国Top20城市
瑞幸门店数量前五的城市是:上海、北京、广州、深圳、杭州,与星巴克前五城市一样,但排序略有差异。
在前二十城市中,长三角有6个,珠三角有2个,京津冀2个。
星巴克主要聚集在沿海一二线城市,而瑞幸在内陆城市快速占领市场,瑞幸前20的城市中已经有了合肥、昆明、郑州,而星巴克前20里并没有出现这三个省会城市。
因此瑞幸门店的分布更加分散,没有过度集中在一线城市。
星巴克全国分布热力图
通过星巴克门店热力图也能看到,红色高密度区主要集中在沿海地区,内陆则呈现点状式分布,比较稀疏。
瑞幸全国分布热力图
瑞幸门店分布则更加均匀,除沿海地区,华中地区湖南、安徽、湖北、湖南等也有比较多的门店。
星巴克上海分布热力图
上海是全国咖啡消费需求最大的城市,我们看看星巴克门店在上海的分布情况。
整体上星巴克门店集中在上海市区内环范围,往外以点线式分散,郊区五大新城、浦东机场、虹桥枢纽也是较为集中的区域。
瑞幸上海分布热力图
瑞幸在上海市区内环的集中度没有星巴克那么明显,整体数量上也少很多。
Python数据分析 下面再深入分析星巴 克和瑞幸门店的关联关系,我们知 道瑞幸咖啡是后起之秀,据说很多门店的选址依据主要看周边是否有星巴克。
那全国范围每个星巴克门店周边平均有多少个瑞幸门店呢?这次从方圆500米范围看看瑞幸在星巴克周边的聚集情况。
我们使用Python和其第三方库shapely来进行处理数据,shapely主要用来处理地理坐标数据。
第一步:导入所需要的库
# 导入相关库 import pandas as pdimport requestsimport time from shapely.geometry import Pointfrom 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个瑞幸门店 # 方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店 starbucks['Luckin_numbers' ].mean()
输出:0.6
方圆500米范围内,全国最多的星巴克门店周边有7个瑞幸门店 # 方圆500米范围内,最多的星巴克门店周边有7个瑞幸门店 starbucks['Luckin_numbers' ].max()
输出:7
方圆500米范围内,星巴克门店周边平均瑞幸门店数各城市排名,最多的是临沂市,平均每个星巴克门店周边有1.8个瑞幸门店 # 方圆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数据分析展示了星巴克和瑞幸咖啡门店的区域分布、关联关系,其实还有很多值得分析挖掘的地方。
比如说有些城市星巴克门店周边的瑞幸门店非常少,或者几乎没有,那原因是什么?是潜在的机会还是要规避的深坑?
如果大家有兴趣可以试一试。