data_cleaning.ipynb

【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:点击)
  1. import pandas as pd
  2. import numpy as np

2. 数据处理

2.1 数据导入和清洗

  1. # 加载数据,自定义原始数据 header
  2. data = pd.read_csv('https://ds-1300369208.cos.ap-shanghai.myqcloud.com/effect_tb.csv',header = None)
  3. data.columns = ["dt","user_id","label","dmp_id"]
  4. # 日志天数属性用不上,删除该列
  5. data = data.drop(columns = "dt")
  6. data.head(3)

image.png

  1. # 描述性统计
  2. data.describe()

image.png

重复值处理

  1. data.shape
  1. (2645958, 3)

数据行数与独立用户数不统一,检查是否存在重复行:

  1. data[data.duplicated(keep = False)].sort_values(by = ["user_id"])

image.png

  1. data.nunique()
  1. user_id 2410683
  2. label 2
  3. dmp_id 3
  4. dtype: int64

删除重复行,并再次检查

  1. # drop duplicate
  2. data = data.drop_duplicates()
  3. # check if any duplicates left
  4. data[data.duplicated(keep = False)]

空值处理

  1. # check null values
  2. data.info(show_counts = True)
  1. <class 'pandas.core.frame.DataFrame'>
  2. Int64Index: 2632975 entries, 0 to 2645957
  3. Data columns (total 3 columns):
  4. # Column Non-Null Count Dtype
  5. --- ------ -------------- -----
  6. 0 user_id 2632975 non-null int64
  7. 1 label 2632975 non-null int64
  8. 2 dmp_id 2632975 non-null int64
  9. dtypes: int64(3)
  10. memory usage: 80.4 MB

数据集无空值,无需进行处理。

空值的处理流程:pandas dataframe空值的处理方法

异常值处理

通过透视表检查各属性字段是否存在不合理取值,同时查看每个分析组别的样本数量

  1. data.pivot_table(index = "dmp_id", columns = "label", values = "user_id",
  2. aggfunc = "count", margins = True)

image.png
属性字段未发现异常取值,无需进行处理。

2.2 样本容量检验

在进行A/B测试前,需检查样本容量是否满足试验所需最小值。这里借助Evan Miller的样本量计算工具:Sample Size Calculator

首先需要设定点击率基准线以及最小提升比例,我们将对照组的点击率设为基准线.

  1. # 计算对照组的点击率
  2. data[data["dmp_id"] == 1]["label"].mean()
  1. 0.012551012429794775

对照组点击率为1.25%,假定我们希望新的营销策略能让广告点击率至少提升1个百分点,则算得所需最小样本量为:2152。

计算流程

A/B实验样本量计算原理

  1. data["dmp_id"].value_counts()
  1. 1 1905663
  2. 2 411107
  3. 3 316205
  4. Name: dmp_id, dtype: int64

两组营销活动的样本量分别为41.11万和31.62万,满足最小样本量需求。

  1. # 保存清洗好的数据备用
  2. data.to_csv("data/output.csv", index = False)