データ分析系プログラマーのブログ

主にPythonを使ったデータ分析や機械学習をやっています。

Pythonを使った独立性のカイ二乗検定統計量の求め方

検定には、母平均、母比率、母分散を用いた検定の他に、二項分布、ポアソン分布、適合度、独立性の検定があります。このうち、カイ二乗統計量を用いた独立性の検定は、2つ以上の分類基準を持つクロス集計表において、分類基準間に関連があるかどうかを検定することをいいます。独立性の検定では、カイ二乗分布を用いて検定を行います。この記事では、Pythonを使って、独立性におけるカイ二乗の統計検定量の求め方と独立性の検定の行い方について紹介しています。

独立性の検定

独立性の検定は、2つ以上の分類基準を持つクロス集計表において、分類基準間に関連があるかどうかを検定することです。この場合も、カイ二乗分布を使用します。検定統計量は、理論値を求め、ズレを計算し、すべてのズレの和を計算することで求められます。

理論値は、i列目の度数の合計を「fi」、j行目の度数合計を「fj」、すべての度数の合計をnとすると、i列・j行目の「理論値」は以下の式から求められます。


理論値=\frac{f_i\times f_j}{n}

すべてのズレの和は以下のようになります。


\chi^2=\frac{(実測値_1-理論値_1)^2}{理論値_1}+\frac{(実測値_2-理論値_2)^2}{理論値_2}+\dots+\\ \frac{(実測値_n-理論値_n)^2}{理論値_n}

自由度は、m行、n行とした場合、(m-1)/(n-1)となります。

例えば、ランダムに選ばれた男女各100人の血液型について次のようなデータが得られた時、性別と血液型に関連があるといえるかどうかは以下のようになります。

血液型 A型 O型 B型 AB型
男性 50 24 17 9 100
女性 45 28 22 5 100

理論値を計算するために各血液型の合計を計算します。

血液型 A型 O型 B型 AB型
男性 50 24 17 9 100
女性 45 28 22 5 100
95 52 39 14 200

理論値は以下のようになります。


理論値=\frac{f_i\times f_j}{n}
血液型 A型 O型 B型 AB型
男性 47.5 26 19.5 7 100
女性 47.5 26 19.5 7 100

ズレの和は以下のようになります。


\chi^2=\frac{(50-47.5)^2}{47.5}+\frac{(24-26)^2}{26}+\frac{(17-19.5)^2}{19.5}+\frac{(9-7)^2}{7}\\
+\frac{(45-47.5)^2}{47.5}+\frac{(28-26)^2}{26}+\frac{(22-19.5)^2}{19.5}+\frac{(5-7)^2}{7}\\
=0.1315+0.1538+0.3205+0.571+0.1315+0.1538+0.3205+0.571=2.3536

自由度は、(2-1)/(4-1)となります。


\chi^2_{0.05}(3)

は、片側検定なので、7.815となります。

よって、有意水準5%において、帰無仮説を棄却しない」という結果になるので、性別と血液型は独立である(関連がない)」と結論づけられます。

Pythonを使った独立性のカイ二乗検定統計量の求め方

pythonを使って独立性のカイ二乗検定統計量を求める場合は以下のようになります。リストを使って計算する場合は、まず、男性と女性のデータをそれぞれ用意します。次に、for文を使って、男性と女性の血液型ごとの合計を求めます。次に、男性、女性それぞれの理論値をfor文で求めます。そして、男女それぞれのデータと理論値を使ってカイ二乗統計検定量を計算します。最後に、有意水準0.05、自由度からカイ二乗の値をscipyのstats.chi2.ppfで求めて、有意水準0.05の片側検定で検定を行います。また、独立性におけるカイ二乗統計検定量は、numpyでデータを用意して、scipyのchi2_contingencyを使用することでも求められます。

data1 = [50,24,17,9]
data2 = [45,28,22,5]

data12 = []

for i, j in zip(data1, data2):
    k = i + j
    data12.append(k)
print("男性と女性の血液型ごとの合計 = ", data12)

data1_all = sum(data1)
data2_all = sum(data2)
data12_all = sum(data12)

data1_theo = []
data2_theo = []

for i in data12:
    k = i*data1_all/data12_all
    data1_theo.append(k)
    
for i in data12:
    k = i*data2_all/data12_all
    data2_theo.append(k)

