分布と検定


# 分布

## 乱数と一様分布

まずは、一様乱数を発生させて、その分布を図示してみましょう。


```python
# 乱数を扱うためのライブラリをインポートする。
import random
```


```python
sample_size = 10 # 乱数発生回数

# 一様乱数を dist に格納する （distribution : 分布）
dist = [random.random() for i in range(sample_size)]
```


```python
# dist の中身を確認する。
dist
```


```python
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline
```


```python
# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()
```

### 乱数発生回数を増やしてみる

乱数発生回数を多くするにしたがって、"理想的な" 分布の形に近づいていきます。


```python
sample_size = 100 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()
```


```python
sample_size = 1000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()
```


```python
sample_size = 10000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()
```


```python
sample_size = 100000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()
```

### binを増やしてみる

ゴミを分別するのに使う箱のことを bin と言います。ヒストグラムを描く時は、いくつの bin に分別するかで表示が違ってきます。binの数を多くすると、分布の細かい形が見えますが、ひとつのbinあたり分別されたデータ数は当然少なくなります。


```python
sample_size = 100000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100) # binを多くする
plt.grid()
plt.show()
```

## 二項分布

 __np.random.binomial(n, p)__ は、確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、奇数が出る個数を返します。このような分布を、二項分布と言います。
 
### 等確率の二項分布

奇数と偶数が等確率で出るルーレットを１０回プレイし、奇数が出る回数を数えます。それを１００００回繰り返します。奇数と偶数が同じ回数だけ出る確率（５回ずつ出る確率）はどのくらいでしょうか。


```python
# 数値計算のライブラリをインポートする。
import numpy as np
```


```python
sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=10, p=0.5) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()
```

上図から分かるように、奇数と偶数が等確率で出るルーレットを１０回プレイして、奇数と偶数が同じ回数だけ出る確率（５回ずつ出る確率）は、約２５％（１００００回中の約２５００回）ほどです。案外少ない、という印象を持つかもしれませんね。

#### そのルーレットはイカサマか

あなたはカジノで他の客がルーレットをプレイしているのを観察していました。すると、奇数の出る回数がやけに多いので、そのルーレットはイカサマではないかという気がしてきました。イカサマでなければ、ルーレットは奇数と偶数が等確率で出るはずです。ところがこのルーレットは、１００回中６０回、奇数が出ました。このルーレットはイカサマでしょうか。

奇数と偶数が等確率で出るルーレットを１００回プレイした時、奇数が出る回数が６０回以上になる確率はどれくらいでしょうか。まずは分布を描いてみましょう。


```python
sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=100, p=0.5) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()
```

上と同様の計算で、今度は「ルーレットを１００回プレイして奇数が６０回以上出る確率」を計算してみます。


```python
sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=100, p=0.5) for i in range(sample_size)]

p = sum([1 for n in dist if n >= 60]) / sample_size
print("p値: %(p)s " %locals())
```

奇数と偶数が等確率で出るルーレットを１００回プレイして、奇数が出る回数が「偶然」６０回以上になる確率は 5% 以下になることが分かりました。つまり、１００回中６０回以上奇数が出るようなルーレットは、そのルーレットがイカサマだと疑ってみるのが良さそうです。

このときのpを、p値(有意確率)と呼びます。

* 帰無仮説：そのルーレットはイカサマではない（奇数と偶数が等確率で出る）。
* 対立仮説：そのルーレットはイカサマである。
* p < 0.05 なので、有意水準5%で、帰無仮説を棄却できる。
* すなわち、そのルーレットはイカサマである可能性が高い。

#### 課題1

１００回中６０回以上奇数が出るようなルーレットは、そのルーレットがイカサマだと疑ってみるのが良さそうです。では、１０回中６回以上奇数が出た場合、<u>奇数が出た確率は同じ６０％</u>ですが、そのルーレットはイカサマと言えるでしょうか。p値を計算して答えてください。


```python
# 課題1
```

### 等確率でない二項分布

