使用Shapiro-Wilk正态性检验遇p值不准确警告,求解决方案
Shapiro-Wilk检验大样本量警告的解决方案
当样本量达到1048575时,Shapiro-Wilk检验会因为统计量近似计算的精度问题抛出警告,以下是几个可行的解决思路:
1. 随机抽样后再做Shapiro-Wilk检验
直接从大样本中抽取不超过5000个代表性样本进行检验,只要抽样是随机的,结果足够反映整体数据的正态性:
# 随机抽取5000个样本 sampled_data = householdPowerConsumption_analysis.Global_active_power.sample(n=5000, random_state=42) # 对抽样数据做Shapiro-Wilk检验 stat, p = st.shapiro(sampled_data)
2. 改用适合大样本的正态性检验方法
Shapiro-Wilk并非大样本场景的最优选择,推荐使用以下两种方法:
- Kolmogorov-Smirnov检验(KS检验):适用于大样本,直接对比数据分布与正态分布的差异:
from scipy.stats import norm, kstest # 先拟合正态分布的均值和标准差 mu, std = norm.fit(householdPowerConsumption_analysis.Global_active_power) stat, p = kstest(householdPowerConsumption_analysis.Global_active_power, 'norm', args=(mu, std)) - Anderson-Darling检验:专门用于检验数据是否符合特定分布,对大样本的支持更好,还能给出不同显著性水平下的临界值:
from scipy.stats import anderson result = anderson(householdPowerConsumption_analysis.Global_active_power, dist='norm') # 输出统计量和各显著性水平的临界值 print('统计量:', result.statistic) print('临界值:', result.critical_values) print('显著性水平:', result.significance_level)
3. 结合可视化判断正态性
大样本下,统计检验的p值会极度敏感——哪怕数据只是轻微偏离正态,也会得到显著的p值。此时可视化方法更具实际意义:
- 绘制直方图+核密度估计(KDE):
import seaborn as sns sns.histplot(householdPowerConsumption_analysis.Global_active_power, kde=True) - 绘制QQ图:
import statsmodels.api as sm sm.qqplot(householdPowerConsumption_analysis.Global_active_power, line='s')
通过观察直方图的形状是否接近钟形,QQ图中的点是否贴合参考线,就能直观判断数据的正态性。
内容的提问来源于stack exchange,提问作者project work
相关产品推荐
相关产品推荐

