ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python数据分析实战:还原同城配送订单单价波动的真实规律

Python数据分析实战:还原同城配送订单单价波动的真实规律 短视频平台上一段两小时的超长视频把“午高峰跑单单价不高”“恶劣天气单价低”这类话题推到了讨论中心。抛开视频里的情绪表达真正适合技术人员切入的角度只有一个用订单数据还原现象背后的结构。午高峰和恶劣天气到底对单价有没有影响、影响有多大是定价规则、订单结构还是配送时长造成了感知差异这些问题都可以用 Python 数据分析来验证而不是停留在个例感受。这篇文章以同城配送订单为分析对象先构造一份可复现的模拟订单数据再走一遍数据清洗、特征加工、分时段统计、天气分组对比和多因素交叉分析的完整流程。文章会解释每个指标的业务含义给出可视化结果并说明结论该怎么表述才不容易被误解。适合刚入门数据分析、想找一个完整实战项目的 Python 学习者也适合订单运营、物流调度、骑手运营相关岗位的工程师参考分析方法。1. 先拆解“午高峰单价低”背后的可量化指标1.1 单价至少有三种口径讨论“单价低”之前先明确单价到底是什么指标。同一个订单用不同口径计算结论可能完全相反。单均收入总订单收入除以订单数反映每一单平均能拿多少钱。每公里收入订单收入除以配送距离反映单位里程的定价水平。每小时收入订单收入除以配送时长反映单位时间内的收入效率。一个雨天订单单均收入因为天气加价而上升但配送距离变短、配送耗时变长每小时收入反而下降。所以当有人说“恶劣天气单价低”时他说的很可能是每小时收入低而不是系统给这单的钱变少了。分析的第一步就是把这三个口径拆开分别计算。1.2 需要同时观察的四个变量要回答午高峰两小时为什么让人感觉单价低至少要看四个变量时段、天气、配送距离、配送时长。它们之间会互相影响只看一个很容易得出错误结论。时段决定订单量和加价规则。天气决定天气加价也影响配送速度和订单结构。配送距离直接决定基础配送费。配送时长决定单位时间收入也是感知“累不累、值不值”的核心。分析主线分成三层先做单变量统计再看控制距离后的天气效应最后做“时段 天气”交叉分析。1.3 技术选型和数据口径分析环境建议 Python 3.10 及以上核心库使用 pandas、numpy、matplotlib、seaborn、jupyter。真实项目中数据一般来自订单宽表或数仓字段包括下单时间、送达时间、距离、天气、订单金额等。下面为了可复现使用模拟数据模拟数据的结构和真实订单宽表保持一致落地到真实项目时替换数据源即可。指标口径计算公式解决的问题单均收入total_fare / 订单数每一单能拿多少钱每公里收入total_fare / distance_km单位里程定价水平每小时收入total_fare / (delivery_minutes / 60)单位时间收入效率2. 构造一份可复现的配送订单模拟数据集2.1 字段设计与业务含义模拟数据包含 20000 条配送订单时间跨度 7 天覆盖晴天、多云、小雨、暴雨四种天气。字段设计如下字段类型说明order_idstring订单唯一编号order_timedatetime下单时间weatherstring下单时天气类型distance_kmfloat配送距离单位公里delivery_minutesfloat配送时长单位分钟total_farefloat订单总收入单位元is_noon_peakint是否午高峰 11-13 点is_evening_peakint是否晚高峰 17-19 点weather_feefloat天气加价peak_feefloat时段加价fare_per_kmfloat每公里收入fare_per_hourfloat每小时收入模拟数据的关键假设有三条。第一基础配送距离服从指数分布且恶劣天气时近距离订单占比提高模拟“天气差时用户更倾向点附近商家”的行为。第二配送时长由基础时长、距离和天气耗时系数构成雨雪天气配送速度下降。第三定价规则为基础 5 元加 1.8 元每公里再加时段加价和天气加价。2.2 生成订单时间、天气和距离用 numpy 生成随机数据时固定随机种子保证结果可以复现。import numpy as np import pandas as pd from datetime import datetime, timedelta np.random.seed(42) order_count 20000 start_day datetime(2025, 1, 6) end_day datetime(2025, 1, 13) # 在 7 天内随机生成订单时间 minutes_span int((end_day - start_day).total_seconds() / 60) random_minutes np.random.randint(0, minutes_span, sizeorder_count) order_time [start_day timedelta(minutesint(m)) for m in random_minutes] # 天气类型和概率 weather_type np.random.choice( [sunny, cloudy, rain, storm], sizeorder_count, p[0.45, 0.30, 0.18, 0.07] ) # 基础距离服从指数分布恶劣天气时距离整体缩短 distance_base np.random.exponential(scale3.2, sizeorder_count) distance_ratio np.where(np.isin(weather_type, [rain, storm]), 0.72, 1.0) distance_km np.clip(distance_base * distance_ratio, 0.3, 20).round(2)这里把天气对距离的影响设计为 0.72 倍目的是模拟真实场景中雨天用户更容易选择近距离商户的行为。生产环境接入真实数据后这个系数不需要设置直接用真实距离字段即可。2.3
返回列表