2025/5/2

エクセル関数を使ったマンホイットニーのU検定のやり方【コピペ用テンプレートあり】

Thumbnail for エクセル関数を使ったマンホイットニーのU検定のやり方【コピペ用テンプレートあり】

はじめに

エクセル関数を使った、 マンホイットニーのU検定(ウィルコクソンの順位和検定)のやり方を紹介します。 ここでは大標本向けの方法(正規近似)を用います。

下にテンプレート(セルデータサンプル)があるので、 コピペですぐに使用できます。

マンホイットニーのu検定とは

マンホイットニーのU検定とは、「2つの母集団の分布の中央値に有意差があるか」を判定する統計的仮説検定の1つです。 ウィルコクソンの順位和検定とも呼ばれます。 対応のないt検定のノンパラメトリック版として使用されます。

いつ使うのか?

マンホイットニーのU検定は、以下のような場合に使用します。

  • カテゴリデータでない
  • データが正規分布していない、または外れ値が大きい(間隔・比率尺度データのとき)
  • データが独立した2群(グループ)

マンホイットニーのU検定は、 標本サイズによって途中の手順が変わります。 ここでは、 大標本向けの方法(正規近似)を用いる ため、 以下のいずれかの条件を満たす必要があります。

  • 2群の両方のサイズ n ≧ 8
  • 2群の内の片方のサイズ n ≧ 21

算出値の意味

仮説検定では、 p値 を算出し、 有意水準α と比較を行います。 マンホイットニーのU検定(正規近似)での p値 は、 検定統計量 ZUZ_Uから NORMSDIST関数を使って得られます。

p値有意水準α による判定は以下の通りです。

  • p値 < α のとき: 各群の母集団の中央値の間に有意差が ある
  • p値 ≥ α のとき: 各群の母集団の中央値の間に有意差が ない

エクセルでの算出方法

以下の 全セルをコピー ボタンをクリックし、エクセルの A1 セルに貼り付けると、 K16 セルにp値(下記の場合 0.031449255)、 K19セルに検定結果(下記の場合 (有意差)あり)が出力されます。

データを書き換える場合は、 A, B列のデータを書き換え、 J3, J4セルのグループ名も更新してください。 またデータ数に応じて、D ~ G列のセル中の計算式を下に拡張(コピー)、 または削除してください。

