統計学入門練習問題11.4と11.7をPythonで解いてみた

#はじめに
統計学入門第11章は推定がテーマになっている章です。このうち練習問題11.4と11.7をPythonで解いてみました。環境はAnacondaを使用している。

#解く
##11.4
**問題**
>11.4
母分散$\sigma^2=9$の正規母集団から大きさ$n$の標本を抽出して、母平均$\mu$の信頼係数$99\%$の信頼区間を求めたい．その幅を$1$以下にするには，$n$をいくつ以上にすべきか．

母分散$\sigma^2$が既知のとき、母平均$\mu$の信頼係数$1-a$（信頼区間の％を0<1-a<1の割合で表したもの）の信頼区間は$[\overline{X}-Z_{\alpha/2}・\sigma/\sqrt{n},~~~~\overline{X}+Z_{\alpha/2}・\sigma/\sqrt{n}]$と表される。
標準正規分布におけるメジアンからの上側の）ここでの問題は、上側と下側の差が1以下となるnを求めたいので$(\overline{X}+Z_{\alpha/2}・\sigma/\sqrt{n})-(\overline{X}-Z_{\alpha/2}・\sigma/\sqrt{n})\leq1$を求める
Sympyに上の式を解かせて答えを求める。

~~~python
import sympy as sym
import scipy.stats as stats

n = sym.Symbol('n')
bottom, up = stats.norm.interval(alpha=0.99) #メジアンを中心に値の99%が含まれる範囲の限界を求める。
sigma = 3　#標準偏差

F = 2*up*(sigma/sym.sqrt(n)) - 1 <= 0 #上の式
print(sym.solve(F, n))
~~~

~~~
(238.856277636764 <= n) & (n < oo)
~~~
$n$は標本数だから整数であるべきで答えは**239以上**となります

##11.7
**問題**
>11.7
東京の1988年8月1日から10日までの最低気温は
$21.8,~22.4,~22.7,~24.5,~25.9,~24.9,~24.9,~24.9,~24.9,~24.0~(^\circ C)$
であった．以下，正規母集団を仮定する．
i) 母平均$\mu$の信頼係数$99\%$の信頼区間を求めよ．
ii) 母分散$\sigma^2$の信頼係数$95\%$の信頼区間を求めよ．
iii)さらに，大阪の同期の最低気温は
$22.1,~25.3,~23.3,~25.2,~25.3,~24.9,~24.9,~24.9,~24.9,~24.9,~24.0~(^\circ C)$
であった．東京（1）と大阪（２）の最低気温差$\mu\equiv\mu_1-\mu_2$の$95\%$信頼区間を作れ．なお，二つの母分散は等しいと仮定せよ．

**i) 母平均$\mu$の信頼係数$99\%$の信頼区間を求めよ．**

母分散$\sigma^2$が未知のとき母平均$\mu$の信頼係数$1-\alpha$の信頼区間は$[\overline{X}-t_{\alpha/2}(n-1)・s/\sqrt{n},~~~~\overline{X}+t_{\alpha/2}(n-1)・s/\sqrt{n}]$
と表される。よって上の区間に標本から求められる値を代入すれば良い。

~~~python
import numpy as np
import scipy.stats as stats
import sympy as sym
min_tokyo = np.array([21.8, 22.4, 22.7, 24.5, 25.9,
                      24.9, 24.8, 25.3, 25.2, 24.6])

n = len(min_tokyo)  # 標本数
tokyo_std = np.std(min_tokyo, ddof=1)  # 不偏分散からの標準偏差
tokyo_var = np.var(min_tokyo, ddof=1)  # 不偏分散
tokyo_mean = min_tokyo.mean()  # 東京の平均

# i)
bottom1, up1 = stats.t.interval(
    df=n - 1, alpha=0.99, loc=tokyo_mean, scale=tokyo_std/np.sqrt(n))
# df→自由度(n-1) alpha→99％→0.99 loc→平均 scale→出てくる値にかける値
print(bottom1, up1)
~~~
結果

~~~
22.779046896409294 25.640953103590707
~~~

**ii) 母分散$\sigma^2$の信頼係数$95\%$の信頼区間を求めよ．**

母分散$\sigma^2$の信頼係数$1-\alpha$の信頼区間は
$[(n-1)s^2/\chi^2_{\alpha/2}(n-1),~~~~(n-1)s^2/\chi^2_{1-\alpha/2}(n-1)]$
と表される。よって上の区間に標本から求められる値を代入すれば良い。

~~~python
# ii)
bottom2, up2 = stats.chi2.interval(alpha=0.95, df=n-1) #df→自由度(n-1) alpha→95%区間
print((n-1)*tokyo_var / up2, (n-1)*tokyo_var / bottom2) #区間の式通りに計算
~~~
結果

~~~
0.9172692525451521 6.461660438291186
~~~

**iii)さらに，大阪の同期の最低気温は
$22.1,~25.3,~23.3,~25.2,~25.3,~24.9,~24.9,~24.9,~24.9,~24.9,~24.0~(^\circ C)$
であった．東京（1）と大阪（２）の最低気温差$\mu\equiv\mu_1-\mu_2$の$95\%$信頼区間を作れ．なお，二つの母分散は等しいと仮定せよ．**

まず、東京と大阪の最低気温の差をとって1標本として推定する。i)と同様に解けばよい。$[\overline{X}-t_{\alpha/2}(n-1)・s/\sqrt{n},~~~~\overline{X}+t_{\alpha/2}(n-1)・s/\sqrt{n}]$
であるから、

~~~python
# iii)
min_osaka = np.array([22.1, 25.3, 23.3, 25.2, 25.3,
                      24.9, 24.9, 24.9, 24.9, 24.0])

# 差をとって計算するバージョン
min_sa = min_tokyo - min_osaka  # 東京と大阪の差の標本
sa_mean = min_sa.mean()  # 差の平均
sa_std = min_sa.std()  # 差の標準偏差

bottom3, up3 = stats.t.interval(
    df=n-1, alpha=0.95, loc=sa_mean, scale=sa_std/np.sqrt(n))
print(bottom3, up3)
~~~
結果

~~~
-0.9709402658776036 0.4309402658776038
~~~

次に、母分散が等しい2標本として推定する。信頼係数$1-\alpha$の信頼区間は
$[\overline{X}-\overline{Y}-t_{a/2}(m+n-2)s\sqrt{1/m+1/n},\overline{X}-\overline{Y}+t_{a/2}(m+n-2)s\sqrt{1/m+1/n}]$
と表される。(m:xの標本数,n:yの標本数)この区間の式に代入すれば良い。

~~~python
# ２標本で解くバージョン
osaka_mean = min_osaka.mean() #大阪の平均最低気温
var_sum_t = sum((min_tokyo - tokyo_mean) ** 2) #東京の(標本−標本平均)^2の和
var_sum_o = sum((min_osaka - osaka_mean) ** 2) #大阪の(標本−標本平均)^2の和
two_var = (var_sum_t + var_sum_o) / (2*n-2) #東京と大阪の合併した分散
two_std = np.sqrt(two_var) #上の文さんから求めた標準偏差
bottom4, up4 = stats.t.interval(
    df=2*n-2, alpha=0.95, loc=tokyo_mean-osaka_mean, scale=two_std*np.sqrt(2/n))

print(bottom4, up4)
~~~
結果

~~~
-1.427203591568164 0.8872035915681649
~~~
1標本問題として推定したほうが、2標本として推定するよりも区間が小さくなる。

#おわりに
いろいろと説明不足感が否めないが、検索力を高めよう。