数据来源:阿里云天池 Audience Expansion Dataset · 分析工具:Python(pandas + scipy + statsmodels)
支付宝计划向用户投放营销广告,有两种新的广告策略可以考虑。为了判断哪种策略效果更好,设计了一组对照实验:
判断"效果好"的标准是广告点击率——看到广告的用户中,有多少人点了进去。点击率越高,说明广告越能吸引用户。
实验持续了 2 天,共覆盖 2,209,870 名用户。
数据来自阿里云天池公开数据集 Audience Expansion Dataset,记录了支付宝两组营销策略活动的真实用户行为日志。数据经过匿名化处理,不影响分析结论的适用性。
| 字段 | 含义 | 取值 |
|---|---|---|
| 用户编号 | 支付宝用户的匿名标识 | 唯一数字编号 |
| 是否点击 | 用户当天是否点击了广告 | 1 = 点击,0 = 未点击 |
| 策略编号 | 用户被分到哪一组 | 1 = 对照组,2 = 策略一,3 = 策略二 |
| 日期 | 是第几天的数据 | 1 = 第一天,2 = 第二天 |
原始数据共 2,645,958 条记录,2,410,683 名独立用户。数据清洗分两步:组内去重和跨组用户处理。
问题:实验持续 2 天,同一用户在同一分组中可能两天都有记录。原始数据中有 13,580 个用户×分组组合存在两条记录(占总数的 0.5%),其余 99.5% 的用户只有一天的数据。
处理方式:同一用户在同一分组内有多条记录的,保留最后一天的数据。去重后剩 2,632,378 条。
已知局限:保留最后一天会丢失"第一天点了、第二天没点"的点击记录。这类用户共 96 人,占总用户数的 0.004%,影响可以忽略。下表对比了三种处理方式的结果差异:
| 处理方式 | 对照组 | 策略一 | 策略二 | 策略二提升幅度 |
|---|---|---|---|---|
| 保留最后一天(本报告采用) | 1.34% | 1.96% | 3.07% | +1.72 个百分点 |
| 保留第一天 | 1.33% | 1.95% | 3.05% | +1.72 个百分点 |
| 任意一天点过即算点 | 1.35% | 1.97% | 3.07% | +1.73 个百分点 |
三种方式的最大差距不到 0.02 个百分点,对结论无影响。本报告采用"保留最后一天"。
问题:约 20 万用户(200,813 人)同时出现在多个分组中。例如有的用户既在对照组又在策略一,或者三个分组都有记录。这说明同一用户被多个投放计划覆盖,无法判断到底是哪个策略起了作用,属于污染样本。
处理方式:将 20 万跨组用户全部丢弃,只保留只出现在一个分组的纯独占用户。最终保留 2,209,870 条记录。
为什么丢弃而不是保留一条:跨组用户在所有分组里的点击率都远低于纯独占用户(见下表),说明这批人本身就不太爱点广告。如果把他们塞进策略组,会拉低策略组的点击率,稀释策略的真实效果。
| 分组 | 跨组用户点击率 | 纯独占用户点击率 | 差距 |
|---|---|---|---|
| 对照组 | 0.21% | 1.34% | 低了 6 倍 |
| 策略一 | 0.89% | 1.96% | 低了一半 |
| 策略二 | 1.69% | 3.07% | 低了一半 |
丢弃前后对比:下表展示了丢弃跨组用户前后,各组点击率的变化:
| 分组 | 丢弃前人数 | 丢弃前点击率 | 丢弃后人数 | 丢弃后点击率 |
|---|---|---|---|---|
| 对照组 | 1,753,874 | 1.34% | 1,753,874 | 1.34% |
| 策略一 | 340,702 | 1.71% | 243,849 | 1.96% |
| 策略二 | 316,107 | 2.61% | 212,147 | 3.07% |
对照组前后不变(跨组用户在两种方式下都不计入对照组)。策略一和策略二的点击率明显上升,因为低点击率的跨组用户被移除了。策略二的相对提升从 95% 升至 128%,策略的真实效果更加清晰。
图1:各组样本量分布
| 组别 | 样本量 | 占比 |
|---|---|---|
| 对照组 | 1,753,874 | 79.4% |
| 策略一 | 243,849 | 11.0% |
| 策略二 | 212,147 | 9.6% |
| 合计 | 2,209,870 | 100% |
图2:各组广告点击率对比
| 组别 | 样本量 | 点击人数 | 点击率 |
|---|---|---|---|
| 对照组 | 1,753,874 | 23,548 | 1.34% |
| 策略一 | 243,849 | 4,786 | 1.96% |
| 策略二 | 212,147 | 6,507 | 3.07% |
图3:两种策略相较对照组的提升幅度
从数据来看:
看到策略二的点击率更高,一个自然的问题是:这个差距会不会只是碰巧?万一换一批用户,结果就反过来了?
判断方法分三步,核心思路是:先假设策略没用,再看实际差距跟正常波动比有多大。
第一步:假设策略没用,算"共同的点击率"
假设策略二跟对照组本质上没区别,那两组的"真实点击率"应该是一样的。这个共同的点击率大概是多少?把两组数据合在一起算:两组总点击数 ÷ 总人数。以对照组和策略二为例,合并后点击率约 1.53%。
第二步:算"正常波动有多大"
即使两组真实点击率都是 1.53%,实际统计出来也不会精确等于 1.53%,总会有随机波动。波动幅度跟两个因素有关:人数越多波动越小,点击率越低波动越小。用公式算出来,这个正常波动约 0.028 个百分点。可以理解为"正常的随机抖动幅度"——就像量体温,真实 36.5°C,每次量可能显示 36.4 或 36.6,这个 ±0.1 就是正常抖动。
第三步:看实际差距是正常波动的几倍
实际差距 1.72 个百分点 ÷ 正常波动 0.028 个百分点 ≈ 61 倍。就好比体温计正常抖动 0.1 度,结果量出来差了 6.1 度——不可能是体温计不准,是真发烧了。
根据统计学的规律:实际差距达到 2 倍正常波动,碰巧概率约 5%(行业通用门槛);达到 3 倍,碰巧概率约 0.3%。这次的差距是 61 倍,碰巧概率远小于千分之一,可以确定提升是真实的。
| 计算步骤 | 数值 | 说明 |
|---|---|---|
| 对照组 | 1,753,874 人,点击率 1.34% | 原始数据 |
| 策略一 | 243,849 人,点击率 1.96% | 原始数据 |
| 第一步:合并点击率 | 1.42% | 两组总点击 ÷ 总人数 |
| 第二步:正常波动 | 0.026 个百分点 | 人数越多、点击率越低,波动越小 |
| 实际差距 | 0.62 个百分点 | 1.96% - 1.34% |
| 第三步:倍数 | 24 倍 | 0.62 ÷ 0.026 |
| 碰巧概率 | 远小于 0.001% | 24 倍远超 3 倍(0.3%)门槛 |
| 结论 | 提升是真实的,不是碰巧 | |
| 计算步骤 | 数值 | 说明 |
|---|---|---|
| 对照组 | 1,753,874 人,点击率 1.34% | 原始数据 |
| 策略二 | 212,147 人,点击率 3.07% | 原始数据 |
| 第一步:合并点击率 | 1.53% | 两组总点击 ÷ 总人数 |
| 第二步:正常波动 | 0.028 个百分点 | 人数越多、点击率越低,波动越小 |
| 实际差距 | 1.72 个百分点 | 3.07% - 1.34% |
| 第三步:倍数 | 61 倍 | 1.72 ÷ 0.028 |
| 碰巧概率 | 远小于 0.001% | 61 倍远超 3 倍(0.3%)门槛 |
| 结论 | 提升是真实的,不是碰巧 | |
为了确认实验结果不是某一天的偶然现象,我们看一下两天分别的点击率:
图4:各组第1天 vs 第2天点击率
| 组别 | 第1天点击率 | 第2天点击率 | 波动情况 |
|---|---|---|---|
| 对照组 | 0.96% | 1.82% | 第2天明显升高 |
| 策略一 | 2.03% | 1.89% | 第2天略有下降 |
| 策略二 | 3.36% | 2.52% | 第2天有所下降 |