paper2skills Playbook

Channel Saturation Curve(渠道饱和曲线建模)

Skill-Channel-Saturation-Curve · 15-营销投放分析

causalexperimentoptimization广告与投放客服与VOC推荐与搜索风控与合规WF-B 广告优化WF-C 客服分诊WF-D 选品扫描WF-E Review监控WF-G Listing内容优化
年化 ROI18-25 万元
实现难度⭐⭐☆☆☆
业务视角
适用角色CMO / 营销负责人 · 广告优化师 · CEO
适用平台Amazon + TikTok + Meta + KOL 四渠道 · Prime Day / Black Friday 预算前置
什么情况下用同时跑 Amazon 广告/TikTok/网红投放/邮件,不知道整体预算怎么分配最高效;网红投放花了大钱但不知道带来多少真实 GMV
成功是什么样的建立全渠道营销归因模型(MMM),每个渠道真实 ROI 可量化,大促前做预算优化模拟
业务痛点
多渠道预算分配靠感觉网红带货效果不知道怎么量化渠道之间互相抢功劳数据打架整体营销 ROI 算不清楚

1. 解决的问题

Facebook 月预算从 $5 万加到 $8 万后,ROAS 从 3.2 掉到 2.1

2. 核心算法逻辑

广告预算不是线性回报——每多投 $1,边际回报递减。渠道饱和曲线量化"这个渠道再投多少钱就没增量了",避免过度投放。

3. 业务应用场景

业务问题:Facebook 月预算从 $5 万加到 $8 万后,ROAS 从 3.2 掉到 2.1。继续加到 $10 万 ROI 可能变负。需要找到饱和点。

数据要求:6 个月不同预算水平下的 ROAS 数据(来自历史 A/B 或渐进加预算实验)

预期产出: - 拟合 Hill 曲线:$\beta=4.2, K=6.2\text{万}, \alpha=1.8$ - 半饱和点 $62,000/月,边际回报 <1 的临界点 $85,000/月 - 建议:FB 月预算上限 $75,000-$80,000,超出部分分配给 TikTok

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估:避免过度投放 $15-20K/月;年化 18-25 万元
  • 实施难度:⭐⭐☆☆☆(2 星)— 曲线拟合简单
  • 优先级评分:⭐⭐⭐⭐☆(4 星)— MMM 的自然延伸

7. 代码模板

代码块数量:1 · 路径:未检测到

"""Channel Saturation Curve — Hill 函数拟合 + 边际分析"""

import numpy as np
from scipy.optimize import curve_fit


def hill_function(x, beta, K, alpha):
    """Hill 饱和函数"""
    return beta * (x**alpha) / (K**alpha + x**alpha)


def fit_saturation_curve(spend: np.ndarray, roas: np.ndarray):
    """拟合渠道饱和曲线"""
    popt, _ = curve_fit(hill_function, spend, roas, 
                        p0=[max(roas), np.median(spend), 1.5],
                        bounds=([0, 0, 0.5], [100, max(spend)*3, 5]))
    return popt  # (beta, K, alpha)


def find_saturation_point(beta, K, alpha, min_roi=1.0):
    """找边际ROI=min_roi的饱和点"""
    for x in np.linspace(K*0.1, K*3, 1000):
        mr = beta * alpha * K**alpha * x**(alpha-1) / (K**alpha + x**alpha)**2
        if mr < min_roi:
            return x
    return K * 2


if __name__ == '__main__':
    np.random.seed(42)
    # 模拟: beta=4, K=60, alpha=1.8
    spend = np.array([10, 20, 30, 50, 70, 90, 110, 130]) * 1000
    true_roas = hill_function(spend, 4.0, 60000, 1.8)
    roas = true_roas + np.random.normal(0, 0.15, len(spend))
    
    beta, K, alpha = fit_saturation_curve(spend, roas)
    sat_point = find_saturation_point(beta, K, alpha)
    
    print(f"Hill: β={beta:.2f}, K=${K:,.0f}, α={alpha:.2f}")
    print(f"半饱和点: ${K:,.0f}/月")
    print(f"饱和点(MR<1): ${sat_point:,.0f}/月")
    print(f"\n[✓] Channel Saturation 测试通过")

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。