全住民の5%がある感染症に罹患したと推定されている。その全住民の中から無作為に20人を抽出した場合、抽出された集団の中に罹患者は何人いるでしょうか。そのような分布も二項分布になります。分布を描いてみましょう。


```python
sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=20, p=0.05) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()
```

#### 課題2

全住民の5%がある感染症に罹患したと推定されている。その全住民の中から無作為に100人を抽出したところ、抽出された集団の中に罹患者が10人以上いた。

(1)　それが偶然起こる確率を概算しなさい。

(2)　その結果をどう解釈すれば良いか。


```python
# 課題2
```

## 正規分布

__random.normalvariate(mu, sigma)__ は正規分布に従う乱数を発生させる関数です（mu は平均で、sigma は標準偏差）。

### 標準正規分布

平均０、標準偏差1の正規分布を「標準正規分布」と言います。標準正規分布を描いてみましょう。


```python
sample_size = 10000 # 乱数発生回数

dist = [random.normalvariate(mu=0, sigma=1) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()
```

標準正規分布に従う乱数が２以上の値を出力する確率はどのくらいでしょうか。計算してみましょう。


```python
sample_size = 10000 # 乱数発生回数

dist = [random.normalvariate(mu=0, sigma=1) for i in range(sample_size)]

p = sum([1 for n in dist if n >= 2]) / sample_size
print("p値: %(p)s " %locals())
```

## 偏差値

大学受験模試などでよく使われる「偏差値」は、平均５０、標準偏差１０の正規分布に従うという仮定をおいています。分布を描いてみましょう。ここで、縦軸は「学生数」をイメージしてください。


```python
sample_size = 10000 # 乱数発生回数

# 平均５０、標準偏差１０の正規分布
dist = [random.normalvariate(mu=50, sigma=10) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()
```

### 課題3

偏差値７０以上の学生は、１万人中、何人いると推定されるでしょうか。


```python
# 課題3
```

# 検定


```python
import numpy as np # 数値計算を行うライブラリ
import scipy as sp # 科学計算ライブラリ
from scipy import stats # 統計計算ライブラリ
```

## カイ２乗検定

カイ２乗検定は、２つの分布が同じかどうかを検定するときに用いる手法です。

サイコロを60回ふり、各目が出た回数を数えたところ、次のようになりました。

<table border=1>
<tr><td>サイコロの目</td>
<td>１</td><td>２</td><td>３</td><td>４</td><td>５</td><td>６</td></tr>
<tr><td>出現回数</td>
<td>17</td><td>10</td><td>6</td><td>7</td><td>15</td><td>5</td></tr>
</table>

このとき、理論値の分布（一様分布）に従うかどうかを検定してみましょう。


```python
significance = 0.05
o = [17, 10, 6, 7, 15, 5] # 実測値
e = [10, 10, 10, 10, 10, 10] # 理論値

chi2, p = stats.chisquare(o, f_exp = e)

print('chi2 値は %(chi2)s' %locals())
print('確率は %(p)s' %locals())

if p < significance:
    print('有意水準 %(significance)s で、有意な差があります' %locals())
else:
    print('有意水準 %(significance)s で、有意な差がありません' %locals())
```

    chi2 値は 12.4
    確率は 0.029699459203520212
    有意水準 0.05 で、有意な差があります


### 課題4

ある野菜をＡ方式で育てたものとＢ方式で育てたものの出荷時の等級が次の表のようになったとき，これらの育て方と製品の等級には関連があると見るべきでしょうか。

