python卡方检验是否符合正态分布
时间: 2025-01-19 10:37:25 浏览: 31
使用Python进行卡方检验以确定数据是否符合正态分布
为了通过卡方检验来判断一组数据是否符合正态分布,在Python中有多种库可以实现这一目标。然而,值得注意的是,卡方适合度检验通常用于离散分布而非连续分布如正态分布。对于正态性的评估,更常用的方法包括Shapiro-Wilk测试、D'Agostino-Pearson omnibus测试以及Anderson-Darling测试等。
尽管如此,如果确实希望利用类似于卡方的思想来进行近似处理,则可以通过将连续的数据分箱成类别后再执行卡方检验的方式间接完成[^1]。具体操作如下:
数据准备与预处理
首先创建或加载待检测的数据集,并将其转换为适用于卡方检验的形式——即将数值型特征按照一定区间划分为多个类目。
import numpy as np
from scipy.stats import chi2_contingency
import matplotlib.pyplot as plt
np.random.seed(42)
data = np.random.randn(1000) # 假设这里有一个标准正态分布的随机数列作为例子
plt.hist(data, bins='auto')
plt.title("Histogram with 'auto' bins")
plt.show()
接着定义若干个合理的边界值构成直方图中的各个箱子(bin),并计算每个箱子内实际观测到的数量。
bins_edges = [-3,-2,-1,0,1,2,3]
observed_frequencies, _ = np.histogram(data, bins=bins_edges)
print(f"Observed frequencies within each bin: {list(observed_frequencies)}")
计算期望频率
根据理论上的正态分布概率密度函数PDF求得对应于上述各边界的累积分布函数CDF之差,从而得出理论上应该出现多少次落在该范围内的事件次数。
mu, sigma = data.mean(), data.std() # 获取样本均值和标准偏差
expected_proportions = []
for i in range(len(bins_edges)-mu)/sigma
upper_bound = (bins_edges[i+1]-mu)/sigma
from scipy.stats import norm
expected_prop = norm.cdf(upper_bound) - norm.cdf(lower_bound)
expected_proportions.append(expected_prop * len(data))
print(f"Expected proportions under null hypothesis of normality: {list(map(round, expected_proportions))}")
执行卡方检验
最后调用chi2_contingency()
函数传入观察频数向量即可得到最终的结果。
statistic, pvalue, dof, ex = chi2_contingency([observed_frequencies])
if pvalue < 0.05:
print('Reject the Null Hypothesis that Data follows Normal Distribution.')
else:
print('Fail to reject the Null Hypothesis; Data may follow a Normal Distribution.')
print(f"\nChi-squared statistic={statistic:.4f}, P-value={pvalue:.4f}")
这种方法虽然能够提供一定的参考价值,但在实践中并不推荐用来严格验证正态性,因为其本质上还是针对分类变量设计的工具。相比之下,专门为此目的开发出来的统计测验会更加可靠有效[^2]。
相关推荐


















