見出し画像

【第20回】母平均の差の検定

高等学校における統計教育と情報教育を考える本シリーズも今回で20回目の投稿となりました。これまで多くのみなさまに読んでいただき、感謝申し上げます。これからもよろしくお願いいたします。

今回は教育効果や新薬の効果などを検証する方法を学んでいきたいと思います。

本論の前に

さて突然ですが、みなさまはタイピングはお得意でしょうか。私は、パソコンを使い始めたときの変な癖がなかなか抜けず、タッチタイピングを習得するのに苦労をしました。社会人になってから少しずつ練習を重ね、今では一応は仕事をする上で困らないくらいにはなりました。

図1: e-typingのスコア

上記は「e-typing」というタイピング練習サイトでの最近の結果です。このスコアの位置づけは下記サイトをご参照ください。

情報Iの授業でプログラミングやデータ活用を学ぶ上で、タイピング能力は実はかなり大事な基盤であるように思うようになりました。授業の中でコードを打ちながら学んでいく際に、タイピングで苦労をしていると、本来学ぶべき内容の理解が追い付かなくなり、結果、ますますコンピュータに対して苦手意識を持つ悪循環を生んでしまうように感じたからです。次年度は年度初めより具体的な目標設定を各自で行いながら、継続的に練習をしていくような取り組みもしていきたいと考えています。

対応のある2標本t検定

前置きが長くなりましたが、ここからが本題です。今回は次のような問題を考えてみたいと思います。

例題1-生徒の成長

例題1
K先生は授業で担当をしている生徒に1年間、タイピング練習を行うような指導を行っている。K先生の授業を受けている10名の生徒を無作為に抽出し、1学期初めと3学期末のe-typingのスコアを比較したところ下の表のようになった。この結果から、タイピング練習の指導には効果があったと判断して良いだろうか。スコアの分布は正規分布に従うものとして、有意水準5%で検定をしなさい。

この問題は10名の生徒について、1学期初めと3学期末のスコアはすべて組になっており、これらは対応のある2標本において母平均に有意差があるかどうかを検定する問題になります。このような場合もt分布を使った検定を行います。

解答1

それでは、帰無仮説と対立仮説を確認してみましょう。K先生が担当している生徒全員について、3学期末のスコアから1学期初めのスコアを引いた差の平均を$${ m }$$とします。今回は「効果があったかどうか」を判断したいので、片側検定になります。

[帰無仮説] $${ m = 0 }$$  [対立仮説] $${ m > 0 }$$

それぞれの生徒に対して、3学期末のスコアから1学期初めのスコアを引いた差を$${ X }$$とおいたとき、問題文の仮定から$${ X }$$は正規分布に従います。正規分布に従う母集団から無作為に抽出した大きさ10の標本の標本平均を使って母平均に関して検定を行うわけですので、前回の1標本のt検定に帰着されます
これ以上は、確率変数を使った数学的な議論は行わず、コンピュータを活用してどのように分析するかという分析手法に焦点をあてます。

まず、1学期初めのスコアと3学期末のスコアの配列を定義し、同じインデックスの要素の差をとった配列diffを定めます。

import numpy as np
from scipy import stats
type1 = np.array([123,155,177,189,195,202,209,224,254,332])
type3 = np.array([151,158,199,197,190,235,288,211,300,331])
diff = type3 - type1
diff

これを実行しますと、array([ 28, 3, 22, 8, -5, 33, 79, -13, 46, -1])が出力されます。この配列が標本のデータであり、標本平均を次のコードで調べます。

np.mean(diff)

これを実行すると20.0が出力されます。この10名は平均すると20点スコアを上げたということです。
それでは、scipy.statsモジュールのttest_1sampメソッドでt値とp値を求めてみましょう。

stats.ttest_1samp(diff, popmean=0)

これを実行すると、次が出力されます。

Ttest_1sampResult(statistic=2.2707081992525953, pvalue=0.04930594736299829)

ここで求めているp値は両側検定のときの値です。すなわち、 t 値はおよそ2.27ですので、$${ t < -2.27 または t > 2.27}$$であるような確率がここで求めたp値になります。ゆえに、片側検定の場合はその半分の値が求めるp値になりますので、下のコードを実行します。

stats.ttest_1samp(diff, popmean=0).pvalues / 2