print("男性の理論値 = ", data1_theo)
print("女性の理論値 = ", data2_theo)

chi2 = 0

for i, j in zip(data1, data1_theo):
    chi2 += ((i - j)**2)/j

for i, j in zip(data2, data2_theo):
    chi2 += ((i - j)**2)/j

print("カイ二乗統計検定量 = ", chi2)

男性と女性の血液型ごとの合計 = [95, 52, 39, 14]
男性の理論値 = [47.5, 26.0, 19.5, 7.0]
女性の理論値 = [47.5, 26.0, 19.5, 7.0]
カイ二乗統計検定量 = 2.3547329863119337

from scipy import stats
alpha = 0.05 #有意水準
df = (2-1)*(len(data1)-1) # 自由度 (n-1)×(m-1)

chi2_value = stats.chi2.ppf(1-alpha, df)

if chi2 < chi2_value:
    print("カイ二乗の値は", chi2_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、",
          "性別と血液型は独立である(関連がない)」と結論づけられます。")
    
else:
    print("カイ二乗の値は", chi2_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、",
          "性別と血液型は独立とは言えない(関連がある)」と結論づけられます。")

カイ二乗の値は 7.814727903251179 なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、 性別と血液型は独立である(関連がない)」と結論づけられます。

from scipy import stats
import numpy as np
array = np.array([[50,24,17,9], [45,28,22,5]])
result = stats.chi2_contingency(array)

print("カイ二乗の統計量",result[0])
print("p値",result[1])
print("自由度",result[2])
print("期待度数",result[3])

カイ二乗の統計量 2.3547329863119337
p値 0.5021166806663782
自由度 3
期待度数 [[47.5 26. 19.5 7. ]
[47.5 26. 19.5 7. ]]

参考

統計学の時間 | 統計WEB

Pythonを使った適合度のカイ二乗検定統計量の求め方

検定には、母平均、母比率、母分散を用いた検定の他に、二項分布、ポアソン分布、適合度、独立性の検定があります。このうち、カイ二乗統計量を用いた適合度の検定は、ある調査によって得られたクロス集計表がある場合、実測度数がある特定の分布に適合(一致)するかどうかを検定することをいいます。適合度の検定では、カイ二乗分布を用いて検定を行います。この記事では、Pythonを使って、適合度のカイ二乗の統計検定量の求め方と適合度の検定の行い方について紹介しています。

適合度の検定

適合度の検定は、カイ二乗統計量によって行います。カイ二乗統計量は、実測値と理論値のズレの和によって求められます。また自由度はカテゴリー数n-1によって求められます。


\chi^2=\frac{(実測値_1-理論値_1)^2}{理論値_1}+\frac{(実測値_2-理論値_2)^2}{理論値_2}+\dots+\\ \frac{(実測値_n-理論値_n)^2}{理論値_n}

例えば、日本人の血液型の分布はA型が40%、O型が30%、B型が20%、AB型が10%であると言われていて、ランダムに選ばれた100人の血液型について次のようなデータが得られた時、このデータは日本人の血液型の分布と同じといえるかどうかは以下のようになります。有意水準は0.05とします。

血液型 A型 O型 B型 AB型
度数 53 24 18 5 100

理論値は、

血液型 A型 O型 B型 AB型
度数 40 30 20 10 100

ズレの和は、


\chi^2=\frac{(53-40)^2}{40}+\frac{(24-30)^2}{30}+\frac{(18-20)^2}{20}+\frac{(5-10)^2}{10}=4.225+1.2+0.2+2.5=8.125

有意水準0.05、自由度4-1=3のカイ二乗の片側検定は、7.815となっています。

よって、有意水準5%において、帰無仮説を棄却し、対立仮説を採択するという結果になるので、調査した血液型分布は日本人の血液型分布と一致しないと結論づけられます。

Pythonを使った適合度のカイ二乗検定統計量の求め方

pythonを使って適合度のカイ二乗検定統計量を求める場合は以下のようになります。まず、実測値と理論値のデータをそれぞれ用意します。次に、for文を使って、カイ二乗統計検定量の式を用いて計算します。適合度のカイ二乗統計検定量は、scipyのstats.chisquareを使用することでも求められます。次に、有意水準0.05、自由度からカイ二乗の値をscipyのstats.chi2.ppfで求めて、有意水準0.05の片側検定で検定を行います。

data1 = [53,24,18,5]
data2 = [40,30,20,10]

chi2 = 0

for i, j in zip(data1, data2):
    chi2 += ((i - j)**2)/j

print("カイ二乗統計検定量 = ", chi2)

カイ二乗統計検定量 = 8.125

from scipy import stats
alpha = 0.05 #有意水準
df = len(data1) - 1 # 自由度n-1

print("chisquareを使用したカイ二乗統計検定量の値 = ", stats.chisquare(data1, f_exp = data2))

chi2_value = stats.chi2.ppf(1-alpha, df)

if chi2 > chi2_value:
    print("カイ二乗の値は", chi2_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、",
          "調査した血液型分布は日本人の血液型分布と一致しないとは言えない結論づけられます")
    
else:
    print("カイ二乗の値は", chi2_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、",
          "調査した血液型分布は日本人の血液型分布と一致しないと結論づけられます")

chisquareを使用したカイ二乗統計検定量の値 = Power_divergenceResult(statistic=8.125, pvalue=0.04349775141156383)
カイ二乗の値は 7.814727903251179 なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、 調査した血液型分布は日本人の血液型分布と一致しないとは言えない結論づけられます

参考

統計学の時間 | 統計WEB

Pythonを使ったポアソン分布の検定統計量の求め方

検定には、母平均、母比率、母分散を用いた検定の他に、二項分布、ポアソン分布、適合度、独立性の検定があります。このうち、ポアソン分布を用いた検定は、事故や地震などのようにサンプル数が非常に大きく、確率が非常に小さい場合にサンプル数×確率を一定とすることができポアソン分布に従います。また確率変数がポアソン分布に従う時、期待値=分散=λ(サンプル数×確率)となるので、統計検定量を求めてある期間における事象(事故や地震など)の起こりやすさを判定することができます。この記事では、Pythonを使って、ポアソン分布の統計検定量の求め方と検定の行い方について紹介しています。

ポアソン分布の検定

確率変数Xがポアソン分布に従い、サンプルサイズnが十分に大きい時には、次の式は標準正規分布に従います。


z=\frac{X-n\lambda}{\sqrt{n\lambda}} = \frac{\frac{X}{n}-\lambda}{\sqrt{\frac{\lambda}{n}}}

例えば、1分に1個の不良品が出る工場があり、改善した結果、1時間に40個となった時、有意水準を0.05とした場合、1分間の不良品の発生頻度は低下したと言えるかどうかは以下のようになります。

この場合、


\lambda=60/60=1

\frac{X}{n}=40/60=0.6667

n=60

となるので、以下のようになります。


z= \frac{\frac{X}{n}-\lambda}{\sqrt{\frac{\lambda}{n}}}
=\frac{0.6667-1}{\sqrt{\frac{1}{60}}}
=\frac{-0.3333}{0.129}=-2.58

Z_{0.05}=1.64

よって、帰無仮説を棄却し、対立仮説を採択するという結果になるので、この工場ではでは1分に1回の不良品が発生するとは言えないので、工場の改善によって不良品の発生数は改善されたと結論づけられます。

Pythonを使ったポアソン分布の検定統計量の求め方

pythonを使ってポアソン分布の統計検定量を求める場合は以下のようになります。まず、サンプル数は、改善後が1時間に40個とあるので、n = 60とします。また、λ(lambda1)は1分間に1個とあるので、1時間に60個となりまます。さらに、改善後の1時間当たりの不良品の数をXとしてそれぞれ用意します。次に、ポアソン分布における統計検定量を求めて、有意水準0.05の片側検定で検定を行います。

import math

n = 60 #1分に1個なので60分で60個
lambda1 = 60/60 #1分に1個を60分にしただけ
X = 40 #改善後の1時間あたりの不良品の数

z = (X/n - lambda1)/math.sqrt(lambda1/n)
print("ポアソン分布の統計検定量 = ", z)

ポアソン分布の統計検定量 = -2.5819888974716116

from scipy import stats
alpha = 0.05 #有意水準

z_value = stats.norm.ppf(1-alpha)

if z > z_value:
    print("z値は", z_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、",
          "この工場ではでは1分に1回の不良品が発生するので、工場の改善によって不良品の発生数は改善されていない結論づけられます。")
    
else:
    print("z値は", z_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、",
          "この工場ではでは1分に1回の不良品が発生するとは言えないので、工場の改善によって不良品の発生数は改善されたと結論づけられます。")

z値は 1.6448536269514722 なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、 この工場ではでは1分に1回の不良品が発生するとは言えないので、工場の改善によって不良品の発生数は改善されたと結論づけられます。 ​

参考

統計学の時間 | 統計WEB

Pythonを使った二項分布の検定統計量の求め方

検定には、母平均、母比率、母分散を用いた検定の他に、二項分布、ポアソン分布、適合度、独立性の検定があります。このうち、二項分布を用いた検定は、コインやサイコロなどのようにある値が出るか出ないかと言った二項分布からコインやサイコロなどの確率に歪みがないかどうかを判定することができます。この記事では、Pythonを使って、二項分布の統計検定量の求め方と検定の行い方について紹介しています。

二項分布の検定

二項分布の検定の場合、次の式から得られる統計量zは標準正規分布に従います。


z=\frac{X-np}{\sqrt{np(1-p)}}

例えば、あるサイコロを10,000回投げたときに1が出た回数が1,500回で有意水準を0.05とした場合、このサイコロはどの目も等しく出る歪みのないサイコロといえるかどうかは以下のようになります。


np=10000/6=1666.67

z=\frac{X-np}{\sqrt{np(1-p)}}=\frac{1500-1666.67}{\sqrt{1666.67(1-\frac{1}{6})}}=\frac{-166.67}{37.2678}=-4.472

Z_0.025=1.96

よって、帰無仮説を棄却し、対立仮説を採択するという結果になり、このサイコロの1が出る確率は1/6ではなく、このサイコロは1の出やすさに関して歪んでいると結論づけられます。

Pythonを使った二項分布の検定統計量の求め方

pythonを使って二項分布の統計検定量を求める場合は以下のようになります。与えられた設問より、1が出た回数、サンプル数、サイコロの確率をそれぞれ用意します。次に、二項分布における統計検定量zを求める式を使って検定量zの値を求めます。次に、有意水準を使い、statsのnorm.ppfを使用して、z値を求めて、if文で検定することができます。

import math

x = 1500 #1が出た回数
n = 10000 #サンプル数
p = 1/6 #サイコロの確率

z = (x - n*p)/math.sqrt(n*p*(1 - p))
print("二項分布の統計検定量 = ", z)

二項分布の統計検定量 = -4.472135954999576

from scipy import stats
alpha = 0.05 #有意水準

z_value = stats.norm.ppf(1-alpha/2)

if -z_value < z < z_value:
    print("z値は", z_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、",
          "このサイコロの1が出る確率は1/6ではないとは言えず、このサイコロは1の出やすさに関して歪んでいるとは言えないと結論づけられます。")
    
else:
    print("z値は", z_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、",
          "このサイコロの1が出る確率は1/6ではなく、このサイコロは1の出やすさに関して歪んでいると結論づけられます。")

z値は 1.959963984540054 なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、 このサイコロの1が出る確率は1/6ではなく、このサイコロは1の出やすさに関して歪んでいると結論づけられます。

参考

統計学の時間 | 統計WEB

Pythonを使った等分散の検定統計量の求め方

母分散の検定には2標本を使った等分散の検定があります。この2つの標本のた母分散を使っ等分散の検定は、2つの標本から得た標本分散を使って2つの分散が等しいかをF分布を使って検定する方法となります。この記事では、Pythonを使った、等分散の統計検定量Fの求め方と検定の行い方について紹介しています。

等分散の検定とは

等分散の検定では、2標本の不偏分散、サンプルサイズがそれぞれある場合、統計量Fは以下のようになります。


F =  \frac{max\{u_1^2, u_2^2\}}{min\{u_1^2, u_2^2\}}
  • maxが標本1の不偏分散で、minが標本2の不偏分散の場合の自由度は、(標本1のサンプルサイズ-1、標本2のサンプルサイズ-1)
  • maxが標本2の不偏分散で、minが標本1の不偏分散の場合の自由度は、(標本2のサンプルサイズ-1、標本1のサンプルサイズ-1)

F分布とは

F分布とは、自由度、カイ二乗分布が互いに独立である場合に、次の式から算出されるFが従う確率分布のことです。


F = \frac{\chi^2_1/k_1}{\chi^2_2/k_2}

母分散が等しいと仮定できる時の統計量F


F = \frac{\chi^2_1/k_1}{\chi^2_2/k_2} = \frac{s^2_1/\sigma^2_1}{s^2_2/\sigma^2_2}=\frac{s^2_1}{s^2_2}

例えば、分散未知の正規分布に従う2群からサンプリングし、次のような結果を有意水準0.05で検定した場合、この2群の母分散は等しいと考えられるかは以下のようになります。

項目 A群 B群
サンプルサイズ 11 7
不偏分散 1.24 4.21
分散 1.05 3.97

F = \frac{s^2_1}{s^2_2} = \frac{4.21}{1.24} = 3.395

また、


F_{0.025}(6,10)=4.072

棄却域は、


F > 4.072

よって、この2群の母分散は等しくないとは言えないという結論になります。

また、例えば、機械Ⅰで作った製品を10個、機械Ⅱで作った製品を12個鳥、その重さ(g)を測って次の値を得た場合、この二つの製品の重さが正規分布に従うと仮定して、これら2台の機械で作られる製品の重さの分散が等しいかどうかを有意水準5%で検定する場合は以下のようになります。

1 2 3 4 5 6 7 8 9 10 11 12
機械Ⅰ 0.374 0.380 0.365 0.399 0.388 0.383 0.311 0.398 0.363 0.373 - -
機械Ⅱ 0.313 0.320 0.304 0.332 0.328 0.355 0.348 0.351 0.323 0.307 0.342 0.374

n_1 = 10,  \Sigma x_i = 3.734,  \Sigma x_i^2 = 1.399958

n_2 = 12,  \Sigma y_i = 3.997,  \Sigma y_i^2 = 1.336341

u_1^2 = \frac{1}{n_1 - 1}\left\{\Sigma x_i^2 - \frac{(\Sigma x_i)^2}{n}\right\} =  \frac{1}{9}\left\{1.399958 - \frac{3.734^2}{10}\right\} = 0.000631

u_2^2 = \frac{1}{n_2 - 1}\left\{\Sigma y_i^2 - \frac{(\Sigma y_i)^2}{n}\right\} =  \frac{1}{11}\left\{1.336341 - \frac{3.997^2}{10}\right\} = 0.000455

F =  \frac{max\{u_1^2, u_2^2\}}{min\{u_1^2, u_2^2\}} = \frac{0.000631}{0.000455} = 1.39

F_{0.025}(9,11) = 3.60

棄却域は、


F > 3.60

よって、F=1.39は棄却域に入らないので、帰無仮説は採択されるので、2つの母分散は等しいとみなされる。

Pythonを使った等分散の検定統計量の求め方

pythonを使って等分散の統計検定量を求める場合は以下のようになります。与えられた設問より、2つの不偏分散から大きい方の値の不偏分散を分子、小さい方の不偏分散を分母にして、等分散の統計検定量Fと自由度を求めます。次に、それぞれのサンプル数から自由度を求めて、statsのf.ppfからF値を求めて、if文で検定することができます。

variance_A = 1.24
variance_B = 4.21

if variance_A > variance_B:
    F = variance_A/variance_B
    dfn, dfd = 11 - 1, 7 -1

else:
    F = variance_B/variance_A
    dfn, dfd = 7 - 1, 11 -1

print("等分散の統計検定量F = ", F)
print("自由度 ", dfn,",", dfd)

等分散の統計検定量F = 3.3951612903225805
自由度 6 , 10

from scipy import stats
alpha = 0.05 #有意水準

f_value = stats.f.ppf(1-alpha/2, dfn, dfd)

if F < f_value:
    print("F値は", f_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になるので、",
          "この2群の母分散は等しくないとは言えないという結論になります。")

else:
    print("F値は", f_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になるので、",
          "この2群の母分散は等しくないという結論になります。")

F値は 4.07213131505824 なので、帰無仮説を採択し、対立仮説を棄却するという結果になるので、 この2群の母分散は等しくないとは言えないという結論になります。

import statistics

machine1 = [0.374,0.380,0.365,0.399,0.388,0.383,0.311,0.398,0.363,0.373]
machine2 = [0.313,0.320,0.304,0.332,0.328,0.355,0.348,0.351,0.323,0.307,0.342,0.374]

variance1 = round(statistics.variance(machine1),6)
variance2 = round(statistics.variance(machine2),6)

if variance1 > variance2:
    F = variance1/variance2
    dfn, dfd = len(machine1)-1, len(machine2)-1

