ABTest结果验证

ABTest结果验证

一:函数介绍

pdf:概率密度函数 ——注意和正态分布函数不一样

ppf:分位点函数(CDF的逆)——即根据给定概率求临界点的值,注意这里的概率是从左侧开始算的。

cdf:累计分布函数 ——即pdf曲线下方面积,也即概率,是从左侧开始计算的,所以可以看到x越大,cdf的值越大

二:cdf(x,μ,σ) 参数介绍:

2.1 cdf(x) 默认 服从 μ=0,σ=1 的正态分布,结果表示 x 在 正态分布N(0,1)中左侧检验的结果概率P值

2.2 cdf(x , 2 , 3) 表示: x出现在正态N(2,3) 中左侧检验的结果概率P值

三:demo

1.1 ppf 通过α计算分布临界值
from scipy import stats
α=0.05
β=0.2
z_α = stats.norm.ppf(1-α/2)
z_β = stats.norm.ppf(1-β)
print(z_α) #1.959963984540054
print(z_β) #0.8416212335729143
1.2 cdf 计算左侧检验P值
from scipy import stats

stats.norm.cdf(-1.64) #0.05050258347410371
# cdf(x,μ,σ)
1.3cdf 计算右侧检验P值
from scipy import stats

1 - stats.norm.cdf(1.64) #0.050502583474103746
# 使用 1-结果,是因为cdf() 结果默认是左侧检验,所以如果H0:μ<=μ0,属于右侧检验的时候就需要使用 1-stats.norm.cdf()

四:ABTest 结果检验–左侧检验

题目:指标在测试后的结果不能低于测试前的结果的2个标准差

数据:组A为对照组,组B为测试组

1.数据准备
import pandas as pd
import numpy as np
from scipy import stats
#1.数据准备
data = pd.DataFrame(
    data=np.random.randint(10,50,size=(100,2)),
    columns=[['A','B']]
)
A = data['A']
B = data['B']
2.临界值
#2.计算对照组的2个标准差是多少
#临界值
linjiezhi = data['A'].std()*2 #6.019363
3.计算均值差

x ˉ A − x ˉ B \bar x_A - \bar x_B xˉAxˉB

#3.均值之差
a_mean = data['A'].mean()
b_mean = data['B'].mean()
diff_μ = float(a_mean) - float(b_mean) 
print(diff_μ) #0.6400000000000006
4.计算方差

s A 2 n A + s B 2 n B \frac {s_A ^2}{n_A} + \frac {s_B ^2}{n_B} nAsA2+nBsB2

var_a = data.A.var()/data.A.count()
var_b = data.B.var()/data.B.count()
var = float(var_a) + float(var_b)
print(var) #0.1761131313131313
5.均值之差服从的正态分布

x ˉ A − x ˉ B   N ( l i n j i e z h i , v a r ) 代 入 数 值 : l i n j i e z h i = 6.019363 / v a r = 0.1761131313131313 \bar x_A - \bar x_B ~ N(linjiezhi, \sqrt var) \\ 代入数值:linjiezhi=6.019363 / var=0.1761131313131313 xˉAxˉB N(linjiezhi,v ar):linjiezhi=6.019363/var=0.1761131313131313

6.计算均值只差在分布中的概率P值

H0: μA-μB>=6.019363

H1:μA-μB<6.019363

所以改假设检验属于 左侧 检验

P = stats.norm.cdf(diff_μ,loc=linjiezhi,scale=np.sqrt(var)) # norm.dist
print(P) #6.46430124e-38

结论:拒绝H0 , 不拒绝H1 , 所以测试组结果下降小于2个标准差

五:ABTest 结果检验–右侧检验

题目:指标在测试后要提升30%

数据:组A为对照组,组B为测试组

1.数据准备
import pandas as pd
import numpy as np
from scipy import stats
#1.数据准备
data = pd.DataFrame(
    data=np.random.randint(10,50,size=(100,2)),
    columns=[['A','B']]
)
A = data['A']
B = data['B']
2.临界值
#提升30%
linjiezhi = data.A.mean()*0.3
print(linjiezhi) #1.446
3.计算均值差

x ˉ B − x ˉ A \bar x_B - \bar x_A xˉBxˉA

#3.均值之差
a_mean = data['A'].mean()
b_mean = data['B'].mean()
diff_μ = float(b_mean) - float(a_mean)  #这里是b-a 是因为测试组b组应该提升30%,所以
print(diff_μ) # -0.6400000000000006
4.计算方差

s A 2 n A + s B 2 n B \frac {s_A ^2}{n_A} + \frac {s_B ^2}{n_B} nAsA2+nBsB2

var_a = data.A.var()/data.A.count()
var_b = data.B.var()/data.B.count()
var = float(var_a) + float(var_b)
print(var) #0.1761131313131313
5.均值之差服从的正态分布

x ˉ B − x ˉ A   N ( l i n j i e z h i , v a r ) 代 入 数 值 : l i n j i e z h i = 1.446 / v a r = 0.1761131313131313 \bar x_B - \bar x_A ~ N(linjiezhi, \sqrt var) \\ 代入数值:linjiezhi=1.446 / var=0.1761131313131313 xˉBxˉA N(linjiezhi,v ar):linjiezhi=1.446/var=0.1761131313131313

6.计算均值只差在分布中的概率P值

H0: μB-μA<=1.446

H1:μB-μA>1.446

所以改假设检验属于 右侧 检验

P = 1 - stats.norm.cdf(diff_μ,loc=linjiezhi,scale=np.sqrt(var))
print(P) #0.97260955
#结论: 不拒绝H0 , 提升值小于30%,,所以实验结果不ok,没有提升30%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值