【A/B测试】支付宝营销策略效果分析
1. 数据来源
数据集来自阿里云天池:
阿里云天池 - Audience Expansion Dataset
该数据集包含三张表,分别记录了支付宝两组营销策略的活动情况:
- emb_tb_2.csv: 用户特征数据集
- effect_tb.csv: 广告点击情况数据集
- seed_cand_tb.csv: 用户类型数据集
本分析报告主要使用广告点击情况数据,涉及字段如下: - dmp_id:营销策略编号(源数据文档未作说明,这里根据数据情况设定为1:对照组,2:营销策略一,3:营销策略二)
- user_id:支付宝用户ID
- label:用户当天是否点击活动广告(0:未点击,1:点击)
import pandas as pdimport numpy as np
2. 数据处理
2.1 数据导入和清洗
# 加载数据,自定义原始数据 headerdata = pd.read_csv('https://ds-1300369208.cos.ap-shanghai.myqcloud.com/effect_tb.csv',header = None)data.columns = ["dt","user_id","label","dmp_id"]# 日志天数属性用不上,删除该列data = data.drop(columns = "dt")data.head(3)

# 描述性统计data.describe()
重复值处理
data.shape
(2645958, 3)
数据行数与独立用户数不统一,检查是否存在重复行:
data[data.duplicated(keep = False)].sort_values(by = ["user_id"])

data.nunique()
user_id 2410683label 2dmp_id 3dtype: int64
删除重复行,并再次检查
# drop duplicatedata = data.drop_duplicates()# check if any duplicates leftdata[data.duplicated(keep = False)]
空值处理
# check null valuesdata.info(show_counts = True)
<class 'pandas.core.frame.DataFrame'>Int64Index: 2632975 entries, 0 to 2645957Data columns (total 3 columns):# Column Non-Null Count Dtype--- ------ -------------- -----0 user_id 2632975 non-null int641 label 2632975 non-null int642 dmp_id 2632975 non-null int64dtypes: int64(3)memory usage: 80.4 MB
数据集无空值,无需进行处理。
空值的处理流程:pandas dataframe空值的处理方法
异常值处理
通过透视表检查各属性字段是否存在不合理取值,同时查看每个分析组别的样本数量
data.pivot_table(index = "dmp_id", columns = "label", values = "user_id",aggfunc = "count", margins = True)

属性字段未发现异常取值,无需进行处理。
2.2 样本容量检验
在进行A/B测试前,需检查样本容量是否满足试验所需最小值。这里借助Evan Miller的样本量计算工具:Sample Size Calculator
首先需要设定点击率基准线以及最小提升比例,我们将对照组的点击率设为基准线.
# 计算对照组的点击率data[data["dmp_id"] == 1]["label"].mean()
0.012551012429794775
对照组点击率为1.25%,假定我们希望新的营销策略能让广告点击率至少提升1个百分点,则算得所需最小样本量为:2152。
data["dmp_id"].value_counts()
1 19056632 4111073 316205Name: dmp_id, dtype: int64
两组营销活动的样本量分别为41.11万和31.62万,满足最小样本量需求。
# 保存清洗好的数据备用data.to_csv("data/output.csv", index = False)
