Z检验scipy.stats.norm的相关计算

Z检验(Z-test)是一种用于检验一个样本的均值是否与已知的总体均值相等的统计方法。它通常用于以下情况:
总体参数已知: 当总体的均值和标准差已知时,可以使用Z检验来确定样本均值是否与总体均值相等。
大样本: Z检验在样本容量较大(通常大于30)时表现最佳,因为它依赖于正态分布的性质。
连续数据: Z检验适用于连续型数据,例如测量值,而不适用于分类数据。
Z检验的基本思想是计算样本均值与总体均值之间的差异,然后将其标准化,得到Z统计量,再与显著性水平进行比较,从而决定是否拒绝原假设。

scipy.stats.norm 是 Scipy 库中用于处理正态分布的模块。它包含了一系列函数,允许你计算正态分布的概率密度函数、累积分布函数、生存函数等。
在Python中,进行Z检验通常需要手动计算Z分数,并使用标准正态分布的函数(例如累积分布函数)来获取p值。Scipy库是一个强大的统计学工具,提供了一些相关的函数,包括:
scipy.stats.norm.cdf:用于计算标准正态分布的累积分布函数(Cumulative Distribution Function,CDF),即给定值以下的概率。
scipy.stats.norm.sf:用于计算标准正态分布的生存函数(Survival Function),即给定值以上的概率。
scipy.stats.zscore:用于计算给定数据的Z分数。
 

单样本Z检验(One-Sample Z-Test): 用于检验一个样本的均值是否与已知的总体均值相等。这种情况下,总体的均值和标准差已知。

import numpy as np
from scipy.stats import norm, zscore

# 示例数据
data = np.random.normal(loc=28, scale=5, size=100)

# 假设的总体均值
population_mean = 26

# 样本均值和标准差
sample_mean = np.mean(data)
sample_std = np.std(data, ddof=1)  # 使用ddof=1来计算样本标准差

# 计算Z分数
z_score = (sample_mean - population_mean) / (sample_std / np.sqrt(len(data)))

# 计算双尾p值
p_value = 2 * norm.sf(np.abs(z_score))

# 使用zscore函数计算Z分数
# z_scores_data = zscore(data)

# 打印结果
print(f"Z分数 (手动计算): {z_score}, 双尾p值: {p_value}")
#print(f"Z分数 (使用zscore函数): {z_scores_data}")
import numpy as np
from scipy import stats

# 假设总体均值已知为5,总体标准差已知为2
population_mean = 5
population_stddev = 2

# 创建样本数据
sample_data = np.random.normal(5.01, 2, 30)  # 这里的均值为6,样本容量为30

# 计算样本均值
sample_mean = np.mean(sample_data)

# 计算标准误差(标准差除以样本容量的平方根)
standard_error = population_stddev / np.sqrt(len(sample_data))

# 计算Z统计量
z = (sample_mean - population_mean) / standard_error

# 设置显著性水平(通常为0.05)
alpha = 0.05

# 查找Z分布的临界值
critical_value = stats.norm.ppf(1 - alpha/2)

# 进行假设检验
if np.abs(z) > critical_value:
    print("拒绝原假设:样本均值与总体均值不相等")
else:
    print("接受原假设:样本均值与总体均值相等")

-------------------------------------------------------- 

双样本Z检验(Two-Sample Z-Test)用于比较两个独立样本的均值是否有显著差异

import numpy as np
from scipy import stats

# 创建两组样本数据
group1 = np.random.normal(5, 2, 30)
group2 = np.random.normal(5.01, 2, 30)

# 计算两组样本的均值和标准差
mean1, mean2 = np.mean(group1), np.mean(group2)
stddev1, stddev2 = np.std(group1), np.std(group2)

# 计算标准误差
standard_error = np.sqrt((stddev1**2 / len(group1)) + (stddev2**2 / len(group2)))

# 计算Z统计量
z = (mean1 - mean2) / standard_error

# 设置显著性水平(通常为0.05)
alpha = 0.05

# 查找Z分布的临界值
critical_value = stats.norm.ppf(1 - alpha/2)

# 进行假设检验
if np.abs(z) > critical_value:
    print("拒绝原假设:两组样本的均值不相等")
else:
    print("接受原假设:两组样本的均值相等")

------------------------------------------------------

from scipy.stats import norm

# 计算正态分布的概率密度函数(PDF)在某点的值
pdf_value = norm.pdf(0)

# 计算正态分布的累积分布函数(CDF)在某点的值
cdf_value = norm.cdf(0)

# 计算正态分布的生存函数(SF)在某点的值
sf_value = norm.sf(0)

print(f"PDF在0点的值: {pdf_value}")
print(f"CDF在0点的值: {cdf_value}")
print(f"SF在0点的值: {sf_value}")

-------------------------------------------------------------------------------

# 绘制直方图、概率密度函数曲线、检验样本是否来自正态分布

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from scipy.stats import normaltest
from scipy.stats import norm
plt.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文标签乱码
plt.rcParams['axes.unicode_minus'] = False

# 生成正态分布样本
x = np.random.normal(loc=12, scale=2.5, size=340)

# 绘制直方图
plt.hist(x, bins=30, density=True, alpha=0.7, color='blue', edgecolor='black')

# 生成正态分布的概率密度函数曲线
xmin, xmax = plt.xlim() #plt.xlim() 返回当前的 x 轴范围(x-axis limits)
x_range = np.linspace(xmin, xmax, 100)
pdf = norm.pdf(x_range, np.mean(x), np.std(x))
# 绘制概率密度函数曲线
plt.plot(x_range, pdf, 'k-', linewidth=2)
# 添加标题和标签
plt.title('正态分布图')
plt.xlabel('随机变量值')
plt.ylabel('频率')
# 显示图形
plt.show()

# scipy.stats.normaltest 是 Scipy 中用于检验样本是否来自正态分布的函数。
# normaltest它基于 D'Agostino and Pearson's test,它结合了样本的偏度和峰度来进行判断。
# 进行正态性检验
statistic, p_value = normaltest(x)
# 打印结果
print(f"统计量: {statistic}, p值: {p_value}")
# 判断正态性
if p_value < 0.05:
    print("样本不是来自正态分布")
else:
    print("样本可能来自正态分布")


# 正态性检验 - Shapiro-Wilk检验
stat, p = stats.shapiro(x)
print("Shapiro-Wilk检验统计量:", stat)
print("Shapiro-Wilk检验p值:", p)

猜你喜欢

转载自blog.csdn.net/book_dw5189/article/details/133448993