MCM520 ← 资料站首页 2017B「拍照赚钱」任务定价(二):成本—覆盖权衡下的最优重定价 打开交互阅读器 →

2017B「拍照赚钱」任务定价(二):成本—覆盖权衡下的最优重定价

1 问题重述与优化目标

承接第一篇的诊断结论:原方案把定价锁死在常数 80 元,浪费了价格的强杠杆,导致约 38% 的任务流单,且流单集中在低可达区域。本篇要解决的是问题二的核心——如何为新一批任务重新定价。

我们把目标形式化为一个多目标权衡问题:平台既希望尽可能多的任务被完成(覆盖率高),又希望总支出尽可能低(成本低),二者天然冲突。给定第一篇拟合出的接单响应函数(逻辑回归),本篇在"每个任务的接单概率不低于目标阈值 TT"的约束下,求解使总成本最小的差异化定价;再通过扫描 TT 得到成本—覆盖 Pareto 前沿,供平台方按预算与体验诉求拍板。

所有数字仍来自唯一真源 gen_data.gen_2017b(),与第一篇的逻辑回归系数完全一致。

图1

2 以逻辑回归为响应函数的优化模型

第一篇得到接单响应函数(原始量纲)

P(完成∣price,cnt_R)=σ(b0+b1price−8010+b2⋅cnt_R),(b0,b1,b2)=(−1.039, 0.990, 0.142)P(\text{完成}\mid \text{price}, \text{cnt\_R}) = \sigma\big(b_0 + b_1\tfrac{\text{price}-80}{10} + b_2\cdot \text{cnt\_R}\big),\quad (b_0,b_1,b_2)=(-1.039,\,0.990,\,0.142)

对第 ii 个任务,设其周边会员数为 cic_i,我们要选定价 pip_i 使 P(pi,ci)≥TP(p_i,c_i)\ge T。由于 σ\sigma 关于价格单调增,使成本最小的最优解恰好是把价格压到约束边界——即令 P(pi,ci)=TP(p_i,c_i)=T:

pi\*=80+10⋅logit⁡(T)−b0−b2cib1,logit⁡(T)=ln⁡T1−Tp_i^{\*}= 80 + 10\cdot\frac{\operatorname{logit}(T)-b_0-b_2 c_i}{b_1},\qquad \operatorname{logit}(T)=\ln\frac{T}{1-T}

这是一个闭式解:因为响应函数在价格上线性,无需迭代搜索。对于更一般的非单调/含约束情形,该问题可嵌入线性或非线性规划框架,但本数据下闭式解已是最优。

图2 画出单任务的响应曲线:当周边会员数 c=8c=8(中等可达)时,定价 80 元仅能换来 52.5% 的接单概率,提到 100 元才到 88.9%;而 c=20c=20(高可达)时 80 元已有 85.9%。同一定价对不同任务效果天差地别——这正是差异化定价的必要性与空间。

图2

3 成本—覆盖 Pareto 前沿

把目标覆盖率 TT 从 0.5 扫到 0.98,对每一档求解最小总成本,得到 Pareto 前沿(图3)。成本随覆盖率单调上升且明显加速:覆盖率 50% 时约需 5.79 万元,90% 时约 7.37 万元,98% 时已达 8.68 万元。

图3

这条曲线是定价决策的"导航图":它量化了"每多买一点覆盖要花多少钱"。前沿上没有绝对最优,只有适合平台当前阶段的折中点——预算紧张就选左下、追求体验就选右上。本篇以 T=0.90T=0.90 作为主推荐方案(兼顾成本与覆盖),其下所有结论均围绕该点展开。

4 重定价的结构:就难加价、就易减价

差异化定价最直观的特征是价格随可达性反向变化。图4 给出各可达性分箱的重定价后均价:

周边会员数 0–2 2–5 5–10 10–20 20–40 40+
重定价均价(元) 111.6 108.3 102.8 94.0 71.9 42.9

