Udacity(优达学城) 在线教育平台

目录

一、实验概述

(一)实验现状

(二)实验变化

(三)实验假设

二、策略选择

(一)不变指标—用于健全性检查

(二)评估指标

三、指标的基线值(baseline)

四、估计标准差

(一)缩放数据

(二)估计标准差

1、总转化率 Gross Conversion

2、保留率 Retention

3、净转化率 Net Conversion

五、实验样本量计算

(一)获得z_score临界值和标准差

1、总转化率 GC

2、保留率Retention(该指标不用)

3、净转化率 NC

六、数据导入

(一)数据质量检查

1、检查用户数

2、检查点击免费试用按钮的用户数

3、检查概率差异的合理性(点击免费试用按钮的概率)

(二)指标样本量检查

1、GC

2、NC

(三)符号测试 进行双重检查

七、结论与建议


一、实验概述

(一)实验现状

  • 主页上有两个选项:“开始免费试学”和“访问课程资料”

——若学生点击“开始免费试学”,系统将要求他们输入信用卡信息,然后他们将进入付费课程版本的免费试学。14天后,将对他们自动收费,除非他们在此期限结束前取消试用。
——若学生点击“访问课程材料”,他们将能够观看视频和免费进行小测试,但是他们不会获得导师指导支持或验证证书,无法提交最终项目来获取反馈。

(二)实验变化

  • 测试一项变化:

如果学生点击“开始免费试学”,系统会问他们有多少时间投入到这个课程中。 如果学生表示每周5小时或更多,将按常规程序进行登录。

如果他们表示一周不到5小时,将**弹出一条消息说明优达学城的课程通常需要更多的时间投入才能成功完成**,并建议学生可免费访问课程资料。

但无论如何,学生都可以选择继续参加免费试用课程或免费试学。

(三)实验假设

  • 原假设:有弹窗后,会减少因时间不足而放弃课程的学员,但对付费学员不会产生太大影响。

若原假设为真,则优达学城将改进整体学生体验,可以提高整体用户的课程完成率,另一方面也可以为辅助老师减压,让他们专注于那些可以投入更多时间的用户

  • 转移单位为cookie

尽管学生参加的是免费试学,但在登录后他们的用户 id 便被跟踪。同一个用户 id 不能两次参加免费试学。对于不参加免费试学的用户,他们的用户 id 不会在试验中被跟踪,即使他们在访问课程概述页面时登录了网站。

二、策略选择

一个成功的实验需要两种标准:不变指标+评估指标

(一)不变指标—用于健全性检查

确保我们的实验(我们对一部分人群进行改变的方式,以及我们收集数据的方式)没有本质上的错误。意味着选择的指标,认为不受影响,后来确保这些指标在控制和实验组之间没有大幅度改变。

cookie的数量: 访问课程页面的唯一cookie数量(可理解为用户id数量) 最小=3000
独立访客数:去重cookies计数
点击次数:点击“免费试学”的cookie数量  最小=240
点击概率:点击“免费试学”的cookie数量/总cookie数量  最小=0.01

(二)评估指标

是我们期望看到变化的指标,与我们目标实现的业务目标相关。

对于每个指标,我们都声明了一个Dmin,它标志着对业务实际意义重大的最小变化

eg.任何低于2%的保留率增长,即使在统计上显著,对企业来说都是不实际的。

  • 总转化率(Gross Conversion):课程等级用户数/免费试学按钮点击量
  • 净转化率(Net Conversion):课程付费用户数/免费试学按钮点击量

(同一个用户id不能登记两次免费试用课程)
用户ID虽然被记录在事件发生之后,但可能受到分组的影响所导致评估效果产生误差,故不选用。
留存率则是因为在后续的计算过程中发现所需的页面浏览数量过多,并导致实验时间过长,故不选择作为评估指标。
根据原假设,希望:总转化率减小,净转化率基本不变。

  • (retention 指标没有用到)

保留率的基线概率是付费用户数(14天免费后注册)除以总注册用户数。

三、指标的基线值(baseline)

在开始实验之前,应该知道这些指标在变化之前是如何表现的——即它们的基线值是什么。

应该是从日常数据中聚合得到的(日均):

