AB Testing基础与Python实战(二)支付宝营销策略效果分析
1. 数据来源
本文所用数据集来自阿里云天池:
阿里云天池 - Audience Expansion Datasethttps://tianchi.aliyun.com/dataset/50893
该数据集包含三张表,分别记录了支付宝两组营销策略的活动情况:
effect_tb.csv: 广告点击情况数据集
emb_tb_2.csv: 用户特征数据集
seed_cand_tb.csv: 用户类型数据集
本篇文章中主要使用广告点击情况数据集effect_tb.csv。原始数据有四列,用到的是第二列到第四列的数据,涉及字段如下:
user_id:支付宝用户ID
label:用户当天是否点击活动广告(0:未点击,1:点击)
dmp_id:营销策略编号(源数据文档未作说明,这里根据数据情况设定为1:对照组,2:营销策略一,3:营销策略二)
2.数据处理
首先导入所需要的数据与Python 库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 导入数据
data = pd.read_csv(r"audience_expansion\effect_tb.csv",header = None)
data.columns = ["dt","user_id","label","dmp_id"]
# 日志天数属性用不上,删除该列
data = data.drop(columns = "dt")
data.head(3)
查看数据行数与独立用户数检查是否存在重复行:
#数据行数
data.shape
# 去重后行数
data.nunique()
数据行数2645958与独立用户数2410683不统一,检查一下重复行并删除:
#筛选出重复的user_id
data[data.duplicated(keep = False)].sort_values(by = ["user_id"])
# 删除重复的行
data = data.drop_duplicates()
# 再次检查是否有重复的行
data[data.duplicated(keep = False)]
结果为空,已删除所有的重复的user_id
接着看看有没有空白值。
#检查是否有空值
data.info(null_counts = True)
通过结果得到数据集无空值,无需进行处理。
拉一个透视表,生成label和dmp_id两列对应的值的计数情况,看看有没有异常值
data.pivot_table(index = "dmp_id", columns = "label", values = "user_id",
aggfunc = "count", margins = True)
从结果看也没有异常值,无需处理
3.样本量检验
在进行A/B测试前,需检查样本容量是否满足试验所需最小值。当然在实际的AB test中在确定实验方案时就定好了所需要的样本量,这里由于我们拿到的是已有的数据,所以简单做个验证
这里借助之前说到的样本量计算工具:
https://www.evanmiller.org/ab-testing/sample-size.html
首先需要设定点击率基准线以及最小提升比例,我们将对照组的点击率设为基准线,在工具中计算可以得到最小样本量

查看每个每个营销活动的样本数
#按照dmp_id分类计数
data["dmp_id"].value_counts()
两组营销活动的样本量分别为41.11万和31.62万,满足最小样本量需求。
3.假设检验
先计算几组试验的点击率情况
# 计算每组的点击率情况
print("对 照 组: " ,data[data["dmp_id"] == 1]["label"].mean())
print("营销策略一: " ,data[data["dmp_id"] == 2]["label"].mean())
print("营销策略二: " ,data[data["dmp_id"] == 3]["label"].mean())
#输出结果为:
#对 照 组: 0.012551012429794775
#营销策略一: 0.015314747742072015
#营销策略二: 0.026191869198779274
可以看到策略一和策略二相较对照组在点击率上都有不同程度提升。
其中策略一提升0.2个百分点,策略二提升1.3个百分点,只有策略二满足了前面我们对点击率提升最小值的要求。
接下来需要进行假设检验,看策略二点击率的提升是否显著。
a. 原假设和备择假设
记对照组点击率为\(p_1\),策略二点击率为\(p_2\),则:
原假设 H0: \(p_1 ≥ p_2\)
备择假设 H1: \(p_1< p_2\)
b. 分布类型、检验类型和显著性水平
数据结果只有点击和不点击,样本服从二点分布,独立双样本,样本大小n>30,总体均值和标准差未知,所以采用Z检验。显著性水平α取0.05。
c. Z检验的统计量
1.单样本的比例Z检验
用于检验样本比例与总体比例是否有显著差异。其公式为:
\]
其中:
\(\hat{p}\) 是样本比例
\(p\) 是假设的总体比例
\(n\) 是样本量
2.独立双样本的比例Z检验
用于检验两个独立样本的比例是否有显著差异。其公式为:
\]
其中:
\(\hat{p}_1 , \hat{p}_2\)分别是两个样本的比例
\(p_1,p_2\)分别是两个总体的比例
\(n_1,n_2\)分别是两个样本的样本量
当原假设为\(H_0: p_1 = p_2\)也就是总体比例相同时,我们可以使用公式:
\]
其中\(\hat{p} = \frac{x_1 + x_2}{n_1 + n_2}\)是总体的比例
https://www.stats.gov.cn/zs/tjll/csgj/202311/t20231127_1944929.html
首先根据公式手动计算一下检验统计量z:
# 样本数
n_old = len(data[data.dmp_id == 1]) # 对照组
n_new = len(data[data.dmp_id == 3]) # 策略二
# 点击数
c_old = len(data[data.dmp_id ==1][data.label == 1])
c_new = len(data[data.dmp_id ==3][data.label == 1])
# 计算点击率
r_old = c_old / n_old
r_new = c_new / n_new
# 总体点击率
r = (c_old + c_new) / (n_old + n_new)
print("总体点击率:", r)
# 计算检验统计量z
z = (r_old - r_new) / np.sqrt(r * (1 - r)*(1/n_old + 1/n_new))
print("检验统计量z:", z)
计算得出检验统计量z为 -59.44168632985996
# 查α=0.05对应的z分位数
from scipy.stats import norm
z_alpha = norm.ppf(0.05)
z_alpha
当α=0.05是z检验统计量为-1.64, 检验统计量z = -59.44,该检验为左侧单尾检验,拒绝域为{z<z_alpha}。
所以我们可以得出结论:原假设不成立,策略二点击率的提升在统计上是显著的
当然也可以直接根据已有的Python公式计算:
import statsmodels.stats.proportion as sp
z_score, p = sp.proportions_ztest([c_old, c_new],[n_old, n_new], alternative = "smaller")
print("检验统计量z:",z_score,",p值:", p)
检验统计量z: -59.44168632985996 ,p值: 0.0
p值约等于0,p < α,与方法一结论相同,拒绝原假设。
参考文章:
https://zhuanlan.zhihu.com/p/68019926
https://www.heywhale.com/mw/project/5efee4a563975d002c98adba/content