else:
    F = variance1/variance2
    dfn, dfd = len(machine2)-1, len(machine1)-1

print("機械Ⅰの不偏分散 = ",variance1)
print("機械Ⅱの不偏分散 = ",variance2)

print("等分散の統計検定量F = ", F)
print("自由度 ", dfn,",", dfd)

機械Ⅰの不偏分散 = 0.000631
機械Ⅱの不偏分散 = 0.000455
等分散の統計検定量F = 1.386813186813187
自由度 9 , 11

from scipy import stats
alpha = 0.05 #有意水準

f_value = stats.f.ppf(1-alpha/2, dfn, dfd)

if F < f_value:
    print("F値は", f_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になるので、",
          "この2群の母分散は等しくないとは言えないという結論になります。")

else:
    print("F値は", f_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になるので、",
          "この2群の母分散は等しくないという結論になります。")

F値は 3.5878986691065444 なので、帰無仮説を採択し、対立仮説を棄却するという結果になるので、 この2群の母分散は等しくないとは言えないという結論になります。

参考

統計学の時間 | 統計WEB

Pythonを使った母分散の検定統計量の求め方(母平均未知)

検定には、母平均、母比率、母分散を用いた検定がそれぞれあります。このうち、母分散を用いた検定は、母平均が既知の場合は、標本平均の分布は、自由度nのカイ二乗分布に従い、母平均が未知の場合は、自由度n-1のカイ二乗分布に従います。この記事では、Pythonを使って、母平均未知の場合の母分散の統計検定量の求め方と検定の行い方について紹介しています。

母分散の検定

母分散の検定では、与えられたデータから、分散、サンプルサイズを求め、検定基準の標準偏差がある場合、統計量のカイ二乗は以下のようになります。


\chi^2 = \frac{ns^2}{\sigma^2}

例えば、ガラスの仕切りから10個のガラスの標本をとり、ガラスの屈折率を測って次のような値を得た場合で、屈折率の仕切りの標準偏差が0.008を超えなければ、仕切りは合格で、超えたら不合格となる時の、有意水準が0.01の合格、不合格の判定は以下のようになります。

1 2 3 4 5 6 7 8 9 10
ガラスの屈折率 1.77 1.79 1.78 1.79 1.79 1.76 1.80 1.76 1.79 1.80

\Sigma x_i = 1.77 + 1.79 + \cdots + 1.80 = 17.83

\Sigma x_i^2 = 1.77^2 + 1.79^2 + \cdots + 1.80^2 = 31.7929

s^2 = \frac{1}{n}\left\{\Sigma x_i^2 - \frac{(\Sigma x_i)^2}{n}\right\} = \frac{1}{10}\left\{31.7929 - \frac{17.83^2}{10}\right\} = 0.0002

\chi^2 = \frac{ns^2}{\sigma^2} =  \frac{10\times 0.0002}{0.008^2} = 31.25

\chi^2_{0.01}(9) = 21.67

これにより、求めた検定統計量は有意水準0.01の自由度9においてのカイ二乗分布よりも大きいことから帰無仮説を棄却するので仕切りは不合格となります。

Pythonを使った母分散の検定統計量の求め方(母平均未知)

pythonを使って母分散の統計検定量を求める場合は以下のようになります。与えられた設問より、10個のガラスの標本から分散とサンプル数を求め、検定基準の標準偏差の0.008、有意水準0.01をそれぞれ用意します。次に、母分散における統計検定量カイ二乗を求める式を使って検定量の値を求めます。次に、有意水準と自由度を使い、statsのchi2.ppfを使用して、カイ二乗値を求めて、if文で検定することができます。

from statistics import pvariance

sigma = 0.008
data = [1.77,1.79 ,1.78,1.79,1.79,1.76,1.80,1.76,1.79,1.80]
n = len(data)
v = round(pvariance(data),5)
print("ガラスの屈折率の分散 = ",v)

ガラスの屈折率の分散 = 0.0002

Chi_square = round(n*v/sigma**2,2)
print("カイ二乗(母分散)の統計検定量 = ",Chi_square)

カイ二乗(母分散)の統計検定量 = 31.25

from scipy import stats
alpha = 0.01 #有意水準
Degree_of_freedom = len(data) - 1 #自由度

Chi_square_value = stats.chi2.ppf(1-alpha, df=Degree_of_freedom)