低可达任务被提价到 110 元左右(用价格杠杆补偿其天然劣势),高可达任务反而被降到 43 元地板价(它们本就容易完成,无需多付)。这与原方案"所有任务一律 80 元"形成鲜明对照,正是第一篇诊断出的"价格与难度错配"被纠正后的结果。

图4

图5 对比重定价前后的分箱完成率:原方案呈 20%→100% 的剧烈落差(可达性决定生死),重定价后各箱完成率被拉平到约 90%——偏远任务不再因定价不足而流单,市中心任务也不再因过度付费而浪费预算。覆盖的"公平性"与"底线保障"同时实现。

图5

5 三方案成本对比

图6 把三个方案的总成本并排比较:

  • 原方案:6.55 万元,覆盖仅 61.95%;
  • 差异化重定价(T=0.90T=0.90):7.37 万元,覆盖 90.06%;
  • 统一定高价基线(所有任务都按最贵所需价 112.69 元):9.24 万元。

图6

把覆盖从 62% 提升到 90.6%,总成本仅增加 8170 元(+12.5%)——用少量加价换回大量流单,是笔划算的交易。更重要的是,相比"无脑统一定最贵价"的粗暴方案(9.24 万元),本方案的差异化定价又省下约 1.87 万元:它只对真正困难的任务加价,对容易的任务减价,把钱花在刀刃上。

6 边际成本与预算约束

覆盖率的提升不是均匀便宜的。图7 显示每把目标提高 5 个百分点所需的增量成本:从 85% 提到 90% 需追加约 3432 元,90%→95% 约 5697 元,95%→98% 约 7430 元——边际成本随目标提高而陡增。原因很直观:越接近满分覆盖,剩下的都是"最难啃"的低可达任务,必须狠加价才能推动。

图7

若平台先确定预算而非覆盖率,可反向查 Pareto 前沿得到"该预算下能买到的最大覆盖"(图8):预算 7 万元最多 81.8%,7.5 万元达 90.6%,8 万元达 95.2%。这条"预算—最大覆盖"曲线与图3 是同一前沿的两种读法,分别服务于"先定体验"和"先定钱包"两类决策习惯。

图8

7 结论与向后一篇的铺垫

本篇在逻辑回归响应函数下,给出了成本—覆盖权衡的最优差异化重定价:主方案 T=0.90T=0.90 以 7.37 万元总成本实现 90.6% 覆盖(较原方案 +12.5% 成本、+28.6pp 覆盖),且比统一定价省 1.87 万元。Pareto 前沿与边际成本曲线共同说明——覆盖率越往高处走越贵,平台方应按预算/体验权衡选点。

但本篇仍把每个任务当作独立决策单元,忽略了任务的空间聚集性:现实中一名会员完全可以在一次出行中顺路完成多个邻近任务。若能把邻近任务"打包"计价,平台对同一会员的多次支付可合并、对顺路任务的边际激励可打折,从而在不牺牲覆盖的前提下进一步压低成本。这正是第三篇的主题。

8 闭式解为何成立,以及一般化

本篇能把最优定价写成闭式,关键在于响应函数对价格是单调线性的:逻辑回归的 logit 在价格维度上是一次的,约束 P≥TP\ge T 的边界解自然可反解。若改用带交互项或更复杂的响应函数(如用神经网络拟合的接单概率),单调性仍大致成立,可用一维二分搜索快速求每个任务的边界价,计算量依旧很小。因此"就难加价、就易减价"的结论对更复杂的响应模型同样稳健,闭式解只是本数据下最干净的特例。

9 敏感性:系数估计误差会怎样传导

