正态性检验在可以说医学研究中非常重要,也是特别基本的一个统计方法,它可以用来确定数据集是否遵循正态分布。这个假设对于许多统计分析方法来说是基础,如t检验、ANOVA(方差分析)、回归分析等。如果数据不符合正态分布,那么使用这些方法可能会导致误导性的结果。因此,正态性检验是进行这些统计分析前的重要步骤。
适用范围:正态性检验通常用于连续型变量。例如,人体的身高、体重、血压、血糖等可以用来进行正态性检验。如果数据是分类的或者是排名的,那么正态性检验就不适用。
以下是一些常见的正态性检验方法,以及它们之间的一些区别:
数据:演示数据是关于新生儿出生体重影响因素的, 来自R语言自带数据 birthwt
目的:检验bwt是否符合正态性
使用的库:
库名
|
用途
|
pandas
|
对数据读取、保存、清洗、转换等
|
scipy
|
对数据进行统计分析
|
matplotlib
|
绘图使用的包
|
数据大致样式:
首先导入库和读取数据:
# 导入库
from scipy import stats
import pandas as pd
# 读取数据
df = pd.read_csv("data/birthwt.csv", encoding="utf-8") # 读取数据
print(df.info()) # 打印查看一下数据信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 189 entries, 0 to 188
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 low 189 non-null int64
1 age 189 non-null int64
2 lwt 189 non-null int64
3 race 189 non-null int64
4 smoke 189 non-null int64
5 ptl 189 non-null int64
6 ht 189 non-null int64
7 ui 189 non-null int64
8 ftv 189 non-null int64
9 bwt 189 non-null int64
dtypes: int64(10)
memory usage: 14.9 KB
"""
可以看到数据均为 int64 的数值型数据(Python还有string(文本类型数据), 和float(浮点类型数据,也就小数, int是整数类型),数据量为 189,且均没有缺失值
1. **Shapiro-Wilk 测试**:这是最常用的正态性检验方法之一。它的优点是在小样本(例如,n < 50)上有很好的表现,但是在大样本上可能过于保守,即错误地认为数据不符合正态分布。
# 使用stats类的shapiro方法进行正态性检验
shapiro_test = stats.shapiro(df["bwt"])
print(f"Shapiro-Wilk检验: W={shapiro_test.statistic}, p值={shapiro_test.pvalue}")
Shapiro-Wilk检验: W=0.9924418330192566, p-value=0.43540576100349426
"""
结果分析:
在进行正态性检验后,P值(或概率值)用于确定数据是否符合正态分布的假设。在这个情况下,P值为0.43540576100349426。通常,如果P值大于0.05,我们就不拒绝原假设,也就是认为数据符合正态分布。反之,如果P值小于0.05,我们就拒绝原假设,认为数据不符合正态分布。在你的情况下,由于P值为0.435,大于0.05,因此我们不拒绝原假设,可以认为数据符合正态分布
2. **Kolmogorov-Smirnov 测试**:这个测试的优点是可以用于任何连续分布的检验,不仅仅是正态分布。但是,对于小样本,它的效力较低。
# 进行Kolmogorov-Smirnov检验
ks_statistic, p_value= stats.kstest(df["bwt"], cdf="norm", args=(np.mean(df["bwt"]), np.std(df["bwt"])))
print('statistic:', ks_statistic)
print('P值:', p_value)