多群間の等分散性の検定を行う(バートレット検定・ルビーン検定)【Python】

2つのグループの分散が等しいかどうかを調べるにはどうしたらよいでしょうか?限られた標本数のサンプルをとって、その2つの分散がほぼ同じであれば母分散も等しいと言えるのでしょうか?だとすると、どのくらい分散が一致していたら母分散も同じといえるのでしょうか。

このようなことを確かめる方法には2群間の母分散の比を用いたF検定や、多群間で適応可能なバートレット検定・ルビーン検定などがあります。ここではPythonを用いてバートレット検定・ルビーン検定を用いて等分散性の検定を行う方法を説明します。

なお、今回用いるPythonのscipy.statsモジュールではF検定は実装されていませんが、2群間においてもバートレット検定・ルビーン検定で代用可能です。

開発環境

  • Python 3.7.9
  • scipy 1.6.0

なぜ母分散が等しいか検定する必要があるのか?

そもそも2群の分散が等しいかどうかが分かって何かいいことがあるのでしょうか?

もちろん、2群の等分散性そのものを知りたいということもあるかもしれませんが、t検定や分散分析のように等分散性を仮定した統計手法を使うための前段階として用いられることが多くあります。

例えば2群の母平均の差の検定において、その分散が等しいことが仮定できるかどうかによって使う検定が異なってきます。具体的には、等分散性が仮定できればスチューデントのt検定を、等分散性を仮定できなければウェルチのt検定を用いる必要があるので、そのためにはまず等分散性が仮定できるかどうかの検定を行う必要があるのです。

ただし、これは教科書的にも書かれていてよく知られていることですが、しかし、「等分散検定 → t検定」のように2段階に検定を行うことは検定の多重性の問題もはらんでいます。このため、最近は最初から等分散性の仮定を必要としない検定を用いる場合なども多いようです。詳しくは以下のリンクをご覧ください。

具体的な例

まずは具体的な例をもとに実際の等分散検定を行ってみましょう。

ある企業の健診において血圧(収縮期血圧)を計測しました。この時、グループAとグループBからそれぞれランダムに15人抽出した血圧のデータが以下の通りだとします。この時、グループAとグループBの血圧の分散に差があるといえるでしょうか?

なお、これは以下の「対応のない2群の母平均の差の検定」における例と同じものになります。

ここでこの2群の母分散が同じかどうかを検定して、その結果次第で母平均の差の検定に用いる検定方法を決めるという流れになります。

2群の母分散が等しいかどうかを検定する

それではグループAとグループBの母分散が等しいといえるかどうかの検定を有意水準を5%で行ってみましょう。帰無仮説と対立仮説とは次のようになります。

  • 帰無仮説:グループAの母分散(\(\sigma_A^2\))とグループBの母分散(\(\sigma_B^2\))とは同じである (\(\sigma_A^2 = \sigma_B^2\))
  • 対立仮説:グループAの母分散(\(\sigma_A^2\))とグループBの母分散(\(\sigma_B^2\))とは異なる (\(\sigma_A^2 \neq \sigma_B^2\))

Pythonを用いて仮説検定を行う場合はscipy.statsモジュールを用います。ここでは母集団の正規性を仮定できる場合のバートレット検定と、正規分布以外にも適応可能なルビーン検定について説明します。

(scipy.statsモジュールではF検定は実装されていないので、ここでは省略しました)

バートレット検定

正規分布に従う母集団の等分散性の検定はバートレット検定を行います。Pythonのscipy.statsモジュールではbartlett関数で実装されているので、これを用いて先ほどのサンプルについてバートレット検定を行ってみましょう。

from scipy import stats

group_A = [107,117,131,121,130,116,109,131,118,107,108,131,105,110,108]
group_B = [118,116,127,140,115,137,116,140,121,139,128,127,121,131,123]

result = stats.bartlett(group_A, group_B)
print(result)
BartlettResult(statistic=0.12091788877706942, pvalue=0.7280410896047669)

これよりp値が0.72804… ということが分かります。これは、仮に帰無仮説が真であるとすると今回の標本分布と同じかより極端な標本分布が偶然得られる確率は0.72804…であるという意味になります。ここでは最初に有意水準を5%としているので、「その確率が5%以下であるならば、それは偶然ではない(=有意である)」とあらかじめ設定しています。帰無仮説が真であるときに今回の標本分布が偶然得られる確率は0.72804…であり0.05(5%)よりも大きいことから、これは偶然ではない(=有意である)とは言えず、帰無仮説は棄却できません。つまり、グループAとグループBの母分散は同じである(少なくとも母分散が違うとは言えない)といえます。

バートレット検定は感度の良い検定手法ですが、正規分布に従わない標本では分散の均一性よりもその非正規性を検出してしまう傾向があると言われています。このため、正規分布に従わないと想定される母集団に対しては次のルビーン検定の方が好ましいと言えます。

ルビーン検定

母集団の正規性が仮定できない場合は正規母集団以外にも適応可能なルビーン検定で等分散性の検定を行います。Pythonのscipy.statsモジュールではlevene関数で実装されているので、これを用いて先ほどのサンプルについてルビーン検定を行ってみましょう。

from scipy import stats

group_A = [107,117,131,121,130,116,109,131,118,107,108,131,105,110,108]
group_B = [118,116,127,140,115,137,116,140,121,139,128,127,121,131,123]

result = stats.levene(group_A, group_B)
print(result)
LeveneResult(statistic=0.2343502377179084, pvalue=0.6320817628460745)

これよりp値が0.63208… ということが分かります。有意水準5%で帰無仮説を棄却することはできずに、グループAとグループBの母分散は同じである(少なくとも母分散が違うとは言えない)といえます。

多群間における等分散性の検定

先ほどは2群間の等分散性の検定を題材に説明しましたが、今回用いたバートレット検定はルビーン検定は3群以上にも拡張された検定方法です。多群間での等分散性の検定を行う場合は、以下のように引数にそのまますべての群を指定しましょう。

# 多群間のバートレット検定
result = stats.bartlett(group_A, group_B, group_C)
print(result)

# 多群間のルビーン検定
result = stats.levene(group_A, group_B, group_C)
print(result)

関連記事・スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)