import math as mt
import numpy as np
import pandas as pd
from scipy.stats import normfrom IPython.core.interactiveshell import InteractiveShell   #多行输出
InteractiveShell.ast_node_interactivity = "all" baseline={'Cookies':40000,'Clicks':3200,'Enrollments':660,'CTP':0.08,'GConversion':0.20625,'NConversion':0.109313,'Retention':0.53
}

四、估计标准差

一个指标的变化越大,就越难取得显著的结果。假设每天访问课程概览页面的样本量为5000个cookie(如项目说明中所示),我们只想估计评估指标的标准偏差。我们正在考虑的样本量应该小于我们收集的“群体”,并且足够小,可以有两个这样大小的群体。

(一)缩放数据

根据我们为方差估计指定的样本大小来调整收集的度量计数估计。
在这种情况下,每天访问课程概览页面的40000个cookie中,具有唯一性的cookie只有5000个

#缩放数据
baseline['Cookies']=500
baseline['Clicks']=baseline['Clicks']*(5000/40000)
baseline['Enrollments']=baseline['Enrollments']*(5000/40000)
baseline
#绝对量进行缩放,相对比值指标保持不变
{'Cookies': 500,'Clicks': 400.0,'Enrollments': 82.5,'CTP': 0.08,'GConversion': 0.20625,'NConversion': 0.109313,'Retention': 0.53}

(二)估计标准差

假设概率p^满足二项分布,以课程登记转化率(Gross Conversion)来说,课程登记用户数/免费试用按钮点击量,一次点击,要么登记课程,要么退回,不登记课程,所以这个转化率对应二项分布中事件成功发生的概率p,那么总体方差为np(1-p),由中心极限定理,从总体抽取一定样本,样本标准差的估计量为:

所以,对于每个指标,需要插入三列变量:p^ 、n、SD

1、总转化率 Gross Conversion

#总转化率 Gross Conversion
GC={}
GC['d_min']=0.01
GC['p']=baseline['GConversion']
GC['n']=baseline['Clicks']
GC['sd']=round(mt.sqrt(GC['p']*(1-GC['p'])/GC['n']),4)   #四舍五入为4位小数
GC
{'d_min': 0.01, 'p': 0.20625, 'n': 400.0, 'sd': 0.0202}

2、保留率 Retention

是付费用户数(14天免费后注册)除以总注册用户数。换句话说,考虑到入学人数,支付的可能性。样本量是注册用户的数量。在这种情况下,分流单位不等于分析单位(登记的用户),因此分析估计是不够的——如果我们有这些估计的数据,我们也希望从经验上估计这种差异。

#Retention
R={}
R['d_min']=0.01
R['p']=baseline['Retention']
R['n']=baseline['Enrollments']
R['sd']=round(mt.sqrt((R['p']*(1-R['p']))/R['n']),4)
R
{'d_min': 0.01, 'p': 0.53, 'n': 82.5, 'sd': 0.0549}

3、净转化率 Net Conversion

NC={}
NC['d_min']=0.0075
NC['p']=baseline['NConversion']
NC['n']=baseline['Clicks']
NC['sd']=round(mt.sqrt(NC['p']*(1-NC['p'])/NC['n']),4)
NC
{'d_min': 0.0075, 'p': 0.109313, 'n': 400.0, 'sd': 0.0156}

五、实验样本量计算

可以计算出我们需要的样本的数量,这样实验具有足够的统计能力,以及显著性。

α=0.05(第一类错误)和β=0.2(第二类错误)

可检测变化( d =Dmin)和基线转换率p ^

原假设:Pexp-Pcont=d

需要计算:

  • 1-α/2和1-β的z_score临界值
  • sd1和sd2,即基线和预期变化率的标准差

(一)获得z_score临界值和标准差

#获得z_score临界值和标准差
def get_z_score(alpha):return norm.ppf(alpha)
#找到正态分布中分布函数为x时对应的x轴的点(是求积分的反向操作)
norm.ppf(0.95)
norm.ppf(0.975)def get_sds(p,d):sd1=mt.sqrt(2*p*(1-p))sd2=mt.sqrt(p*(1-p)+(p+d)*(1-(p+d)))sds=[sd1,sd2]return sds#计算每组所需的最小样本量
def get_samplesize(sds,alpha,beta,d):n=pow((get_z_score(1-alpha/2)*sds[0]+get_z_score(1-beta)*sds[1]),2)/pow(d,2)return n
#pow(x,y) 计算x的y次方
1.6448536269514722
1.959963984540054

