AB实验:
1. 人均类->t检验
# 计算t值
def get_t(x):
# 遍历看x需要几次的显著性检验。可能有多个实验组,需要一对一检验
x1 = x[x.分组.astype('str')=='1'].iloc[0] # 对照组,组号固定为1,转为Series格式
for i in x[x.分组.astype('str')!='1'].分组:
x2 = x[x.分组==i].iloc[0] # 实验组i,组号为i
# 计算t值,由于输入的是x2-x1,故t值越大,说明x2越大于x1。
t = (x2.均值-x1.均值) / np.sqrt( (1/x2.样本量+1/x1.样本量) * (( x2.样本量-1)*x2.方差 + (x1.样本量-1)*x1.方差) / ( x2.样本量 + x1.样本量 - 2 ) )
# 计算p值,无论t值的正负,均按照正的处理。
n = x1.样本量+x2.样本量-2 # 总体方差相等时的自由度
p_value = stats.t.sf(abs(t), n)*2
x.loc[x.分组==i, 't值'] = t
x.loc[x.分组==i, 'p值'] = p_value
return x
sign = sign.groupby('指标').apply(get_t)
sign
sign:
2. 比值类->delta method + t检验
# 比值类,两个正态分布相比,需要对方差进行delta method修正
def get_t3(x):
# 遍历看x需要几次的显著性检验。可能有多个实验组,需要一对一检验
x1 = x[x.分组.astype(str)=='1'].iloc[0] # 对照组,组号固定为1,转为Series格式
for i in x[x.分组.astype(str)!='1'].分组:
x2 = x[x.分组==i].iloc[0] # 实验组i,组号为i
# delta method方法计算t值
var1 = (1/x1.样本量) * (x1['分子-方差']/x1['分母-均值']**2 + (x1['分子-均值'])**2*x1['分母-方差']/x1['分母-均值']**4)
var2= (1/x2.样本量) * (x2['分子-方差']/x2['分母-均值']**2 + (x2['分子-均值'])**2*x2['分母-方差']/x2['分母-均值']**4)
t = (x2['分子-均值']/x2['分母-均值']-x1['分子-均值']/x1['分母-均值']) / np.sqrt(var1 + var2)
n = x1.样本量+x2.样本量-2
# 计算p值
p_value = stats.t.sf(abs(t), n)*2
x.loc[x.分组==i, 't值'] = t
x.loc[x.分组==i, 'p值'] = p_value
return x
输入:
3. 用户转化类
x1 = 1 # "对照组-点击人数"
x2 = 2 # "实验组-点击人数"
p1 = 1 / 1 # 对照组-点击到xx的用户转化率
p2 = 1 / 2 # 实验组-点击到xx的用户转化率
z = (p2-p1)*1.0000/np.sqrt((p2*(1-p2))/(x2)+(p1*(1-p1))/(x1))
print('zscore:', z)
p_value = stats.norm.sf(abs(z))*2
print('p值:', p_value)
还没写完,后续补上
旧版:
from scipy import stats
# F分布
stats.f.ppf(0.95,n1,n2) # 0.95分位数求概率面积
stats.f.cdf(5.14,n1,n2) # 面积求概率----累计分布
stats.f.pdf(2,n1,n2) # 求x=2的概率----概率分布函数
# 卡方分布
stats.chi2.ppf(vlas, df)
# 计算p值--F检验
p_value = 1 - stats.f.cdf(F,n1,n2)
# t检验
# p_value = 1 - stats.t.cdf(t, n1+n2-2) # t值 # 旧版
p_value = stats.t.sf(abs(t), n)*2
1.
计算p值时要不要1-。如果t值大于0,要,如果t值小于0,不用。因为p值指的是这里:
2.
t值用(实验组-对照组)或(对照组-实验组)都可以,注意看用的什么就行。
stats.chi2_contingency
列联表的独立性检验(卡方检验)
参考:scipy.stats.chi2分布(python scipy 卡方分布 )
3. 用户维度的数据,如何直接做t检验,不用手动计算均值方差
t, p,df=st.ttest_ind(对照组-每个用户的点击量, 实验组-每个用户的点击量,usevar='unequal') # usevar='unequal'表示两个总体方差不同
print('假设检验的t值=%.3f'%t,'自由度为%.3f'%df,'双尾检验p值=%.4f'%p)