paper2skills Playbook

Creative Fatigue Detection — 生存分析驱动的广告素材疲劳检测

Skill-Creative-Fatigue-Detection · 13-广告分析

causalexperimentforecasting广告与投放WF-B 广告优化WF-G Listing内容优化
实现难度⭐☆☆☆☆
业务视角
适用角色广告优化师 / 投放负责人 · CMO · 运营负责人
适用平台Amazon PPC(SP/SB/SD)· TikTok Ads · Meta 广告 · 多平台归因
什么情况下用广告账户几十个系列,不知道哪个在真正赚钱;ROAS 看起来好看但实际利润没有提升;预算有限想集中打高价值用户
成功是什么样的每分广告预算有明确 ROI 追踪,砍掉低效渠道后同等预算 ROAS 提升 30-50%
业务痛点
ROAS 好看但利润没有涨不知道哪个素材真的有效归因窗口期不同数据打架TikTok/Meta/Amazon 广告数据整合不了

1. 解决的问题

广告素材疲劳(Creative Fatigue)是指:同一批用户反复看到相同广告后,CTR、CVR 等核心指标持续衰减的现象。

2. 核心算法逻辑

广告素材疲劳(Creative Fatigue)是指:同一批用户反复看到相同广告后,CTR、CVR 等核心指标持续衰减的现象。

3. 业务应用场景

业务背景:某母婴品牌在 Meta Ads 投放婴儿奶瓶广告,上线 5 款素材(主图+短视频各类型)。初始 ROAS 4.2,但第 21 天起 ROAS 持续下滑,未能及时发现素材疲劳。

量化 ROI: - 月均素材疲劳损失(未检测):约 $3,000-$6,000 - 应用检测后减少损失:65-75%,月均节约 $2,000-$4,500 - 实施成本:一次性开发约 20 小时

业务背景:某婴儿推车品牌在 Amazon SB 投放 3 支产品视频,每支生命周期约 2-4 周。手动监控 3 支视频的 CTR 变化消耗大量人力,且经常错过最优下线时机。

4. 输入数据要求

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

5. 输出结果

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

6. 业务价值 / ROI

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

7. 代码模板

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

"""
Creative Fatigue Detection
生存分析 + 路径签名的广告素材疲劳检测系统

依赖:numpy, pandas, scipy, lifelines (pip install lifelines)
测试:python -m pytest test_creative_fatigue.py -v
"""

import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
from scipy import stats


@dataclass
class CreativeMetrics:
    """广告素材每日指标"""
    creative_id: str
    date: str
    impressions: int
    clicks: int
    conversions: int
    spend: float
    
    @property
    def ctr(self) -> float:
        return self.clicks / self.impressions if self.impressions > 0 else 0.0
    
    @property
    def cvr(self) -> float:
        return self.conversions / self.clicks if self.clicks > 0 else 0.0
    
    @property
    def cpc(self) -> float:
        return self.spend / self.clicks if self.clicks > 0 else 0.0


class PathSignatureCalculator:
    """
    路径签名计算器
    从 CTR 时间序列中提取趋势衰减特征
    """
    
    @staticmethod
    def compute_level1_signature(ctr_series: List[float]) -> float:
        """
        一阶签名:总变化量
        S^1 = Σ ΔCTR_t = CTR_T - CTR_0
        """
        if len(ctr_series) < 2:
            return 0.0
        return ctr_series[-1] - ctr_series[0]
    
    @staticmethod
    def compute_level2_cross_signature(ctr_series: List[float]) -> float:
        """
        二阶交叉签名:时间加权 CTR 变化
        S^12 = Σ_t t * ΔCTR_t
        

8. 论文来源

  • 2204.11588
  • 2509.09758