活动分析 增量 Lift
活动分析活动概述活动背景平台近 30 天活跃用户中存在一批高浏览、高加购但未下单的潜在用户群体其转化率是制约 GMV 增长的关键因素之一。为进一步挖掘存量用户价值运营侧针对近 30 天活跃但未产生任何下单行为的用户定向发放全场 8 折优惠券活动 IDfull_reduction_30d活动周期为 2026-06-15 至 2026-06-18。由于该活动采用定向投放而非全量随机实验处理组与对照组在用户行为特征上存在系统性差异直接使用对比分析会导致选择偏差Selection Bias。因此本项目基于活动日志、用户行为埋点与交易数据构建准实验建模宽表并通过PSM倾向得分匹配方法剥离自然转化与促销敏感度等因素影响科学评估本次活动所带来的增量 GMVIncremental GMV为后续促销策略优化与投放 ROI 评估提供量化依据。带来的增量GMV。分析目标评估活动是否真正拉动 GMV计算增量Lift、增量ROI判断折扣是否“透支未来消费”指导下一次大促预算与策略倾向得分匹配 PSM构造建模宽表SQL取数user_profile 用户画像表order_info 订单表activity_log 活动触达记录user_event 事件埋点关键变量协变量变量选择原因近 30 天浏览次数影响触达概率活跃浏览用户常被圈人选入活动影响 GMV浏览多是购买意向强的信号若不控制 → 活动组天然转化高 → 高估活动效果近 30 天加购次数加购 强购买意向运营常把“加购未购”用户作为促销目标控制后可消除“意向偏差”历史累计 GMV高价值用户更可能被纳入 VIP / 高活人群活动本身客单价高、转化率高不控制 → 活动组 GMV 天生高 → 偏差注册天数老用户 vs 新用户活跃度、信任度不同运营策略不同新人专享 vs 老客唤醒控制生命周期阶段避免混淆新老客差异是否点击过 Push表征用户是否对消息敏感是否更容易被活动触达Push 易达 / 易互动与转化行为相关愿意点通知 → 下单意愿强很好地区分“易触达人群”城市等级一二线城市消费力更强 → GMV 高有时活动投放会倾斜或相反下沉市场倾斜属典型用户属性混淆因子控制后可减少地域结构偏差概括选这6个变量的原因都是“既影响运营是否会把人群选入活动又影响是否会下单/GVM 多少”的混淆变量——是 PSM 需要控制的对象。with treated_users as (-- 标记被活动触达的用户 select distinct user_id, 1 as is_treated from activity_log where activity_id full_reduction_30d and dt between 2026-06-15 and 2026-06-18 -- 活动举行3天 ), control_candidates as (-- 对照组活动前30天活跃 未下单未被活动触达 select distinct user_id, 0 as is_treated from activity_log a left join ( select distinct user_id from dwd_order_info where dt between 2026-05-16 and 2026-06-14 )o on a.user_ido.user_id left join treated_users t on a.user_idt.user_id where o.user_id is null -- 活动前30天没下单 and t.user_id is null -- 未触达 ), user_event as (-- 埋点表统计 select user_id, sum(case when event_idbrowse then 1 else 0 end) as browse_cnt,-- 浏览次数 sum(case when event_idcart then 1 else 0 end) as cart_cnt, -- 加购次数 sum(case when event_idpush then 1 else 0 end) as push_click_cnt -- push点击次数 from ods_user_event where event_id in (browse,cart,push) ), activity_gmv as (-- 结果变量活动期GMV select user_id, sum(pay_amount) as gmv_total, sum(case when dt between 2026-06-15 and 2026-06-18 then pay_amount else 0 end) as gmv_activity from order_info group by user_id ) -- 拼合建模宽表 select u.user_id, u.is_treated, p.city_level,-- 城市等级 p.activity_day, -- 活跃天数 coalesce(e.browse_cnt,0) as browse_cnt_30d, coalesce(e.cart_cnt,0) as cart_cnt_30d, coalesce(e.push_click_cnt,0) as push_click_cnt, coalesce(a.gmv_total,0) as gmv_total,-- 历史下单金额 coalesce(a.gmv_activity,0) as gmv_activity from ( select * from treated_users union all select * from control_candidates )u left join dwd_user_profile p on u.user_idp.user_id left join user_event e on u.user_ide.user_id left join activity_gmv a on u.user_ida.user_id训练倾向得分模型Pythonimport pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler df pd.read_csv(psm_model_table.csv) x df[[browse_cnt_30d,cart_cnt_30d,gmv_total,activity_day,city_level,push_click_cnt]] y df[is_treated] # 标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 训练 Logistic Regression得到每个用户在“被活动选中”的概率倾向得分 model LogisticRegression( max_iter1000, class_weightbalanced # 防止活动组样本少 ) model.fit(X_scaled, y) df[propensity_score] model.predict_proba(X_scaled)[:, 1] # 最近邻 卡尺Caliper from sklearn.neighbors import NearestNeighbors treated df[df[treated] 1].reset_index(dropTrue) control df[df[treated] 0].reset_index(dropTrue) # 卡尺常用0.05 或 0.25 * σ caliper 0.05 nn NearestNeighbors(n_neighbors1) nn.fit(control[[propensity_score]]) distances, indices nn.kneighbors(treated[[propensity_score]]) # 卡尺过滤 mask distances.flatten() caliper matched_treated treated.loc[mask].reset_index(dropTrue) matched_control control.iloc[indices.flatten()[mask]].reset_index(dropTrue) # 计算标准化均值差SMD def smd(df1, df2, cols): result [] for col in cols: mean1 df1[col].mean() mean2 df2[col].mean() std_pool np.sqrt((df1[col].var() df2[col].var()) / 2) smd_val (mean1 - mean2) / std_pool result.append((col, smd_val)) return pd.DataFrame(result, columns[variable, smd]) cols [ browse_cnt_30d, cart_cnt_30d, hist_gmv, reg_days, city_level, push_click_flag ] balance_df smd(matched_treated, matched_control, cols) print(balance_df) # 计算 ATT增量 Lift att_gmv ( matched_treated[gmv_618].mean() - matched_control[gmv_618].mean() ) print(f活动组人均 GMV{matched_treated[gmv_618].mean():.2f}) print(f对照组人均 GMV{matched_control[gmv_618].mean():.2f}) print(fATT增量 Lift{att_gmv:.2f})判断标准SMD含义 0.1✅ 优秀0.1 ~ 0.2⚠️ 可接受 0.2❌ 不平衡需调整模型如果 SMD 0.2加交互项换模型GBDT / XGBoost 预测倾向得分缩小 Caliper删除极端样本附录增量Lift 找对照组的方法增量 Lift 实验/活动组指标−对照组未参与同期指标Lift 率(%) 活动组−对照组/ 对照组增量 LiftLift / 增量提升指的是 剔除自然增长后纯粹由活动带来的那部分额外效果。也就是——测算“如果没做这个活动本来不会发生的变化”。科学性排序A/B Test ≫ PSM 历史同期对比 ≥ 简单 T vs C通常最差① A/B Test 随机分流最理想但不可回溯历史50% 用户看到活动实验组、50% 用户看不到对照组同时间、同人群 → 差异 活动效果② 类似人群匹配-PSM可回溯历史没参加活动的相似用户同城市、同消费层级用他们做近似对照③ 历史同期易受干扰上月同日 / 上周同期需保证无大节日、无大流量波动PSM 如何选择协变量选择协变量X的原则不能是活动本身造成的影响结果变量GMV是否是会被圈入活动的人群不能选的变量变量为什么不能放活动期是否加购 / 下单 / 支付受活动影响Post-treatment会切断因果链活动期间点击活动页次数本身就是活动效果的一部分领取优惠券张数活动中中介变量不是前置混淆因子