はじめに
- 今回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