Z 検定の関連計算 scipy.stats.norm

Z 検定は、サンプルの平均が既知の母集団の平均と等しいかどうかを検定するために使用される統計手法です。通常、次のような状況で使用されます。
母集団パラメータがわかっている: 母集団の平均と標準偏差がわかっている場合、Z 検定を使用してサンプル平均が母集団平均と等しいかどうかを判断できます。
大規模なサンプル: Z 検定は正規分布の特性に依存するため、サンプル サイズが大きい (通常は 30 を超える) 場合に最適なパフォーマンスを発揮します。
連続データ: Z 検定は、測定値などの連続データに適していますが、カテゴリデータには適していません。
Z 検定の基本的な考え方は、標本平均と母集団平均の差を計算し、それを標準化して Z 統計量を取得し、それを有意水準と比較して帰無仮説を棄却するかどうかを決定することです。

scipy.stats.norm は、正規分布を処理するための Scipy ライブラリのモジュールです。正規分布の確率密度関数、累積分布関数、生存関数などを計算できる一連の関数が含まれています。
Python で Z 検定を実行するには、通常、Z スコアを手動で計算し、標準正規分布の関数 (累積分布関数など) を使用して p 値を取得する必要があります。Scipy ライブラリは、次のようないくつかの関連関数を提供する強力な統計ツールです。
scipy.stats.norm.cdf: 標準正規分布の累積分布関数 (CDF)、つまり、指定された値と次の確率を計算するために使用されます。
scipy.stats.norm.sf: 標準正規分布の生存関数 (生存関数)、つまり、指定された値を超える確率を計算するために使用されます。
scipy.stats.zscore: 指定されたデータの Z スコアを計算するために使用されます。
 

1 サンプル Z 検定: サンプルの平均が既知の母集団平均と等しいかどうかを検定するために使用されます。この場合、母集団の平均と標準偏差がわかります。

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("接受原假设:样本均值与总体均值相等")

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

2 サンプル Z 検定は、2 つの独立したサンプルの平均が大きく異なるかどうかを比較するために使用されます。

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