(二)计算各指标的样本量

1、总转化率 GC

# 将d 参数添加到每个度量的每个度量特征中:
GC['d']=0.01
R['d']=0.01
NC['d']=0.0075#总转化率(Gross Conversion)样本值:
GC['samplesize']=round(get_samplesize(get_sds(GC['p'],GC['d']),0.05,0.2,GC['d']))
GC
#如果我们在5000次页面浏览中点击了400次(400/5000=0.08)->
#那么,我们将再次需要GC[“SampSize”]/0.08=322938次页面浏览,每组!
GC['samplesize']=round(GC['samplesize']/0.08*2)
GC
{'d_min': 0.01,'p': 0.20625,'n': 400.0,'sd': 0.0202,'d': 0.01,'samplesize': 25835}
{'d_min': 0.01,'p': 0.20625,'n': 400.0,'sd': 0.0202,'d': 0.01,'samplesize': 645875}

2、保留率Retention(该指标不用)

R['samplesize']=round(get_samplesize(get_sds(R['p'],R['d']),0.05,0.2,R['d']))
R
#意味着我们需要39087个用户,每个组注册!
#我们必须首先将其转换为点击的Cookie,然后转换为查看页面的Cookie,最后转换为两组的multipky。
R['samplesize']=round(R['samplesize']/0.08/0.20625*2)
R
#将使我们的页面总浏览量高达400多万次,这几乎是不可能的.
#因为我们知道我们每天获得大约40000次,这将需要100多天的时间。
#这意味着我们必须放弃这个指标,而不是继续使用它,因为我们的实验结果(小得多)会有偏差。

3、净转化率 NC

NC['samplesize']=round(get_samplesize(get_sds(NC['p'],NC['d']),0.05,0.2,NC['d']))
NC
NC['samplesize']=round(NC['samplesize']/0.08*2)
NC
#需要有685325个cookies查看页面。这比总转换所需的要多,所以这将是我们的数字。
#假设我们每天有80%的页面浏览量,这个实验的数据收集周期(实验被揭示的时间)大约为3周。
{'d_min': 0.0075,'p': 0.109313,'n': 400.0,'sd': 0.0156,'d': 0.0075,'samplesize': 27413}

Out[12]:

{'d_min': 0.0075,'p': 0.109313,'n': 400.0,'sd': 0.0156,'d': 0.0075,'samplesize': 685325}

六、数据导入

control=pd.read_csv('C:/Users/ZJDCUser/Desktop/比赛实战/Udacity弹窗测试-abtest/control_data.csv')
control
experiment=pd.read_csv('C:/Users/ZJDCUser/Desktop/比赛实战/Udacity弹窗测试-abtest/experiment_data.csv')
experiment

(一)数据质量检查

检查实验组与控制组之间的差异,有三个不变指标

1、检查用户数

pageviews_cont=control['Pageviews'].sum()
pageviews_exp=experiment['Pageviews'].sum()
pageviews_total=pageviews_cont+pageviews_exp
print('对照组pageviews总数:',pageviews_cont)
print('实验组pageviews总数:',pageviews_total)
#数字很接近。
对照组pageviews总数: 345543
实验组pageviews总数: 690203

但要确保数量上的差异不显著,是随机的,甚至和我们预期的一样。
预计对照组的浏览量约为两组总浏览量的一半(50%),由中心极限定理得,二项分布近似为正态分布(当n足够大时)

想测试:观察到的 p ^ (对照组的样本数除以两组的总数)是否与 p = 0.5有显著差异。

置信区间:

当我们观察到的 p^在这个范围内时,一切正常,测试通过。

p=0.5
alpha=0.05
p_hat=round(pageviews_cont/pageviews_total,4)
sd=mt.sqrt(p*(1-p)/pageviews_total)
ME=round(get_z_score(1-alpha/2)*sd,4)
print('置信区间:[',p-ME,',',p+ME,'];p_hat',p_hat)
#p_hat 在置信区间范围内,说明组间样本数量的差异是预期的。
置信区间:[ 0.4988 , 0.5012 ];p_hat 0.5006

2、检查点击免费试用按钮的用户数

