統計的推定 - 母平均の点推定

# まえがき
自身の勉強としてのまとめ、メモになります。


# はじめに
推測統計（inferential statistics）は主に<b>推定</b>と<b>検定</b>の二種類に分類されます。そして、そのうちの推定の中でも、さらに<b>点推定</b>と<b>区間推定</b>の二種類に分類できます。本記事では点推定について実際にデータを用意しながらPythonを用いて学習します。

# 点推定
点推定とは推定したい母平均や母分散など、母集団のパラメーターを一つの値で推定する方法になります。まず、母平均の推定を考える上の例として、このような事があるとしましょう。<br>

`Aさんの学年では300人の生徒がいる。定期テストが開かれ、Aさんの数学の点数は78点だった。しかし学年の平均点が公表されず、Aさんは自分の学力がどのレベルにあるのか分からなくて困っている。全員に点数を聞くのは不可能なためすれ違った人20人に点数を聞き平均を求めた結果70点であったため、自分の点数が平均より上で満足できた。`<br>

このように母集団（300人の生徒）から標本（20人の聞き込み）を抽出し、標本平均（70点）を求める事で、母平均（300人の生徒の平均）を推測したという一連の流れが点推定と呼ばれるものになります。
実際にこのような母平均の点推定の例を、コードの方で実行してみます。

# 実際にやってみる
得点分布を作るにあたって[こちら](http://msc.oups.ac.jp/fgapp/bunpu/bunpu-dat.csv)のサイトからcsvファイルをお借りし、ダウンロードして読み込みませます。

#### 1. ファイルを読み込み、分布を表示

```python
# ライブラリ
import random
import pandas as pd
import numpy as np
from scipy import stats
%matplotlib inline
import matplotlib.pyplot as plt

# csvファイルの読み込み
df = pd.read_csv('./test_score.csv')
# 数値以外のデータをNaNに置き換え,消す
df = df.apply(pd.to_numeric, errors='coerce')
df = df.dropna()
# 300個データを取り出す
score = np.array(df['score'][30:330])

# 分布の表示
fig = plt.figure(figsize=(8, 4))
plt.hist(score, bins=80)
plt.xlabel('点数')
plt.ylabel('人数')
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652763/1a35a32a-3c71-361e-976e-64746c4ed123.png)
全体的に点数が横に散らばっている印象です。
次に先程の例のように、無作為抽出された20人のデータを用意し、母平均と比べ検証してみます。

#### 2. 標本平均、母平均の比較
```python
n = 20
np.random.seed(1)
sample = np.random.choice(score, n)
sample_mean = np.mean(sample)
p_mean = np.mean(score)
print('標本平均 :', sample_mean)
print('母平均 :', p_mean)
```
```
標本平均 : 56.8
母平均 : 56.453
```
このように比較的平均に近い値となったことから、推定量に標本平均を使う事で母平均の良い推定ができていることがわかります。ではどうして標本平均を使うと母平均をうまく推定できるか説明します。

#### 3. 不偏性、一致性
実際に、無作為抽出で得た20人のテストの点数は、期待値が$　μ　$で分散が$　σ^{2}　$の確率分布に従う、互いに独立な確率変数$　X_1,X_2,...,X_{20}$と考えることもできます。そして、それから計算される標本平均$\bar{X} =  \frac{X_1+X_2+...+X_{20}}{n}$もまた確率変数になっていて、試行のたびに得られる結果は異なります。

```python
# 同じように無作為抽出を5回行う
for i in range(5):
    s_mean = np.mean(np.random.choice(score, n))
    print(f'{i+1}回目の標本平均: {s_mean:.3f}')
```
```
1回目の標本平均: 52.100
2回目の標本平均: 55.200
3回目の標本平均: 65.700
4回目の標本平均: 57.700
5回目の標本平均: 57.450
```
この標本平均$\bar{X}$の期待値は$E(\bar{X})=μ$となり、母平均に一致する。これを大数の法則を用いて検証してみます。1万組の標本データそれぞれの平均を求め、その平均を算出します。

```python
n_sample = 10000
np.random.seed(10)
# 1万組の標本を抽出
samples = np.random.choice(score, (n_sample, n))
# 標本データそれぞれで標本平均を求め、その平均を出す
sample_means = np.mean(samples)
print(np.mean(sample_means))
```
```
56.465545
```
母平均は56.453だったため、標本平均の期待値は母平均になっていそうです。このように推定量の期待値が推定したいパラメータ（母数）[^1]　に一致する性質を<b>不偏性</b>といいます。これは、「$n$の値に関係なく、推定量の期待値が真のパラメータであること」を示しています。つまり、$n$が小さい時にも大きい時にも、推定量の外れ具合が偏っていない（外れ具合が上にも下にも同じである）ことを表しています。
そして、不偏性をもっている推定量のことを<b>不偏推定量</b>といいます。<br>
次に、先ほどは20人であったサンプルサイズ$n$を100万にしたときの、標本平均$\bar{X}$を求めてみます。

```python
print(np.mean(np.random.choice(score, 1000000)))
```
```
56.451292
```
母平均は56.453だったため、非常に母平均に近い値となりました。サンプルサイズ$n$を増やしていくと標本平均は母平均の値に収束していきます。このように、推定量がだんだんと真のパラメータに近づく性質を<b>一致性</b>といいます。
そして、一致性をもっている推定量のことを<b>一致推定量</b>といいます。<br>

<font color='red'><b>標本平均は一致推定量であり不偏推定量です。「一致性, 不偏性」このふたつの性質を持っているため、母平均をうまく推定できるといえるのです。</b> </font> <br>

以上が母平均の点推定となります。

# さいごに
今回の記事制作に当たって統計WEB（https://bellcurve.jp/statistics/course/8612.html）
と「Pythonで理解する統計解析の基礎」の方を一部参考にさせていただきました。
次は母分散の点推定についてまとめていきたいです。


[^1]: 母平均や母分散など、母集団が持つ固有の統計量のこと