AB Testing基础与Python实战(二)支付宝营销策略效果分析的更多相关文章
- 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程
点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...
- python基础3 ---python数据类型二
ython基础 一.python数据类型 ------列表(list) 1.定义:[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素 特性:可存放多个不同类型的值:可修改指定索 ...
- 网络基础和python(二)
一,五层协议 应用层 端口 传输层 tcp\udp 网络层 ipv4\6 数据链路层 ethernet 物理层 mac 二:什么是变量? 变量:核心在于变和量儿字,变->变 ...
- Python实战二
要求:按照要求完成对文件的增.删.改.查操作. def add(**kwargs): '''新增内容,在指定位置新增''' while True: flag = False with open(&qu ...
- Java并发编程原理与实战二十三:Condition原理分析
先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使condit ...
- Python实战:美女图片下载器,海量图片任你下载
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- 转 Python爬虫实战二之爬取百度贴吧帖子
静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...
- Python实战:爬虫的基础
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
随机推荐
- 物理机burpsuite抓包虚拟机以及Chrome导入burp证书
记录物理机的burpsuite抓包虚拟机谷歌浏览器和遇到的问题总结 从别的地方搬家过来的,图片有水印懒得改了就这样吧,或者改天抹了( 打开虚拟机,网络适配器选择NAT 打开主机的burpsuite,点 ...
- Devops工程师需要具备的10项技能
Facebook.Amazon和Microsoft等公司正在大量使用DevOps技术来确保软件的一致交付,DevOps的的工作机会和所需要的技能集也是越来越多. 在这里,我们将讨论Devops工程师需 ...
- 从源码解析 QGraphicsItem 旋转、缩放、平移、transform等变换操作,利用QGraphicsTransform实现变形动画
QGraphicsItem 有3种方式进行变换:1. 最简单方便的是使用 setRotation() .setScale():2. 使用 setTransform() 进行复杂变换:3. 还可以使用 ...
- RocketMQ消息是如何存储的
RocketMQ的消息存储是一个复杂而高效的过程,设计上充分考虑了性能和扩展性, 消息存储的主要组件包括CommitLog文件.消费队列文件(ConsumerQueue).以及索引文件(IndexFi ...
- JDK的SPI有什么缺陷?dubbo做了什么改进?
JDK的SPI机制的缺点 ⽂件中的所有类都会被加载且被实例化.这样也就导致获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类.如果不想用某些实现类, ...
- 聊聊SpringAI流式输出的底层实现?
在 Spring AI 中,流式输出(Streaming Output)是一种逐步返回 AI 模型生成结果的技术,允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回. ...
- 树莓派智能摄像头实战指南:基于TensorFlow Lite的端到端AI部署
引言:嵌入式AI的革新力量 在物联网与人工智能深度融合的今天,树莓派这一信用卡大小的计算机正在成为边缘计算的核心载体.本文将手把手教你打造一款基于TensorFlow Lite的低功耗智能监控设备,通 ...
- windows快速开启【程序和功能】
程序和功能一般常用的操作是对软件进行卸载. 方式一: 1. Win+R打开运行 2. 输入appwiz.cpl命令 方式二: 1.Win+X打开快捷开关 2. F进去应用和功能 3.点击右侧程序和功能 ...
- 【经验】Git|Windows下如何管理和部署多个Git账号的SSH密钥文件
生成 SSH 密钥 先打开一个git窗口,生成ssh密钥. 如果打开的不是git窗口,而是cmd窗口,则需要先切换到C:\Users\用户名\.ssh目录下. 下面这条指令的your_email和yo ...
- FreeSWITCH Jitter Buffer 技术解析与应用指南
一.概述 freeswitch是一款简单好用的VOIP开源软交换平台. Jitter Buffer(抖动缓冲器)是实时语音通信中解决网络抖动和延迟问题的核心技术.FreeSWITCH通过STFU(So ...