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:

python t分布表 python计算t分布的分位数_python t分布表

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

输入:

python t分布表 python计算t分布的分位数_python_02

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值指的是这里:

python t分布表 python计算t分布的分位数_开发语言_03

2.

python t分布表 python计算t分布的分位数_方差_04

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)