Tracks
您是否曾经运行过 t 检验,得到一个诡异的 p 值,后来才发现您的数据与正态分布相去甚远?
这在某个时刻几乎每个人都遇到过。t 检验的问题在于它假设您的数据服从正态分布。当这一假设不成立时,结果可能具有误导性。偏态数据和小样本量都会违反正态性假设。而现实世界的数据很少按教科书的方式表现。
Mann-Whitney U 检验正是为解决这一问题而来。它是 t 检验的非参数替代方法,基于秩次而非均值来比较两个组,因此不在意分布的形状。
本文将介绍什么是 Mann-Whitney U 检验、何时使用、其数学原理,以及如何在 Python 和 R 中运行并解读它。
但究竟什么是 t 检验?如果您有这个疑问,请阅读我们的Python t 检验入门一文——它会解答您的所有问题。
什么是 Mann-Whitney U 检验?
Mann-Whitney U 检验是一种用于比较两个独立组的非参数统计检验。
与 t 检验不同,它不假设您的数据服从正态分布。它通过将原始数值转换为秩并进行分析,来比较两组的分布。这使其在数据存在偏态、离群值,或以其他方式不满足正态性要求时成为一个不错的选择。
您也会看到它被称为Wilcoxon 秩和检验。在大多数情境下这两个名称是同义的。
何时使用 Mann-Whitney U 检验
Mann-Whitney U 检验需要满足一组特定条件。仅当以下全部条件成立时才应使用:
- 两个独立组: 样本不重叠,一个组的取值不会影响另一个组
- 有序或连续数据: 如考试分数、响应时间或任何测量值
- 非正态分布: 数据偏态、厚尾,或样本太小无法确认正态性
- 样本量小: 数据不足以依赖中心极限定理
我们来看一个例子。
假设您有两门采用不同教学方法的课程,想知道哪一门的考试成绩更好。您绘制分数分布图,发现它们并不服从正态分布——其中一班有几个离群值将分布向右拉。t 检验比较的是组均值,因此这些离群值会抬高均值,让这一班看起来比实际更好。
这种偏斜的均值进入了 t 检验的计算,返回的 p 值并不能反映两组之间的差异。Mann-Whitney U 检验不会出现这个问题,因为它使用的是秩而非原始分数。单个离群值最多只能成为最高秩的值,无法像均值那样扭曲结果。
当您处理有序数据(如 1-5 的问卷量表)时,它也是首选。这些取值并非真正连续,计算均值意义不大。
Mann-Whitney U 检验公式
该检验会产生两个 U 统计量,每个组一个。公式如下:

Mann-Whitney U 检验公式
其中:
-
n1和n2是第 1 组和第 2 组的样本量 -
R1和R2是各组的秩和——即分配给各组观测值的所有秩的总和
秩和的计算方法是将两组的所有数值合并,从小到大排序,并为每个数值分配一个秩。最小值的秩为 1,其次为 2,依此类推。然后分别将属于各组的秩相加。
检验统计量是 U1 和 U2 中较小的一个。随后将其与临界值比较,或用来计算 p 值。
好消息是您无需手工计算。Python 和 R 都能替您完成,下面我会演示。
Mann-Whitney U 检验的假设
Mann-Whitney U 检验比 t 检验更灵活,但仍有三项需要遵守的假设:
- 样本独立: 两组彼此不影响。一组中的观测与另一组中的观测无关系
- 有序或连续数据: 数据需要具有自然顺序——可以判断某个值高于或低于另一个值
- 分布形状相似: 如果您希望将结果解读为中位数比较,则两组应具有大致相同形状的分布。若形状不同,检验仍可进行,但您比较的是平均秩而非中位数
第三个假设最容易让人困惑。
Mann-Whitney U 检验常被描述为对中位数的检验,但只有在两组分布形状相似时这才成立。如果不相似,结果会告诉您更一般的信息——一组的取值是否整体上倾向于高于另一组。
Python 中的 Mann-Whitney U 检验
Python 的 scipy.stats 模块提供了 Mann-Whitney U 检验的函数。下面用两班考试分数做一个简单示例。
from scipy.stats import mannwhitneyu
class_a = [72, 85, 90, 65, 78, 88, 95, 70, 83, 76]
class_b = [60, 55, 74, 68, 80, 58, 63, 71, 66, 59]
stat, p_value = mannwhitneyu(class_a, class_b, alternative="two-sided")
print(f"U statistic: {stat}")
print(f"P-value: {p_value:.4f}")

