美团外卖数据分析系统:Python+Pandas+Streamlit实现用户分层与运营洞察

发布时间:2026/9/1 18:51:16
美团外卖数据分析系统:Python+Pandas+Streamlit实现用户分层与运营洞察 简介面向Python数据分析与爬虫开发的完整项目源码基于美团外卖业务场景覆盖数据采集、清洗、存储、分析预测和可视化全流程。系统使用Scrapy框架抓取数据支持MySQL与MongoDB存储借助线性回归、LSTM模型实现订单趋势预测并集成最短路线推荐、随机组卷等实用算法可扩展至交通物流、金融预测等领域。压缩包共26个文件以8个Python脚本、4个Markdown文档、2个SQLite数据库文件和2个GZ压缩包为主整包仅348KB内含爬虫模块、数据库初始化、系统启动、快速入门及运行教程同时保留了可直接使用的db数据文件便于快速部署与二次开发。所有核心代码均含注释流程清晰可对照运行教程逐步跑通。资源包内还包含一键安装与启动脚本降低环境配置门槛。目前已有160人学习下载另附论文书写大纲与打包说明适合课题研究、毕业设计及技术进阶参考。1. 项目概述与核心目标1.1 项目要解决的业务问题做数据分析的人应该都有过这种感受学了一堆 SQL、Python、可视化工具但真正落到一个完整的业务场景里总觉得差点意思。这也是我做“美团外卖数据分析系统”这个项目的初衷——用最接近真实业务的数据和逻辑把从数据处理、指标搭建、分析建模到可视化展示的完整链路跑通。这个项目模拟的是一套典型的外卖平台经营分析系统核心看的是四个角色用户、商家、订单、骑手。围绕这些角色可以拆出几类非常实际的分析问题用户复购率为什么低哪个区域的商家动销率不行午高峰订单积压到底卡在哪个环节骑手的配送效率受什么因素影响这些问题不是凭空想出来的而是外卖平台日常运营中每天都在盯的指标。项目本身定位是“数据人练手 业务人理解数据”的桥梁。它的价值在于让你拿到一套完整的数据集和源码后能跟着把分析流程走一遍理解每个环节为什么这么做而不是只停留在“我会写一个SQL”或者“我会画一个图表”的碎片化阶段。适合的数据分析师、商业分析岗候选人、转行数据工程的同学来学习和二次扩展。1.2 技术栈选型思路这套系统没有采用重型大数据架构而是用 Python Pandas SQLite Streamlit 的组合来落地原因很直接项目源码要让大部分人能跑起来而不是让环境配置劝退一半人。核心组件包括Pandas 做数据清洗和聚合SQLite 存储结构化数据Streamlit 做 Web 可视化界面Plotly 负责交互式图表。这套组合既能覆盖真实项目里的主要工作内容又不需要部署 Hadoop、Spark 集群。如果你之后要往大数据方向扩展数据处理逻辑迁移到 Spark SQL 也是顺理成章的因为分析口径和指标模型完全不用变。提示源码里所有数据均为模拟生成但字段设计和业务逻辑参考了真实外卖平台的结构序列规律和分布也尽量贴近真实情况所以分析结论具备参考价值。2. 系统整体架构与数据链路设计2.1 从原始数据到分析指标的流转链路数据系统的核心不只是“会分析”更重要的是把数据链路理清楚。这个项目的链路是原始数据 → 清洗层 → 指标层 → 应用层。原始数据层包括订单表、用户表、商家表、骑手表、配送轨迹表各表通过外键关联。清洗层负责处理缺失值、重复值、时间字段标准化、异常值剔除。指标层基于业务口径计算各类核心指标比如复购率、客单价、动销率、超时率等。应用层用图表和报表的方式把指标呈现出来。这一步看起来简单但很多人做数据项目时会忽略数据建模的必要性——上来就直接 Pandas 一顿 groupby最后发现口径混乱、图表对不上。所以这套项目的顺序是先建表再写清洗脚本最后才分析保证每一步的数据流是清晰可控的。2.2 数据库表结构与业务含义订单表是整张数据网的枢纽。它记录了订单ID、用户ID、商家ID、骑手ID、下单时间、支付时间、出餐时间、送达时间、订单金额、配送距离、配送费、订单状态等字段。其中几个时间戳字段很关键因为出餐时长、配送时长、骑手等待时长都可以通过时间差计算出来。用户表包含用户ID、注册时间、近30天下单次数、用户等级、偏好品类。商家表涵盖商家ID、品类、商圈、评分、月销量、起送价、平均出餐时长、营业状态。骑手表包含骑手ID、所属站点、接单数、平均配送时长、好评率、配送工具类型。这几张表之间的关联关系其实就是外卖业务跑起来的全过程用户下单→商家出餐→骑手取餐→送达用户。每个环节的数据延迟和异常状态都会反映在订单表的时间字段上这也是后续分析的核心素材。2.3 构建可复用的数据清洗流程数据清洗是整个系统里最“不性感”但最重要的一步。源码里用 Python 写了一套标准清洗流程核心处理逻辑如下删除订单表中订单金额为负或为0的异常记录剔除配送时长超过 3 小时的数据一般判断为测试数据或系统异常统一时间格式为 datetime 类型方便做时间序列聚合对商家评分做缺失值填充用该品类平均分补全。这一步里最容易踩的坑是时间字段的解析。原始数据里的时间可能是字符串也存在 2024/1/5 和 2024-01-05 混用的情况如果不在清洗阶段统一格式后面做按小时聚合时就会报错或者结果明显有偏差。源码里专门封装了一个 parse_time 函数处理这个问题你复用时只需要注意你的源数据格式即可。3. 核心数据分析模块与业务洞见3.1 用户运营分析RFM 分层与复购预测用户分析的重点不是“看谁买得多”而是“把用户分成不同群体然后针对不同群体采取差异化策略”。项目采用经典 RFMRecency, Frequency, Monetary模型做用户分层三个维度分别是最近一次下单间隔、下单频率和消费金额。这里有一个值得细说的细节RFM 分层的阈值不是随便拍的而是参考全量用户的分布来定。比如下单频率的中位数是 3 次/月那高于中位数的就是高频用户最近一次下单间隔的中位数是 7 天那小于 7 天就算活跃用户。把三个维度组合后可以划分出“高价值活跃用户”“高价值流失风险用户”“低价值低频用户”等类别。在源码中RFM 计算之后还会做一层用户画像透视看不同分层用户的偏好品类、平均配送距离、优惠敏感度差异。比如发现高价值用户偏好“轻食沙拉”和“日料”那运营策略上就可以针对这类用户做定向品类券而不是全量发券。3.2 商家经营分析动销率、评分与复购关系商家维度的分析可以从两个角度切入一是平台运营视角关注商家活跃度和供给质量二是商家自身视角关注销售额、转化和复购。动销率这个指标很容易被新手忽略但它是平台健康的晴雨表。动销率 有销量商家数 / 营业商家数如果这个值偏低说明大量商家虽然挂着营业状态但实际接不到单。结合商圈数据进一步分析可以定位出动销率低的商圈然后去排查是供给过剩、配送覆盖不足还是用户需求不够。评分与复购率的关系分析也很有看头。源码里做了评分分桶4.8 分以上、4.5-4.8、4.2-4.5、4.2 以下然后统计每个分桶下用户的 30 天复购率差异。实测数据下评分 4.5 以上的商家复购率明显高于低分商家这个结论对平台治理有直接指导意义——优先改善低分商家的出餐体验和品控比拉新更划算。3.3 订单与配送时效分析定位瓶颈环节订单分析的重点是漏斗和时间拆解。一个订单从下达到完成经历用户下单→商家接单→商家出餐→骑手到店→骑手取餐→送达每个环节都有时间消耗。项目里定义了三个核心时长出餐时长接单到出餐、骑手到店时长出餐到骑手到店、配送时长取餐到送达。通过分时段聚合可以看到非常典型的业务规律午高峰11:30-13:00期间出餐时长明显拉长但骑手到店时长反而缩短说明高峰期骑手运力充足但是商家产能吃紧。晚高峰的出餐压力相对小一些但配送时长更长因为晚高峰的配送距离普遍远了。这个分析结论可以直接指导平台在午高峰重点解决商家出餐慢的问题比如优化出餐流程或提前备餐。3.4 运力调度分析骑手效率与商圈冷热骑手分析可能是这套系统里最有意思的模块。把骑手按站点分组后计算各站点的平均配送时长、人均接单量、平均空驶距离你会发现站点之间的效率差异非常明显。源码里做了一个“商区-站点-时段”三级下钻分析可以回答这类问题望京商圈的午高峰订单量比其他商区高 40%但望京站点的骑手只有其他站点的 1.2 倍那望京站点在午高峰必定存在运力缺口。进一步看骑手的最优配送路径还能发现站点排班是否合理。骑手效率分析里有一个很有价值的衍生指标骑手闲置时间占比。闲置时间 骑手当前订单送达时间到下一单取餐时间的间隔。如果这个值大面积偏高说明调度算法分配订单不够均衡如果大面积偏低则骑手压力过大可能导致差评率上升。这个指标在真实外卖平台里是调度系统的重要优化目标。4. 可视化报表与 BI 前台实现4.1 从数据到图表报表选型与布局逻辑可视化不是把图表堆在一起就完事而是要有清晰的浏览动线。项目里的仪表盘设计遵循“总-分-细”的逻辑首页放核心 KPI 卡片总订单量、GMV、活跃用户数、平均配送时长第二屏是趋势图表展示订单量、销售额的日趋势和时段分布第三屏是维度对比图按商圈、品类、站点做横向比较最后是明细数据查询。图表选型上有几个经验可以分享看趋势用折线图看分布用直方图或箱线图看占比用饼图或堆叠柱状图看相关性用散点图。这个项目里时间聚合用折线图用户分层用饼图配送时长分布用直方图商家对比用柱状图整体看起来比较舒服也符合业务汇报的习惯。4.2 Streamlit 交互组件的实战配置前端用 Streamlit 实现时有几个交互设计是提升使用体验的关键。侧边栏用来放筛选器包括日期范围、城市、商圈、品类多选。所有图表都会响应筛选器的变化这里要用 st.cache_data 做缓存不然每次拖动日期控件都会全量重算页面会卡到怀疑人生。源码里对数据加载和 RFM 计算函数都加了缓存装饰器实际跑的时候响应速度提升非常明显。KPI 卡片不要直接用 st.write 输出数字而是用 st.metric 组件可以展示同环比变化。比如订单量旁边显示较昨日 12.5%这个细节让仪表盘更像真实的 BI 系统。地图组件用 st.map 配合经纬度数据可以展示订单热力分布这里是用的内置地图不需要额外申请地图服务的 key。注意Streamlit 默认的页面宽度比较窄记得在配置里设置 layoutwide否则图表会很拥挤交互体验直接掉一个档次。4.3 关键代码片段解读这里把源码里比较核心的时段聚合代码抽出来说明一下import pandas as pd def analyze_hourly_trends(df): df[hour] df[order_time].dt.hour hourly_stats df.groupby(hour).agg( order_cnt(order_id, count), gmv(order_amount, sum), avg_delivery(delivery_duration, mean) ).reset_index() hourly_stats[avg_order_value] hourly_stats[gmv] / hourly_stats[order_cnt] return hourly_stats这段代码的作用是按小时聚合订单量、GMV、平均配送时长和客单价。请注意 groupby 之后用 agg 指定不同字段的不同聚合函数这是 Pandas 的高效写法比多次 groupby 再 merge 快得多。如果你的数据量变大到千万级别这段逻辑迁移到 Spark SQL 只需要改写成几条 SQL 语句。5. 常见问题与排查技巧实录5.1 环境搭建与依赖安装的坑这个项目跑起来遇到的第一个拦路虎通常不是代码问题而是 Python 环境。很多人在装依赖时直接 pip install -r requirements.txt然后发现 Streamlit 版本和 Plotly 版本冲突页面渲染异常。我的建议是用虚拟环境隔离python -m venv venv然后激活虚拟环境再装依赖。如果你在 Windows 上执行激活脚本时系统提示“禁止运行脚本”这是 PowerShell 执行策略限制只需要一条命令解决Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser。版本配套方面实测比较稳的组合是 Python 3.9/3.10、Pandas 1.5、Streamlit 1.28、Plotly 5.18。如果装的是最新版 Streamlit部分 API 有变动源码里用了 st.cache_data 而不是老版的 st.cache注意区分。5.2 数据导入与路径问题的排查用 SQLite 存数据时最容易出问题的是中文路径和相对路径。如果你把项目文件夹放在中文目录下部分 SQLite 驱动会报文件路径错误。解决方法是把数据库路径改为绝对路径或者在代码里用 os.path.join 拼接路径避免硬编码。另外首次运行时会自动建表并导入 CSV 数据这个过程可能会有点慢。如果中途中断再运行时会出现“表已存在”的报错。源码里已经做了判断逻辑如果检测到表存在且数据量一致就会跳过导入只做读取。但如果你改了数据结构需要删除 data 目录下的 .db 文件再重新生成。5.3 输出结果异常时的排查顺序如果发现某个图表数据明显不对我的排查顺序是先看原始数据有没有问题再做清洗逻辑检查最后看聚合字段是否正确。很多人一上来就怀疑可视化代码写错了其实大多数情况是数据处理环节出了问题。举例说明有一次我发现“午高峰订单量”看起来异常低排查后发现是时间字段的时区问题源数据里存的是 UTC 时间没有转换成本地时间导致所有订单全部偏移了 8 小时。这个问题在源码里通过统一转换 solved也提醒我们任何时间相关的分析第一步永远先确认时区口径。6. 项目扩展与进阶思考6.1 从离线分析迈向实时监控当前版本是离线批处理模式数据导入后做分析适合日报、周报场景。但如果你想更进一步往实时数仓方向发展可以在架构上做两层升级数据采集层用 Kafka 接入订单流实时计算层用 Spark Structured Streaming 或 Flink 做窗口聚合结果写入 Redis 或 ClickHouse前端通过 WebSocket 实时刷新大屏。这个升级路径不需要推翻现有代码业务指标模型可以完全复用只需要把“定时跑批”变成“实时计算”。从学习角度讲你可以先接一个模拟数据流然后逐步替换模块比自己从零搭一个完整实时架构要平滑得多。6.2 分析模型如何继续做深目前的用户分层、商家分析还是基础版本想要在简历上突出亮点可以继续补充三件事一是用回归分析或树模型找出影响复购率的关键因子比如配送时长、满减力度、商家评分等。二是加入同期群分析看不同月份新用户的留存曲线差异。三是对订单量做时间序列预测用 Prophet 或 ARIMA 预测未来一周的单量这在真实业务里对应于备货和运力排班需求。模型本身不复杂但做完之后整个项目的深度立刻不一样了因为它从“描述现状”升级到了“预测未来”这对业务决策的价值是完全不同的量级。我个人在实际跑这套源码时最大的感受是数据系统的价值不在于技术栈有多新而在于分析逻辑是否贴近真实业务。你把这套项目的业务逻辑吃透了就算换一套数据、换一个行业拆解问题的思路也是通用的。最后再分享一个建议不要只盯着代码跑通试着改几个分析维度比如换个分群方法、加一个预测模型踩点坑收获会大得多。本文还有配套的精品资源点击获取