'''
A/B测试是为了得到同一个目标进行制定的两个方案,在同一时间维度,分别让组成成分相似的用户群组随机使用一个方案,
最后根据结果进行判断哪一个方案效果好。
数据集来源:阿里云天池
- dmp_id:营销策略编号(这里根据数据情况设定为1:对照组,2:营销策略一,3:营销策略二)
- user_id:支付宝用户ID
- label:用户当天是否点击活动广告(0:未点击,1:点击)
'''
'\nA/B测试是为了得到同一个目标进行制定的两个方案,在同一时间维度,分别让组成成分相似的用户群组随机使用一个方案,\n最后根据结果进行判断哪一个方案效果好。\n\n数据集来源:阿里云天池\n\n'
# 导入相关的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
alipay_audi_exp4076/
# 导入数据并进行处理
data = pd.read_csv("alipay_audi_exp4076/effect_tb.csv",header = None,names = ['dt','userid','label','dmp_id'])
data.head()
dt userid label dmp_id
0 1 1 0 1
1 1 1000004 0 1
2 1 1000004 0 2
3 1 1000006 0 1
4 1 1000006 0 3
umns=
# 根据后面的计算,dt列在后面的处理中用不到,给予删除
data = data.drop(columns='dt')
data.head()
userid label dmp_id
0 1 0 1
1 1000004 0 1
2 1000004 0 2
3 1000006 0 1
4 1000006 0 3
描述性统计
# 查查描述性统计
data.describe()
userid label dmp_id
count 2.645958e+06 2.645958e+06 2.645958e+06
mean 3.112995e+06 1.456297e-02 1.395761e+00
std 1.828262e+06 1.197952e-01 6.920480e-01
min 1.000000e+00 0.000000e+00 1.000000e+00
25% 1.526772e+06 0.000000e+00 1.000000e+00
50% 3.062184e+06 0.000000e+00 1.000000e+00
75% 4.721132e+06 0.000000e+00 2.000000e+00
max 6.265402e+06 1.000000e+00 3.000000e+00
data.shape
# 查看是否有重复值以及相关的处理
data.shape
(2645958, 3)
data.duplicated().sum()
12983
data
data = data.drop_duplicates()
data
userid label dmp_id
0 1 0 1
1 1000004 0 1
2 1000004 0 2
3 1000006 0 1
4 1000006 0 3
5 1000007 0 1
6 1000008 0 3
7 1000014 0 1
8 1000016 0 3
9 1000018 0 1
10 1000018 0 3
11 100002 0 1
12 1000020 0 3
13 1000024 0 1
14 1000025 0 1
15 1000028 0 2
16 1000029 0 1
17 1000034 0 1
18 1000036 0 1
19 100004 0 1
20 1000040 0 2
21 1000046 0 3
22 1000049 0 1
23 1000057 0 1
24 1000058 0 3
25 1000059 0 1
26 1000060 0 2
27 1000064 0 1
28 1000067 0 1
29 100007 0 1
... ... ... ...
2645928 999814 0 1
2645929 999819 0 1
2645930 999837 0 1
2645931 999840 0 1
2645932 999843 0 1
2645933 999858 0 2
2645934 999858 0 3
2645935 999863 0 2
2645936 999864 0 1
2645937 999865 0 1
2645938 999875 0 1
2645939 999877 0 1
2645940 99988 0 1
2645941 999889 0 1
2645942 999909 0 1
2645943 999910 0 1
2645944 999911 0 2
2645945 999911 0 3
2645946 999915 0 1
2645947 999940 0 2
2645948 999955 0 1
2645949 999957 0 1
2645950 999958 0 1
2645951 999960 0 1
2645952 999965 0 1
2645953 999966 0 1
2645954 999971 0 1
2645955 99999 0 2
2645956 999990 0 1
2645957 999992 1 1
2632975 rows × 3 columns
data.info(null_counts = True)
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2632975 entries, 0 to 2645957
Data columns (total 3 columns):
userid 2632975 non-null int64
label 2632975 non-null int64
dmp_id 2632975 non-null int64
dtypes: int64(3)
memory usage: 80.4 MB
# 异常值的检查
# 通过透视表检查各属性字段是够存在不合理取值
data.pivot_table(index='dmp_id',columns = 'label',values='userid',aggfunc = 'count',margins=True)
label 0 1 All
dmp_id
1 1881745 23918 1905663
2 404811 6296 411107
3 307923 8282 316205
All 2594479 38496 2632975
d
# 查看字段类型
data.dtypes
userid int64
label int64
dmp_id int64
dtype: object
# 样本容量检验
'''
在进行A/B测试前,需检查样本容量是否满足试验所需最小值
首先需要设定点击率基准线以及最小提升比例,我们将对照的点击率设为基准线
'''
'\n在进行A/B测试前,需检查样本容量是否满足试验所需最小值\n首先需要设定点击率基准线以及最小提升比例,我们将对照的点击率设为基准线\n'
l
data[data['dmp_id'] == 1]['label'].mean()
0.012551012429794775
# 对照组点击率为1.26%,假定我们希望新的营销策略能让广告点击率至少提升1分百分点,则算的最小样本量为:2167
data['dmp_id'].value_counts()
1 1905663
2 411107
3 316205
Name: dmp_id, dtype: int64
,index=False
# 两组营销活动的样本量分别为41.11万和31.62万,满足最小样本需求
# 将处理好的数据保存
data.to_csv('data_ali_output.csv',index=False)
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 零假设和备择假设
记对照组点击率为p1,策略二点击率为p2,则
零假设H0: p1 >= p2
备择假设H1: p1 < p2
b. 分布类型、检验类型和显著性水平
样本服从二点分布,独立双样本,样本大小n>30,总体均值和标准差未知,所以采用Z检验。显著性水平α取0.05.
'''
'根据结果可以看到策略一和策略二都有一定的提升,其中策略一提升0.2个百分点,\n策略二提升1.3个百分点,只有策略二满足了前面我们对点击率提升最小的要求.\n\n接下来进行假设检验,看策略二点击率的提升是否显著\n\na 零假设和备择假设\n记对照组点击率为p1,策略二点击率为p2,则\n 零假设H0: p1 >= p2\n 备择假设H1: p1 < p2\n\nb. 分布类型、检验类型和显著性水平\n样本服从二点分布,独立双样本,样本大小n>30,总体均值和标准差未知,所以采用Z检验。显著性水平α取0.05.\n\n'
r
# 公式计算
# 用户数
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)
r
D:\Anaconda\lib\site-packages\ipykernel_launcher.py:7: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
import sys
D:\Anaconda\lib\site-packages\ipykernel_launcher.py:8: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
0.014492310074225832
z
# 计算检验统计量Z
z = (r_old - r_new) / np.sqrt(r *(1-r)*(1/n_old + 1/n_new))
z
-59.44168632985996
z_alpha
# 查看α=0.05对应的Z分位数
from scipy.stats import norm
z_alpha = norm.ppf(0.05)
z_alpha
-1.6448536269514729
是显著的。
# z_alpha = -1.64,检验统计量z=-59.44,该检验为左侧单位检验,拒绝域为{z<z_alpha}
# 所以我们可以得到结论:原假设不成立,策略二点击率的提升在统计上是显著的。
于对照组点击率有近一倍,因而在两组营销则略中应该选择第二组进行推广。
#结论
综上所述,两种策略中,策略二对广告的点击率有显著提升效果,且较于对照组点击率有近一倍,因而在两组营销则略中应该选择第二组进行推广。