Kruskal-Wallis检验
Kruskal-Wallis检验一般用于比较常见的比较三个群体的水平,比如我们有一班、二班、三班的语文成绩,我们将三个班的学生成绩混合在一起进行排名,也就是我们平时所说的级排名。进一步通过计算班级的平均级排名来判断班级之间的班级水平,这个方法要求数据之间要独立分布,即不要有类似三个班之间会有互相辅导的情况,不互相影响。
Friedman检验
Friedman检验同样用于检验水平,但比较倾向于检验不同时期的水平,比如有甲乙丙三人的期中、期末、模拟考成绩,假设只看成绩来判断,分别用成绩计算每个学生自己三个时期成绩排名(纵向对比,排名在学生个人内部),并计算每个时期的学生平均排名,就可以得到在每个时期学生的水平是否有进步。注意,这里很容易有个误区是理解为进行学生之间的对比,那样得到的是哪个学生更厉害,我们需要观察不是与外界比较,而是自己与自己对比。
分别举一个例子来说明:
R
library(dplyr)
# 生成数据:3个班级的成绩
classes <- data.frame(
class = rep(c("A", "B", "C"), each = 3),
score = c(78, 85, 90, 55, 68, 72, 92, 88, 95)
)
# 查看全局排名(验证!)
classes$global_rank <- rank(classes$score) # 55排1,68排2,...,95排9
# 计算各班平均排名
classes %>%
group_by(class) %>%
summarise(mean_rank = mean(global_rank))
# 运行Kruskal-Wallis检验
kruskal.test(score ~ class, data = classes)
# 生成数据:3个学生的3次考试成绩
students <- data.frame(
student = rep(1:3, each = 3),
exam = rep(c("期中", "期末", "模拟考"), times = 3),
score = c(80, 85, 78, 70, 72, 68, 90, 88, 92)
)
# 查看每个学生的内部排名(验证!)
students %>%
group_by(student) %>%
mutate(rank = rank(score)) # 学生甲:期末(1), 期中(2), 模拟考(3)
# 运行Friedman检验
friedman.test(score ~ exam | student, data = students)
输出:
R
Kruskal-Wallis rank sum test
data: score by class
Kruskal-Wallis chi-squared = 6.4889, df = 2, p-value = 0.03899
Friedman rank sum test
data: score and exam and student
Friedman chi-squared = 0.66667, df = 2, p-value = 0.7165
从结果可以看到Kruskal-Wallis的p值小于0.05,结果有一定的可信度,3个班级的数学成绩分布存在显著差异(至少有一个班级与其他不同);而Friedman的p值大于0.05,所以同一批学生在3次考试(期中、期末、模拟考)中的成绩变化没有差异。