これを実行すると、0.024652973681499143となり、これは有意水準0.05を下回っていますので、帰無仮説は棄却されます。

なお、このような対になっている2標本の母平均の差の検定を行う場合は、scipy.statsのttest_relメソッドを使えば、一発でp値を求めることができます。下のように、ttest_rel(配列1, 配列2)の形で用います。

import numpy as np
from scipy import stats
type1 = np.array([123,155,177,189,195,202,209,224,254,332])
type3 = np.array([151,158,199,197,190,235,288,211,300,331])
stats.ttest_rel(type3, type1).pvalues / 2

こちらを実行しても、0.024652973681499143が出力されます。

さらに、scipyのバージョンが1.60以降であれば、alternative = "greater"のオプションにより上側確率を求めることもできます。

対応のない2標本t検定

次に、母平均を比較する2つの母集団からそれぞれ抽出した標本が組になっていない場合について考えます。
これはさらに、2つの母集団の母分散が等しいと「仮定できるとき」と「仮定できないとき」に分けて議論されるのですが、ここでは後者のみを扱うことにします。
この、母分散が等しいと仮定できない2つの母集団の母平均の差の検定ウェルチのt検定と言い、数学的な議論は非常に難しいです。ただ、Pythonを使って結論を出すだけならば、非常に簡単にできます。
次の例題を使って考えてみましょう。

例題2-別年度の入学生

例題2
K先生は2020年度入学生と2021年度の入学生全員に対して、入学時のタイピング能力を図るため、e-typingのスコアを測定している。それぞれの年度の入学生10名を無作為に抽出し、そのスコアを調べたところ、次のような結果になった。
2020年度:123, 155, 177, 189, 195, 202, 209, 224, 254, 332
2021年度:151, 158, 190, 197, 199, 211, 235, 288, 300, 331
この結果から、2021年度入学生は2020年度入学生よりも入学時のe-typingのスコアの平均が高いと判断して良いだろうか。スコアの分布は正規分布に従うものとして、有意水準5%で検定をしなさい。

解答2

解答の前に、こちらは先ほどの問題1と数値自体は同じです。
2020年度、2021年度のデータは問題1の「1学期初め」、「3学期末」のデータをそれぞれ昇順に並べたものです。
それを踏まえて、結果を見ていきたいと思います。
まずは、2020年度と2021年度の入学生全体の平均をそれぞれ$${ m_X, m_Y }$$とします。このとき、帰無仮説と対立仮説は次のようになります。

[帰無仮説] $${ m_X = m_Y }$$  [対立仮説] $${ m_X < m_Y }$$

まず、 2020年度と2021年度の入学生からそれぞれ抽出された10名の平均である標本平均を求めてみましょう。

import numpy as np
from scipy import stats
type2020 = np.array([123, 155, 177, 189, 195, 202, 209, 224, 254, 332])
type2021 = np.array([151, 158, 190, 197, 199, 211, 235, 288, 300, 331])
print(np.mean(type2020))
print(np.mean(type2021))

これを実行することにより、2020年度は206.0、2021年度は226.0であることが分かります。それでは、母平均の差の検定を行います。
ウェルチの検定を行う場合は、scipy.statsのttest_indメソッドで、オプションにequal_var=Falseを指定して、p値を求めることができます。
下のように、ttest_ind(配列1, 配列2, equal_var=False)の形で用います。

stats.ttest_ind(type2021, type2020, equal_var=False).pvalue / 2

実行しますと、0.229823205995494が出力されます。これは有意水準の0.05よりは大きく、帰無仮説は棄却されないことが分かります。つまり、2021年度入学生のほうが入学時のe-typingのスコアの平均が高いとは判断できないということです。

まとめ

今回は、2標本t検定という母平均の差の検定を見てみました。
この検定は、新しく開発した薬を無作為に抽出した何名かに実際に服用していただき、特定の検査値を見て、服用前と後で効果があったのかどうかなどを見る際に使われる手法です。
確率変数を使ってきちんと議論しようと思うとなかなか難しいのですが、まずはPythonを使ってイメージをつかめると良いと思いました。

  • 組になっている2標本 stats.ttest_rel(配列1, 配列2)

  • 対応のない2標本 stats.ttest_ind(配列1, 配列2, equal_var=False) 

最後までお読みいただき、ありがとうございました。