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

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

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