検定の手順とPythonを使った2項分布の検定

数学的理論と計算

検定、つまり統計学的検定は統計の基本として知って知っておいたほうがいい知識です。

じゃ検定は何をするのかというと、例えば「製品AとBの間に優劣があるのかどうか」とか「テストの成績がクラスごとに差があるのかどうか」など、何かと何かを比べるときに使われます。

Sponsored Link

統計学的検定:仮説の設定

統計学的検定には下記の手順があります。

  1. 仮説の設定
  2. 検定統計量の計算
  3. 判定

そして検定を行う際に最も重要なのが仮説の設定です。

仮説の設定

対象とする集団の固有の統計量、すなわち母平均、や母分散などの母数(パラメーター)について仮説を立て、それが成り立つかを確率的に判定することが検定の手順になります。

例えば、クラスAとクラスBの国語の成績が統計学的に検定するとき以下の仮説を立てます。

  • 帰無仮説「 : = 」: クラスAとクラスBの国語の成績の平均は等しい。
  • 対立仮説「 :  ≠ 」クラスAとクラスBの国語の成績の平均は等しくない。

検定は帰無仮説が棄却されることを意図しています。

また積極的に仮説を認めるものではないため、仮説が棄却されない場合でも「クラスAとクラスBの国語の成績が等しくないとは言えない」という具合に表現します。

一方帰無仮説が棄却された場合、対立仮説である「クラスAとクラスBの国語の成績の平均は等しくない」が採用されます。

なお対立仮説には、目的により「 :  ≠ 」のほかに、「 : または : 」があります。

統計検定量の計算

統計検定量の計算には z検定や t検定がありますが、基本的には以下のように使い分けます。

  • z検定:母分散既知
  • t検定:母分散未知
  • ウェルチ検定:母分散未知、2集団の分散に差がある

これらは実際計算しながら説明していきます。

判定

例えば標準正規分布に従うZを統計検定量としたとき、有意水準の領域、例えば5%の場合、両側2.5%ずつの領域が棄却域になります。

両側2.5%の棄却域の場合、境界値は-1.96と1.96になるので、計算して得られた値がこれらの境界値よりも大きいまたは小さい場合、帰無仮説は棄却されます。

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

p_u = norm.ppf(0.975, loc=0, scale=1)     # 両側5%点の上側 2.5%
p_d = norm.ppf(0.025, loc=0, scale=1)     # 両側5%点の下側 2.5%
X= np.arange(-5, 5, 0.1)                  # 0から100まで0.1間隔のリスト
Y = norm.pdf(X, 0, 1)                     # 確率密度関数にx, 平均0、標準偏差1の標準正規分布

fig, ax = plt.subplots(1,1)               #標準正規分布の描画

ax.set_xticks([p_d, p_u])                 # 目盛りと値を追加
ax.plot(X, Y, color='r')

y= 0

# 標準正規分布とy=0 の直線に挟まれた両側5%点の上側5%点(p=u)以上、両側5%点の下側5%点(p_d) 以下の面積(確率)を塗りつぶす。
ax.fill_between(X, Y, y, where = (X>p_u)|(X<p_d))


両側検定のほかに、左右どちらかで行う片側検定もあり有意水準が5%ときの境界値は-1.65と1.65。

これらの値よりも小さい値、または大きい値の場合帰無仮説は棄却されます。

p = norm.ppf(0.95, loc=0, scale = 1)       #上側5%点
X = np.arange(-5, 5, 0.1)                  # 0から100まで0.1間隔のリスト
Y = norm.pdf(X,0,1)                        # 確率密度関数にx, 平均0、標準偏差1の標準正規分布

fig, ax = plt.subplots(1,1)                #標準正規分布の描画

ax.set_xticks([p])                         # 目盛りと値を追加
ax.plot(X, Y, color = 'r')

y = 0

# 標準正規分布とy=0 の直線に挟まれた上側5%点以上の面積(確率)を塗りつぶす。
ax.fill_between(X,Y,y, where=X>p)

p = norm.ppf(0.05, loc=0, scale = 1)             #下側5%点
X = np.arange(-5, 5, 0.1)                       # 0から100まで0.1間隔のリスト
Y = norm.pdf(X,0,1)                             # 確率密度関数にx, 平均0、標準偏差1の標準正規分布

fig, ax = plt.subplots(1,1)                      #標準正規分布の描画

ax.set_xticks([p])                               # 目盛りと値を追加
ax.plot(X, Y, color = 'r') 

y = 0 

# 標準正規分布とy=0 の直線に挟まれた下側5%点以下の面積(確率)を塗りつぶす。
ax.fill_between(X,Y,y, where=X<p)

統計学的検定:二項分布の例題

演習で身につける統計学入門 から、2項分布を用いた検定の例題を解いてみることにします。

まずは、いかさまサイコロかどうかの検定。

以下問題。

「サイコロを300回振った時、5の目が55回出た場合、このサイコロは5の目が出やすいといえるか」を有意水準0.05で検定する。

サイコロで5の目が出る確率をpとすると、帰無仮説 は 「このサイコロは公平である:p = 1/6」となります。

また、対立仮説は「この仮説は5の目が出やすい:p ≠ 1/6」となります。

サイコロの5が出やすいということは「p>1/6」となるため、右側の片側検定を行うことになります。

以下計算になります。

import numpy as np
from scipy import stats

alpha = 0.05     # 信頼水準
n = 300        # 試行回数
x = 55        # 5の目が出た回数

# 二項分布 Bi(300, 1/6)

mu = n*(1/6)     # 確率変数 X の期待値
v = mu*(1-(1/6))   # 分散
std = v**0.5     # 標準偏差

print(mu)
print(std)
print(v)

50.0 
6.454972243679029 
41.66666666666667

サイコロを振る回数が300回と多いので、サイコロの目が出る回数 x は正規分布 に従います。

これを標準化した統計量 Z は  に従います。

つまり:

Z = (x-mu)/std
print(Z)
0.7745966692414833

各値を代入すると、Z = 0.7745 となり、棄却域 Z = 1.65よりも小さいので、帰無仮説は棄却されません。

つまり「5の目が出やすいとは言えない」と判定されます。

ではこれをグラフで表してみましょう。

以下のコードを実行し、Z値の位置を確認します。

from matplotlib import pyplot as plt
from scipy.stats import norm
p = norm.ppf(0.95, loc=0, scale = 1)      # 上側5%
X = np.arange(-5, 5, 0.1)                # -5から5までの関数リスト
Y = norm.pdf(X,0,1)                       # 確率密度関数にX,平均0、標準偏差1の標準正規分布
fig, ax = plt.subplots(1,1)               # 標準正規分布の描画
ax.plot(X, Y, color = 'r')
ax.set_xticks([p,Z])                      # 有意水準、Z値
plt.xticks(rotation=-90)          # 値を90度回転
y = 0
# 標準正規分布とy=0の直線に挟まれた上側5%点(p)以上の面積(確率)を塗りつぶす
ax.fill_between(X,Y,y, where=X>p)

グラフから、Z値は棄却域の内側にあるのが確認できます。

参考サイト:

https://ai-soldier.work/useful-features-matplotlib/

 

Sponsored Link

コメント

タイトルとURLをコピーしました