LoginSignup
5
2

More than 1 year has passed since last update.

対応がない3群間比較の備忘録

Last updated at Posted at 2022-07-30

はじめに

  • 今回3群間の比較することがあったので、本記事に簡易的にその手法を記載する。
  • 今回の動作環境は以下である。

Windows 11
Python 3.8.5
numpy 1.22.3
scikit-posthocs 0.7.0
scipy 1.5.2
pandas 1.1.1

ライブラリのインポート

from scipy import stats
import numpy as np
import pandas as pd
import scikit_posthocs as sp
from statsmodels.stats.multicomp import pairwise_tukeyhsd

データ例

  • csvデータからデータを読み込んでデータを用意。
  • A列、B列、C列の3列あるとし、データ例は同じ数とする。
df = pd.read_csv('sample.csv')

group_A = df['A']
group_B = df['B']
group_C = df['C']

1. Shapiro-Wilk(シャピロ・ウィルク)検定:正規性検定

  • 3群それぞれ検定。p値が0.05以上であれば正規分布に従う。
  • p1, p2, p3すべてが0.05以上 → 3群すべてで正規性あり → 2. Bartlett(バーレット)検定
  • p1, p2, p3すべてが0.05以上ではない →3群すべてで正規性なし → 5. Kruskal-Wallis検定
#Shapiro-Wilk検定
s1,p1 = stats.shapiro(group_A)
s2,p2 = stats.shapiro(group_B)
s3,p3 = stats.shapiro(group_C)

print('A:' + str(p1) + ', B:' + str(p2) + ', C:' + str(p3))

2. Bartlett(バーレット)検定:等分散性検定

  • p4 > 0.05 → 分散が等しい → 3. 一元配置分散分析:ANOVA
  • p4 < 0.05 → 分散が等しくない → 5. Kruskal-Wallis検定
Bartlett検定
s4,p4 = stats.bartlett(group_A,group_B,group_C)

print('p値'+ str(p4))

3. 一元配置分散分析:ANOVA

  • 分散分析を実施。
  • p5 < 0.05 → 3群間どれかの組み合わせに有意差がある → 4.Tukeyの検定
#ANOVA
s5,p5 = stats.f_oneway(group_A,group_B,group_C)
print('p値'+ str(p5))

4. Tukeyの検定:多重比較

  • 多重比較によりどの群間で有意差があるかを確認
  • p-adjの値が0.05以下が確認
#Tukeyの検定
group = ['group_A' for _ in range(len(group_A))] + ['group_B' for _ in range(len(group_B))] + \
        ['group_C' for _ in range(len(group_C))]
df1 = pd.DataFrame({'group': group, 'score': pd.concat([group_A, group_B, group_C])})

print(pairwise_tukeyhsd(df1.score, df1.group))
#Output sample
 Multiple Comparison of Means - Tukey HSD, FWER=0.05 
=====================================================
 group1  group2 meandiff p-adj   lower  upper  reject
-----------------------------------------------------
group_A group_B   1.3531 0.4975 -1.4773 4.1835  False
group_A group_C   3.8686 0.0044  1.0248 6.7124   True
group_B group_C   2.5155 0.0924 -0.3149 5.3459  False
-----------------------------------------------------

5. Kruskal-Wallis(クラスカル・ウォリス)検定

  • ノンパラメトリック法
  • p6 < 0.05 →3群間のどれかの組み合わせに有意差がある → 6. Steel-Dwass(スティール・ドゥワス)検定
#Kruskal-Wallis検定
s6,p6 = stats.kruskal(group_A,group_B,group_C)

print('p値:' + str(p6))

6. Steel-Dwass(スティール・ドゥワス)検定:多重比較

  • 多重比較によりどの群間で有意差があるかを確認
data = pd.DataFrame({"A": group_A, "B": group_B, "C":group_C})
data = x.melt(var_name='groups', value_name='values')

print(sp.posthoc_dscf(data, val_col='values', group_col='groups'))
#Output sample
          A         B         C
A  1.000000  0.900000  0.062225
B  0.900000  1.000000  0.109268
C  0.062225  0.109268  1.000000

参考文献

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2