pythonの大きな特徴の一つとして、統計学を扱うことができる、というものがあります
pythonを学び始めた方の中にも、
「ビッグデータの統計を出来るようになりたい」
「pythonを統計ソフトとして扱いたい」
と思っている方もいるのではないでしょうか?
しかし、ネット上にはarray型にしたデータを用意して統計を…
という情報が多く、csvやExcelファイルから読み込んで、pythonで統計処理を行う方法については記載されていません
そこで、この記事ではcsvファイルから読み込んだ任意の列を統計にかける方法について、解説していきたいと思います
今回、pythonで統計をかけるのは「ウィルコクソン符号付き順位検定」と呼ばれるものです
実際のサンプルコードをもとに解説をしていきます
pythonで統計学を学ぶ流れは以下の記事を参考にしてください

Contents
ウィルコクソン符号付き順位検定とは
ウィルコクソン符号付き順位検定はノンパラメトリック検定の一種で、2つのデータに対応がある場合に用います
ノンパラメトリック検定で2つのデータに対応がない場合には、「マンホイットニーのU検定(ウィルコクソンの順位和検定)」を用います

ウィルコクソン符号付き順位検定では、得られたデータを順位化して、統計的推定をおこないます
ウィルコクソン符号付き順位検定の仮説は以下のようになっています
- 帰無仮説H0:「母代表値に差はない」
- 対立仮説H1:「母代表値に差がある」
検定統計量が定めた有意水準以下の場合には、帰無仮説が棄却されることになります
ウィルコクソン符号付き順位検定は「前」「後」の比較
ウィルコクソン符号付き順位検定は、対応のある2つのデータを比較する場合に用います
では、対応のあるデータとはどういったものでしょうか?
例えば、高血圧で服薬しているAさんがいた場合に、
服薬し始めるx月y日と服薬開始2週間後のx月y+2週日で、血圧を比較したい場合や、
ダイエット開始日と1ヶ月後の体重を比較したい場合など、
同一人物から2回以上データを測定した場合に、対応のある検定手法を用います
ウィルコクソン符号付き順位検定をかける手順
ウィルコクソン符号付き順位検定をかける手順として、
- 2群は対応している
- 正規性がない
というのが前提になります
正規性の検定については、以下の記事で詳しく解説していますので、参考にしてみてください