ABCDEFGHIJKLM
1データ
2グループ順位同値判定kk^3-k順位和nU
3X99=RANK.AVG(B3,B:B)=IF(ROW()=MATCH(B3,B:B,0),1,0)=IF(E3=1,COUNTIF(B:B,B3),0)=F3^3-F3X=SUMIFS(D:D,A:A,J3)=COUNTIFS(A:A,J3)=$L$3*$L$4+(L3*(L3+1))/2-K3
4Y137=RANK.AVG(B4,B:B)=IF(ROW()=MATCH(B4,B:B,0),1,0)=IF(E4=1,COUNTIF(B:B,B4),0)=F4^3-F4Y=SUMIFS(D:D,A:A,J4)=COUNTIFS(A:A,J4)=$L$3*$L$4+(L4*(L4+1))/2-K4
5X108=RANK.AVG(B5,B:B)=IF(ROW()=MATCH(B5,B:B,0),1,0)=IF(E5=1,COUNTIF(B:B,B5),0)=F5^3-F5
6X111=RANK.AVG(B6,B:B)=IF(ROW()=MATCH(B6,B:B,0),1,0)=IF(E6=1,COUNTIF(B:B,B6),0)=F6^3-F6
7Y124=RANK.AVG(B7,B:B)=IF(ROW()=MATCH(B7,B:B,0),1,0)=IF(E7=1,COUNTIF(B:B,B7),0)=F7^3-F7N=L3+L4
8Y134=RANK.AVG(B8,B:B)=IF(ROW()=MATCH(B8,B:B,0),1,0)=IF(E8=1,COUNTIF(B:B,B8),0)=F8^3-F8T=SUM(G:G)
9X116=RANK.AVG(B9,B:B)=IF(ROW()=MATCH(B9,B:B,0),1,0)=IF(E9=1,COUNTIF(B:B,B9),0)=F9^3-F9
10X133=RANK.AVG(B10,B:B)=IF(ROW()=MATCH(B10,B:B,0),1,0)=IF(E10=1,COUNTIF(B:B,B10),0)=F10^3-F10U=MIN(M3:M4)
11Y150=RANK.AVG(B11,B:B)=IF(ROW()=MATCH(B11,B:B,0),1,0)=IF(E11=1,COUNTIF(B:B,B11),0)=F11^3-F11μ_u=L3*L4/2
12X103=RANK.AVG(B12,B:B)=IF(ROW()=MATCH(B12,B:B,0),1,0)=IF(E12=1,COUNTIF(B:B,B12),0)=F12^3-F12σ_u^2=L3*L4/12*(K7+1-K8/(K7*(K7-1)))
13Y135=RANK.AVG(B13,B:B)=IF(ROW()=MATCH(B13,B:B,0),1,0)=IF(E13=1,COUNTIF(B:B,B13),0)=F13^3-F13z_u=ABS((K10-K11))/SQRT(K12)
14X139=RANK.AVG(B14,B:B)=IF(ROW()=MATCH(B14,B:B,0),1,0)=IF(E14=1,COUNTIF(B:B,B14),0)=F14^3-F14
15Y90=RANK.AVG(B15,B:B)=IF(ROW()=MATCH(B15,B:B,0),1,0)=IF(E15=1,COUNTIF(B:B,B15),0)=F15^3-F15有意水準α0.05
16Y112=RANK.AVG(B16,B:B)=IF(ROW()=MATCH(B16,B:B,0),1,0)=IF(E16=1,COUNTIF(B:B,B16),0)=F16^3-F16p値=2*(1-NORMSDIST(K13))
17X146=RANK.AVG(B17,B:B)=IF(ROW()=MATCH(B17,B:B,0),1,0)=IF(E17=1,COUNTIF(B:B,B17),0)=F17^3-F17
18X150=RANK.AVG(B18,B:B)=IF(ROW()=MATCH(B18,B:B,0),1,0)=IF(E18=1,COUNTIF(B:B,B18),0)=F18^3-F18結果
19X155=RANK.AVG(B19,B:B)=IF(ROW()=MATCH(B19,B:B,0),1,0)=IF(E19=1,COUNTIF(B:B,B19),0)=F19^3-F19有意差=IF(K16<=K15,"あり","なし")
20X141=RANK.AVG(B20,B:B)=IF(ROW()=MATCH(B20,B:B,0),1,0)=IF(E20=1,COUNTIF(B:B,B20),0)=F20^3-F20
21X139=RANK.AVG(B21,B:B)=IF(ROW()=MATCH(B21,B:B,0),1,0)=IF(E21=1,COUNTIF(B:B,B21),0)=F21^3-F21
22X196=RANK.AVG(B22,B:B)=IF(ROW()=MATCH(B22,B:B,0),1,0)=IF(E22=1,COUNTIF(B:B,B22),0)=F22^3-F22
23X155=RANK.AVG(B23,B:B)=IF(ROW()=MATCH(B23,B:B,0),1,0)=IF(E23=1,COUNTIF(B:B,B23),0)=F23^3-F23
24X159=RANK.AVG(B24,B:B)=IF(ROW()=MATCH(B24,B:B,0),1,0)=IF(E24=1,COUNTIF(B:B,B24),0)=F24^3-F24
25X161=RANK.AVG(B25,B:B)=IF(ROW()=MATCH(B25,B:B,0),1,0)=IF(E25=1,COUNTIF(B:B,B25),0)=F25^3-F25
26X164=RANK.AVG(B26,B:B)=IF(ROW()=MATCH(B26,B:B,0),1,0)=IF(E26=1,COUNTIF(B:B,B26),0)=F26^3-F26
27X144=RANK.AVG(B27,B:B)=IF(ROW()=MATCH(B27,B:B,0),1,0)=IF(E27=1,COUNTIF(B:B,B27),0)=F27^3-F27
28X150=RANK.AVG(B28,B:B)=IF(ROW()=MATCH(B28,B:B,0),1,0)=IF(E28=1,COUNTIF(B:B,B28),0)=F28^3-F28
29X132=RANK.AVG(B29,B:B)=IF(ROW()=MATCH(B29,B:B,0),1,0)=IF(E29=1,COUNTIF(B:B,B29),0)=F29^3-F29
30Y164=RANK.AVG(B30,B:B)=IF(ROW()=MATCH(B30,B:B,0),1,0)=IF(E30=1,COUNTIF(B:B,B30),0)=F30^3-F30
31Y172=RANK.AVG(B31,B:B)=IF(ROW()=MATCH(B31,B:B,0),1,0)=IF(E31=1,COUNTIF(B:B,B31),0)=F31^3-F31
32Y154=RANK.AVG(B32,B:B)=IF(ROW()=MATCH(B32,B:B,0),1,0)=IF(E32=1,COUNTIF(B:B,B32),0)=F32^3-F32
33Y154=RANK.AVG(B33,B:B)=IF(ROW()=MATCH(B33,B:B,0),1,0)=IF(E33=1,COUNTIF(B:B,B33),0)=F33^3-F33
34X130=RANK.AVG(B34,B:B)=IF(ROW()=MATCH(B34,B:B,0),1,0)=IF(E34=1,COUNTIF(B:B,B34),0)=F34^3-F34
35Y151=RANK.AVG(B35,B:B)=IF(ROW()=MATCH(B35,B:B,0),1,0)=IF(E35=1,COUNTIF(B:B,B35),0)=F35^3-F35
36X147=RANK.AVG(B36,B:B)=IF(ROW()=MATCH(B36,B:B,0),1,0)=IF(E36=1,COUNTIF(B:B,B36),0)=F36^3-F36
37Y160=RANK.AVG(B37,B:B)=IF(ROW()=MATCH(B37,B:B,0),1,0)=IF(E37=1,COUNTIF(B:B,B37),0)=F37^3-F37
38Y162=RANK.AVG(B38,B:B)=IF(ROW()=MATCH(B38,B:B,0),1,0)=IF(E38=1,COUNTIF(B:B,B38),0)=F38^3-F38
39Y178=RANK.AVG(B39,B:B)=IF(ROW()=MATCH(B39,B:B,0),1,0)=IF(E39=1,COUNTIF(B:B,B39),0)=F39^3-F39
40Y179=RANK.AVG(B40,B:B)=IF(ROW()=MATCH(B40,B:B,0),1,0)=IF(E40=1,COUNTIF(B:B,B40),0)=F40^3-F40
41Y182=RANK.AVG(B41,B:B)=IF(ROW()=MATCH(B41,B:B,0),1,0)=IF(E41=1,COUNTIF(B:B,B41),0)=F41^3-F41
42Y182=RANK.AVG(B42,B:B)=IF(ROW()=MATCH(B42,B:B,0),1,0)=IF(E42=1,COUNTIF(B:B,B42),0)=F42^3-F42
43X112=RANK.AVG(B43,B:B)=IF(ROW()=MATCH(B43,B:B,0),1,0)=IF(E43=1,COUNTIF(B:B,B43),0)=F43^3-F43
44Y169=RANK.AVG(B44,B:B)=IF(ROW()=MATCH(B44,B:B,0),1,0)=IF(E44=1,COUNTIF(B:B,B44),0)=F44^3-F44
45Y187=RANK.AVG(B45,B:B)=IF(ROW()=MATCH(B45,B:B,0),1,0)=IF(E45=1,COUNTIF(B:B,B45),0)=F45^3-F45
46Y149=RANK.AVG(B46,B:B)=IF(ROW()=MATCH(B46,B:B,0),1,0)=IF(E46=1,COUNTIF(B:B,B46),0)=F46^3-F46
47Y109=RANK.AVG(B47,B:B)=IF(ROW()=MATCH(B47,B:B,0),1,0)=IF(E47=1,COUNTIF(B:B,B47),0)=F47^3-F47
48X79=RANK.AVG(B48,B:B)=IF(ROW()=MATCH(B48,B:B,0),1,0)=IF(E48=1,COUNTIF(B:B,B48),0)=F48^3-F48
49X109=RANK.AVG(B49,B:B)=IF(ROW()=MATCH(B49,B:B,0),1,0)=IF(E49=1,COUNTIF(B:B,B49),0)=F49^3-F49
50X188=RANK.AVG(B50,B:B)=IF(ROW()=MATCH(B50,B:B,0),1,0)=IF(E50=1,COUNTIF(B:B,B50),0)=F50^3-F50
51X64=RANK.AVG(B51,B:B)=IF(ROW()=MATCH(B51,B:B,0),1,0)=IF(E51=1,COUNTIF(B:B,B51),0)=F51^3-F51
52X168=RANK.AVG(B52,B:B)=IF(ROW()=MATCH(B52,B:B,0),1,0)=IF(E52=1,COUNTIF(B:B,B52),0)=F52^3-F52
53X168=RANK.AVG(B53,B:B)=IF(ROW()=MATCH(B53,B:B,0),1,0)=IF(E53=1,COUNTIF(B:B,B53),0)=F53^3-F53
54X115=RANK.AVG(B54,B:B)=IF(ROW()=MATCH(B54,B:B,0),1,0)=IF(E54=1,COUNTIF(B:B,B54),0)=F54^3-F54
55Y180=RANK.AVG(B55,B:B)=IF(ROW()=MATCH(B55,B:B,0),1,0)=IF(E55=1,COUNTIF(B:B,B55),0)=F55^3-F55
56X135=RANK.AVG(B56,B:B)=IF(ROW()=MATCH(B56,B:B,0),1,0)=IF(E56=1,COUNTIF(B:B,B56),0)=F56^3-F56
57Y191=RANK.AVG(B57,B:B)=IF(ROW()=MATCH(B57,B:B,0),1,0)=IF(E57=1,COUNTIF(B:B,B57),0)=F57^3-F57
58Y110=RANK.AVG(B58,B:B)=IF(ROW()=MATCH(B58,B:B,0),1,0)=IF(E58=1,COUNTIF(B:B,B58),0)=F58^3-F58
59

