2026年8月13日木曜日

Brunner-Munzel検定

 Brunner-Munzel検定(以下,BM検定)は,WMW検定と同じく,特定の確率分布を仮定しないノンパラメトリックな方法です.

WMW検定では,母集団が従う確率分布がどんな分布でも問題はなく,2つの分布の形は同じであるという前提条件がありました(帰無仮説H0が正しいときには,分布は一致するので,分散も等しくなる).一方,BM検定は,2つの確率分布の形状が同じでなくても問題ありません.

Rのデフォルト関数にはBM検定がないので,パッケージをインストールする必要があります.BM検定を行うパッケージには以下の3つ(rankFD,lawstat,brunnermunzel)があります.

> install.packages("rankFD")

> install.packages("lawstat")

> install.packages("brunnermunzel")

以下では,brunnermunzelを使って検定を行ってみます.まずは,パッケージをロードします.

> library(brunnermunzel)

関数はbrunnermunzel.testとなります.コマンドは brunnermunzel.test(A ~ B) となります.

> brunnermunzel.test(choles ~ suppl)


Brunner-Munzel Test


data:  choles by suppl

Brunner-Munzel Test Statistic = 2.9318, df = 5.2973, p-value = 0.03039

95 percent confidence interval:

 0.552361 1.207639

sample estimates:

P(X<Y)+.5*P(X=Y) 

            0.88 

結果を見るとP値が0.03039で,有意水準αの0.05(5%)より小さいので,統計的に有意だと結論づけることができます.結論としては「サプリメントAの飲用者とBの飲用者の間にはコレステロール値に統計的に有意な差が認められた(P=0.030)」,「サプリメントAの飲用者のコレステロール値は,Bの飲用者よりも低かった(P=0.030)」などとすることができます.

続けて,並べ替えBM検定を行ってみます.関数はbrunnermunzel.permutation.testで,コマンドはbrunnermunzel.permutation.test(A ~ B) となります.

> brunnermunzel.permutation.test(choles ~ suppl)


permuted Brunner-Munzel Test


data:  choles by suppl

p-value = 0.05556

sample estimates:

P(X<Y)+.5*P(X=Y) 

            0.88 

結果を見ると,P値が0.05556で,有意水準αの0.05(5%)より大きいので,統計的に有意ではないと結論づけることができます.結論としては「サプリメントAの飲用者とBの飲用者の間にはコレステロール値に統計的に有意な差は認められなかった(P=0.056)」などとすることができます.

2026年8月12日水曜日

Wilcoxon-Mann-Whitney (WMW) 検定

 WMW検定は,Mann-WhitneyのU検定とWilcoxonの順位和検定の総称です.正規分布を仮定しないWMW検定は,どんな確率分布にも対応しますが,比較する2つの母集団が同じ形状の確率分布に従うという過程があります.

RでWMW検定を行うには"exactRankTests"パッケージのインストールが必要です.パッケージのインストールは,Rを立ち上げて,以下のコマンドを実行します(ミラーの選択を求められるので,近い場所〜例えばJapan〜を選んでダウンロードします).

> install.packages("exactRankTests")

ダウンロードが済んだら,以下のコマンドを実行してライブラリをロードします.

> library(exactRankTests)


前回までと同様にデータの読み込みが完了している前提で検定を行います.WMW検定を行うコマンドは,

> wilcox.exact(A ~ B)

となります.
実行してみます.

> wilcox.exact(choles ~ suppl)

すると,以下のような返答が返ってきます.

Exact Wilcoxon rank sum test


data:  choles by suppl

W = 3, p-value = 0.05556

alternative hypothesis: true mu is not equal to 0

P値は0.05556で,有意水準のαの0.05(5%)より大きいので,統計的に有意な差は認められないので「サプリメントAの飲用者とBの飲用者の間にはコレステロール値に統計的な有意な差は認められなかった(P=0.056)」と結論づけられます.

"exactRankTests"パッケージを使わない場合は,Rに標準装備されている wolcox.testを使うこともできます.

> wilcox.test(choles ~ suppl)


Wilcoxon rank sum exact test


data:  choles by suppl

W = 3, p-value = 0.05556

alternative hypothesis: true location shift is not equal to 0


Jupyter Notebookファイルはこちら(GitHub)

2026年8月11日火曜日

Welchのt検定