Python 中的 Mann-Whitney U 检验
参数 alternative="two-sided" 告诉检验您在检测两组是否在任一方向上存在差异。您并未预设哪一组更高。如果您有方向性假设,则应使用 "less" 或 "greater"。
此处 p 值为 0.0046,低于 0.05 的常用阈值。这意味着您可以拒绝原假设,即两班分数分布之间存在统计学显著差异。
仅就 U 统计量本身而言,缺乏上下文意义不大。您可以关注 p 值来判断差异是否具有统计学显著性,并查看原始数据或中位数来理解差异的方向。
R 中的 Mann-Whitney U 检验
R 通过 wilcox.test() 函数来运行 Mann-Whitney U 检验。我将沿用前面的考试分数示例。
class_a <- c(72, 85, 90, 65, 78, 88, 95, 70, 83, 76)
class_b <- c(60, 55, 74, 68, 80, 58, 63, 71, 66, 59)
wilcox.test(class_a, class_b, alternative = "two.sided")

R 中的 Mann-Whitney U 检验
W 统计量与 U 统计量相同——R 只是使用了不同的标签。解读方式与 Python 相同:p 值 0.0029 低于 0.05,因此两组之间存在统计学显著差异。
您也可能会看到关于并列值(ties)的警告。
当两组中有两个或多个相同的取值时就会出现这种情况,这会影响秩的分配。R 会为您处理这种情况,但如果并列很多,值得检查您的数据是否满足检验的假设。
如何解读 Mann-Whitney U 检验结果
Mann-Whitney U 检验的原假设是两组来自同一分布——换言之,它们之间没有差异。您的任务是寻找反驳这一假设的证据。
p 值就是实现这一点的方式:
- p < 0.05: 拒绝原假设。两组的分布不同,该差异具有统计学显著性
- p >= 0.05: 证据不足以拒绝原假设。这并不意味着两组完全相同,只是说明数据未显示出明确差异
请记住,Mann-Whitney U 检验比较的是分布。显著结果表明一组的取值往往比另一组的取值秩更高——而非平均数更高。若要描述差异方向,请查看各组的中位数,而非均值。
Mann-Whitney U 检验 vs t 检验
这两个检验解决的是同一问题(比较两组),但方法不同,选错会影响结果。
t 检验
t 检验比较两组的均值。它建立在数据服从正态分布的假设之上,当该假设成立时,是一个很好的检验。
问题在于这一假设。如果数据有偏或样本量较小、难以确认正态性,t 检验的结果就可能不可靠。均值会受极端值拉动,p 值也会反映这一点。
在以下情况下使用 t 检验:
- 数据服从正态分布
- 样本量足够大
- 处理的是无明显偏态或离群值的连续数据
Mann-Whitney U 检验
Mann-Whitney U 检验比较的是分布而非均值。它将两组的所有数值合并排序并赋秩,检验是否有一组持续地获得更高的秩。由于基于秩,离群值和偏态不会像在均值情况下那样扭曲结果。
当数据确实服从正态分布时,t 检验在检测差异方面通常更有力。Mann-Whitney U 检验更灵活,但会牺牲一定的敏感度。
在以下情况下使用 Mann-Whitney U 检验:
- 数据不服从正态分布
- 处理有序数据
- 样本量小,无法确认正态性
- 存在离群值且无法剔除
下面是两者的快速对比:

