当前位置: 首页 > news >正文

用Python+PyEcharts搞定星巴克门店数据可视化:从数据清洗到交互式图表全流程

Python+PyEcharts实战:星巴克门店数据可视化全流程解析

当咖啡香气遇上数据科学,会碰撞出怎样的火花?本文将带你用Python和PyEcharts库,从原始星巴克门店数据出发,完成数据清洗、分析到交互式可视化的全流程实战。无论你是想了解商业分布规律的数据分析师,还是希望掌握PyEcharts可视化技巧的开发者,这篇包含完整代码和商业解读的指南都能让你获得实用技能。

1. 环境准备与数据获取

在开始分析前,我们需要配置合适的Python环境。推荐使用Anaconda创建独立环境:

conda create -n starbucks-vis python=3.8 conda activate starbucks-vis pip install pandas pyecharts jupyterlab

数据集通常包含以下关键字段:

  • 门店名称
  • 详细地址(省/市/区)
  • 经纬度坐标
  • 营业时间(开始/结束)
  • 门店类型(普通/臻选/旗舰店)

提示:实际数据可能包含缺失值或格式不一致的情况,这正是我们需要数据清洗的原因。原始数据质量直接影响最终分析结果的可靠性。

常见数据来源包括:

  1. 公开数据平台(如Kaggle、和鲸社区)
  2. 商业数据API接口
  3. 网络公开数据抓取(需遵守相关法律法规)

2. 数据清洗与预处理实战

拿到原始数据后,我们需要进行系统性的数据清洗。以下是一个典型的数据质量检查流程:

import pandas as pd # 加载数据 df = pd.read_csv('starbucks_china_locations.csv') # 基础信息检查 print(f"数据集形状:{df.shape}") print("\n前5行数据预览:") print(df.head()) # 缺失值检查 missing_report = df.isnull().sum() print("\n缺失值统计:") print(missing_report[missing_report > 0]) # 重复值检查 duplicates = df.duplicated().sum() print(f"\n重复记录数:{duplicates}")

常见数据问题及处理方法:

问题类型检测方法处理方案
缺失值isnull().sum()删除或合理填充
重复值duplicated()保留首次出现记录
异常值describe()/箱线图修正或剔除
格式不一致dtypes/正则匹配统一格式化

对于营业时间数据,需要进行特殊处理:

# 营业时间标准化 df['营业时长'] = pd.to_datetime(df['停止营业时间']) - pd.to_datetime(df['开始营业时间']) df['营业小时数'] = df['营业时长'].dt.total_seconds() / 3600 # 处理极端值 df = df[(df['营业小时数'] >= 4) & (df['营业小时数'] <= 24)]

3. 地理分布可视化技术

PyEcharts的地理可视化功能非常强大,下面我们逐步构建省级分布热力图。

3.1 省级门店数量统计

首先计算各省门店数量:

province_counts = df['省份'].value_counts().reset_index() province_counts.columns = ['省份', '门店数量'] # 转换为PyEcharts需要的格式 province_data = province_counts.values.tolist()

3.2 交互式中国地图绘制

使用Map组件创建可视化:

from pyecharts.charts import Map from pyecharts import options as opts china_map = ( Map() .add("门店数量", province_data, "china", label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="星巴克中国省级分布热力图"), visualmap_opts=opts.VisualMapOpts( max_=max(province_counts['门店数量']), is_piecewise=True, pos_top="middle", orient="vertical" ) ) ) china_map.render("china_map.html")

关键参数说明:

  • is_piecewise:启用分段式图例
  • pos_top:控制图例位置
  • orient:图例方向(垂直/水平)

3.3 城市级分布旭日图

旭日图能同时展示省-市两级分布:

from pyecharts.charts import Sunburst # 准备层级数据 city_counts = df.groupby(['省份','城市']).size().reset_index(name='数量') sunburst_data = [] for _, row in city_counts.iterrows(): sunburst_data.append({ 'name': row['城市'], 'value': row['数量'], 'parent': row['省份'] }) sunburst = ( Sunburst(init_opts=opts.InitOpts(width="1000px", height="600px")) .add("", data_pair=sunburst_data, highlight_policy="ancestor", radius=[0, "90%"]) .set_global_opts(title_opts=opts.TitleOpts(title="省-市两级门店分布")) ) sunburst.render("sunburst.html")

4. 营业时间分析可视化

营业时间数据可以揭示不同地区的消费习惯差异。

4.1 营业时间分布直方图

from pyecharts.charts import Bar # 统计各小时开店数量 open_hour_counts = df['开始营业时间'].str[:2].value_counts().sort_index() bar = ( Bar() .add_xaxis(open_hour_counts.index.tolist()) .add_yaxis("门店数量", open_hour_counts.values.tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="门店开始营业时间分布"), xaxis_opts=opts.AxisOpts(name="小时"), yaxis_opts=opts.AxisOpts(name="门店数量") ) ) bar.render("opening_hours.html")

4.2 营业时长对比分析