<table border="1" bgcolor="#FFFFFF" cellpadding="0" cellspacing="0" align="center">
  <tr> 
    <th width="100" height="30" bgcolor="#CCCC99"></th>
    <th width="81" height="30" bgcolor="#FFFFCC"> 優 </th>
    <th width="100" height="30" bgcolor="#FFCCCC"> 良 </th>
    <th width="100" height="30" bgcolor="#99FFCC"> 可 </th>
    <th width="100" height="30" bgcolor="#CCCCCC">計</th>
  </tr>
  <tr align="center"> 
    <td width="100" height="30" bgcolor="#CCCC99"> Ａ方式 </td>
    <td width="100" height="30" bgcolor="#FFFFFF"> 12</td>
    <td width="100" height="30" bgcolor="#FFFFFF">30</td>
    <td width="100" height="30" bgcolor="#FFFFFF">58</td>
    <td width="100" height="30" bgcolor="#CCCCCC">100</td>
  </tr>
  <tr align="center"> 
    <td width="119" height="30" bgcolor="#CCCC99"> B方式 </td>
    <td width="81" height="30" bgcolor="#FFFFFF"> 14</td>
    <td width="100" height="30" bgcolor="#FFFFFF">90</td>
    <td width="100" height="30" bgcolor="#FFFFFF">96</td>
    <td width="100" height="30" bgcolor="#CCCCCC">200</td>
  </tr>
  <tr align="center" bgcolor="#CCCCCC"> 
    <td width="119" height="30">計</td>
    <td width="81" height="30">26</td>
    <td width="100" height="30">120</td>
    <td width="100" height="30">154</td>
    <td width="100" height="30">300</td>
  </tr>
</table>


```python
# 課題4
```

## 対応のない t 検定


```python
# 対応のないt検定
significance = 0.05
X = [68, 75, 80, 71, 73, 79, 69, 65]
Y = [86, 83, 76, 81, 75, 82, 87, 75]

t, p = stats.ttest_ind(X, Y)

print('t 値は %(t)s' %locals())
print('確率は %(p)s' %locals())

if p < significance:
    print('有意水準 %(significance)s で、有意な差があります' %locals())
else:
    print('有意水準 %(significance)s で、有意な差がありません' %locals())
```

    t 値は -3.214043146821967
    確率は 0.006243695014300228
    有意水準 0.05 で、有意な差があります


### 課題5

６年１組と６年２組の２つのクラスで同一の算数のテストを行い、採点結果が出ました。２つのクラスで点数に差があるかどうか検定してください。

<table border="1" bgcolor="#FFFFFF" cellpadding="0" cellspacing="0" align="center">
  <tr align="center"> 
    <th width="120" height="30" bgcolor="#ffffcc"> ６年１組</th>
    <th width="120" height="30" bgcolor="#ffffcc"> 点数</th>
    <th width="120" height="30" bgcolor="#ffcccc"> ６年２組</th>
    <th width="120" height="30" bgcolor="#ffcccc"> 点数</th>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc"> 1</td>
    <td width="120" height="30" bgcolor="#FFFFFF"> 70</td>
    <td width="120" height="30" bgcolor="#cccccc"> 1</td>
    <td width="120" height="30"> 85</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">2</td>
    <td width="120" height="30" bgcolor="#FFFFFF">75</td>
    <td width="120" height="30" bgcolor="#cccccc">2</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">3</td>
    <td width="120" height="30" bgcolor="#FFFFFF">70</td>
    <td width="120" height="30" bgcolor="#cccccc">3</td>
    <td width="120" height="30">95</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">4</td>
    <td width="120" height="30" bgcolor="#FFFFFF">85</td>
    <td width="120" height="30" bgcolor="#cccccc">4</td>
    <td width="120" height="30">70</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">5</td>
    <td width="120" height="30" bgcolor="#FFFFFF">90</td>
    <td width="120" height="30" bgcolor="#cccccc">5</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">6</td>
    <td width="120" height="30" bgcolor="#FFFFFF">70</td>
    <td width="120" height="30" bgcolor="#cccccc">6</td>
    <td width="120" height="30">75</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">7</td>
    <td width="120" height="30" bgcolor="#FFFFFF">80</td>
    <td width="120" height="30" bgcolor="#cccccc">7</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">8</td>
    <td width="120" height="30" bgcolor="#FFFFFF">75</td>
    <td width="120" height="30" bgcolor="#cccccc">8</td>
    <td width="120" height="30">90</td>
  </tr>
</table>


```python
class_one = [70, 75, 70, 85, 90, 70, 80, 75]
class_two = [85, 80, 95, 70, 80, 75, 80, 90] 
```


```python
# 課題5
```

## 対応のある t 検定