Weltchのt検定は,独立2群のt検定が拡張された手法です.Weltchのt検定では等分散を仮定せず,比較する母集団の母分散σ^2(もしくは,母標準偏差σ)が等くても(σA=σB),等くなくても(σAσB)どちらの状況にも対応します.Weltchのt検定の過程は比較する2つの母集団が正規分布に従うことだけを前提としています.

前回同様に,データ(example_a.csv)を読み込みます.

> ex.a <- read.csv("example.a.csv")

読み込まれたデータがカテゴリカルデータとして認識されているかどうかを確認して,文字型として認識されている場合は,以下のように修正します.

> str(ex.a)

'data.frame': 10 obs. of  2 variables:

 $ choles: int  118 132 120 115 113 129 126 134 135 131

 $ suppl : chr  "A" "A" "A" "A" ...

> ex.a $ suppl <- factor(ex.a $suppl)

> str(ex.a)

'data.frame': 10 obs. of  2 variables:

 $ choles: int  118 132 120 115 113 129 126 134 135 131

 $ suppl : Factor w/ 2 levels "A","B": 1 1 1 1 1 2 2 2 2 2


RでWeltchのt検定を実行するときは以下のコマンドを実行します

> t.test(A ~ B)

この構文は,独立2群のt検定のt検定の構文から引数""var.equal=TRUE"を抜いたものになります(関数 t.test がデフォルトで実行するのはWeltchのt検定ということ).

実行してみます.

> t.test(choles ~ suppl)


Welch Two Sample t-test


data:  choles by suppl

t = -3.0732, df = 5.8431, p-value = 0.02261

alternative hypothesis: true difference in means between group A and group B is not equal to 0

95 percent confidence interval:

 -20.536084  -2.263916

sample estimates:

mean in group A mean in group B 

          119.6           131.0 

P値が0.02261になっていて,有意水準αの0.05(5%)より小さいので,統計的に有意と結論づけられ,サプリメントAの飲用者とBの飲用者の間には,コレステロールとに統計的に有意な差が認められた(P=0.023)ということができます.

Jupyter Notebookファイルはこちら(GitHub)

2026年8月10日月曜日

独立2群のt検定

Rによる独立2群のt検定

 CSV形式で,以下のようなコレステロールと飲用しているサプリメントの種類に関するデータ(引用しているサプリメントとコレステロールの関係データ)があったとします(これをexample_a.csvというファイル名で保存します).

choles,suppl

118,A

132,A

120,A

115,A

113,A

129,B

126,B

134,B

135,B

131,B

このデータを用いて,独立2群のt検定を行うには以下のようなコマンドを実行します.

まずは,データのcsvファイル(example_a.csv)を読み込み,"ex.a"という名前をつけます.ターミナルからRを起動して,以下のコマンドを実行します.

> ex.a <- read.csv("example_a.csv")

ex.a にデータが格納されているかを確認しておきます.

> ex.a

   choles suppl

1     118     A

2     132     A

3     120     A

4     115     A

5     113     A

6     129     B

7     126     B

8     134     B

9     135     B

10    131     B

データの構造を確認するための 関数str を使って,データを見てみます.

> str(ex.a)

'data.frame': 10 obs. of  2 variables:

 $ choles: int  118 132 120 115 113 129 126 134 135 131

 $ suppl : chr  "A" "A" "A" "A" ...

ここで,以下の文章はex.aがデータフレーム型であり,2つの変数からなっていて,それぞれ10個の観測値を持つと書かれています.これは正しいのでOKです.

'data.frame': 10 obs. of  2 variables:


続いて,変数に関する情報です.最初の"choles"は,int(整数)型の数値であることを示していて,各値も示されています.続いて,2つ目の変数"suppl"は,chr(文字列)型の変数として読み込まれています.

 $ choles: int  118 132 120 115 113 129 126 134 135 131

 $ suppl : chr  "A" "A" "A" "A" ...

"suppl"がchr(文字列)型のままでは解析ができないので,以下のようにfactor関数を使って,強制的に因子型に読み直すように指示します.

> ex.a $ suppl <- factor(ex.a $ suppl)

再度,確認してみると,int型で認識されていることが確認できます.

> str(ex.a)

'data.frame': 10 obs. of  2 variables:

 $ choles: int  118 132 120 115 113 129 126 134 135 131

 $ suppl : Factor w/ 2 levels "A","B": 1 1 1 1 1 2 2 2 2 2


