2つのクラスの平均点は統計的に差があると言えるか？

Hello, World! あーみーです！

Life is Tech ! School では，タイピング練習のため，日常的に[寿司打](http://typingx0.net/sushida/)をやる習慣があります．
設定の難易度・コースは，「一発勝負，お手軽3000円コース」です．

日々の点数を記録しているので，タイピング速度・正確さの成長が可視化され実感できます．
また，各Schoolクラスの平均を算出し，ランキングも発表されるので，切磋琢磨されます．

ただ，クラスの人数も違いますし，単に人数で平均を算出したからといって，本当に「クラスごとの平均の差」には意味があるのかという疑問はあります．~~数点の差で負けると悔しいので「平均の差に意味はない」と言いたい！~~

そこで，この記事では，等平均仮説の検定を用いて統計的にその差には意味があるのか確認することを目的として執筆をしていこうと思います．


## 環境

今回は以下の環境で実施します．

- RStudio

今回のデータセットは，Rで作成しました．平均と標準偏差を決めて正規分布に従うように生成しています．生データでの実施は，Schoolのネタとしてこっそりやりたいと思います．

```r:各クラスのデータ生成
# シードを固定 記事の公開日が12月21日なので
set.seed(1221)

# Aクラスの点数 平均点が500点くらいになる小規模クラス
group_A <- as.integer(rnorm(n = 16, mean = 500, sd = 100)) 

# Bクラスの点数 平均点が500点くらいになる大規模クラス
group_B <- as.integer(rnorm(n = 41, mean = 500, sd = 100))
```

結果は以下です．

```r:各クラスのデータ出力
> group_A
 [1] 430 442 495 592 729 527 418 452 518 751
[11] 528 443 419 590 594 484

> group_B
 [1] 432 440 550 516 419 624 370 440 481 560
[11] 654 635 530 605 385 484 446 450 615 575 
[21] 556 411 526 630 523 546 564 295 340 557 
[31] 557 613 387 663 580 451 491 475 334 472 
[41] 701

> mean(group_A)
[1] 525.75

> mean(group_B)
[1] 509.3415
```

Aクラス，Bクラスどちらも同じタイピングレベルで，人数だけ違うという設定にしました．

自分がBクラスだったら，「Aクラスは人数が少ないから平均点が高いんだ！うちのクラスだって負けていない！」と言って悔しがるでしょう(笑)

## 検定の順番

Aクラスの平均点とBクラスの平均点は「統計的に差がある」と言えるか，有意水準0.05で検定をします．

Aクラスの平均点の正規母集団$N(\mu_A, \sigma_A^2)$と，Bクラスの平均点の正規母集団$N(\mu_B, \sigma_B^2)$について，**等平均仮説の検定**を用いて「2つのクラスの平均点に差があるか」の検定をおこないます．

しかしここで，母分散$\sigma^2_A$，$\sigma^2_B$は不明であり且つ，$\sigma^2_A = \sigma^2_B$であるかどうかもわからないため，対象の母分散を等しいと仮定しておこなう等平均仮説の検定がおこなえません．

そこで，等平均仮説の検定を実施するべく，$\sigma_A^2 = \sigma_B^2$と仮定するため，先に**等分散仮説の検定**を用いて$\sigma_A^2 = \sigma_B^2$と仮定していいか検定をおこないます．

つまり，以下の手順で仮説検定をおこないます．

1. 等分散仮説の検定により，対象の母分散が「等しくないとは言えない」ことを検定する．
2. 母分散が等しいと仮定して，等平均仮説の検定により，「2つのクラスの平均点に差があるか」を検定する．

## 等分散仮説の検定

はじめに，等分散仮説の検定をおこないます．

対立仮説$H_1:\sigma_A^2 \neq \sigma_B^2$に対して，帰無仮説$H_0:\sigma_A^2 = \sigma_B^2$を有意水準0.05で両側検定します．

等分散仮説の検定をおこなうことから統計量$F$を使います．

> 検定をおこなう2つの標本不偏分散を$u_1^2$，$u_2^2$とすると統計量$F$は以下の式から求めることができます．
>
>$$F=\frac{u_1^2}{u_2^2}$$
>
> ここで，標本不偏分散$u^2$は，標本数を$n$，分散を$s^2$とすると以下の式から求めることができます．

>$$u^2=\\frac{n s^2}{n-1}$$

今回のデータから，統計量$F$を算出すると以下のようになりました．

$$
F=\frac{u_A^2}{u_B^2}=\frac{10630.2}{9631.63}=1.104
$$

このとき，統計量$F$は自由度$(n_A - 1, n_B - 1)$の$F$分布に従うので，$F$分布表から，有意水準0.05(両側検定のため0.025)の棄却域は以下の結果より$[0, 0.387) \cup (2.182, \infty)$となります．

$$F^{15}_{40}(0.025)=2.182$$

```math
F^{15}_{40}(0.975) = \frac{1}{F_{15}^{40}(0.025)} = \frac{1}{2.58}=0.387
```

よって，統計量$F$は棄却域に入っていないため，帰無仮説$H_0:\sigma_A^2 = \sigma_B^2$が採択されます．

検定の結果，有意水準0.05で，今回のデータから「**母分散が等しくないとは言えない**」ことが確認されました．

```r:Rで計算
> # 統計量Fの算出
> (f <- var(group_A) / var(group_B))
[1] 1.103676

> # 棄却域の算出
> qf(1 - 0.025, 15, 40)
[1] 2.181903
> qf(1 - 0.975, 15, 40)
[1] 0.3868464
```

### 別解

Rで1発で出すときは，以下です．

```R:別解
> var.test(group_A, group_B)

	F test to compare two variances

data:  group_A and group_B
F = 1.1037, num df = 15, denom df = 40, p-value = 0.768
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.5058318 2.8530085
sample estimates:
ratio of variances 
          1.103676
```

結果より，p値が今回の有意水準0.05を上回っているので，帰無仮説を保留し，対象の2クラス間の分散は等しいとします．ここで，結果のF，num df，denom dfはそれぞれF統計量，分子の自由度，分母の自由度を示しています．

95%信頼区間はBクラスに対するAクラスの比の信頼区間であり，左の値が最小値，右の値が最大値を示しています．今回の場合は，その区間に1が入っているため，「データの分散の比が1に等しくない」という対立仮説は採択されません．




## 等平均仮説の検定
等分散仮説の検定により，今回のデータから「母分散が等しくないとは言えない」ことが確認されたため，次に，$\sigma_A^2 = \sigma_B^2$と仮定して等平均仮説の検定をおこなってきます．

対立仮説$H_1:\mu_A \neq \mu_B$に対して，帰無仮説$H_0:\mu_A = \mu_B$を有意水準0.05で両側検定します．

母分散の値が不明なため，$U^2$を用いる統計量$T$を使います．

>検定をおこなう2つの平均を$\overline{x}_1$，$\overline{x}_2$，標本数を$n_1$，$n_2$とすると統計量$T$は以下の式から求めることができます．

>```math
T=\frac{\overline{x}_1 - \overline{x}_2}{\sqrt{U^2(\frac{1}{n_1}+\frac{1}{n_2})}}
```
>ここで，$U^2$は検定をおこなう2つの分散を$s_1^2$，$s_2^2$とすると以下の式から求めることができます．

>```math
U^2 = \frac{n_1 s_1^2 + n_2 s_2^2}{(n_1 - 1)+(n_2 - 1)}
```

今回のデータから，統計量$T$を算出すると以下のようになりました．

```math
T=\frac{\overline{x}_A - \overline{x}_B}{\sqrt{U^2(\frac{1}{n_A}+\frac{1}{n_B})}}
=\frac{525.75 - 509.3415}{\sqrt{9903.968 \times (\frac{1}{16}+\frac{1}{41}})}
=0.559
```

このとき，統計量$T$は自由度$(n_A+n_B-2)$の$T$分布に従うので，$T$分布表から，有意水準0.05(両側検定のため0.025)の棄却域は以下の結果より$(-\infty, -2.004) \cup (2.004, \infty)$となります．

$$T_{55}(0.025)=2.004$$

よって，統計量$T$は棄却域に入っていないため，帰無仮説$H_0:\mu_A=\mu_B$が採択されます．

検定の結果，有意水準0.05で，今回の2つのクラスの平均点は「**統計的に差があるとは言えない**」ことが確認されました．

```r:Rで計算
> # 統計量Tの算出
> n_a <- length(group_A)
> n_b <- length(group_B)
> s_a <- var(group_A) * (n_a - 1) / n_a
> s_b <- var(group_B) * (n_b - 1) / n_b

> u2 <- (n_a * s_a + n_b * s_b) / ((n_a - 1) + (n_b - 1))
> (t <- (mean(group_A) - mean(group_B)) / (sqrt(u2 * ((1 / n_a) + (1 / n_b)))))
[1] 0.559345

> # 棄却域の算出
> qt(1 - 0.025, 55)
[1] 2.004045
```

### 別解

Rで1発で出すときは，以下です．

```R:別解
> t.test(group_A, group_B, var.equal = T)

	Two Sample t-test

data:  group_A and group_B
t = 0.55934, df = 55, p-value = 0.5782
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -42.38066  75.19773
sample estimates:
mean of x mean of y 
 525.7500  509.3415
```

## おわりに
今回は，2つのクラスデータを生成し，2つのクラスの平均点は「統計的に差がある」と言えるかについて検定をおこないました．結果，2つのクラスの平均点は「統計的に差があるとは言えない」ことが確認されました．
注意してほしいのは，今回の結果からは「**何も得られていない**」ということです．検定は帰無仮説を棄却し，対立仮説が採択されて初めて意味があります．
つまり，帰無仮説を棄却できなかった今回のパターンでは，Aクラスのほうが平均点は高いけれど，このデータだけでは，そこにBクラスと**統計的に有意な差**があるとは言えないわけです．

そのため，「このデータだけでは，Aクラスの平均点のほうが上かなんてわからないんだぞ！」と悪あがきするぐらいしかできません．話のネタぐらいなら十分ですが(笑)

[ソースコード](https://gist.github.com/raicos/c0973b6600ba57d84ea443fe163b0df3)

それでは，Happy Hacking :smile: