統計的検定

この内容は山田、杉澤、村井(2008)「R」によるやさしい統計学を参考にしています。

この講義では、「統計的仮説検定」をとりあげます。 これは、統計的仮説検定の手順の理解と用語の習熟がねらいです。 また、代表的な統計的仮説検定、つまり標準正規分布を用いた検定、t分布を用いた検定、無相関検定、カイ二乗検定について学びます。

学習項目です:

統計的仮説検定の必要性

下の散布図を見てください(青色の円は、点の分布の状態を表すために描いたものです): 散布図 これをみると、この2つの変数 a と bの間には相関関係がないようにみえます。実際 $corrcoef(a,b)= -0.034$なので相関なしといえます。 ところが、a, bそれぞれから30点ずつ無作為抽出したデータ xa, xb (下にその散布図を示す)は、 ときに 0.378 という『弱い相関』を示すことがあります。


参考: 無相関の母集団から相関するデータを作る
次が無相関の母集団から相関するデータを作った方法です:

In [ ]:
help(plt.Circle)
In [48]:
import matplotlib.pyplot as plt
import numpy.random as random
import matplotlib.patches as patches
%matplotlib inline
fig = plt.figure()
ax = plt.axes()
a = random.normal(50,10,500)
b = random.normal(50,10,500)
plt.scatter(a, b, s=20, c='k',alpha=0.4)
plt.xlabel('a')
plt.ylabel('b')

# 中心(50,50)で半径25の円を描画
circle=patches.Circle((50,50),25, fill=False, color='b')
ax.add_patch(circle)
aspect = (ax.get_xlim()[1] - ax.get_xlim()[0]) / (ax.get_ylim()[1] - ax.get_ylim()[0])                     
ax.set_aspect(aspect)  # 縦横の縮尺を調整
plt.show()
In [7]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
a = random.normal(50,10,500)
b = random.normal(50,10,500)
for _ in range(100):
    xa = random.choice(a,30)
    xb = random.choice(b,30)
    if (abs(np.corrcoef(xa,xb)[0,1]) > 0.30):
        break

plt.scatter(xa, xb)
plt.xlabel('xa')
plt.ylabel('xb')
x = np.linspace(10, 90, 10000)
lm = np.polyfit(xa, xb, 1)
plt.plot(x, lm[0]*x+lm[1],"g")
print(np.corrcoef(xa,xb)[0,1])
0.349755952421

これは、実際には作為的に作られたデータです。しかし、あなたが発明した機器の有効性を示す論文や、あなたが作った薬品の効果を示す論文において、都合の良いデータだけを集めたのではないか、もしくは作為がないとしても、このデータは本当に偶然の結果であって多数のデータを取ればこのようなグラフにはならないのではないか、という疑いがかけられることがあります。

そのような疑いや批判には、(前の章で学んだように)『標本抽出が無作為抽出であること』(都合の良いデータを集めたわけではない)、そして(本章で学ぶように)『母集団に全く相関がないとしたら、抽出した標本からこのような結果が得られる可能性が非常に小さいということ』(多数のデータを集めても同じような結果が得られる確率が高い)を示さなければなりません。そして、 統計的仮説検定は確率に基づき、後者の主張を行うための方法です。(前者の「無作為抽出」は、統計による分析の大前提です)

統計的仮説検定の手順と用語

統計的仮説検定の一般的な手順を次の表に示します。ここで取り上げる検定は、標本が正規分布に従う母集団から無作為に抽出されたものであることを仮定し、それを前提として行われます。なお「正規分布に従う母集団」のことを正規母集団と呼びます。

手順 やること
1 母集団に関する帰無仮説対立仮説を設定
2 検定統計量を選択
3 有意水準 αの値を決定
4 データを収集した後、データから検定統計量の実現値を求める
5 結論: 検定統計量の実現値棄却域に入れば帰無仮説を棄却し、対立仮説を採択する。そうでなければ、帰無仮説を採択する

1. 帰無仮説と対立仮説

  • 帰無仮説:提案する手法が従来の手法と「差がない」、 提案する手法は「効果がない」という仮説---本来主張したいこととは逆の仮説この仮説が棄却されることを目標として仮説検定を行う
    具体的には、母平均$\mu = 0$ (母平均は0である), 母相関係数$\rho =0$ (相関がない), 母平均の差$\mu_1 - \mu_2 = 0$ (差がない)というような仮説
  • 対立仮説: 帰無仮説が棄却されたときに採択される仮説--- 帰無仮説とは逆の仮説であり、実験などで 示したい・主張したいことを表したもの
    具体的には、母平均$\mu \neq 0$(母平均は0でない), 母相関係数 $\rho \neq 0$ (相関がある), 母平均の差$\mu_1 - \mu_2 \neq 0$ (差がある)というような仮説