t 检验与 Mann-Whitney U 检验对比
拿不准时,先检查分布。如果大致正态,用 t 检验;否则,Mann-Whitney U 检验更稳妥。
Mann-Whitney U 检验的常见错误
大多数错误源于未理解该检验的本质。以下是最常见的几种。
误以为比较的是均值
这是最常见的误解。Mann-Whitney U 检验比较的是分布,而非均值。显著结果表明一组的数值倾向于获得更高的秩——并不代表平均数更高。如果需要描述差异,请报告中位数,而非均值。
忽视分布形状差异
如果两组的分布形状不同——一组右偏,另一组对称——就不能将结果解读为中位数的比较。检验仍可运行,但输出显示的是整体分布的差异,而非中心位置的偏移。在就中位数下结论前请先检查分布。
误解 p 值
p 值低于 0.05 意味着差异具有统计学显著性。它并不告诉您差异有多大或是否具有实际意义。非常大的样本即使组间实际差异很小也可能产生显著的 p 值。如果分析中关心效应量,请另行计算。
用于配对数据
Mann-Whitney U 检验适用于两个独立组。如果数据是配对的——同一受试者测量两次,或成对匹配——应使用 Wilcoxon 符号秩检验。
何时不应使用 Mann-Whitney U 检验
Mann-Whitney U 检验并非所有情境的合适工具。以下情形应选择其他方法。
您的数据是配对的
如果同一受试者同时出现在两组中——如干预前后测量,或匹配对——两组样本并不独立。Mann-Whitney U 检验假设独立,在此情境下会忽略观测间的关联,导致结果不可靠。应使用 Wilcoxon 符号秩检验。
您有两组以上
Mann-Whitney U 检验一次只能比较两组。如果需要比较三组或更多,请使用 Kruskal-Wallis 检验,它是一元方差分析的非参数等价方法,能处理多组。
大样本且数据正态
Mann-Whitney U 检验的主要优势是不要求正态性。如果数据服从正态分布且样本量足以确认这一点,t 检验是更好的选择。它在这种情况下统计功效更高,更有可能在真实存在差异时将其检出。
结论
当您的数据不服从正态分布、t 检验并不合适时,Mann-Whitney U 检验是一个很好的解决方案。
它基于秩而非原始数值工作,因而避开了使参数检验在偏态或小样本数据上不可靠的那些假设。这使它非常适合真实世界的分析——数据很少会按您的期望行事。
更大的启示在于检验方法的选择。没有任何一种检验适用于所有数据集。您应始终先检查数据——其分布、结构和样本量——并据此选择方法。合适的检验就是与您的数据相匹配的那一个。
如果您是统计学新手或想深入学习该主题,我们的 Statistician in R 学习路径将用 52 小时的材料助您胜任相关工作。
常见问题
Mann-Whitney U 检验用于什么场景?
当无法假设数据服从正态分布时,Mann-Whitney U 检验用于比较两个独立组。它将两组的所有数值合并排序并赋秩,检验是否有一组持续地获得更高的秩。适用于有序与连续数据。
Mann-Whitney U 检验与 t 检验有何不同?
t 检验比较两组的均值,并假设正态分布。Mann-Whitney U 检验使用秩来比较分布,因此不作该假设。当数据偏态或样本量较小时,Mann-Whitney U 检验更稳妥。
我何时应使用 Mann-Whitney U 检验?
当您有两个独立组、数据为有序或连续,且无法确认正态性时使用。样本量小且存在离群值时也很合适。如果数据服从正态分布且样本量大,t 检验通常会给出更好的结果。
Mann-Whitney U 检验中的 p 值说明了什么?
p 值低于 0.05 表明两组分布之间存在统计学显著差异。它不告诉您差异有多大或是否具有实践意义。为此,您需要另外计算效应量,并查看各组的中位数。
我可以将 Mann-Whitney U 检验用于配对数据吗?
不能。Mann-Whitney U 检验假设两组相互独立,意味着一组的取值不会影响另一组。如果您的数据是配对的——如对同一受试者的前后测量——应改用 Wilcoxon 符号秩检验。将 Mann-Whitney U 检验用于配对数据会忽略观测之间的关系,导致结果不可靠。