Personalized Promotion Targeting — 个性化促销定向:用户响应异质性建模
Skill-Personalized-Promotion-Targeting · 14-用户分析
causalexperimentforecastingoptimization客服与VOCWF-C 客服分诊WF-H 复购增长
年化 ROI300-600 万元
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐☆☆
业务视角
适用角色运营负责人 / 用户增长负责人 · CMO · 产品经理
适用平台Amazon 买家分层 · DTC 站 LTV 预测 · Klaviyo/Brevo 邮件分群
什么情况下用有大量老客户,但不知道谁是高价值客户、谁快要流失;新客获取成本越来越高,老客复购却上不去
成功是什么样的用户按 RFM/LTV 分层精准触达,高价值用户留存率提升,老客贡献收入占比从 30% 提升到 50%
业务痛点
1. 解决的问题
1. Cannibalization(自相残杀):把折扣发给"本来就会买"的高意愿用户,白白损失利润
2. 核心算法逻辑
核心问题:促销"一刀切"的浪费
3. 业务应用场景
业务问题:品牌推出"Stage1→Stage2奶粉换购"优惠,Stage2 售价更高,换购成功即提升 LTV。但如果发给所有 Stage1 用户,大量原本会自然升阶的用户白白享受了折扣。
应用流程: 1. 用户分群:基于宝宝月龄(4月龄以下/4-5月龄/6月龄以上)+ RFM 分群 2. 关键洞察:6月龄以上用户已自然升阶(Sure Things),4-5月龄用户是最佳目标(Persuadables) 3. 响应模型:历史数据估计每群的增量响应概率 $\Delta p_i$ 4. Knapsack 分配:在促销预算下,优先分配给 ROI = $\Delta p_i \times \Delta LTV_i / cost_i$ 最高的分群
预期产出: - 仅投放 4-5 月龄用户(30% 的活跃 Stage1 用户),节省 70% 促销成本 - 换购率:从全体投放的 12% 提升至精准投放的 28% - 人均促销成本降低 40%,整体 ROI 提升 2.3x
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 易处:Knapsack 贪心算法简单高效;分群可复用现有 RFM 逻辑
- 难处:增量响应概率需要历史 A/B 数据或 Uplift 模型支撑;分群定义依赖业务知识
- 前提:需要至少1次历史A/B实验或准实验数据来估计基线响应率
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Personalized Promotion Targeting — 个性化促销定向
异质性响应建模 + Knapsack 预算优化
纯 Python 标准库,无 sklearn/pandas 依赖
Python 3.14 兼容
"""
from __future__ import annotations
import math
import random
from dataclasses import dataclass
# ─── 数据结构 ────────────────────────────────────────────────────────────────
@dataclass
class UserSegment:
"""用户分群的促销响应特征"""
segment_id: str
segment_name: str
n_users: int # 该分群用户数
propensity_to_respond: float # 绝对响应概率 P(buy | promo)
baseline_response: float # 无促销响应概率 P(buy | no promo)
expected_value: float # 响应后期望 LTV 增量($)
cost: float # 人均促销成本($)
@property
def incremental_response(self) -> float:
"""增量响应概率 = 有促销 - 无促销(排除 Sure Things)"""
return max(0.0, self.propensity_to_respond - self.baseline_response)
@property
def roi_per_dollar(self) -> float:
"""每美元促销成本的期望增量价值"""
if self.cost <= 0:
return 0.0
return (self.incremental_response * self.expected_value) / self.cost
@property
def segment_type(self) -> str:
"""自动识别象限类型"""
if self.incremental_response < 0.02:
if self.baseline_response > 0.5:
return "Sure Things"
return "Lost Causes / Sleeping Dogs"
if self.roi_per_dollar < 0.5:
return "Low ROI Persuadables"
return "Persuadables"
@dataclass
class AllocationResult:
"""分配结果"""
segment: UserSegment
allocated_users: int
allocation_fraction: float # 该分群中被分配的比例
expected_incremental_ltv: float
total_cost: float
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。