統計学を使っていると、3群以上の比較を行う場面が出てきます
A,B,C群の3群があった場合に、各組み合わせでt検定やマンホイットニーのU検定はかけてはいけない、というのが通説です
このように3群以上の比較を行うときに使用するのが、クラスカル・ウォリス検定やフリードマン検定と呼ばれる検定手法です
今回はクラスカル・ウォリス検定をpythonでかける方法について、サンプルコードを交えながら解説していきたいと思います
pythonで統計学を学ぶ流れは以下の記事を参考にしてください
Contents
クラスカル・ウォリス検定とは
クラスカル・ウォリス検定はノンパラメトリック検定の一つです
対応のない3つ以上のグループ間で差の有無を検討したい場合に用います
>>>データの対応の有無とは?(…coming soon…)
クラスカル・ウォリス検定は3群間に有意差があるかどうか?
を検定するものであって、どの群間に有意差があるかまではわかりません
そのため、クラスカル・ウォリス検定で有意差を認めた場合には、多重比較を行う必要が出てきます
>>>多重比較検定とは?(…coming soon…)
データが正規分布に従っている場合には、一元配置分散分析の使用になります
こちらも、どの群間に有意差があるかまではわからないため、多重比較が必要になってきます
クラスカル・ウォリス検定をかける手順
クラスカル・ウォリス検定をかける前提として、
- 正規分布していない
- 対応のないデータ
- 3群以上の比較を行いたい
という条件が必要です
正規性の検定については、以下の記事で詳しく解説していますので、参考にしてください
pythonでクラスカル・ウォリス検定をかけてみる
pythonでクラスカル・ウォリス検定をかける場合には、scipyのstats.kruskal()を使用します
scipy.stats.kruskal(*args, nan_policy='propagate')
scipy.stats.mstats.kruskal(*args)
上記のコードでクラスカル・ウォリス検定をかけることができます
pythonではクラスカル・ウォリス検定が2種類用意されています
scipy.stats.kruskal(*args, nan_policy='propagate')
こちらのコードでクラスカル・ウォリス検定をかける場合には、全てのグループの母集団の中央値が等しいという帰無仮説を検定します
帰無仮説を棄却した場合でも、どのグループ間が異なるのかを示すものではないため、その後の多重比較検定が必要になります
scipy.stats.mstats.kruskal(*args)
それに対して、上記のコードでは、中央値の等さについては言及しません
私は以下のようにコードを書いています
def KruskalWallistest():
type = [("all file","*")]
file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)
A_list=stasticsdata.iloc[:,2]
A=list(A_list)
B_list=stasticsdata.iloc[:,3]
B=list(B_list)
C_list=stasticsdata.iloc[:,4]
C=list(C_list)
A_mean=sum(A_list)/len(A_list)
B_mean=sum(B_list)/len(B_list)
C_mean=sum(C_list)/len(C_list)
data=[["A_mean",A_mean],["B_mean",B_mean],["C_mean",C_mean]]
df=pd.DataFrame(data,columns=["name","mean"])
df.plot(x="name",y=["mean"],kind="bar",figsize=(9,8))
plt.show()
result=stats.mstats.kruskalwallis(A,B,C)
text.insert(tk.END,stasticsdata.describe())
listbox1.insert(tk.END,"p=%.3f" %(result.pvalue))
ちょっと煩雑なコードですが、SDを算出して、棒グラフにエラーバーをつけています
ノンパラなので、本来は棒グラフではなく、箱ひげ図なんですけど、そこは今後修正していく予定です
csvで読み込んだデータから、列数を指定することで、好きな列を検定にかけることができます
iloc[]の数値を変えれば、違う列のデータをクラスカル・ウォリス検定にかけることもできます
まとめ
今回はクラスカル・ウォリス検定について解説をしました
pythonを使えば簡単に統計をかけることができます
統計をかけること自体は簡単に行えますが、群の設定やcsvから取り込んだデータの処理などがややめんどくさいかもしれません
しかし、一度作ってしまえば、他の統計をかけるときも
stats.xxxxxx()
xのところだけを変えるのみで済むので、スムーズに作ることができると思います
さらにGUIにしてしまえば、自分だけではなく、pythonの入っていないパソコンでも使うことができます
ぜひ参考にしてみてください
私がpythonと統計学を学ぶのに参考にした書籍は以下です
スクールに通わずにpythonを学習するためには?
Python学習を進めていく上で、
「ひとまず何かしらの書籍に目を通したい」「webで調べても全くわからない」という状況が何度も何度でも出てくるかと思います。
そういう時に便利なのが、kindleとテラテイルです。
Kindleはご存知の通り、電子書籍です。
Kindleには多くのpython学習本が用意されており、無料で読むことができます。(たまに有料もあります)
ひとまずどういった書籍があるのか?もしものために、書籍に目を通しておこうという場合には、kindleの利用がおすすめです。