2022年 11月 9日

单因素Anova分析 Python实现

单因素方差分析常用于判断在多个分组中某个指标是否具有显著差异,下面以射击比赛为例,三位选手分别成绩如下:

Pat – 5, 4, 4, 3, 9, 4
Jack – 4, 8, 7, 5, 1, 5
Alex – 9, 9, 8, 10, 4, 10

基于上述数据,我们希望判断上述三个选手中成绩最好的。原假设:三个选手的成绩无显著差异。
在这里插入图片描述
拒绝原假设的就表示在三个选手中至少有两个人是具有显著差异的。

import numpy as np
from scipy import stats
 
data = np.rec.array([
('Pat', 5),
('Pat', 4),
('Pat', 4),
('Pat', 3),
('Pat', 9),
('Pat', 4),
('Jack', 4),
('Jack', 8),
('Jack', 7),
('Jack', 5),
('Jack', 1),
('Jack', 5),
('Alex', 9),
('Alex', 8),
('Alex', 8),
('Alex', 10),
('Alex', 5),
('Alex', 10)], dtype = [('Archer','|U5'),('Score', '<i8')])
 
f, p = stats.f_oneway(data[data['Archer'] == 'Pat'].Score,
                      data[data['Archer'] == 'Jack'].Score,
                      data[data['Archer'] == 'Alex'].Score)
 
print ('One-way ANOVA')
print ('=============')
 
print ('F value:', f)
print ('P value:', p, '\n')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

得到的结果如下:
在这里插入图片描述
由于P值0.02 < 0.05;所以我们拒绝原假设,认为三个选择间至少有两个具有显著性的差异。虽然知道了三者间具有显著差异,但是我们还是希望能够判断出哪个选手是三人中成绩最好的,接下来采用Tukey’s range test进行分析。

from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison
  • 1
  • 2

并在第一部分的代码后添加如下代码

mc = MultiComparison(data['Score'], data['Archer'])
result = mc.tukeyhsd()
 
print(result)
  • 1
  • 2
  • 3
  • 4

结果如下图
在这里插入图片描述
在上图中,可以看出(Alex&Jack) 和(Alex&Pat)拒绝原假设,
在这里插入图片描述
通过均值的差值可以得出结论Alex是三个选择中成绩最好的。