''' A/B测试是为了得到同一个目标进行制定的两个方案,在同一时间维度,分别让组成成分相似的用户群组随机使用一个方案, 最后根据结果进行判断哪一个方案效果好。 数据集来源:阿里云天池
- dmp_id:营销策略编号(这里根据数据情况设定为1:对照组,2:营销策略一,3:营销策略二)
- user_id:支付宝用户ID
- label:用户当天是否点击活动广告(0:未点击,1:点击)
''' ' A/B测试是为了得到同一个目标进行制定的两个方案,在同一时间维度,分别让组成成分相似的用户群组随机使用一个方案, 最后根据结果进行判断哪一个方案效果好。 数据集来源:阿里云天池 ' # 导入相关的包 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测试前,需检查样本容量是否满足试验所需最小值 首先需要设定点击率基准线以及最小提升比例,我们将对照的点击率设为基准线 ''' ' 在进行A/B测试前,需检查样本容量是否满足试验所需最小值 首先需要设定点击率基准线以及最小提升比例,我们将对照的点击率设为基准线 ' 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个百分点, 策略二提升1.3个百分点,只有策略二满足了前面我们对点击率提升最小的要求. 接下来进行假设检验,看策略二点击率的提升是否显著 a 零假设和备择假设 记对照组点击率为p1,策略二点击率为p2,则 零假设H0: p1 >= p2 备择假设H1: p1 < p2 b. 分布类型、检验类型和显著性水平 样本服从二点分布,独立双样本,样本大小n>30,总体均值和标准差未知,所以采用Z检验。显著性水平α取0.05. ' 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:Anacondalibsite-packagesipykernel_launcher.py:7: UserWarning: Boolean Series key will be reindexed to match DataFrame index. import sys D:Anacondalibsite-packagesipykernel_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} # 所以我们可以得到结论:原假设不成立,策略二点击率的提升在统计上是显著的。 于对照组点击率有近一倍,因而在两组营销则略中应该选择第二组进行推广。 #结论 综上所述,两种策略中,策略二对广告的点击率有显著提升效果,且较于对照组点击率有近一倍,因而在两组营销则略中应该选择第二组进行推广。