pythonでウィルコクソン符号付き順位検定をかけてみる
pythonでウィルコクソン符号付き順位検定をかける場合には、scipyのstats.wilcoxonを使用します
scipy.stats.wilcoxon(x、 y = None、 zero_method = 'wilcox'、 correction = False、 alternative = 'two-sided'、 mode = 'auto')
上記のコードでウィルコクソン符号付き検定をかけることができます
私は以下のようにコードを書いています
from scipy import stats
stats.wilcoxon(A, B, alternative='two-sided')
このような表記でもウィルコクソン符号付き順位検定をかけることができます
「alternative」は両側検定か片側検定かです
alternative=’two-sided’で両側検定、
alternative=’greater’もしくは’less’で片側検定になります
ウィルコクソン符号付き検定のxとyについて
ウィルコクソンの符号付き検定は対応のある2つのデータを比較する検定手法のため、
x,yの値は入力する必要があります
しかし、yの値を指定しない場合には、xの値にxとyの値の差を入力する必要があります
コードにすればすぐかもしれませんが、余計な作業を増やす必要はないので、x,yの値を入力すればOKです
csvから取り込んだデータを2群に分ける
ではcsvから読み込んだデータを2群に分けていきます
import pandas as pd
import os
import csv
from scipy import stats
def MannWhitneyUtest():
type = [("all file","*")] # 読み取るファイルをcsvに絞り込む。
file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)
print(stasticsdata)
A_list=stasticsdata.iloc[:,2]
A=list(A_list)
B_list=stasticsdata.iloc[:,3]
B=list(B_list)
result=stats.wilcoxon(A, B, alternative='two-sided')
ID | Group | A_Group_Sitting height | B_Group_Sitting height |
No.1 | A | 68 | 68 |
No.2 | A | 72 | 72 |
No.3 | A | 89 | 89 |
No.4 | A | 68 | 68 |
No.5 | A | 75 | 75 |
No.6 | A | 77 | 77 |
No.7 | B | 73 | 73 |
No.8 | B | 81 | 83 |
No.9 | B | 75 | 73 |
No.10 | B | 77 | 75 |
No.11 | B | 73 | 72 |
No.12 | B | 83 | 80 |
No.13 | B | 69 | 71 |
上記のようなcsvデータが読み取ります
# 読み取るファイル形式を絞る(今回の場合は全てのファイル)
type = [("all file","*")]
#ファイル参照画面を開いて、ファイルを選択する
file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
#選択したcsvファイルを読み込み、インデックスはNone(なし)とする
stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)
#stasticsdataの中身を確認する
print(stasticsdata)
この状態で「stasticsdata」にcsvデータが読み込まれます
今回のcsvのデータとは異なりますが、読み込めていると、上記のように表出されるはずです
これだとA群とB群の指定がまだできていないため、統計をかけたい値をA群・B群に指定していきます
#2列目をA群として読み込む
A_list=stasticsdata.iloc[:,2]
#読み込んだ2列目をリスト形式にする
A=list(A_list)
#3列目をB群として読み込む
B_list=stasticsdata.iloc[:,3]
#読み込んだ3列目をリスト形式にする
B=list(B_list)
#ウィルコクソン符号付き順位検定をかける(両側検定)
result=stats.wilcoxon(A, B, alternative='two-sided')
上記のコードで好きな列をA群・B群に指定することができます
pythonではcsv1列目のデータが「0」として表現されるので、0からのスタートになります
ilocを使えば列番号で指定して、取り出すことができます
>>>pandasで任意の列・行の値を取得する方法(…coming soon…)
ID | Group | A_Group_Sitting height | B_Group_Sitting height |
No.1 | A | 68 | 68 |
No.2 | A | 72 | 72 |
No.3 | A | 89 | 89 |
No.4 | A | 68 | 68 |
No.5 | A | 75 | 75 |
No.6 | A | 77 | 77 |
No.7 | B | 73 | 73 |
No.8 | B | 81 | 83 |
No.9 | B | 75 | 73 |
No.10 | B | 77 | 75 |
No.11 | B | 73 | 72 |
No.12 | B | 83 | 80 |
No.13 | B | 69 | 71 |
あとは実行すれば検定結果が表示されるはずです
私はGUIで作成しているので、検定結果をリストボックスに表示させています
listbox1.insert(tk.END,"p=%.5f" %(result.pvalue))
まとめ
今回はウィルコクソン符号付き順位検定について解説をしました
pythonを使えば簡単に統計をかけることができます
統計をかけること自体は簡単に行えますが、群の設定やcsvから取り込んだデータの処理などがややめんどくさいかもしれません
しかし、一度作ってしまえば、他の統計をかけるときも
stats.xxxxxx()
xのところだけを変えるのみで済むので、スムーズに作ることができると思います
さらにGUIにしてしまえば、自分だけではなく、pythonの入っていないパソコンでも使うことができます
ぜひ参考にしてみてください
私がpythonを学ぶのに参考にした書籍は以下です
スクールに通わずにpythonを学習するためには?
Python学習を進めていく上で、
「ひとまず何かしらの書籍に目を通したい」「webで調べても全くわからない」という状況が何度も何度でも出てくるかと思います。
そういう時に便利なのが、kindleとテラテイルです。
Kindleはご存知の通り、電子書籍です。
Kindleには多くのpython学習本が用意されており、無料で読むことができます。(たまに有料もあります)
ひとまずどういった書籍があるのか?もしものために、書籍に目を通しておこう
という場合には、kindleの利用がおすすめです。