対立仮説の設定により、検定は次のどちらかで行う(両側検定の方がより厳しい条件であり、普通は両側検定 で行う):

  • 片側検定:対立仮説が、母平均$\mu > 0$(もしくは$\mu < 0$ )、 、母相関係数 $\rho > 0$(もしくは$\rho < 0$)、、母平均の差$\mu_1 > \mu_2$ (もしくは$\mu_1 < \mu_2$ )、の場合
  • 両側検定:対立仮説が、母平均μ≠0、母相関係数ρ≠0 、母平均の差 μ1 - μ2≠ 0の場合
    要するに、両側検定では、例えば母平均$\mu \neq 0$を調べるには、母平均$\mu > 0$ と$\mu < 0$ の両方を調べなければならない

帰無仮説が正しいものとして分析を行う

実際に得られたデータから計算された検定統計量の値によって採択を判断する。

  • 帰無仮説が正しいとしたとき、検定統計量が、ほぼ起こり得ない値(それほど極端な値)であれば、帰無仮説を棄却する(つまり、本来の主張を表す対立仮説が採択される)。そうでなければ(確率的に十分起こりうるような値であれば、帰無仮説を採択する(この場合は、本来主張したかった対立仮説が棄却されてしまう)。

2. 検定統計量

  • 検定統計量:統計的仮説検定のために用いられる標本統計量のこと。
  • 検定統計量の実現値:実際のデータ(手に入った標本)を基に計算してえられる具体的な値のこと

検定統計量の実現値は、対立仮説に合うほど 0から離れた値を示す

3. 有意水準と棄却域

対立仮説を採択するか決定するときに基準になるのが有意水準(αで表されます)


有意水準は5%または1%(α=0.05またはα=0.01)に設定することが多い(つまり、標本が100回に5回(5%の場合)以下にしか現れないデータであった---こんなことは偶然では起こりえない---、だから帰無仮説が成り立たないと考えて良いのではないか、という判断基準)


帰無仮説が正しいものとして考えた時の標本分布を帰無分布という---帰無分布に基づいて確率計算される


帰無仮説のもとで、非常に生じにくい検定統計量の値の範囲を棄却域という---帰無仮説が棄却される領域(だから、この範囲に入るのが『望ましい』)

  • 採択域: 棄却域以外の部分---「帰無仮説が採択される領域」
  • 臨界値: 棄却域と採択域の境目の値
棄却域に検定統計量の実現値が入ったら、帰無仮説を棄却する---本来主張したかったことが採択される!

正規分布を帰無分布とした時の棄却域

4 & 5. 統計的仮説検定の結果の報告

検定統計量の実現値が棄却域に入った場合、「差がない」という帰無仮説を棄却し、 「差がある」という対立仮説を採択する。

    検定結果は5% (または1%)水準で有意である
    または 「p < .05 (または p < .01 )で有意差が見られた 」 と記述する。
帰無仮説が棄却できない場合は、「検定の結果、差が有意でなかった」または「有意差が認められなかった」と書く。

課題4-1

あなたはランダムに配置された対象物(例えば地雷や石油や埋蔵金など)を衛星からのセンサーデータを元に限定された時間(例えば1時間)内に検出する機器を作成した。100個のデータに対し検出率は0.70であった。そして、その性能が従来の製品(検出率は0.60と宣伝されている)よりも優れていることを統計的仮説検定の手法により示したい。
どのような帰無仮説と対立仮説をたてればよいか、また検定方法は片側か両側か、有意水準はどのくらいに設定したらよいか、考えを述べよ。

回答欄:

p値

p値帰無仮説が正しいという仮定のもとで、標本から計算した検定統計量の実現値以上の値が得られる確率

p値が有意水準より小さい時に帰無仮説を棄却する

[参考: p値が小さいことの意味] p値の大きさが対立仮説を採択する(帰無仮説を棄却する)決め手となります。p値が小さいということは、 『帰無仮説が正しいとすると』確率的にほとんど起こりえないことが起きた(有意水準が5%なら100回中5回以下、 1%なら100回中1回以下)ということを意味します。逆にp値が大きいということは、確率的にはよくあることが起きた(だから、この結果では差があるとはいえない)、 ということになります。

第1種の誤りと第2種の誤り

  • 第1種の誤り α: 「帰無仮説が真のとき、これを棄却してしまう」誤りのこと
    この種の誤りを犯す確率が「有意水準」または「危険率
  • 第2種の誤り β:「帰無仮説が偽のとき、これを採択する(棄却できない)」誤りのこと
    本当は差があるのに「差がない」と判断してしまう誤り

検定力

検定力帰無仮説が偽の場合、全体の確率1から第2種の誤りの確率(1 - β)を引いた確率
「第2種の誤りを犯さない確率」ともいう、つまり間違っている帰無仮説を正しく棄却できる確率のこと 


中心極限定理、正規分布、$\chi^2$分布、$t$分布、$F$分布のまとめ(再び)

  1. 中心極限定理

    • 互いに独立な$n$個の確率変数$X_1, X_2, \ldots,X_n$が平均$\mu$, 分散$\sigma^2$の同一の確率分布に従うとき、 $\bar{X}=\frac{1}{n} (X_1+X_2+\cdots+X_n)$(つまり$\bar{X}$はその平均)は$n\rightarrow \infty$のとき 正規分布$N(\mu, \sigma^2/n)$に従う
    • そして$\bar{X}$を標準化した確率変数$Z=\frac{\bar{X}-\mu}{\sigma/\sqrt{n}}$は、$n \rightarrow \infty$のとき標準正規分布$N(0,1)$に従う
  2. 正規分布$N(\mu, \sigma^2)$

    • 平均値$\mu=0$、分散$\sigma^2=1$の正規分布$N(0,1)$を標準正規分布と呼ぶ。これは、正規分布に従う確率変数$X$を標準化: $Z=\frac{X-\mu}{\sigma}$ した変数が従う分布である。
    • 互いに独立な$n$個の確率変数$X_1, X_2, \ldots,X_n$がすべて同一の正規分布$N(\mu,\sigma^2)$に従うとき、 $\bar{X}=\frac{1}{n} (X_1+X_2+\cdots+X_n)$(つまり$\bar{X}$はその平均)は正規分布$N(\mu, \sigma^2/n)$に従う。 (注:中心極限定理と違い、$n \rightarrow \infty$が不要であることに注意)
  3. $\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$分布に従う
  4. $t$分布

    • 2つの独立な確率変数$X$と$Y$があり、$X$は標準正規分布$N(0,1)$に、$Y$は自由度$n$の$\chi^2$分布に従うとき、$Z=\frac{X}{\sqrt{Y/n}}$とすると、$Z$は自由度$n$の$t$分布に従う
  5. $F$分布

    • 2つの独立な確率変数$X$と$Y$があり、$X$は 自由度$m$の 、$Y$は 自由度$n$の$\chi^2$分布 に従うとき、$Z=\frac{X/m}{Y/n}$とすると、$Z$は 自由度$(m,n)$の$F$分布に従う


標準正規分布を用いた検定(1つの平均値の検定: 母分散が既知)

正規母集団 $N(\mu, \sigma^2)$ から無作為に$n$個の標本を抽出する(このとき「標本サイズは$n$である」という)と

       標本平均の分布も正規分布
       標本平均の平均は [ア] 、分散は [イ ] (問題:ア、イに当てはまる記号を書け---課題4-2)
$\bar{X}$(標本平均)を次式により変換した値を検定統計量とする: $$Z = \frac{\bar{X}-\mu}{\sigma/\sqrt{n}}$$

課題4-2 : 母分散が既知の場合の検定の考え方の確認

  1. 正規母集団 $N(\mu, \sigma^2)$から無作為に$n$個の標本を抽出したとき、 理論的に標本平均と標本の分散がそれぞれどのように表されるか、書きなさい(つまり、上の[ア], [イ]の箇所を補うこと)。ヒント: 正規分布の性質
  2. 標本平均を$\bar{X}$とし、標本が正規母集団 $N(\mu, \sigma^2)$からの無作為抽出であるとする。$Z = \frac{\bar{X}-\mu}{\sigma/\sqrt{n}}$はどのような分布に従うと考えられるか?
  3. 正規母集団から無作為に抽出された$n$個の標本があり、母分散が$\sigma^2$であることがわかっている場合に、「母平均が$\mu$に等しい」という仮説はどのような場合に『棄却』すべきだろうか、有意水準を5%として答えよ。

回答欄:


Pythonを使った実習

例題:「心理学テスト」が$N(12, 10)$の正規分布に従うものとする。 次のデータ(「指導法データ」と呼ぶ)はこの母集団から無作為抽出した標本と考えてよいかどうかを判定せよ

In [2]:
import numpy as np
SampleData = np.array([13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15])

次のステップで行う:

  1. 帰無仮説と対立仮説をたてる: 帰無仮説は「無作為抽出した標本と考えて良い」、つまり$\mu = 12$
    対立仮説は「無作為抽出した標本ではない」、つまり$\mu \neq 12$
  2. 検定統計量の選択: 標本データを標準化した値(Zで表す)
  3. 有意水準の決定: 両側検定で、有意水準 5%、つまり$\alpha=0.05$
  4. 検定統計量の実現値の計算:

In [3]:
# SampleDataに標本データがあることが前提
mu=12.0    # 帰無仮説:平均=12
var=10.0  # 母分散
n=len(SampleData)
sampleMean =np.mean(SampleData)
z =  (sampleMean - mu) / (var/n)**0.5             # 検定統計量
print("検定統計量の実現値=",z)
検定統計量の実現値= -2.82842712474619

  • 帰無仮説の棄却か採択かの決定: 帰無仮説によればこの標本は正規分布に従う。そこでscipy.statsモジュールのppf関数で棄却の臨界値を求める、 もしくはcdf関数でp値を求める
    • 下側確率:標準正規分布に従う確率変数$Z$を例にとると、$Z$がある値$\alpha$以下となる確率 $Prob(Z \leq \alpha)$
    • 上側確率:標準正規分布に従う確率変数$Z$を例にとると、$Z$がある値$\alpha$より大きくなる確率 $Prob(Z > \alpha)$

  • In [ ]:
    import scipy.stats as st
    st.norm.ppf(0.025)    # 下側確率0.05/2 = 0.025となるzの値を求める
    # 下側確率であるから、この値よりもZ値が小さければ棄却される
    
    In [ ]:
    # 上側確率 1 - 0.05/2 = 0.975となるzの値を求める
    st.norm.ppf(0.975)  
    # 上側確率であるから、この値よりもZ値が大きければ棄却される
    
    In [ ]:
    # 参考
    help(st.norm.ppf)
    

    この結果、棄却域は $Z < -1.959964$ または $Z > 1.959964$となるので、$Z$の値は棄却域に入る。 よって、結論「有意水準5%において、指導法データは心理学テスト(という母集団)から無作為抽出した標本とはいえない」。


    なお、関数cdfを用いて、直接p値を求めることもできる:

    In [ ]:
    st.norm.cdf(z)   # 下側確率  前に求めた値:z=-2.828427
    # 下側確率とすれば、p値は0.0023という小さな値(<  0.05)
    
    In [ ]:
    st.norm.cdf(-z)   # 上側確率
    
    In [ ]:
    # 両側検定なので2倍する
    2*st.norm.cdf(-z)
    # 両側検定であるから2倍したp値は0.0047という小さな値(< 0.05)
    
    In [ ]:
    # 参考
    help(st.norm.cdf)
    

    課題4-3

    ある食品メーカーの同じ種類の缶詰めから無作為抽出した缶詰9個の内容量を測定したところ、平均が$49.4$であった。この缶詰は$N(50.0,1.44)$に従う母集団から無作為抽出した標本と考えてよいかどうかを有意水準5%で検定せよ。(別な言い方をすれば、母分散が正しいとして、母平均は50.0と考えてよいかどうかの検定)

    In [ ]:
     
    

    t分布を用いた検定(1つの平均値の検定: 母分散が未知)

    正規母集団からの無作為標本であっても、母分散σ2がわからない場合、 先の方法が使えません---先の検定で用いた検定統計量が計算できないからです


    そこで母分散の平方根σ の代わりに、標本から求められる不偏分散の平方根$\hat{\sigma}$を使い、 $ t = \frac{\bar{X}-\mu}{\hat{\sigma}/\sqrt{n}} $ を検定統計量とする。 これは自由度(df) $n-1$ のt分布に従う (参考:母分散が未知のときの母平均の区間推定)

    • t分布:統計学でよく利用される、正規分布の形に似た左右対称・山形の確率分布

    • 自由度(df):t分布の形状を決める

    課題4-4 母分散が未知の場合の検定の考え方の確認

    1. 正規母集団$N(\mu,\sigma^2)$から無作為抽出されたサンプルサイズ$n$の標本に対し、その平均を$\bar{X}$とする。この母分散$\sigma^2$がわからない場合、 その標本の不偏分散$S^2$を用いて計算される検定統計量 $ t = \frac{\bar{X}-\mu}{S/\sqrt{n}} $ が「自由度 $𝑛−1$ の$t$分布に従う」ことの理由説明を行え。
    2. 正規母集団から無作為に抽出された$n$個の標本がある(ただし母分散は知られていない)場合に、「母平均が$\mu$に等しい」という仮説はどのような場合に『棄却』すべきだろうか、有意水準を5%として答えよ。

    Pythonを使った実習

    例題:「心理学テスト」が平均12の正規分布に従うものとする(分散は未知!)。 前項にあげた「指導法データ」 (SampleData) が、この母集団から無作為抽出した標本と考えてよいかどうかを判定せよ 次のステップで行う:
    1. 帰無仮説と対立仮説をたてる: 帰無仮説は「無作為抽出した標本と考えて良い」、つまり$\mu=12$
      対立仮説は「無作為抽出した標本ではない」、つまり$\mu \neq 12$
    2. 検定統計量の選択: 標本の不偏分散の平方根 $\hat{\sigma}$ を用い、 $ t = \frac{\bar{X}-\mu}{\hat{\sigma}/\sqrt{n}} $を検定統計量とする
    3. 有意水準の決定: 両側検定で、有意水準 5%、つまり$\alpha=0.05$
    4. 検定統計量の実現値の計算: ``` # SampleDataは前の例題のもの t = (np.mean(SampleData) - 12) / (np.var(SampleData, ddof=1)/len(SampleData))**0.5 # 検定量 ```
    5. 帰無仮説の棄却か採択かの決定: 帰無仮説によればこの検定統計量は自由度$df=n-1=19$のt分布に従う
      st.t.ppf(0.025,19)     # df=19、下側確率0.05/2 = 0.025となるtの値を求める(scipy.stats.tモジュールのppf関数
      ⇒ -2.0930240544082634
      # 下側確率であるから、この値よりもt値が小さければ棄却される)
      st.t.ppf(0.975,19)     # df=19、上側確率1-0.05/2 = 0.975となるtの値を求める(scipy.stats.tモジュールのppf関数
      # 上側確率であるから、この値よりもt値が大きければ棄却される
      ⇒ 2.093024054408263

      この結果、棄却域は $t < -2.093024$ または $t > 2.093024$となるので、$t$の値は棄却域に入る。
      関数 cdf を用いて、直接p値を求めることもできる:

      st.t.cdf(t)   # 下側確率 (scipy.stats.tモジュールのcdf関数) t=-2.616648,19
      # 下側確率とすれば、p値は0.0085 という小さな値(< 0.05)
      ⇒ 0.0084854604500293768
      print(st.t.cdf(-t,19))  # 上側確率
      ⇒ 0.99151453955
      print(2*st.t.cdf(t,19))    # 両側検定なので2倍する
      ⇒ 0.0169709209001
      # 両側検定より2倍したp値は0.017という小さな値(< 0.05)

    6. よって、結論「有意水準5%において、指導法データは心理学テスト(という母集団)から無作為抽出した標本とはいえない」。 </OL>

    In [4]:
    # 以上の実行
    # 前の例題のデータをここでも使うことにする
    import numpy as np
    SampleData = np.array([13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15])
    
    mu=12.0    # 帰無仮説:平均=12
    # var=10.0  # 母分散は未知とする
    n=len(SampleData)
    sampleMean =np.mean(SampleData)
    unbiasedVar = np.var(SampleData, ddof=1)
    
    t =  (sampleMean - mu) / (unbiasedVar/n)**0.5             # 検定統計量
    print("検定統計量の実現値 = %f" % t)
    
    検定統計量の実現値 = -2.616648
    
    In [6]:
    import scipy.stats as st
    st.t.ppf(0.025,19)     # df=19、下側確率0.05/2 = 0.025となるtの値を求める(scipy.stats.tモジュールのppf関数
    # 下側確率であるから、この値よりもt値が小さければ棄却される)
    
    Out[6]:
    -2.0930240544082634
    In [7]:
    st.t.ppf(0.975,19)     # df=19、上側確率1-0.05/2 = 0.975となるtの値を求める(scipy.stats.tモジュールのppf関数
    # 上側確率であるから、この値よりもt値が大きければ棄却される
    
    Out[7]:
    2.093024054408263
    In [8]:
    st.t.cdf(t,19)   # 下側確率 (scipy.stats.tモジュールのcdf関数)
    # 下側確率とすれば、p値は0.0085 という小さな値(< 0.05)
    
    Out[8]:
    0.00848546013478172
    In [9]:
    print(st.t.cdf(-t,19))  # 上側確率
    print(2*st.t.cdf(t,19))    # 両側検定なので2倍する
    # 両側検定より2倍したp値は0.017という小さな値(< 0.05)
    
    0.9915145398652183
    0.01697092026956344
    

    これにより、結論p値は0.017 < 0.05 であるので、有意水準5%において帰無仮説が棄却、対立仮説が採択された。

    ところで、この場合の対立仮説とはなんでしたっけ?それをちゃんと書くようにしましょう。

    In [ ]:
    ?st.t.ppf
    
    In [ ]:
    ?st.t.cdf
    

    Pythonでt検定するための関数:

    以上のことをすべてやってくれる関数がscipy.statsモジュールのttest_1samp関数である。

    注意: これが使えるのは標本データセットがある場合に限る。データセットが与えられていない場合は、「標本平均、不偏分散、標本サイズ」によって上記の方法により検定する

    In [ ]:
    import scipy.stats as st
    ?st.ttest_1samp
    

    「指導法データ」 (SampleData) を用いてその使い方を示す: st.ttest_1samp(データ,$\mu$)

    In [ ]:
    # 以上の実行
    # 前の例題のデータをここでも使うことにする
    import numpy as np
    SampleData = np.array([13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15])
    
    import scipy.stats as st
    mu=12.0
    st.ttest_1samp(SampleData,mu)
    

    この表示から、t値が-2.617、p値が0.017 (両側検定)であることが得られる。

    注意:関数を実行して値を出して終わりではない. 次のような結論を書くこと
    $p < 0.05$であることから、帰無仮説は棄却された。つまり、有意水準5%において、指導法データは心理学テスト(という母集団)から無作為抽出した標本とはいえない。

    課題4-5

    ある食品メーカーの同じ種類の缶詰めから無作為抽出した缶詰「9個」の内容量を測定したところ、平均が49.4、不偏分散が1.0であった。この缶詰全体は正規分布に従うとするとき、母平均が$50.0$であるという仮説を有意水準5%で検定せよ。

    In [ ]:
    # 解答、計算用
    

    相関係数の検定(無相関検定)

    無相関検定:「母集団において相関が0である」と設定して行う検定


    母集団相関係数(母相関)に関する検定を行うときは、標本相関係数rから次を求めて検定統計量とする: $t = \frac{r\sqrt{n-2}}{\sqrt{1-r^2}}$

    Pythonを使った実習

    例題:以下で与えられる「統計学テスト1」(StatTest1)と「統計学テスト2」(StatTest2)の得点の相関係数の検定を行え。有意水準は5%とする。

    In [73]:
    import numpy as np
    StatTest1 = np.array([6,10,6,10,5,3,5,9,3,3,11,6,11,9,7,5,8,7,7,9])
    StatTest2 = np.array([10,13,8,15,8,6,9,10,7,3,18,14,18,11,12,5,7,12,7,7])
    

    次のステップで行う:

    1. 帰無仮説と対立仮説をたてる: 帰無仮説は$\rho = 0$、つまり母相関$=0$
      対立仮説は「$\rho \neq 0$」、つまり母相関$\neq 0$
    2. 検定統計量の選択: $t = \frac{r\sqrt{n-2}}{\sqrt{1-r^2}}$
    3. 有意水準の決定: 両側検定で、有意水準 5%、つまり$\alpha = 0.05$
    4. 検定統計量の実現値の計算:

      SampleCorr = np.corrcoef(StatTest1, StatTest2)[0,1]
      print("Sample Correlation = %f" % SampleCorr)  # 標本相関
      ⇒ Sample Correlation = 0.749659
      SampleSize = len(StatTest1)
      tDividend =  SampleCorr * (SampleSize - 2.0)**0.5
      tDivider = (1.0 - SampleCorr**2)**0.5
      t = tDividend/tDivider
      ⇒ t statistics = 4.805707

    5. 帰無仮説の棄却か採択かの決定: 帰無仮説によればこの検定統計量は自由度$df=n-2=18$のt分布に従う(「この検定統計量がt分布に従う」の証明は難しいので本講義では扱わない。興味がある人は調べてみよ)

      import scipy.stats as st
      print(st.t.ppf(0.025,18))    # df=18、下側確率0.05/2 = 0.025となるtの値を求める
      ⇒ -2.10092204024
      # 下側確率であるから、この値よりもt値が小さければ棄却される
      print(st.t.ppf(0.975,18))    # df=18、上側確率 1 - 0.05/2 = 0.975となるtの値を求める
      ⇒ 2.10092204024
      # 上側確率であるから、この値よりもt値が大きければ棄却される

    6. この結果、棄却域は $t < -2.101$ または $t > 2.101$となるので、tの値は棄却域に入る。 よって結論「統計学テスト1(StatTest1)と統計学テスト2(StatTest2)は有意水準5%において強い相関(相関係数0.75)がある」 </OL>

    In [1]:
    # 忘れる人がいるのでデータを再度提示する
    import numpy as np
    StatTest1 = np.array([6,10,6,10,5,3,5,9,3,3,11,6,11,9,7,5,8,7,7,9])
    StatTest2 = np.array([10,13,8,15,8,6,9,10,7,3,18,14,18,11,12,5,7,12,7,7])
    
    # ここから分析
    SampleCorr = np.corrcoef(StatTest1, StatTest2)[0,1]
    print("Sample Correlation = %f" % SampleCorr)  # 標本相関
    SampleSize = len(StatTest1)
    tDividend =  SampleCorr * (SampleSize - 2.0)**0.5
    tDivider = (1.0 - SampleCorr**2)**0.5
    
    t = tDividend/tDivider     # 検定統計量
    print("検定統計量の実現値 = %f" % t)
    
    Sample Correlation = 0.749659
    検定統計量の実現値 = 4.805707
    
    In [ ]:
    import scipy.stats as st
    print(st.t.ppf(0.025,18))    # df=18、下側確率0.05/2 = 0.025となるtの値を求める
    # 下側確率であるから、この値よりもt値が小さければ棄却される
    print(st.t.ppf(0.975,18))    # df=18、上側確率 1 - 0.05/2 = 0.975となるtの値を求める
    # 上側確率であるから、この値よりもt値が大きければ棄却される
    

    なおscipy.stats.tモジュールのcdf関数を用いて、直接p値を求めることもできる:

    In [9]:
    import scipy.stats as st
    print(st.t.cdf(t,18))  # 上側確率
    print( (1.0  - st.t.cdf(t,18))*2.0 )  # 両側検定なので2倍する
    # 両側検定により2倍したp値は0.00014という小さな値(< 0.05)
    print("相関係数=",st.pearsonr(StatTest1, StatTest2)[0])
    
    0.9999291885592227
    0.00014162288155450398
    相関係数= 0.749658964824245
    

    この場合の結論は次のようになる。結論を明記することを忘れないようにしよう

    p値は0.00014でありこれは0.05よりも小さな値なので、「相関がない」という帰無仮説が棄却される。ゆえに、有意水準5%において、StatTest1とStatTest2には相関があると考えられ、その相関係数は0.75であり、「強い相関」が認められる


    Pythonで無相関検定するための関数: scipy.stat.pearsonr

    In [2]:
    import scipy.stats as st
    # help(st.pearsonr)
    
    In [3]:
    import scipy.stats as st
    SampleCorr = st.pearsonr(StatTest1, StatTest2)
    print(SampleCorr)
    
    (0.7496589648242449, 0.00014162288155448246)
    

    pearsonr関数の出力の第一要素は標本相関係数(0.75)、第二要素は両側検定によるp値である。


    関数のまとめ

    注: numpyをnp, numpy.randomを random、 matplotlib.pyplotをplt、pandasをpd、scipy.statsをstと略記する

    目的 関数名とモジュール 使い方
    指定された範囲からランダム抽出 random.choice(配列,個数) random.choice(range(10),5)
    標準正規分布で下側確率に対応する確率分布関数の値 st.norm.ppf(p) st.norm.ppf(0.025) # $Prob(Z < q)=0.025$となるqの値
    標準正規分布で下側確率(p値)を求める st.norm.cdf(z) st.norm.cdf(1.96) # $Prob(Z < 1.96)$の値(p値)
    t分布で下側確率に対応する確率分布関数の値 st.t.ppf(p,自由度) st.t.ppf(0.025,19) # 自由度19のt分布で$Prob(Z < q)=0.025$となるqの値
    t分布で下側確率(p値)を求める st.t.cdf(p,df) st.t.cdf(1.96,19) # 自由度19のt分布で$Prob(Z < 1.96)$の値(p値)
    t検定を行う st.ttest_1samp(データ,$\mu$) st.ttest_1samp(np.array([13,14,7,12,10,6,8,15,4,14,9,6,8,8,12,15]),12.0) # $\mu=12$の検定
    無相関検定を行う st.pearsonr(データ1,データ2) st.pearsonr(StatTest1, StatTest2) # 出力の第一要素は標本相関係数、第二要素は両側検定によるp値

    演習問題

    演習問題1

    20歳男性の身長(単位はcm)は分散33.7, 平均170cmの正規分布に従うことが知られているとする。 次のデータ(単位はcm)は、それを母集団とした無作為抽出と考えてよいかどうかを検定せよ。

    In [1]:
    import numpy as np
    Height = np.array([165,150,170,168,159,170,167,178,155,159,161,162,166,171,155,160,168,172,155,167])
    

    解答:帰無仮説を「Heightデータは分散33.7, 平均170cmの正規分布に従う20歳男性の身長データを母集団とし、そこからの無作為抽出である」とする。対立仮説はその否定、すなわち「Heightデータは分散33.7, 平均170cmの正規分布に従う20歳男性の身長データを母集団としていない(無作為抽出ではない)」。有意水準5%、両側検定を行う。

    In [9]:
    mu=170    # 帰無仮説:平均=12
    var=33.7  # 母分散
    n=len(Height)
    HeightMean =np.mean(Height)
    z =  (HeightMean - mu) / (var/n)**0.5             # 検定統計量
    print("検定統計量の実現値=",z)
    
    検定統計量の実現値= -4.699264416205202
    
    In [20]:
    # t<0なので下側確率を用いる
    import scipy.stats as st
    print("p値=%e" % (st.norm.cdf(z)*2))   # 下側確率*2
    print("p値=%f" % (st.norm.cdf(z)*2)) # 別な表現
    
    p値=2.611002e-06
    p値=0.000003
    

    p値が$2.61 \times 10^{-6}$であり有意水準$5 \%$より小さい。 ゆえに帰無仮説は棄却され、対立仮説が採択される。 つまり所与のデータは有意水準5%において「20歳男性の身長の母集団からの無作為抽出」とは考えられない。

    演習問題2

    20歳男性の身長(単位はcm)は 平均170cmの正規分布に従うことが知られているとする。ここで演習問題1との違いは、「分散が未知」であることである。 演習問題1のデータは、それを母集団とした無作為抽出と考えてよいかどうかを検定せよ。

    解答:帰無仮説を「Heightデータは平均170cmの正規分布に従うデータを母集団とし、そこからの無作為抽出である」とする。対立仮説はその否定、すなわち「Heightデータは平均170cmの正規分布に従うデータを母集団としていない(無作為抽出ではない)」。有意水準5%、両側検定を行う。

    In [2]:
    mu=170    # 帰無仮説
    var=np.var(Height,ddof=1) # 母分散は未知とする
    n=len(Height)
    HeightMean =np.mean(Height)
    t =  (HeightMean - mu) / (var/n)**0.5             # 検定統計量
    print("検定統計量の実現値 = %f" % t)
    
    検定統計量の実現値 = -3.850286
    
    In [5]:
    print("不偏分散=%5.2f, データサイズ= %d" %(var, n))
    
    不偏分散=50.20, データサイズ= 20
    
    In [22]:
    import scipy.stats as st
    #下側確率 両側検定なので×2
    print("p値 = %e" % (st.t.cdf(t, n-1)*2))
    print("p値 = %f" % (st.t.cdf(t, n-1)*2)) # 別な表現
    
    p値 = 1.078567e-03
    p値 = 0.001079
    

    p値が0.001であり有意水準5%より小さい。ゆえに帰無仮説は棄却され、対立仮説が採択される。 つまり所与のデータは有意水準5%とすると「平均170cmの正規母集団から無作為抽出した標本とは考えられない」。

    参考:ttest_1sampを使うと簡単!

    In [26]:
    st.ttest_1samp(Height,170)
    
    Out[26]:
    Ttest_1sampResult(statistic=-3.8502858588965956, pvalue=0.0010785667799504406)

    最初の数値(-3.85)が検定統計量の実現値、2番めの数値(0.00108)がp値。これは与えられた標本データが平均$\mu$(この例では170)かつ母分散が未知の正規母集団からの無作為抽出かどうかを検定するのに用いられる。(分散が既知の場合と比べると、p値が高くなりやすいことに注意)

    演習問題3

    次のそれぞれのデータについて無相関検定を行え。結論を明記することを忘れないように。

    In [23]:
    #3-1
    import numpy as np
    Kokugo = np.array([60,40,30,70,55])
    Shakai = np.array([80,25,35,70,50])
    

    解答:pearsonr関数を使えばすぐに求まるが、ひとまず正攻法で解いてみる。帰無仮説は「KokugoとShakaiに相関がない」、対立仮説は「KokugoとShakaiは相関がある」。有意水準を5%とし、両側検定する。

    In [24]:
    SampleCorr = np.corrcoef(Kokugo,Shakai)[0,1]
    print("Sample Correlation = %f" % SampleCorr)  # 標本相関
    SampleSize = len(Kokugo)
    tDividend =  SampleCorr * (SampleSize - 2.0)**0.5
    tDivider = (1.0 - SampleCorr**2)**0.5
    
    t = tDividend/tDivider     # 検定統計量
    print("検定統計量の実現値 = %f" % t)
    
    Sample Correlation = 0.841263
    検定統計量の実現値 = 2.695228
    
    In [28]:
    alpha=0.05
    print("下側の棄却域の値=%f"%st.t.ppf(alpha/2, SampleSize-2))
    print("上側の棄却域の値=%f"%st.t.ppf(1.0-alpha/2, SampleSize-2))
    
    下側の棄却域の値=-3.182446
    上側の棄却域の値=3.182446
    
    In [29]:
    # t > 0 であるからt.cdfをそのまま求めると大きな値になる。そのため1から引き算する。
    print("p値=%f"%( (1-st.t.cdf(t,SampleSize-2))*2 ))
    
    p値=0.074085
    

    参考:st.perasonrを使う: 1番目の数値が相関係数、2番めの数値がp値

    In [30]:
    import scipy.stats as st
    SampleCorr = st.pearsonr(Kokugo, Shakai)
    print(SampleCorr)
    
    (0.8412630177137491, 0.07408497775131745)
    

    p値は0.074でありこれは有意水準の0.05よりも大きい。 ゆえに「KokugoとShakaiには相関がない」という帰無仮説が棄却されない。 従って、有意水準5%において、KokugoとShakaiには相関がない。

    参考:「相関がない」とはしたものの、p値はかなり小さな値である。p値が0.10よりも小さい場合「(有意な差はないものの)有意傾向にある」と言うことがある。

    In [31]:
    #3-2 --- 単純に上記(3-1)のデータを2回繰り返したもの 
    # 結論が変わることに気づくであろう。 データを捏造するとこうなる、という例
    Kokugo2 = np.array([60,40,30,70,55,60,40,30,70,55])
    Shakai2 = np.array([80,25,35,70,50,80,25,35,70,50])
    

    解答:帰無仮説は「Kokugo2とShakai2に相関がない」、対立仮説は「Kokugo2とShakai2は相関がある」。有意水準を5%とし、両側検定する。

    In [32]:
    import scipy.stats as st
    SampleCorr = st.pearsonr(Kokugo2, Shakai2)
    print(SampleCorr)
    
    (0.8412630177137489, 0.002282820730043323)
    

    p値は$0.023$でありこれは$5\%$よりも小さい。 ゆえに「Kokugo2とShakai2は相関がない」という帰無仮説が棄却される。 従って、有意水準5%において、Kokugo2とShakai2には、相関係数0.84という強い相関がある。

    In [33]:
    # 参考:正攻法で解いてみる
    SampleCorr = np.corrcoef(Kokugo2,Shakai2)[0,1]
    print("Sample Correlation = %f" % SampleCorr)  # 標本相関
    SampleSize = len(Kokugo2)
    tDividend =  SampleCorr * (SampleSize - 2.0)**0.5
    tDivider = (1.0 - SampleCorr**2)**0.5
    
    t = tDividend/tDivider     # 検定統計量
    print("検定統計量の実現値 = %f" % t)
    
    Sample Correlation = 0.841263
    検定統計量の実現値 = 4.401288
    
    In [34]:
    alpha=0.05
    print("下側の棄却域の値=%f"%st.t.ppf(alpha/2, SampleSize-2))
    print("上側の棄却域の値=%f"%st.t.ppf(1.0-alpha/2, SampleSize-2))
    
    下側の棄却域の値=-2.306004
    上側の棄却域の値=2.306004
    
    In [35]:
    # t > 0 であるからt.cdfをそのまま求めると大きな値になる。そのため1から引き算する。
    print("p値=%f"%( (1-st.t.cdf(t,SampleSize-2))*2 ))
    
    p値=0.002283