clicks_cont=control['Clicks'].sum()
clicks_exp=experiment['Clicks'].sum()
clicks_total=clicks_cont+clicks_exp
p_hat=round(clicks_cont/clicks_total,4)
sd=mt.sqrt(p*(1-p)/clicks_total)
ME=round(get_z_score(1-alpha/2)*sd,4)
print('置信区间:[',p-ME,',',p+ME,'];p_hat',p_hat)
#p_hat 在置信区间范围内,说明组间样本数量的差异是预期的。
置信区间:[ 0.4959 , 0.5041 ];p_hat 0.5005

3、检查概率差异的合理性(点击免费试用按钮的概率)

希望看到:

合并标准误差(pooled standard error):

ctp_cont=clicks_cont/pageviews_cont
ctp_exp=clicks_exp/pageviews_exp
d_hat=round(ctp_exp-ctp_cont,4)
p_pooled=clicks_total/pageviews_total
sd_pooled=mt.sqrt(p_pooled*(1-p_pooled)*(1/pageviews_cont+1/pageviews_exp))
ME=round(get_z_score(1-alpha/2)*sd_pooled,4)
print('置信区间:[',0-ME,',',0+ME,'];d_hat',d_hat)
#d_hat在置信区间范围内 通过检验
置信区间:[ -0.0013 , 0.0013 ];d_hat 0.0

(二)指标样本量检查

注意 列出了39天的浏览量和点击量  但只列出了23天的注册与付款。
因此。在处理注册与付款时,应注意到只使用相应的页面浏览和点击,而不是全部。

clicks_cont=control['Clicks'].loc[control['Enrollments'].notnull()].sum()
clicks_exp=experiment['Clicks'].loc[experiment['Enrollments'].notnull()].sum()
enrollments_cont=control['Enrollments'].sum()
enrollments_exp=experiment['Enrollments'].sum()

1、GC

#总转化率=注册数/点击数
GC_cont=enrollments_cont/clicks_cont
GC_exp=enrollments_exp/clicks_exp
GC_pooled=(enrollments_cont+enrollments_exp)/(clicks_cont+clicks_exp)
GC_sd_pooled=mt.sqrt(GC_pooled*(1-GC_pooled)*(1/clicks_cont+1/clicks_exp))
GC_ME=round(get_z_score(1-alpha/2)*GC_sd_pooled,4)
GC_diff=round(GC_exp-GC_cont,4)
print('实验变化率为:',GC_diff*100,'%')
print('置信区间:[',GC_diff-GC_ME,',',GC_diff+GC_ME,']')
#可看出置信区间不包括0,变化是显著的。dmin=0.01
#表示:由于弹出窗口的原因,参加免费试用的人数减少了
实验变化率为: -2.06 %
置信区间:[ -0.0292 , -0.012 ]

2、NC

#净准换率=付款次数/点击数
payments_cont=control['Payments'].sum()
payments_exp=experiment['Payments'].sum()NC_cont=payments_cont/clicks_cont
NC_exp=payments_exp/clicks_exp
NC_pooled=(payments_cont+payments_exp)/(clicks_cont+clicks_exp)
NC_sd_pooled=mt.sqrt(NC_pooled*(1-NC_pooled)*(1/clicks_cont+1/clicks_exp))
NC_ME=round(get_z_score(1-alpha/2)*NC_sd_pooled,4)
NC_diff=round(NC_exp-NC_cont,4)
print('实验变化率为:',NC_diff*100,'%')
print('置信区间:[',NC_diff-NC_ME,',',NC_diff+NC_ME,']')
#得到的变化小于0.5%,是一个非常小的下降,在统计上不显著
实验变化率为: -0.49 %
置信区间:[ -0.0116 , 0.0018000000000000004 ]

(三)符号测试 进行双重检查

七、结论与建议

可看出总转化率的变化确实显著,而净转化率的变化则不显著。
实际潜在目标没有实现(通过提前询问付费用户是否有时间投资课程来增加他们的比例),只能建议不要继续改变。

