使用Python进行非参数检验【附代码文件和数据文件】

非参数检验(Nonparametric tests)在医学统计中起着重要的作用。它们的名字来源于它们不依赖于参数模型,也就是说,不需要假设数据遵循特定的分布,如正态分布。这使得非参数检验对数据的形状和分布要求较少,更加灵活和通用。

**用途和作用**:

非参数检验主要用于以下情况:

1. 当数据不满足参数统计检验(如t检验或方差分析)的正态分布假设时。

2. 当样本量小,尤其是当样本量小于30时,可能无法满足正态性假设。

3. 当数据是顺序或分类的,而不是连续的。在这些情况下,非参数检验提供了一种可靠的方法来进行假设检验,可以有效地避免由于违反参数检验假设而导致的误导性结论。

**使用条件**:

非参数检验通常在以下情况下使用:

1. 数据是顺序或分类的,例如使用Likert量表(1-5点)度量的满意度。

2. 数据不满足正态性假设,可能是因为数据有明显的偏态、峰态,或者有离群值。

3. 数据的测量等级是序数等级或名义等级。

**重要性**:非参数检验在医学研究中的重要性主要表现在以下几个方面:

1. 它们提供了一种在不满足常规参数检验假设的情况下进行统计推断的方法。

2. 它们允许我们对复杂或不规则的数据进行分析,这在现实世界的医学研究中是非常常见的。

3. 它们对数据的要求较少,使得更多的研究可以进行统计检验。

**常用的非参数检验**:以下是医学统计中常用的一些非参数检验(这些测试都有自己的使用条件和假设,需要在使用前仔细检查):

1. 曼-惠特尼检验(Mann-Whitney U test):用于比较两个独立样本的中位数。

2. 威尔科克森符号秩检验(Wilcoxon signed-rank test):用于比较两个相关样本的中位数。

3. 克鲁斯卡尔-瓦利斯检验(Kruskal-Wallis test):用于比较三个或更多个独立样本的中位数。

4. 弗里德曼检验(Friedman test):用于比较三个或更多个相关样本的中位数。

5. 斯皮尔曼等级相关系数(Spearman rank correlation coefficient):用于测量两个变量之间的单调关系的强度和方向。

代码实练:

使用数据:degree_bmi.csv

目的: 检验不同的学历之间BMI的差异

使用的库:

库名用途
pandas对数据读取、保存、清洗、转换等
scipy对数据进行统计分析
numpy计算数据均值、标准差等

数据样式:


先导入库和读取数据:

import numpy as np
import pandas as pd
from scipy.stats import mannwhitneyu, kstest, wilcoxon, kruskal, friedmanchisquare, spearmanr

df = pd.read_csv("data/degree_bmi.csv", encoding="gbk")

