python scipy 密度函数 分位数 累计函数计算p值 卡方检验 t检验 F检验 假设检验 AB实验 显著性检验

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 = μ 2 − μ 1 ( n 1 − 1 ) S 1 2 + ( b 2 − 1 ) S 2 2 n 1 + n 2 − 2 t=\dfrac{\mu_2-\mu_1}{\sqrt{\frac{(n_1-1)S^2_1+(b2-1)S^2_2}{n_1+n2-2}}} t=n1+n22(n11)S12+(b21)S22 μ2μ1

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值