【实战】Udacity弹窗测试—ABtest相关推荐

  1. Google官方网络框架Volley实战——QQ吉凶测试,南无阿弥陀佛!

    Google官方网络框架Volley实战--QQ吉凶测试,南无阿弥陀佛! 这次我们用第三方的接口来做一个QQ吉凶的测试项目,代码依然是比较的简单 无图无真相 直接撸代码了,详细解释都已经写在注释里了 ...

  2. 实战Perl脚本测试

    实战Perl脚本测试(转) 这是一篇关于perl脚本测试的总结性文章,其中提到了很多实用的模块,如果文中介绍的不够详细,请到cpan上搜索该模块并查阅其文档.  1基本语法检查 Perl语言的哲学是& ...

  3. vue3 antd项目实战——Modal弹窗自定义遮罩 (利用maskStyle属性自定义遮罩样式)

    vue3 antd项目实战--Modal弹窗自定义遮罩 maskStyle 知识回调 场景复现 关于mask遮罩的API属性 利用maskStyle属性自定义遮罩样式 知识回调 文章内容 文章链接 v ...

  4. ant4 多个form 验证_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...

    点击上方"早起Python",关注并"星标" 每日接收Python干货! 本文含 3321 字,9代码片段建议阅读 8 分钟 前言 在我们写爬虫的过程中,目标网 ...

  5. python爬虫遇到验证码、输入验证码后提醒验证码错误_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...

    前言 在我们写爬虫的过程中,目标网站常见的干扰手段就是设置验证码等,本就将基于Selenium实战讲解如何处理弹窗和验证码,爬取的目标网站为某仪器预约平台 可以看到登录所需的验证码构成比较简单,是彩色 ...

  6. 爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 远芳侵古道,晴翠接荒城. 前言 在 ...

  7. 硬核开篇:Arco Vue + Flask 手把手实战开发一测试需求平台

    ✍ 此系列为整理分享已完结入门搭建<TPM提测平台>系列的迭代版,拥抱Vue3.0将前端框架替换成字节最新开源的arco.design,其中约60%重构和20%新增内容,定位为从 0-1手 ...

  8. 数据分析实战 | A/B测试探寻哪种广告点击率更高?

    大家好,我是丁小杰. 本篇是<数据分析实战>系列第三篇,案例来源为<数据分析实战>一书,书中使用的是 R 语言,接下来一段时间,我会用 Python + Tableau/Pye ...

  9. python数据分析答案_知到_Python数据分析实战_章节测试答案

    摘要: ... 费用本质上是企业资源的流出,是资产的耗费,其目的是为了(  ). A:取得收入 B:降低成本 C:增加权益 D:减少负债 正确答案:A 答案解析:费用可能表现为资产的减少,或负债的增加 ...

  10. CMake实战之安装测试和添加环境生成安装包

    1.安装测试 CMake 也可以指定安装规则,以及添加测试.这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行.在 GNU Makefil ...

最新文章

  1. MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...
  2. R使用交叉验证(cross validation)进行机器学习模型性能评估
  3. 双线程猜数字 TwoThreadGuessNumber.java
  4. 如何在ABAP ALV中具体的控制每个格子中的编辑属性
  5. wxWidgets:命名空间
  6. 国产操作系统进入被彻底抛弃的时代
  7. 点击图片显示大图(有多张图片可以左右滑动)
  8. 点赞功能设计,网上的,留个底
  9. cmd jar 无效_为什么我的JAR文件以CMD执行,而不是双击执行?
  10. numpy 矩阵拼接_Python实践代码总结第10集(Numpy)
  11. 偶然的相遇【我与51CTO的故事】
  12. 计算机查找dll文件,电脑弹窗提示dll文件丢失怎么办?看我如何快速解决吧!
  13. 反编译PyInstaller打包后的exe为py源码
  14. android网上书城管理源代码,网上书店管理系统(附程序源代码).doc
  15. 超好用的数学公式识别软件mathpix!
  16. 随便写了个猪八戒网的任务小助手“小八戒”,需要的拿去
  17. 【网速监控工具——TrafficMonitor 】的下载安装使用教程
  18. 新中大服务器端数据库未能连接,新中大服务器数据库未能连接
  19. 阿里云服务器使用配置
  20. mysql查询性能测试工具_MySQL性能测试工具MySQLslap使用实例详解

热门文章

  1. 鼠标中键控制音量大小
  2. 一种高带外抑制Ku波段滤波器设计
  3. win7安装php失败,win7打印机驱动安装失败怎么办
  4. Vue中Swiper以及vue-awesome-swiper的安装和问题
  5. 【学习笔记】数理统计习题十二
  6. 电脑香港,香港购物:在HK买笔记本电脑都要注意什么?
  7. Oracle 19c对VARCHAR2的限制
  8. WIN10外接显示器有妙招
  9. 计算机加法器原理,加法器原理
  10. 读研整活笔记1:调研编译器solang