python PR

【pythonで統計学】マンホイットニーのU検定を実施する~サンプルコード多め~

python マンホイットニーのU検定
記事内に商品プロモーションを含む場合があります

pythonを学び始めた方の中には統計ソフトとしての使い方もできるから、
という方もいるのではないでしょうか?

実際に私はその一人ですが、pythonを使った統計学のサンプルコードを置いているサイトって少ない気がするんですよね

置いてあっても用いるデータが

A = np.array([13.8, 3.8, 4.6, 10.0, 4.2, 16.1, 14.4, 4.9, 7.8, 11.4])
B = np.array([3.3, 1.1, 4.0, 4.7, 1.9, 3.1, 4.7, 5.3, 4.3, 3.0, 1.0])

とかって感じになっているんですよね

これだと、excelデータやcsvデータから読み込んだ場合に、統計がかけられないんですよね

なので、実際にexcelやcsvから読み込んだデータをどのようにマンホイットニーのU検定にかけるかの説明をしていきたいと思います

pythonで統計学を学ぶ流れは以下の記事を参考にしてください

python 統計学
pythonで統計学を学ぶメリット〜実際の学習手順を紹介〜近年、データサイエンティストの需要が高まってきていますが、データサイエンティスト必須能力として、「プログラミング言語」「統計学」が挙げられています。pythonで統計学を扱えれば、データサイエンティストとしての道も開けるでしょう。今回はpythonで統計学を学ぶメリットや実際にどのように学習していくべきかを解説していきたいと思います。...

マンホイットニーのU検定

マンホイットニーのU検定は「ウィルコクソンの順位和検定」とも呼ばれている、ノンパラメトリック検定の一つです

「ウィルコクソン」とつくノンパラメトリック検定にはもう一つ、
「ウィルコクソンの符号付き順位検定」というものがあります

両者は似たような名前ですが、使用する場面が異なります

マンホイットニーのU検定では、2つのデータに対応がない場合に使用します
それに対して、ウィルコクソンの符号付き順位検定では、ノンパラメトリック検定で、2つのデータに対応がある場合に使用します

python ノンパラ パラメトリック
【pythonで統計学】ノンパラメトリックとパラメトリック検定について統計検定を選択するときに、「ノンパラメトリック(ノンパラ)」「パラメトリック」という文字を見るかと思います。初めて統計に触れる方は、これが何を意味していて、何がどう違うのかがわからないと思います。検定手法を選ぶ際に、ノンパラかパラメトリックかはとても大切な事項になります。今回は、ノンパラとパラメトリックの違いについてと、pythonでどのように判断するかの方法について解説していきたいと思います...

マンホイットニーのU検定とウィルコクソンの符号付き順位検定

マンホイットニーのU検定では、
帰無仮説H0:「2群の母代表値に差はない」
対立仮説H1:「2群の母代表値に差がある」

ということになります

それに対して、ウィルコクソン符号付き順位検定では、
帰無仮説H0:「母代表値に差はない」
対立仮説H1:「母代表値に差がある」

ということになります

マンホイットニーのU検定をかける手順

マンホイットニーのU検定をかける前提として、

  • 独立した2群
  • 正規性がない

というのが前提になります
そのため、まずは対応のあるデータかどうか?

対応のないデータである場合には、正規性の有無は?

ということを確認しなくてはいけません

python 正規性の検定
【pythonで統計学】正規性の検定(シャピロウィルク検定etc)のかけ方~サンプルコード付き~t検定などの統計手法をかける場合には、まずそのデータが正規分布しているかを調べなくてはいけません。正規性を確認する方法の一つに、ヒストグラムを書いて目視で確認する、という方法がありますが、これだけでは正確ではありません。 そこで、「Q-Qプロット」や「シャピロウィルク検定」「コルモゴロフスミルノフ検定」などを使用して、正規性を確認していきます。 実際に統計をかける場合には、csvやexcelデータなどを読み込んで、統計にかけることが多いと思います。そこで今回は、pythonを使ってcsvから取り込んだデータで正規性の検定を行う方法について、解説していきたいと思います。...

