lillifors test python

admin 102 0
Lillifors检验是Kolmogorov-Smirnov检验的修正版,专门用于检验样本是否服从正态分布,尤其适用于总体均值和方差未知的情况,在Python中,可通过scipy.stats.lilliefors函数实现,它自动用样本估计参数,克服了传统KS检验在正态性检验中的局限性,该检验广泛应用于数据预处理阶段,帮助判断数据是否符合正态分布,为后续参数检验(如t检验、ANOVA)提供前提,是统计分析中重要的正态性检验工具。

Python中的Lillifors检验:原理、实现与应用

在统计分析中,检验数据是否符合特定分布(如正态分布)是数据预处理和假设检验的关键步骤,正态性检验广泛应用于t检验、方差分析、线性回归等方法的前提验证中,常见的正态性检验方法包括Shapiro-Wilk检验、Kolmogorov-Smirnov(KS)检验等,但当总体均值和方差未知时,传统KS检验的临界值会因参数估计而产生偏差,为此,统计学家Hubert Lilliefors提出了改进方法——Lillifors检验,专门用于检验样本是否来自未知参数的正态分布,本文将详细介绍Lillifors检验的原理,并通过Python演示其实现方法与应用场景。

Lillifors检验的原理

传统KS检验的局限性

KS检验是通过比较样本经验分布函数(EDF)与理论分布函数(CDF)的最大差异(即D统计量)来判断样本是否符合理论分布,当理论分布的参数(如正态分布的μ和σ²)未知时,通常用样本均值和方差进行估计,这种参数估计会导致理论分布函数与真实分布产生偏差,使得传统KS检验的临界值偏小,容易犯“第一类错误”(即误判正态为非正态)。

Lillifors检验的改进

Lillifors检验的核心是对传统KS检验的临界值进行修正,其基本步骤如下:

  1. 参数估计:计算样本均值$\bar{x}$和样本标准差$s$,作为正态分布的参数估计;
  2. 构造理论分布:基于$\bar{x}$和$s$生成理论正态分布;
  3. 计算D统计量:计算样本经验分布与理论正态分布CDF的最大绝对差异;
  4. 修正临界值:通过蒙特卡洛模拟生成Lillifors临界值表(或近似计算),替代传统KS检验的临界值,从而提高检验准确性。

与Shapiro-Wilk检验相比,Lillifors检验在大样本(n>30)时更稳健,且对轻微偏离正态的数据更敏感。

Python中的Lillifors检验实现

Python中可通过statsmodels库实现Lillifors检验。statsmodels.stats.diagnostic.lilliefors函数是专门用于Lillifors检验的工具,其语法如下:

from statsmodels.stats.diagnostic import lilliefors
# lilliefors(x, pvalmethod='approx')
# x: 样本数据(一维数组)
# pvalmethod: p值计算方法,可选'approx'(近似计算,默认)或'sim'(蒙特卡洛模拟)
# 返回: (D统计量, p值)

安装与导入

若未安装statsmodels,可通过pip安装:

pip install statsmodels

代码示例

示例1:正态分布数据的检验

生成100个服从标准正态分布的样本,进行Lillifors检验:

import numpy as np
from statsmodels.stats.diagnostic import lilliefors
# 生成正态分布数据(均值=0,标准差=1,样本量=100)
np.random.seed(42)  # 设置随机种子保证可重复性
data = np.random.normal(loc=0, scale=1, size=100)
# 执行Lillifors检验
d_stat, p_value = lilliefors(data, pvalmethod='approx')
print(f"D统计量: {d_stat:.4f}")
print(f"p值: {p_value:.4f}")
# 结果解读(显著性水平α=0.05)
if p_value > 0.05:
    print("无法拒绝原假设,数据服从正态分布。")
else:
    print("拒绝原假设,数据不服从正态分布。")

输出结果

D统计量: 0.0387
p值: 0.7652
无法拒绝原假设,数据服从正态分布。

结果显示,p值=0.7652>0.05,表明数据符合正态分布,与数据生成时的真实分布一致。

示例2:非正态分布数据的检验

生成100个服从指数分布的样本(明显非正态),检验其正态性:

# 生成指数分布数据(λ=1,样本量=100)
data_exp = np.random.exponential(scale=1, size=100)
# 执行Lillifors检验
d_stat_exp, p_value_exp = lillief