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检验

用于检验样本比例与总体比例是否有显著差异。其公式为:

\[Z = \dfrac{\hat{p} - p}{\sqrt{\dfrac{p(1-p)}{n}}}
\]

其中:

\(\hat{p}\) 是样本比例

\(p\) 是假设的总体比例

\(n\) 是样本量

2.独立双样本的比例Z检验

用于检验两个独立样本的比例是否有显著差异。其公式为:

\[Z = \frac{(\hat{p}_1 - \hat{p}_2) - (p_1 - p_2)}{\sqrt{\dfrac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \dfrac{\hat{p}_2(1-\hat{p}_2)}{n_2}}}
\]

其中:

\(\hat{p}_1 , \hat{p}_2\)分别是两个样本的比例

\(p_1,p_2\)分别是两个总体的比例

\(n_1,n_2\)分别是两个样本的样本量

当原假设为\(H_0: p_1 = p_2\)也就是总体比例相同时,我们可以使用公式:

\[Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})(\frac{1}{n_1} + \frac{1}{n_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实战(二)支付宝营销策略效果分析的更多相关文章

  1. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  2. python基础3 ---python数据类型二

    ython基础 一.python数据类型     ------列表(list) 1.定义:[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素 特性:可存放多个不同类型的值:可修改指定索 ...

  3. 网络基础和python(二)

    一,五层协议 应用层    端口 传输层   tcp\udp 网络层   ipv4\6 数据链路层  ethernet 物理层    mac 二:什么是变量? 变量:核心在于变和量儿字,变->变 ...

  4. Python实战二

    要求:按照要求完成对文件的增.删.改.查操作. def add(**kwargs): '''新增内容,在指定位置新增''' while True: flag = False with open(&qu ...

  5. Java并发编程原理与实战二十三:Condition原理分析

    先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使condit ...

  6. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  7. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  8. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  9. Python实战:爬虫的基础

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  10. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

随机推荐

  1. 物理机burpsuite抓包虚拟机以及Chrome导入burp证书

    记录物理机的burpsuite抓包虚拟机谷歌浏览器和遇到的问题总结 从别的地方搬家过来的,图片有水印懒得改了就这样吧,或者改天抹了( 打开虚拟机,网络适配器选择NAT 打开主机的burpsuite,点 ...

  2. Devops工程师需要具备的10项技能

    Facebook.Amazon和Microsoft等公司正在大量使用DevOps技术来确保软件的一致交付,DevOps的的工作机会和所需要的技能集也是越来越多. 在这里,我们将讨论Devops工程师需 ...

  3. 从源码解析 QGraphicsItem 旋转、缩放、平移、transform等变换操作,利用QGraphicsTransform实现变形动画

    QGraphicsItem 有3种方式进行变换:1. 最简单方便的是使用 setRotation() .setScale():2. 使用 setTransform() 进行复杂变换:3. 还可以使用 ...

  4. RocketMQ消息是如何存储的

    RocketMQ的消息存储是一个复杂而高效的过程,设计上充分考虑了性能和扩展性, 消息存储的主要组件包括CommitLog文件.消费队列文件(ConsumerQueue).以及索引文件(IndexFi ...

  5. JDK的SPI有什么缺陷?dubbo做了什么改进?

    JDK的SPI机制的缺点 ⽂件中的所有类都会被加载且被实例化.这样也就导致获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类.如果不想用某些实现类, ...

  6. 聊聊SpringAI流式输出的底层实现?

    在 Spring AI 中,流式输出(Streaming Output)是一种逐步返回 AI 模型生成结果的技术,允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回. ...

  7. 树莓派智能摄像头实战指南:基于TensorFlow Lite的端到端AI部署

    引言:嵌入式AI的革新力量 在物联网与人工智能深度融合的今天,树莓派这一信用卡大小的计算机正在成为边缘计算的核心载体.本文将手把手教你打造一款基于TensorFlow Lite的低功耗智能监控设备,通 ...

  8. windows快速开启【程序和功能】

    程序和功能一般常用的操作是对软件进行卸载. 方式一: 1. Win+R打开运行 2. 输入appwiz.cpl命令 方式二: 1.Win+X打开快捷开关 2. F进去应用和功能 3.点击右侧程序和功能 ...

  9. 【经验】Git|Windows下如何管理和部署多个Git账号的SSH密钥文件

    生成 SSH 密钥 先打开一个git窗口,生成ssh密钥. 如果打开的不是git窗口,而是cmd窗口,则需要先切换到C:\Users\用户名\.ssh目录下. 下面这条指令的your_email和yo ...

  10. FreeSWITCH Jitter Buffer 技术解析与应用指南

    一.概述 freeswitch是一款简单好用的VOIP开源软交换平台. Jitter Buffer(抖动缓冲器)是实时语音通信中解决网络抖动和延迟问题的核心技术.FreeSWITCH通过STFU(So ...