zoukankan      html  css  js  c++  java
  • 数据分析_支付宝营销结果分析

    '''
    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}
    # 所以我们可以得到结论:原假设不成立,策略二点击率的提升在统计上是显著的。
    于对照组点击率有近一倍,因而在两组营销则略中应该选择第二组进行推广。
    #结论
    综上所述,两种策略中,策略二对广告的点击率有显著提升效果,且较于对照组点击率有近一倍,因而在两组营销则略中应该选择第二组进行推广。
  • 相关阅读:
    欧拉函数 & 【POJ】2478 Farey Sequence & 【HDU】2824 The Euler function
    【BZOJ】2982: combination(lucas定理+乘法逆元)
    【vijos】1781 同余方程(拓展欧几里得)
    Disillusioning #1 水题+原题赛(被虐瞎)
    【HDU】3622 Bomb Game(2-SAT)
    小结:双连通分量 & 强连通分量 & 割点 & 割边
    【POJ】2942 Knights of the Round Table(双连通分量)
    【POJ】1523 SPF(割点)
    【POJ】1094 Sorting It All Out(拓扑排序)
    小结:网络流
  • 原文地址:https://www.cnblogs.com/spp666/p/13657245.html
Copyright © 2011-2022 走看看