计算各城市平均营业时长并可视化:

city_hours = df.groupby('城市')['营业小时数'].mean().sort_values(ascending=False)[:20] bar_horizontal = ( Bar() .add_xaxis(city_hours.index.tolist()) .add_yaxis("平均营业时长", city_hours.values.tolist()) .reversal_axis() .set_global_opts( title_opts=opts.TitleOpts(title="城市平均营业时长TOP20"), xaxis_opts=opts.AxisOpts(name="小时"), ) )

5. 高级可视化技巧

5.1 组合图表:地理坐标与散点图叠加

from pyecharts.charts import Geo from pyecharts.globals import ChartType geo = ( Geo() .add_schema(maptype="china") .add("门店分布", df[['城市', '经度', '纬度']].values.tolist(), type_=ChartType.EFFECT_SCATTER, symbol_size=5) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="星巴克门店地理坐标分布")) )

5.2 动态时间轴展示

from pyecharts.charts import Timeline # 按年份创建时间轴 timeline = Timeline() for year in sorted(df['开业年份'].unique()): year_data = df[df['开业年份'] == year] map_year = ( Map() .add("门店数量", year_data['省份'].value_counts().items(), "china") .set_global_opts(title_opts=opts.TitleOpts(title=f"{year}年门店分布")) ) timeline.add(map_year, year) timeline.render("timeline.html")

6. 商业洞察与优化建议

通过上述可视化分析,我们可以得出以下商业洞察:

  1. 区域扩张策略

    • 重点关注门店密度较低但经济增速快的省份(如中部地区)
    • 一线城市可考虑开设更多特色旗舰店
  2. 营业时间优化

    • 旅游城市可适当延长营业时间
    • 商务区门店可提前开门时间
  3. 竞争分析

    # 计算各城市咖啡店密度 city_stats = df.groupby('城市').agg({ '门店名称': 'count', '营业小时数': 'mean' }).sort_values('门店名称', ascending=False)

实际项目中,我们发现PyEcharts的交互功能特别适合演示场景。当鼠标悬停在图表元素上时,动态显示详细信息的方式能让观众更直观理解数据内涵。

http://www.jsqmd.com/news/504924/

相关文章:

  • 终极指南:如何快速集成Jazzy到Kotlin项目实现跨平台文档自动化
  • 用动画图解反转链表:三指针法从入门到精通(LeetCode真题演示)
  • 如何优化SwiftMessages性能:iOS消息提示库的FPS与CPU占用实时分析指南
  • 小米MiMo-V2-Pro开放调用,Java后端快速接入全流程实战
  • 基于SprintBoot+MySQL外卖点餐订餐管理系统
  • 从文本到情感的AI对话:ELIZA情感计算技术深度解析
  • Kotlin单例模式实战:饿汉式 vs 懒汉式,哪种更适合你的项目?
  • Websocket服务总被防火墙拦住?试试cpolar内网穿透,免费套餐也能固定TCP端口
  • ollama部署Phi-4-mini-reasoning实操手册:支持中文的高密度推理模型
  • 微服务安全实战——Spring Authorization Server与OAuth2.1深度整合:从授权码模式到Gateway统一认证
  • Java 26正式GA!AI推理与高并发性能拉满,企业级升级指南
  • PACAP-27 (human, ovine, rat);HSDGIFTDSYSRYRKQMAVKKYLAAVL-NH₂
  • Zigbee开发避坑指南:为什么你的Z-Stack 3.0.2在IAR上跑不起来?
  • 游戏开发实战:如何用中点画线法在Unity中高效绘制2D线段(附C#代码)
  • 如何在objection.js中实现数据版本控制:完整指南
  • 如何使用 distroless 容器技术构建超小体积的 htmlq 镜像:完整指南
  • SG90舵机的PWM控制原理与实战应用
  • Llama-3.2-3B应用场景:Ollama部署后构建个人知识管理AI助理实战案例
  • 充电桩系统开发避坑指南:云快充协议V1.5的5个常见错误及解决方案
  • Windows 11下用Ollama一键部署DeepSeek-R1大模型(附8B/14B版本选择建议)
  • R语言实战:5分钟搞定COG功能分类图绘制(附完整代码)
  • Z-Image-GGUF创意广告生成:结合YOLOv11进行元素精准植入
  • 告别手动构造 Payload:Burp 文件上传漏洞测试插件,1000 + 绕过 Payload 全解析|工具分享
  • GLM-OCR性能展示:中英文混合、数学公式、复杂表格识别效果
  • 终极兼容性解决方案:如何让魔兽争霸3在现代系统上流畅运行
  • HG-ha/MTools开发者案例:嵌入MTools AI能力至Electron应用的SDK调用指南
  • 探索C#运动控制框架:轻松上手工业自动化
  • PACAP (6-38) (human, ovine, rat)
  • 液态玻璃屏正在侵蚀你的电池
  • Docker+Qt实战:5步搞定GUI程序容器化部署(附完整Dockerfile)