算出手順

エクセルでマンホイットニーのU検定(正規近似)を行うための手順は、以下の6つです。

1. データ値の順位を算出

2グループを混ぜたデータを、RANK.AVG()関数で小さい順に並べます。 同値の場合は平均値をとります。

2. 重複の補正項の計算

データ中に重複がある場合、検定統計量 ZUZ_U を算出する値に補正項 TT を入れる必要があります。

補正項:

T=i=1ki3kiT = \sum_{i=1} k_i^3 - k_i

そのために必要な k2kk^2-k の計算を、E ~ G列で以下のように行います。

  1. 同値判定 (E列):重複している場合は、2回目以降の重複値で0を、それ以外は1を返す(ROW(), MATCH()関数使用)。
  2. kk の算出 (F列): 重複数をカウント(同値判定 = 1 の行のみ)。
  3. k2kk^2-k の算出 (G列):kk を使って計算。

ROW関数

指定したセルの行番号を返す。
未指定の場合、呼び出し元のセルが指定される。

例:=ROW()

  • 第1引数 : セルの指定範囲(オプション)

MATCH関数

指定した範囲の中で検索し、最初にヒットした相対位置を返す。

例:=MATCH(50,B:B,0)

  • 第1引数 (99): 検索値(必須)
  • 第2引数 (B:B): 検索範囲(必須)
  • 第3引数 (0): 照合の型を 0, -1, 1 で指定(オプション)
    • 0: 完全一致したセルを返す
    • 1: 検索値以下の最大値のセルを返す
    • -1: 検索値以上の最小値のセルを返す