工程落地时,逻辑回归系数是用历史数据估计的,难免有误差。设价格系数 b1b_1 被低估 10%(即实际更应敏感),则按 b1b_1 算出的边界价会偏高——但因为我们设的是"恰达阈值 TT"的边界价,略高的定价只会让实际覆盖超过 TT,代价是多花一点钱,不会"该完成的没完成";反之若 b1b_1 被高估,边界价偏低,部分任务实际覆盖不足。因此实践中应对系数做保守偏严校准(略抬高边界价),用少量成本冗余换取覆盖达标,这与医疗、风控中"宁可误报不可漏报"的思路一致。

10 最低报酬地板与定价结构

本模型设了 40 元的最低报酬地板:对周边会员极多(cnt_R≥40)的任务,按公式算出的边界价甚至为负,说明它们"白给都抢着做",但平台仍需支付不低于 40 元的基本劳务费。地板价不影响"差异化"的本质——它只抬高低端、不抹平高端。图4 中 40+ 分箱均价 42.9 元正是地板效应所致,也符合"易做任务不该倒贴"的商业常识;若取消地板,这部分任务会被定到几元甚至 0 元,反而损害平台劳务定价的严肃性。

11 与原题新任务定价的对应

原题第二问要求"为附件3的新任务重新定价",本篇的闭式边界价可直接套用:只要把新任务的可达性特征(周边会员数、到最近会员距离)代入拟合好的响应函数,立刻得到每个任务的最优价。扫描 TT 得到的 Pareto 前沿,则帮助平台方在"预算"与"体验"之间选点——这正是把建模结论转化为可执行的定价表、回答原题第二问的关键一步。

12 定价表的工程化输出与验证

把上述闭式解落地,平台侧得到的是一张"任务—最优价"对照表:每个任务 ID 对应一个建议价(低可达任务约 110 元、高可达任务约 43 元地板价)。为确保模型没有"纸上谈兵",建议先做小流量 A/B 验证:把 10% 的新任务按本方案定价、其余维持原 80 元一口价,观察两组实际完成率差异是否接近模型预测的 90% 对 62%。若实测差异显著小于预测,说明真实响应函数比拟合的更平缓,应回调系数后重算——这正是把建模闭环嵌入业务迭代的标准动作。此外,定价表应随会员规模变化定期重拟合:当某热区涌入大量新会员,该区任务的 cnt_R 上升、最优价应自动下调,形成"数据—模型—定价"的自适应回路,而非一劳永逸地冻结一张表。

附录:可复现的 Python 实现

在 mcm520-site/tools/ 目录下运行,调用唯一真源复现本篇全部数字。

# 在 mcm520-site/tools/ 目录下运行:python3 this_script.py
import gen_data as GD
import math

D = GD.gen_2017b()
b0, b1, b2 = D["fit_orig"]                 # (-1.039, 0.990, 0.142)
pb = D["price_base"]                        # 80
T_target = D["T"]                           # 0.90
logit_T = math.log(T_target / (1 - T_target))

# 闭式最优定价:令每个任务接单概率恰为 T
p_req = []
for i in range(D["n_tasks"]):
    c = D["tasks"][i]["cnt_R"]
    price = pb + 10.0 * (logit_T - b0 - b2 * c) / b1
    p_req.append(max(price, 40.0))          # 最低报酬地板 40 元
print("重定价后单价 min/med/max = %.2f / %.2f / %.2f"
      % (min(p_req), sorted(p_req)[len(p_req)//2], max(p_req)))

orig_total, new_total = D["orig_total"], D["new_total"]
uniform = D["uniform_baseline"]
print("原方案成本=%.1f 重定价成本=%.1f 统一定价基线=%.1f" % (orig_total, new_total, uniform))
print("覆盖提升:%.1f%% -> %.1f%%  差异化较统一定价省 %.1f 元"
      % (100*D["completion_overall"], 100*D["achieved"], uniform-new_total))

# Pareto 前沿(成本—覆盖权衡)
print("Pareto 前沿 (T, 成本, 覆盖):")
for row in D["pareto"]:
    print("  T=%.2f  成本=%.1f  覆盖=%.3f" % row)