# coding=utf-8
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.stats.weightstats as sw
# 两个样本长度相同
x1 = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
x2 = np.array([1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1])
# 大量数据导入
# df_x1 = pd.read_excel()
# df_x2 = pd.read_excel()
# np.array(df_x1['lable'].tolist())
# np.array(df_x2['lable'].tolist())
# 样本均值是否显著差异检验
def ABTest(x1,x2,alpha = 0.05):
'''
:param x1: 样本 1
:param x2: 样本 2
:param alpha: 第 1 类错误容许值
:return: z/t p 统计量 p 值
'''
# 样本量大于 30 时,使用 Z 检验
if len(x1) >30:
z,p = sw.ztest(x1, x2, value=0)
# 详细计算公式
# 样本标准误差,分母使用 n-1
# x1_mean,x1_std,x2_mean,x2_std = x1.mean(),x1.std(ddof = 1),x2.mean(),x2.std(ddof = 1)
# z = (x1_mean - x2_mean) / np.sqrt(x1_std ** 2 / len(x1) + x2_std ** 2 /len(x2))
# p = 2*stats.norm.sf(abs(z))
# 根据 alpha 计算置信区间 外汇跟单gendan5.com Z 分数服从标准正态分布
d = stats.norm.ppf(1 - alpha / 2)
floor = - d
ceil = d
print(' 使用 Z 检验 ')
print('Z 分数为 {}'.format(z))
print(' 置信区间为 [{0},{1}]'.format(floor,ceil))
print('p 值为 {0},{1}alpha, 认为 x1,x2 均值差异 {2}'.format(p,' 大于 ' if p > alpha else ' 小于 ',' 显著 ' if p < alpha else ' 不显著 '))
return z,p
# 样本量不够大,使用 t 检验
else:
x = x1 - x2
t,p = stats.ttest_1samp(x,0)
d = stats.norm.ppf(1 - alpha / 2)
floor = - d
ceil = d
print(' 使用 T 检验 ')
print('T 分数为 {}'.format(t))
print(' 置信区间为 [{0},{1}]'.format(floor,ceil))
print('p 值为 {0},{1}alpha, 认为 x1,x2 均值差异 {2}'.format(p,' 大于 ' if p > alpha else ' 小于 ',' 显著 ' if p < alpha else ' 不显著 '))
return t,p
ABTest(x1,x2)
结果:
使用 Z 检验
Z 分数为 -7.1414284285428495
置信区间为 [-1.959963984540054,1.959963984540054]
p 值为 9.236596617174027e-13, 小于 alpha, 认为 x1,x2 均值差异显著
Out[21]: (-7.1414284285428495, 9.236596617174027e-13)