ここから,t検定に入ります.まずは,関数attachを使ってデータフレーム"ex.a"の中を探索範囲とします.

> attach(ex.a)


独立2郡のt検定を行うには,以下のコマンドを実行します.

> t.test(A ~ B, var.equal=TRUE)

ここで,"A~B"はモデル式です."var.equal=TRUE"は等分散を仮定してt検定を行うというオプション指定です(TRUEと書かずにTだけでもOKです).

"choles"を応答変数(response variable),"suppl"を説明変数(explanatory variable)にモデル式(choles ~ suppl)として指定して,"var.equal=T"では,等分散を仮定してt検定を行うという指示を出しています.ここで,"TRUE"ではなく"T"と書いています.

> t.test(choles ~ suppl, var.equal=T)


Two Sample t-test


data:  choles by suppl

t = -3.0732, df = 8, p-value = 0.01527

alternative hypothesis: true difference in means between group A and group B is not equal to 0

95 percent confidence interval:

 -19.954001  -2.845999

sample estimates:

mean in group A mean in group B 

          119.6           131.0 


上記の結果において,

t = -3.0732, df = 8, p-value = 0.01527

においては,検定統計量t,自由度dfP値が示されています.
この結果では,P値が0.01527なので,優位水準αの0.05(5%)より小さいことから,統計的に有意と結論づけることができます.
加えて,以下の結果よりAの標本平均は119.6,Bの標本平均は131.0であることから,サプリメントAの飲用者のコレステロール値は,Bの飲用者のコレステロール値よりも低かった(P=0.015)と結論づけられます.

mean in group A mean in group B 

          119.6           131.0 


95 percent confidence interval:

 -19.954001  -2.845999

は,比較する2つの母集団AとBの母平均の差μA-μBに対する95%信頼区間の下限(下側信頼限界)と上限(上側信頼限界)を示しています.

関数attachを使わない方法としては"$"を使う方法があります.

> t.test(ex.a$choles ~ ex.a$suppl, var.equal=T)


Two Sample t-test


data:  ex.a$choles by ex.a$suppl

t = -3.0732, df = 8, p-value = 0.01527

alternative hypothesis: true difference in means between group A and group B is not equal to 0

95 percent confidence interval:

 -19.954001  -2.845999

sample estimates:

mean in group A mean in group B 

          119.6           131.0 

得られる結果は,当然同じ結果になります.

結果について説明しておくと,tの値は検定統計寮,dfは自由度,p-valueはP値を示しています.

t = -3.0732, df = 8, p-value = 0.01527

この結果では,P値が0.01527と有意水準αの0.05(5%)より小さいので,統計的に有意という結果が得られています.
比較する2つの母集団AとBの,母平均の差 μAB に対する95%信頼区間の下限(下限信頼限界)は-19.954001に,上限(上限信頼限界)は-2.845999になります.

95 percent confidence interval:

 -19.954001  -2.845999

また,Aグループの平均は119.6,Bグループの平均は131.0となっています.

mean in group A mean in group B 

          119.6           131.0 




2026年8月9日日曜日

Jupyter Notebook でJuliaを使う際の設定メモ

 HomebrewでJuliaをインストールするには,ターミナルから以下のコマンドを実行します.

% brew install --cask julia


Jupyter Notebookはインストールされている前提で,Juliaのパスを通します.

% echo 'export PATH=$PATH:/path/to/install/folder/bin' >> ~/.zshrc

$ exec $SHELL

Juliaを起動して"]"を押すとパッケージモードに変わるので,以下のように"IJulia"パッケージを追加します.

% Julia                                                            

               _

   _       _ _(_)_     |  Documentation: https://docs.julialang.org

  (_)     | (_) (_)    |

   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.

  | | | | | | |/ _` |  |

  | | |_| | | | (_| |  |  Version 1.12.6 (2026-04-09)

 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org release

|__/                   |


(@v1.12) pkg> add IJulia


インストールが済んで,Jupyter Notebookを立ち上げると,Juliaを選択できるようになっているはずです.

一応,ターミナルからJupyterのカーネルを確認すると,以下のようになっているはずです.

% jupyter kernelspec list

Available kernels:

  ir            /Users/***/Library/Jupyter/kernels/ir

  julia-1.12    /Users/***/Library/Jupyter/kernels/julia-1.12

  python3       /opt/anaconda3/share/jupyter/kernels/python3