使用Python分析瑞幸和星巴克全国门店分布关系

瑞幸会撼动星巴克的行业地位吗?

上个月瑞幸咖啡的酱香拿铁火出圈,让瑞幸再一次出现在聚光灯下,上一次还是财务造假的时候。

这几年国内咖啡市场火热,带动瑞幸在内的很多咖啡品牌飞速发展,从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%。

从量级上来看两者已经很接近,而且瑞幸正以可怕的增长速度扩张门店,以我家附近的商圈为例,去年还只有一家瑞幸,今年已经有三家。

星巴克无论从选址位置、开店成本、门店面积、店员数量上来说都比瑞幸要苛刻一些,瑞幸主打外卖+外带,这也是除市场需求因素外,瑞幸能快速扩张的原因。

星巴克分布全国Top20城市

星巴克门店数量前五的城市是:上海、北京、杭州、深圳、广州。在前二十城市中,长三角有6个,珠三角有5个,京津冀2个。

上海的星巴克门店数量668,是第二名北京2倍之多,同时上海也是全球星巴克门店数量最多的城市,看来魔都人民对咖啡的喜爱名不虚传。

杭州的星巴克数量仅次与上海、北京,高于深圳、广州,杭州的互联网和电商从业者们也比较喜欢星巴克。

瑞幸分布全国Top20城市

瑞幸门店数量前五的城市是:上海、北京、广州、深圳、杭州,与星巴克前五城市一样,但排序略有差异。

在前二十城市中,长三角有6个,珠三角有2个,京津冀2个。

星巴克主要聚集在沿海一二线城市,而瑞幸在内陆城市快速占领市场,瑞幸前20的城市中已经有了合肥、昆明、郑州,而星巴克前20里并没有出现这三个省会城市。

因此瑞幸门店的分布更加分散,没有过度集中在一线城市。

星巴克全国分布热力图

通过星巴克门店热力图也能看到,红色高密度区主要集中在沿海地区,内陆则呈现点状式分布,比较稀疏。

瑞幸全国分布热力图

瑞幸门店分布则更加均匀,除沿海地区,华中地区湖南、安徽、湖北、湖南等也有比较多的门店。

星巴克上海分布热力图

上海是全国咖啡消费需求最大的城市,我们看看星巴克门店在上海的分布情况。

整体上星巴克门店集中在上海市区内环范围,往外以点线式分散,郊区五大新城、浦东机场、虹桥枢纽也是较为集中的区域。

瑞幸上海分布热力图

瑞幸在上海市区内环的集中度没有星巴克那么明显,整体数量上也少很多。

Python数据分析

前面我们通过在下秒机器人上搭建可视化看板,分析了星巴克和瑞幸门店在全国的分布情况,区域差异还是相当明显。

下面再深入分析星巴克和瑞幸门店的关联关系,我们知道瑞幸咖啡是后起之秀,据说很多门店的选址依据主要看周边是否有星巴克。

那全国范围每个星巴克门店周边平均有多少个瑞幸门店呢?这次从方圆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)

数据处理后如下:

第四步:分析数据

  1. 方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店
# 方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店
starbucks['Luckin_numbers'].mean() 

输出:0.6

  1. 方圆500米范围内,全国最多的星巴克门店周边有7个瑞幸门店
# 方圆500米范围内,最多的星巴克门店周边有7个瑞幸门店
starbucks['Luckin_numbers'].max()

输出:7

  1. 方圆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数据分析展示了星巴克和瑞幸咖啡门店的区域分布、关联关系,其实还有很多值得分析挖掘的地方。

比如说有些城市星巴克门店周边的瑞幸门店非常少,或者几乎没有,那原因是什么?是潜在的机会还是要规避的深坑?

如果大家有兴趣可以试一试。

数据和代码地址:

http://nexadata.cn/mobileSetMessage

可点击阅读原文获取数据和代码


相关推荐

  • 一个不太好用的 IDEA 代码生成插件
  • 区区几行Python代码,自动探索性数据分析!
  • 实践教程|scikit-learn 的建模万能模板
  • 看完稚晖君的最新工作台,我酸了。。
  • 技术人对抗焦虑的加减法
  • 大厂面试必考:多线程
  • 聊一聊 React 和 Vue 有啥不一样
  • 【HBLOG10月内推】让你的职业生涯腾飞!
  • 从原理到实践,分析 Redisson 分布式锁的实现方案
  • Java 中的 Stream 可以替代 for 循环吗?
  • 干掉 powerdesigner,设计数据库表用它就够了!
  • 大多数公司,都对 AGPL 许可证“敬而远之”
  • 保护生产中 Node.js 应用程序安全的 15 项最佳实践
  • 从0到1实现一个前端监控系统(附源码)
  • 语雀发布故障公告,个人用户可领6个月会员服务
  • LeCun又双叒唱衰自回归LLM:GPT-4的推理能力非常有限,有两篇论文为证
  • 前端线上部署,如何通知用户有新版本???
  • 在Vue中,template和JSX到底哪个好?有思考过吗?
  • 高性能的手机端神经网络计算框架
  • 如何保证分布式情况下的幂等性