```python
# 対応のあるt検定
significance = 0.05
X = [68, 75, 80, 71, 73, 79, 69, 65]
Y = [86, 83, 76, 81, 75, 82, 87, 75]

t, p = stats.ttest_rel(X, Y)

print('t 値は %(t)s' %locals())
print('確率は %(p)s' %locals())

if p < significance:
    print('有意水準 %(significance)s で、有意な差があります' %locals())
else:
    print('有意水準 %(significance)s で、有意な差がありません' %locals())
```

    t 値は -2.9923203754253302
    確率は 0.02016001617368161
    有意水準 0.05 で、有意な差があります


### 課題6

国語と算数の点数に差があるかどうか検定してください。

<table border="1" bgcolor="#FFFFFF" cellpadding="0" cellspacing="0" align="center">
  <tr align="center"> 
    <th width="120" height="30" bgcolor="#ffffcc">６年１組</th>
    <th width="120" height="30" bgcolor="#ffffcc">国語</th>
    <th width="120" height="30" bgcolor="#ffcccc">算数</th>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc"> 1</td>
    <td width="120" height="30" bgcolor="#FFFFFF"> 90</td>
    <td width="120" height="30"> 95</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">2</td>
    <td width="120" height="30" bgcolor="#FFFFFF">75</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">3</td>
    <td width="120" height="30" bgcolor="#FFFFFF">75</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">4</td>
    <td width="120" height="30" bgcolor="#FFFFFF">75</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">5</td>
    <td width="120" height="30" bgcolor="#FFFFFF">80</td>
    <td width="120" height="30">75</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">6</td>
    <td width="120" height="30" bgcolor="#FFFFFF">65</td>
    <td width="120" height="30">75</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">7</td>
    <td width="120" height="30" bgcolor="#FFFFFF">75</td>
    <td width="120" height="30">80</td>
  </tr>
  <tr align="center"> 
    <td width="120" height="30" bgcolor="#cccccc">8</td>
    <td width="120" height="30" bgcolor="#FFFFFF">80</td>
    <td width="120" height="30">85</td>
  </tr>
</table>


```python
kokugo =   [90, 75, 75, 75, 80, 65, 75, 80]
sansuu = [95, 80, 80, 80, 75, 75, 80, 85]
```


```python
# 課題6
```

## 分散分析


```python
# 1要因の分散分析
significance = 0.05
a = [34, 39, 50, 72, 54, 50, 58, 64, 55, 62]
b = [63, 75, 50, 54, 66, 31, 39, 45, 48, 60]
c = [49, 36, 46, 56, 52, 46, 52, 68, 49, 62]
f, p = stats.f_oneway(a, b, c)

print('f 値は %(f)s' %locals())
print('確率は %(p)s' %locals())

if p < significance:
    print('有意水準 %(significance)s で、有意な差があります' %locals())
else:
    print('有意水準 %(significance)s で、有意な差がありません' %locals())
```

    f 値は 0.09861516667148518
    確率は 0.9064161716556407
    有意水準 0.05 で、有意な差がありません


### 課題7

下記のデータを用いて、分散分析を行ってください。


```python
group1 = [80, 75, 80, 90, 95, 80, 80, 85, 85, 80, 90, 80, 75, 90, 85, 85, 90, 90, 85, 80]
group2 = [75, 70, 80, 85, 90, 75, 85, 80, 80, 75, 80, 75, 70, 85, 80, 75, 80, 80, 90, 80]
group3 = [80, 80, 80, 90, 95, 85, 95, 90, 85, 90, 95, 85, 98, 95, 85, 85, 90, 90, 85, 85]
```


```python
# 課題7
```

# 課題8

Twitter 上で行われた以下のアンケート結果の中から１つ選び、統計的検定を行いなさい。また、その結果について統計的に考察しなさい。

* https://twitter.com/maskot1977/status/921705356341927938
* https://twitter.com/maskot1977/status/1134066208070746112
* https://twitter.com/maskot1977/status/1185076824016969728
* https://twitter.com/maskot1977/status/1179953253510811648