まず重要な用語をまとめておきましょう:
手元にある標本から母集団の性質(母数)を推測することを推測統計といいます。 推測統計は推定と検定に分けられます。
「推定」は、母数の値に対し具体的な値を求める点推定、つまり一つの値で推定の結果を表すものと、区間推定、つまりある幅を持った区間で結果を表すものに分けられます。
また「検定」は母集団について述べた異なる立場の二つの主張(仮説)のうちどれを採用するかを決定するものです。例えば、日本の中学生のテスト得点が5年前と現在とで変化したという仮説と、変化していないという仮説がある場合、どちらを採択するかをきめるのが検定です。
母集団から抽出した標本を用いて、母数の点推定を行う手順についてみていきます。 ここで、標本のデータの個数のことをサンプルサイズ、 もしくは標本の大きさと言います。
例えば、10人の17歳男性の身長データがあるとします。これは日本人の17歳男性全体という『母集団』から抽出された『標本』とみなせます。そしてこのとき標本のデータの個数が10ですから、n = 10と書きます。ここでnはサンプルサイズを表す記号です。
import numpy as np
Height=np.array([165.2, 175.9, 161.7, 174.2, 172.1, 163.3, 170.6, 168.4, 171.3])
この標本から、「17歳の日本人男性全体の身長」(母集団)の平均(母数の一つ)を点推定してみましょう。
それには、次のようにします。ここで mean
は、平均値を求めるメソッド(関数)でした。
print(Height.mean())
まず用語を確認しましょう:
</A>
</CENTER>
ここで、標本統計量からどのように母数を推定するかを表にしておきましょう:
母数 | 推定量 | 関係する関数 | オプション |
---|---|---|---|
母平均 | 標本平均 | np.mean | |
母分散 | 不偏分散 | np.var | ddof=1 |
母標準偏差 | 不偏分散の正の平方根 | np.std | ddof=1 |
母相関係数 | 標本相関係数 | np.corrcoef | 対応する要素 |
練習問題 前項で例に出した「身長データ」を用いて、母集団の分散と標準偏差を点推定した値を求めよ。 またそれに用いたコードをあわせて答えよ。
# Exercise1 計算・解答用
# 母分散と母集団の標準偏差の点推定
Height.var(ddof=1), Height.std(ddof=1)
# 比較 (標本分散, 標準偏差)
# こちらのほうが小さい値になっている
Height.var(), Height.std()
標本から推定値を得る手順よりも大事なこと:
推定値を計算する元になる、標本に含まれる「個々のデータの値」の決定方法について見ていきましょう。
[参考: サイコロの出目の確率分布] 理論的には、サイコロの出目の確率分布はつぎのようになります:
サイコロの出る目 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
確率 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 |
それに対し、シミュレーションにより、サイコロの出る目の度数分布は次のようになりました: (1) 6回サイコロを振った場合:
サイコロの目 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
度数 | 0 | 2 | 1 | 1 | 0 | 2 |
相対度数 | 0 | 2/6 | 1/6 | 1/6 | 0 | 2/6 |
サイコロの目 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
度数 | 10,097 | 9,918 | 9,936 | 9,960 | 10,050 | 10,039 |
相対度数 | 1.0097 | 0.9918 | 0.9936 | 0.9960 | 1.0050 | 1.0039 |
正規分布(normal distribution, ガウス分布 Gaussian distributionともいう)は統計学で最もよく用いられる確率分布なので、ここで復習しておこう
正規分布の表現方法: N (μ,σ2) --- μは平均値、σ2は分散 (σは標準偏差)
</A>
</CENTER>
|
| |||||||||||||||||||||
正規分布 N (0,1)のグラフ | 正規分布 N (1,1) のグラフを重ね書き | </TR> </TABLE>
|
|
|
μ-σからμ+σ の範囲 | μ-2σからμ+2σ の範囲 | μ-3σからμ+3σの範囲 |
目的 | 関数名とモジュール | 使い方 |
---|---|---|
一様分布に従う乱数(復習) | random.random(個数) | random.random(10) # [0,1)の乱数を10個 |
正規分布に従う乱数 | random.normal(平均,標準偏差,個数) | random.normal(50,10,10) # N(50, 10^2)に従う乱数10個 |
指定の範囲の数の生成 | np.linspace(最小値,最大値,個数) | np.linspace(35, 65, 10000) # [35,65]の範囲の数を10000個 |
正規分布の密度関数 | st.norm.pdf(xデータ,平均,標準偏差) | plt.plot(x, st.norm.pdf(x,50,10.0**0.5)) # $N(50,\sqrt{10})$の正規分布の関数描画 |
$N(50,10^2)$の正規母集団から$n = 20$の標本抽出を5,000回繰り返すことにより、標本平均の経験的な標本分布を求めよ。またこの経験的な標本分布から得られるグラフ(ヒストグラム)に、理論的に導かれる標本分布を重ねあわせて表示せよ。
この結果下のようなグラフが得られればよい:
# 計算・解答用
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
import scipy.stats as st
data = np.array([np.mean([random.normal(50,10,20)]) for i in range(5000)])
plt.hist(data,color='y',density=True,bins=20, ec='k')
x = np.linspace(40, 60, 1000) # x = np.arange(35,65,0.01)でもよい
plt.plot(x, st.norm.pdf(x,50,(100/20)**0.5), ls='--',label=r'$N(50,\frac{10^2}{20})$')
plt.xlabel('mean of samples')
plt.ylabel('Density')
plt.title('Histogram of means of samples')
plt.legend()
plt.plot()
# 計算・解答用
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
x = np.linspace(-3,3,1000)
for n in range(1,6):
plt.plot(x,st.norm.pdf(x,0,(1/n)),label=r"$n=%i^2$"%(n))
plt.xlabel('x')
plt.ylabel('norm(x,0,np.sqrt(1/n))')
plt.legend()
plt.show()
?plt.plot
# 計算・解答用
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
import scipy.stats as st
data = np.array([np.mean(random.random(20)*100) for i in range(5000)])
plt.hist(data,color='y',density=True,bins=20,ec='k')
x = np.linspace(25, 75, 1000) # x = np.arange(35,65,0.01)でもよい
plt.plot(x, st.norm.pdf(x,50,(10000/(12*20))**0.5), ls='--',label=r'$N(50,\frac{100^2}{12*20})$')
plt.ylabel('Density')
plt.xlabel('Mean of samples')
plt.title('Histogram of means of samples')
plt.legend()
plt.plot()
この項は次の書籍を参考にしている: 馬場孝之(2014)『統計学キャンパスゼミ』マセマ
以下は、正規分布$N(\mu, \sigma^2)$に従う母集団から無作為抽出した標本$X_1, X_2, \ldots, X_n$に対する推定についてのみ述べる。$\bar{X}=\frac{1}{n}\sum_{i=1}^n X_i$とする。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# Gaussian : N(0,1)
def Gaussian (x):
return (np.exp(-x**2/2)) / np.sqrt(2*np.pi)
# [-6.0, 6.0] の区間で等差数列を作成
x = np.linspace(-6.0, 6.0, 10000)
# f(x)の結果を得る: [Gaussian(-6.0),...,Gaussian(6.0)]
y = [Gaussian(i) for i in x]
# グラフに表示
plt.plot(x,y)
plt.axis([-6,6,-0.02,0.45]) # 描画範囲を指定する x:[-6.0,6.0], y:[-0.02, 0.45]
plt.title("standard normal distribution: N(0,1)")
plt.grid()
であるから信頼区間$(1-\alpha)$を満たすには $$-{\rm ppf}(\frac{\alpha}{2}) \leq \frac{\bar{X}-\mu}{\sqrt{\sigma^2/n}} \leq {\rm ppf}(\frac{\alpha}{2})$$ これから、$\bar{X} - {\rm ppf}(\frac{\alpha}{2})\sqrt{\frac{\sigma^2}{n}} \leq \mu \leq \bar{X} +{\rm ppf}(\frac{\alpha}{2})\sqrt{\frac{\sigma^2}{n}}$
from scipy import stats as st
import matplotlib.pyplot as plt
import numpy as np
lower=st.norm.ppf(0.025)
upper=st.norm.ppf(1-0.025)
x = np.linspace(-4, 4, 10000)
plt.plot(x, st.norm.pdf(x,0,1), label=r'$N(%i,%i)$' % (0,1))
plt.axis([-4,4,-0.02,0.5])
plt.axhline(0,c='g',ls='-.')
plt.axvline(lower,c='b',ls='--')
plt.axvline(upper,c='b',ls='--')
x = np.linspace(lower, upper, 10000)
plt.fill_between(x, st.norm.pdf(x,0,1),color="green")
plt.legend()
plt.title("95% confidence interval")
# 標準正規分布のppf関数の0.025(2.5%)と0.975(97.5%)点
import scipy.stats as st
print("ppf(0.025)={:5.3f}, ppf(0.975)={:5.3f}".format(st.norm.ppf(0.025),st.norm.ppf(1-0.025)))
練習問題2-1
$N(\mu, 16)$に従う母集団から9個の標本$X_1,X_2,\cdots,X_9$を無作為抽出したところ、その標本平均は$\bar{X}=10.0$であった。これから、母平均$\mu$の95%信頼区間を求める。
from scipy import stats as st
import matplotlib.pyplot as plt
import numpy as np
# 有意水準
alpha=0.05
# 標本平均のサイズ
n=9
# 標本平均
xBar=10.0
# 母分散
var=16
# ppf(alpha/2) * (var/n)**0.5
print(st.norm.ppf(0.025)*(var/n)**0.5)
print(st.norm.ppf(0.975)*(var/n)**0.5)
# 以上から
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.norm.ppf(0.025)*(var/n)**0.5, xBar+st.norm.ppf(0.975)*(var/n)**0.5))
問題: 上と同じ状況において、母平均μの99%信頼区間を求めよ。
# 計算
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.norm.ppf(0.005)*(var/n)**0.5, xBar+st.norm.ppf(0.995)*(var/n)**0.5))
練習問題2-2
$N(\mu, 25)$に従う母集団から16個の標本$X_1,X_2,\cdots,X_{16}$を無作為抽出したところ、その標本平均は$\bar{X}=63.0$であった。これから、母平均$\mu$の95%信頼区間を求めよ。
# 計算
# 有意水準
alpha=0.05
# 標本平均のサイズ
n=16
# 標本平均
xBar=63.0
# 母分散
var=25
# 以上から
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.norm.ppf(0.025)*(var/n)**0.5, xBar+st.norm.ppf(0.975)*(var/n)**0.5))
$\chi^2$分布
互いに独立な$n$個の確率変数$X_1, X_2, \ldots,X_n$が標準正規分布$N(0,1)$に従うとき、その2乗和$Z=X_1^2+\cdots+X_n^2$は、自由度$n$の$\chi^2$分布に従う
$t$分布
2つの独立な確率変数$X$と$Y$があり、$X$は標準正規分布$N(0,1)$に、$Y$は自由度$n$の$\chi^2$分布に従うとき、$Z=\frac{X}{\sqrt{Y/n}}$とすると、$Z$は自由度$n$の$t$分布に従う
その根拠:
# 自由度9のときの2.5%点と97.5%点
import scipy.stats as st
print("t.ppf(0.025,3)={:5.3f}, t.ppf(0.975,3)={:5.3f}".format(st.t.ppf(0.025,3),st.t.ppf(1-0.025,3)))
print("t.ppf(0.025,9)={:5.3f}, t.ppf(0.975,9)={:5.3f}".format(st.t.ppf(0.025,9),st.t.ppf(1-0.025,9)))
print("t.ppf(0.025,100)={:5.3f}, t.ppf(0.975,100)={:5.3f}".format(st.t.ppf(0.025,100),st.t.ppf(1-0.025,100)))
# 作図
%matplotlib inline
from scipy import stats as st
import numpy as np
import matplotlib.pyplot as plt
fig,ax = plt.subplots(1,1)
x = np.linspace(-6, 6, 10000)
linestyles = [':', '--', '-.','-']
deg_of_freedom = [1,3,9,100]
for df, ls in zip(deg_of_freedom, linestyles):
ax.plot(x, st.t.pdf(x, df), linestyle=ls, label=r'$df=%i$' % df)
plt.xlabel('$t$')
plt.ylabel('$f(t)$')
plt.title('t-Distribution')
plt.axis([-6,6,-0.02,0.6])
plt.legend()
plt.grid()
練習問題3-1
$N(\mu, \sigma^2)$に従う母集団から10個の標本を無作為抽出したところ、その値は9.8, 10.3, 11.9, 8.7, 9.5, 10.2, 10.9,8.2, 9.4, 10.5であった。これから、母平均$\mu$の95%信頼区間を求める。
# 自由度7のt分布のppf関数の0.025と0.975に対する値
import scipy.stats as st
import numpy as np
# 標本
Xs = np.array([9.8, 10.3, 11.9, 8.7, 9.5, 10.2, 10.9,8.2, 9.4, 10.5])
N=Xs.size
# 平均
xBar=Xs.mean()
N,xBar
# 自由度
ddof=N-1
# 不偏分散
var=Xs.var(ddof=1)
var
# t.ppf(alpha/2,ddof) * (var/n)**0.5
print(st.t.ppf(0.025,ddof)*(var/N)**0.5)
print(st.t.ppf(0.975,ddof)*(var/N)**0.5)
# 以上から
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.t.ppf(0.025,ddof)*(var/N)**0.5, xBar+st.t.ppf(0.975,ddof)*(var/N)**0.5))
%matplotlib inline
from scipy import stats as st
import numpy as np
import matplotlib.pyplot as plt
lower=st.t.ppf(0.025,ddof)
upper=st.t.ppf(0.975,ddof)
df=ddof
x = np.linspace(-6, 6, 10000)
plt.plot(x, st.t.pdf(x, df))
plt.xlabel('$t$')
plt.ylabel('$f(t)$')
plt.title('t-Distribution')
plt.axis([-6,6,-0.02,0.6])
plt.axvline(lower,c='yellow',ls='--')
plt.axvline(upper,c='orange',ls='--')
plt.axhline(0,c='k',ls='-')
x = np.linspace(lower, upper, 10000)
plt.fill_between(x, st.t.pdf(x,df),color="green")
plt.grid()
問題: 上と同じ状況において、母平均μの99%信頼区間を求めよ。
# 標本
Xs = np.array([9.8, 10.3, 11.9, 8.7, 9.5, 10.2, 10.9,8.2, 9.4, 10.5])
N=Xs.size
# 平均
xBar=Xs.mean()
# 自由度
ddof=N-1
# 不偏分散
var=Xs.var(ddof=1)
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.t.ppf(0.005,ddof)*(var/N)**0.5, xBar+st.t.ppf(0.995,ddof)*(var/N)**0.5))
練習問題3-2
ある一年間の新生児から8名の体重を無作為抽出した結果が以下である:(単位はkg)
2.82, 3.01, 3.24, 3.16, 3.34, 3.57, 2.98, 3.28
全国の新生児の体重を母集団とし、それが正規分布に従うと仮定したとき、母平均の95%信頼区間を推定せよ。
Xs=np.array([2.82, 3.01, 3.24, 3.16, 3.34, 3.57, 2.98, 3.28])
N=Xs.size
# 平均
xBar=Xs.mean()
# 自由度
ddof=N-1
# 不偏分散
var=Xs.var(ddof=1)
print("Xbar = {:6.3f}".format(xBar))
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.t.ppf(0.025,ddof)*(var/N)**0.5, xBar+st.t.ppf(0.975,ddof)*(var/N)**0.5))
練習問題4-1
$𝑁(\mu,\sigma^2)$に従う母集団から10個の標本を無作為抽出したところ、その値は9.8, 10.3, 11.9, 8.7, 9.5, 10.2, 10.9,8.2, 9.4, 10.5であった。これから、母分散$\sigma^2$の95%信頼区間を求める。
# 自由度7のt分布のppf関数の0.025と0.975に対する値
import scipy.stats as st
import numpy as np
# 標本
Xs = np.array([9.8, 10.3, 11.9, 8.7, 9.5, 10.2, 10.9,8.2, 9.4, 10.5])
N=Xs.size
# 平均
xBar=Xs.mean()
N,xBar
# 自由度
ddof=N-1
# 不偏分散
var=Xs.var(ddof=1)
var
# chi2.ppf(alpha/2,ddof)
print(st.chi2.ppf(0.025,ddof))
print(st.chi2.ppf(0.975,ddof))
# 以上から
print(" σ**2={:6.3f}".format(var))
print("{:6.3f}<=σ**2<={:6.3f}".format(var*ddof/st.chi2.ppf(0.975,ddof), var*ddof/st.chi2.ppf(0.025,ddof)))
%matplotlib inline
from scipy import stats as st
import numpy as np
import matplotlib.pyplot as plt
df=ddof
upper=st.chi2.ppf(0.025,ddof)
lower=st.chi2.ppf(0.975,ddof)
x = np.linspace(0, 20, 10000)
plt.plot(x, st.chi2.pdf(x, df))
plt.xlabel('$\chi^2$')
plt.ylabel(r'$f(\chi^2)$')
plt.title(r'$\chi^2\ \mathrm{Distribution}$')
plt.axis([-0.2,20,-0.02,0.2])
plt.axvline(lower,c='yellow',ls='--')
plt.axvline(upper,c='orange',ls='--')
plt.axhline(0,c='k',ls='-')
x = np.linspace(lower, upper, 10000)
plt.fill_between(x, st.chi2.pdf(x,df),color="green")
plt.grid()
問題: 上と同じ状況において、母分散の99%信頼区間を求めよ。
print(" σ**2={:6.3f}".format(var))
print("{:6.3f}<=σ**2<={:6.3f}".format(var*ddof/st.chi2.ppf(0.995,ddof), var*ddof/st.chi2.ppf(0.005,ddof)))
練習問題4-2
ある一年間の新生児から8名の体重を無作為抽出した結果が以下である:(単位はkg)
2.82, 3.01, 3.24, 3.16, 3.34, 3.57, 2.98, 3.28
全国の新生児の体重を母集団とし、それが正規分布に従うと仮定したとき、母分散の95%信頼区間を推定せよ。
Xs=np.array([2.82, 3.01, 3.24, 3.16, 3.34, 3.57, 2.98, 3.28])
N=Xs.size
# 平均
xBar=Xs.mean()
# 自由度
ddof=N-1
# 不偏分散
var=Xs.var(ddof=1)
# 以上から
print(" xBar={:6.3f}".format(xBar))
print("{:6.3f}<=μ<={:6.3f}".format(xBar+st.t.ppf(0.025,ddof)*(var/N)**0.5, xBar+st.t.ppf(0.975,ddof)*(var/N)**0.5))
print(" σ**2={:6.3f}".format(var))
print("{:6.3f}<=σ**2<={:6.3f}".format(var*ddof/st.chi2.ppf(0.975,ddof), var*ddof/st.chi2.ppf(0.025,ddof)))