if Chi_square < Chi_square_value:
    print("有意水準0.01の自由度9におけるカイ二乗値は", Chi_square_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、",
          "このガラス仕切りは有意水準0.01において屈折率の標準偏差が0.008よりも小さいので、ガラス仕切りは合格となります。")

else:
    print("有意水準0.01の自由度9におけるカイ二乗値は", Chi_square_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、",
          "このガラス仕切りは有意水準0.01において屈折率の標準偏差が0.008よりも大きいので、ガラス仕切りは不合格となります。")

有意水準0.01の自由度9におけるカイ二乗値は 21.665994333461924 なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、 このガラス仕切りは有意水準0.01において屈折率の標準偏差が0.008よりも大きいので、ガラス仕切りは不合格となります。

Pythonを使った母比率の差の検定統計量の求め方(大標本)

母比率の検定には2標本を使った検定があります。この2つの標本を使った母比率の差の検定は、2つの標本から得た標本比率を使って母比率が等しいかを検定する方法となります。この記事では、Pythonを使って、母比率の差の統計検定量の求め方と検定の行い方について紹介しています。

母比率の差の検定

母比率の差の検定では、サンプルサイズnが十分に大きく、1群目の標本比率、サンプルサイズ、2群目の標本比率、サンプルサイズがあり、2つの標本比率を1つにまとめた標本比率(プールした標本比率)を計算すると、次の式から得られる統計量zは標準正規分布に従います。


z=\frac{\hat{p_1}-\hat{p_2}}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1}+\frac{1}{n_2}\right)}}

プールした標本比率$は以下のようになります。


\hat{p}=\frac{n_1\hat{p_1}+n_2\hat{p_2}}{n_1+n_2}

例えば、あるテレビ番組の視聴率を調査したところ、関東地区では6000世帯中1500世帯、関西地区では3500世帯中720世帯が視聴していた場合、この2地区の視聴率に差があるかどうかは以下のようになります。有意水準は0.05とします。

関東地区 関西地区
調査世帯数 6000 3500
視聴世帯数 1500 720

\hat{p_1}=\frac{1500}{6000}=0.25\\
\hat{p_2}=\frac{720}{3500}=0.2057

\hat{p}=\frac{6000\times0.25+3500\times0.2057}{6000+3500}=\frac{1500+720}{9500}=0.23368

z=\frac{0.25-0.2057}{\sqrt{0.23368(1-0.23368)\left(\frac{1}{6000}+\frac{1}{3500}\right)}}\\
=\frac{0.0443}{\sqrt{0.17907\times\frac{7+12}{42000}}}=4.92

Z_{0.025}は1.96

よって、帰無仮説を棄却し、対立仮説を採択するという結果になるので、関東地区と関西地区とで視聴率に差があると結論づけられます。

Pythonを使った母比率の差の検定統計量の求め方(大標本)

pythonを使って母比率の差の統計検定量を求める場合は以下のようになります。与えられた設問より、関東地区、関西地区それぞれの調査世帯数、視聴世帯数、標本比率を用意します。また、2つの標本比率を1つにまとめたプールした標本比率を計算します。次に、母比率の差における統計検定量zを求める式を使って検定量zの値を求めます。次に、有意水準を使い、statsのnorm.ppfを使用して、z値を求めて、if文で検定することができます。

import math

n_east = 6000
x_east = 1500
n_west = 3500
x_west = 720
p_east = x_east/n_east
p_west = x_west/n_west
p_hat = (n_east*p_east + n_west*p_west)/(n_east + n_west) #プールした標本比率

z = (p_east - p_west)/math.sqrt(p_hat*(1 - p_hat)*(1/n_east + 1/n_west))
print("母比率の差の統計検定量 = ", z)

母比率の差の統計検定量 = 4.920315222429688

from scipy import stats
alpha = 0.05 #有意水準

z_value = stats.norm.ppf(1-alpha/2)

if -z_value < z < z_value:
    print("z値は", z_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になるので、",
          "関東地区と関西地区とで視聴率に差があるとは言えないと結論づけられます。")
    
else:
    print("z値は", z_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になるので、",
          "関東地区と関西地区とで視聴率に差があると結論づけられます。")

z値は 1.959963984540054 なので、帰無仮説を棄却し、対立仮説を採択するという結果になるので、 関東地区と関西地区とで視聴率に差があると結論づけられます。

参考

統計学の時間 | 統計WEB