EZRでマンホイットニーのU検定をかける

余談ですが、EZRでは対応のあるなしでデータの置き方が変わります
対応がない場合には以下のようになります

Group Sitting height
A 68
A 72
A 89
A 68
A 75
A 77
B 73
B 83
B 69
B 88
B 85
B 70

(sitting height=座高)

それに対して、対応がある場合には以下のようになります

Sitting height(morning) Sitting height(evening)
68 68
72 72
89 89
68 68
75 75
77 77
73 73
81 83
75 73
77 75
73 72
83 80
69 71

時間帯による座高の違いを比べた場合には上記のような記載方法になります

これ、めんどくさくないですか?
対応の有無によってデータの配置を変えるの

僕は超絶めんどくさいと思っているので、これを同じ並びのデータで同じ結果を得られるようにpythonで作ってみました

pythonでマンホイットニーのU検定をかけてみる

pythonでマンホイットニーのU検定をかける場合には、scipyのstatsを使用します

from scipy import stats
stats.mannwhitneyu(A, B, alternative='two-sided')

これでマンホイットニーのU検定をかけることができます
「alternative」は両側検定か片側検定かです

デフォルトでは両側検定になっているので、指定しなくてもOKです

参考サイト>>>scipy.stats.mannwhitneyu

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.mannwhitneyu(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データが読み込まれます

マンホイットニーのU検定用データ
今回の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)

#マンホイットニーのU検定をかける(両側検定)
result=stats.mannwhitneyu(A, B, alternative='two-sided')

上記のコードで好きな列をA群・B群に指定することができます
pythonではcsv1列目のデータが「0」として表現されるので、0からのスタートになります
ilocを使えば列番号で指定して、取り出すことができます

python pandas 抽出
pandasのデータフレームから任意の行・列を抽出する〜サンプルコード付き〜Pythonでcsvデータを取り込んだ際、データフレームの形で取り込まれます。取り込んだデータから、特定のデータを抽出したい場合も多々あります。今回はデータフレームで取り込んだデータから、特定の行・列を抽出し、目的の形へと加工する方法について解説していきます。...
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

python列の数え方
あとは実行すれば検定結果が表示されるはずです
私は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の利用がおすすめです。

kindleでpythonの書籍を無料で読んでみる

おすすめプログラミングスクール(無料体験あり)

Webスキルのパーソナルジム【WEBCAMP】

WEBCAMPを徹底解説している記事はこちら

pythonコースを利用できるWEBCAMPを徹底解説【無料体験あり】
pythonコースを利用できるWEBCAMPを徹底解説【無料体験あり】pythonを学ぶことができる「WECAMP」ですが、実際はどうなのでしょうか?webcampで本当にpythonを学ぶことができるのか・案件をとることができるのか、などpythonを初めて学ぶ方は不安に思うと思います。そこで、この記事ではpythonを学ぶことができるwebcampについて徹底解説していきます...
AIを学ぶならアイデミープレミアム

アイデミープレミアムを徹底解説している記事はこちら

Python アイデミープレミアム
pythonが学べるアイデミープレミアムを徹底解説【無料体験あり】アイデミープレミアムはpythonに特化したプログラミングスクールです。pythonを学ぼうと思った方は、一度は聞いたことがあるのではないでしょうか。今回はアイデミープレミアムで学ぶことで、エンジニア業界の戦力になれるのか、しっかりとpythonを学ぶことができるのかについて、徹底解説していきます...
pythonコース【テックアカデミー】

テックアカデミーを徹底解説している記事はこちら

pythonが学べるテックアカデミーを徹底解説【無料体験あり】
pythonが学べるテックアカデミーを徹底解説【無料体験あり】今回の記事では、 pythonを扱えるようになりたい pythonを学んでエンジニアになりたい テックアカデミーってよく聞くけ...

My Agile Privacy
This website uses technical and profiling cookies. Clicking on "Accept" authorises all profiling cookies. Clicking on "Refuse" or the X will refuse all profiling cookies. By clicking on "Customise" you can select which profiling cookies to activate.