3. グループ別に順位和, nn, UUを算出

2グループそれぞれ、個別の順位和とデータサイズ nnUU値 を算出します。

a. 順位和

SUMIFS()関数を使い、各グループごとに順位和(順位の合計値)を算出します。

SUMIFS関数

条件にマッチした値のみの合計値を返す。
第4引数, 第5引数, ... を追加することで、条件を増やすことができる(省略可、最大127条件)。

例:=SUMIFS(D:D,A:A,J3)

  • 第1引数 (D:D): 合計する値の範囲(必須)
  • 第2引数 (A:A): 条件をチェックする範囲(必須)
  • 第3引数 (J3): 条件(必須)
  • 第4引数, 第5,...引数 : 条件範囲と条件を追加(オプション)
b. データサイズ nn

=COUNTIFS()関数を使い、各グループごとにデータサイズを算出します。

COUNTIFS関数

条件にマッチした値をカウントする。
第3引数, 第4引数, ... を追加することで、条件を増やすことができる(省略可、最大127条件)。

例:=COUNTIFS(A:A,J3)

  • 第1引数 (J3): 条件をチェックする範囲(必須)
  • 第2引数 (J3): 条件(必須)
  • 第3引数, 第4,...引数 : 条件範囲と条件を追加(オプション)
c. UU

上記の a., b.の結果を使って、各グループごとにUU値を算出します。 データ中の2グループがX, Yのとき、 グループ XXUU値は、以下の通りです。

UX=nXnY+nX(nX+1)2HXU_X = n_Xn_Y + \frac{n_X(n_X+1)}{2} - H_X
  • nXn_X : グループ XX のデータサイズ
  • nYn_Y : グループ YY のデータサイズ
  • HXH_X : グループ XX の順位和

4. 検定統計量 ZUZ_U の算出

手順2, 3で算出した値を使って、検定統計量 ZUZ_U を算出します。

ZU=UμUσU2Z_U = \frac{|U - \mu_U |}{\sqrt{\sigma_U^2}} \\
  • U=min(UX,UY)U = {\rm min}(U_X, U_Y)
  • μU=nXnY/2\mu_U = n_Xn_Y/2
  • σU2=nXnY/12×(N+1TN(N+1))\sigma_U^2 = n_Xn_Y/12 \times (N+1-\frac{T}{N(N+1)})
  • N=nX+nYN = n_X + n_Y

5. α設定、p値の算出

事前に、有意水準αを設定します。 0.05(5%)や 0.01(1%)が一般的です。

次に、検定統計量 ZUZ_U から、NORMSDIST()関数を使ってp値を算出します。

NORMSDIST関数

標準正規分布の累積分布関数を返す。

例:=NORMSDIST(1.96)

  • 第1引数 (1.96): 標準正規分布の値(必須)

6. 結果の表示

手順5で設定した有意水準と、算出したp値を比較し、検定結果を表示します。