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ˉA−xˉ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ˉA−xˉ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ˉB−xˉ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ˉB−xˉ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%
上一篇: HyperLogLog详解