进行正态性检验:(学习正态性检验可以看这篇 使用python进行正态性检验【附代码文件和数据文件】

# 对学历为0的BMI数据进行正态性检验
ks_statistic0, p_value0= kstest(df[df["学历"] == 0]["BMI"], cdf="norm", args=(np.mean(df[df["学历"] == 0]["BMI"]), np.std(df[df["学历"] == 0]["BMI"])))
print("学历为0的BMI正态性",p_value0)
# 对学历为1的BMI数据进行正态性检验
ks_statistic1, p_value1= kstest(df[df["学历"] == 1]["BMI"], cdf="norm", args=(np.mean(df[df["学历"] == 1]["BMI"]), np.std(df[df["学历"] == 1]["BMI"])))
print("学历为1的BMI的正态性",p_value1)
"""
结果:
学历为0的BMI正态性 0.012385084943399516
学历为1的BMI的正态性 0.01504289113453039
"""

根据结果可以看两组数据P值均小于0.05,可以认为是偏态。

  1. 进行 Mann-Whitney U 检验
# 执行 Mann-Whitney U 检验
statistic, p_value = mannwhitneyu(df[df["学历"] == 0]["BMI"], df[df["学历"] ==1]["BMI"])

# 打印检验结果
print("Mann-Whitney U statistic:", statistic)
print("P-value:", p_value)
结果:
Mann-Whitney U statistic: 5036.0
P-value: 0.9308779379858274
"""

结果与描述:P值为0.931,根据 Mann-Whitney U 检验,我们没有发现0,1两个学历之间BMI之间的显著差异,因为 p 值大于显著性水平(0.05)。然而,这个结论可能受到样本数据的限制,以及其他因素的影响。如果你有更多的样本数据或者其他相关信息,可能需要进一步分析来得出更准确的结论

  1. 威尔科克森符号秩检验
# 执行威尔科克森符号秩检验
wilcoxon_test= wilcoxon(df[df["学历"] == 0]["BMI"], df[df["学历"] == 1]["BMI"])

# 输出结果
print("Wilcoxon signed-rank test:", wilcoxon_test)
"""
结果:
Wilcoxon signed-rank test: WilcoxonResult(statistic=2513.0, pvalue=0.9670887024899815)
"""

结果与描述:P值为0.252,根据威尔科克森符号秩检验,我们没有发现0,1两个学历之间BMI之间的显著差异,因为 p 值大于显著性水平(0.05)。然而,这个结论可能受到样本数据的限制,以及其他因素的影响。如果你有更多的样本数据或者其他相关信息,可能需要进一步分析来得出更准确的结论

  1. 克鲁斯卡尔-瓦利斯检验(Kruskal-Wallis test)
# 执行克鲁斯卡尔-瓦利斯检验
statistic, p_value = kruskal(df[df["学历"] == 0]["BMI"], df[df["学历"] == 1]["BMI"], df[df["学历"] == 2]["BMI"])

# 输出结果
print("Kruskal-Wallis test:")
print("Statistic:", statistic)
print("P-value:", p_value)
"""
结果:
Kruskal-Wallis test:
Statistic: 4.1769275747508345
P-value: 0.12387729157944068
"""

结果与描述:P值为0.124,根据克鲁斯卡尔-瓦利斯检验,我们没有发现0,1,2三个学历之间BMI之间的显著差异,因为 p 值大于显著性水平(0.05)。然而,这个结论可能受到样本数据的限制,以及其他因素的影响。如果你有更多的样本数据或者其他相关信息,可能需要进一步分析来得出更准确的结论

  1. 弗里德曼检验
# 进行弗里德曼检验
statistic, p_value = friedmanchisquare(df[df["学历"] == 0]["BMI"], df[df["学历"] == 1]["BMI"], df[df["学历"] == 2]["BMI"])

# 打印检验结果
print("friedmanchisquare")
print("Statistic: ", statistic)
print("p-value: ", p_value)
"""
结果:
friedmanchisquare
Statistic:  4.579999999999927
p-value:  0.10126646185388707
"""

结果与描述:P值为0.101,根据威弗里德曼检验,我们没有发现0,1,2三个学历之间BMI之间的显著差异,因为 p 值大于显著性水平(0.05)。然而,这个结论可能受到样本数据的限制,以及其他因素的影响。如果你有更多的样本数据或者其他相关信息,可能需要进一步分析来得出更准确的结论

5.斯皮尔曼等级相关系数:

# 计算斯皮尔曼等级相关系数
corr, p_value = spearmanr(df["学历"], df["BMI"])
print("Spearman correlation coefficient")
print("Spearman correlation coefficient:", corr)
print("P-value:", p_value)
"""
结果:
Spearman correlation coefficient
Spearman correlation coefficient: 0.09866551434483192
P-value: 0.08801414238541036
"""

结果与描述:P值为0.088,根据斯皮尔曼等级相关系数,我们没有发现0,1,2三个学历之间BMI之间的显著差异,因为 p 值大于显著性水平(0.05)。然而,这个结论可能受到样本数据的限制,以及其他因素的影响。如果你有更多的样本数据或者其他相关信息,可能需要进一步分析来得出更准确的结论