F分布を数値実験的に確認する

#F分布
皆さん覚えていますか、F分布
私は名前しか覚えていませんでした。


二つの標本があるとき、この二つのそれぞれの母集団の分散は一致するか、考える際に出てきます。

例
サンプルA: 61 62 63 67 61 64
サンプルB: 59 58 61 65 62
「この二つのサンプルのばらつきに差がある」といえるでしょうか

https://staff.aist.go.jp/t.ihara/f.html

がわかりやすいです。

#数値実験
サンプルを二つ取り出し、それぞれの不偏分散の比を計算する。
上記の計算を何度も繰り返し、不偏分散の比の分布を計算する。

サンプルAの不偏分散は自由度5(=要素数6 - 1)のカイ二乗分布に従う
サンプルBの不偏分散は自由度4(=要素数5 - 1)のカイ二乗分布に従う

二つの不偏分散の比はF(5,4)に従う


```python
import numpy as np
import matplotlib.pyplot as plt

n_a = 5
n_b = 4
sample = 100000

a = np.random.normal(
    loc   = 1,      # 平均
    scale = 10,      # 標準偏差
    size  = (sample ,n_a),# 出力配列のサイズ
)


b = np.random.normal(
    loc   = 0,      # 平均
    scale = 10,      # 標準偏差
    size  = (sample ,n_b),# 出力配列のサイズ
)


"""
不偏分散
"""
hoge = a - np.mean(a,axis=1,keepdims=True)
hoge = np.power(hoge,2)     #要素二乗
unbiased_variance_a = np.sum(hoge,axis =1) / (n_a - 1)  #不偏分散なので n-1　で割る

hoge = b - np.mean(b,axis=1,keepdims=True)
hoge = np.power(hoge,2)     #要素二乗
unbiased_variance_b = np.sum(hoge,axis =1) / (n_b - 1)  #不偏分散なので n-1　で割る


F = unbiased_variance_a / unbiased_variance_b

fig, ax = plt.subplots()

ax.hist(F,bins=50000,alpha = 1)

ax.legend()
ax.set_xlim(-3,20)

plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/13376ce1-27aa-5419-ae96-442812dfc895.png)

F分布っぽいグラフが得られました。

#平均に差がある場合、分布に変動はあるのか

平均を変動させ、それぞれの分布を重ね合わせます。


```python
import numpy as np
import matplotlib.pyplot as plt

n_a = 5
n_b = 4
sample = 50000

ans = []
for i in range(10):
    a = np.random.normal(
        loc   = 3**i,      # 平均
        scale = 10,      # 標準偏差
        size  = (sample ,n_a),# 出力配列のサイズ
    )
    
    
    b = np.random.normal(
        loc   = 1,      # 平均
        scale = 10,      # 標準偏差
        size  = (sample ,n_b),# 出力配列のサイズ
    )
    
    
    """
    不偏分散
    """
    hoge = a - np.mean(a,axis=1,keepdims=True)
    hoge = np.power(hoge,2)     #要素二乗
    unbiased_variance_a = np.sum(hoge,axis =1) / (n_a - 1)  #不偏分散なので n-1　で割る
    
    hoge = b - np.mean(b,axis=1,keepdims=True)
    hoge = np.power(hoge,2)     #要素二乗
    unbiased_variance_b = np.sum(hoge,axis =1) / (n_b - 1)  #不偏分散なので n-1　で割る
    
    
    F = unbiased_variance_a / unbiased_variance_b
    ans.append(F)

fig, ax = plt.subplots()

for i in range(10):
    ax.hist(ans[i],bins=200,range = (0,20),alpha = 0.3,label = str(i))

ax.legend()
ax.set_xlim(-3,20)

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e8cf4e79-63c6-9d12-9fa0-0ec4122c93b0.png)

完全に一致しています。


#サンプル間の分散に差がある場合

```python
import numpy as np
import matplotlib.pyplot as plt

n_a = 5
n_b = 4
sample = 50000

ans = []
for i in range(10):
    a = np.random.normal(
        loc   = 1,      # 平均
        scale = 1.5**i,      # 標準偏差
        size  = (sample ,n_a),# 出力配列のサイズ
    )
    
    
    b = np.random.normal(
        loc   = 1,      # 平均
        scale = 1,      # 標準偏差
        size  = (sample ,n_b),# 出力配列のサイズ
    )
    
    
    """
    不偏分散
    """
    hoge = a - np.mean(a,axis=1,keepdims=True)
    hoge = np.power(hoge,2)     #要素二乗
    unbiased_variance_a = np.sum(hoge,axis =1) / (n_a - 1)  #不偏分散なので n-1　で割る
    
    hoge = b - np.mean(b,axis=1,keepdims=True)
    hoge = np.power(hoge,2)     #要素二乗
    unbiased_variance_b = np.sum(hoge,axis =1) / (n_b - 1)  #不偏分散なので n-1　で割る
    
    
    F = unbiased_variance_a / unbiased_variance_b
    ans.append(F)

fig, ax = plt.subplots()

for i in range(10):
    ax.hist(ans[i],bins=200,range = (0,20),alpha = 0.3,label = str(i))

ax.legend()
ax.set_xlim(-3,20)

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/54bffc18-78b6-de9d-aaa5-5cc66968b5ca.png)

分散が違うと、分布が変わることが確かめられました。

#分子と分母
F(10,2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/eb7d9c28-662c-c608-7e13-3394e4928b41.png)
------
F(2,10)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/20e1830a-ccd4-5d66-f3c9-0649f329b9c1.png)

分子と分母が違う場合分布が変わるようです。