読者です 読者をやめる 読者になる 読者になる

Python(とSciPy)で簡単な統計的仮説検定

Excelでもできる程度の簡単な統計的仮説検定ならSciPyの範囲内でできるもよう。以下の実行環境はMac OS X 10.11.6 El Capitan上でHomebrewのpyenvからインストールしたAnaconda 4.3.1(Python 3.6.0、NumPy 1.11.3、Scipy 0.18.1)です。

下記の例は、いずれも伝統的な(あるいは頻度論に基づく)統計的仮説検定をPythonでやる方法をざっくり書いたものですので、統計については別途教科書などを参照して下さい……。

あらかじめ以下のようにscipy.statsモジュールを読み込んでおきます。

>>> from scipy import stats

2項検定

コイン投げのように成功率1/2(=0.5)のもとで、20回中16回表を出すことに成功したとき。

>>> p = stats.binom_test(16, 20, 0.5)
>>> p
0.011817932128906248

有意水準α=.05としたとき、統計的有意となりました。(p値の基準は色々ありますのでそれぞれの分野で適切なαやβやNを用いて判断して下さい。)

対応なしのt検定

24人を12人ずつの2グループに分け、それぞれ試料(例えばケーキの味とかカレーの辛さとか)を5段階評価してもらったとします。その2群の平均値に統計的な有意差があるかを調べます。第1グループのk番目の人と第2グループのk番目の人とが違うので「対応なし」を使います。

>>> d1 = [2,3,1,5,3,4,3,5,4,3,2,3]
>>> d2 = [4,3,4,5,4,4,3,5,4,5,4,4]
>>> t, p = stats.ttest_ind(d1, d2)
>>> t
-2.3213496004719611
>>> p
0.029924340790917867

t値がマイナスの時はd1の平均値<d2の平均値です。効果量とか信頼区間とかも見ると良いと思います。

デフォルトでは分散が等質だとして分析しますが、F検定などで分散が等質でないと出た場合には以下のようにウェルチ検定を行うことができます。

>>> t, p = stats.ttest_ind(d1, d2, equal_var=False)
>>> t
-2.3213496004719611
>>> p
0.032728097618600939

対応ありのt検定

12人がそれぞれ2つの試料の両方を5段階評価してもらった場合には、第1グループのk番目の人と第2グループのk番目の人とが同じになるので「対応あり」を使います。ケーキの評価について考えると、そもそも甘いものが嫌いな人と好きな人などの個人差があります。そういった部分を考慮することができる方法です。

>>> d1 = [2,3,1,5,3,4,3,5,4,3,2,3]
>>> d2 = [4,3,4,5,4,4,3,5,4,5,4,4]
>>> t, p = stats.ttest_rel(d1, d2)
>>> t
-2.9303748521637205
>>> p
0.013681242257293657

1要因の分散分析

2群であればt検定を使いますが、3群以上ではまず分散分析をしてから下位検定をすることが多いようです。1要因の分散分析は以下のように行います。

>>> a = [34, 39, 50, 72, 54, 50, 58, 64, 55, 62]
>>> b = [63, 75, 50, 54, 66, 31, 39, 45, 48, 60]
>>> c = [49, 36, 46, 56, 52, 46, 52, 68, 49, 62]
>>> f, p = stats.f_oneway(a, b, c)
>>> f
0.098615166671485177
>>> p
0.9064161716556407

f比が小さい(p値が大きい)ので、3群の平均値に有意な差はなさそうです。

無相関検定

2変数のあいだの相関が有意であるかを見ます。

>>> d1 = [2,3,4,5,3,4,3,5,4,3,2,3]
>>> d2 = [4,3,4,5,4,4,3,5,6,5,4,4]
>>> r, p = stats.pearsonr(d1, d2)
>>> r
0.50052020128514063
>>> p
0.097450118105491076

rを見ると弱い〜中程度の相関がありそうに思えますが、p値がビミョーです。

その他

scipy.statsモジュールのマニュアルに一覧が載っています。カイ二乗検定、順位和検定、コルモゴロフ−スミルノフ検定、フリードマン検定、などなど盛りだくさん。分布関数や記述統計のプログラムもあるのでいろいろな場面で使えそう。ただ、2要因以上の分散分析が見当たらない。同ページの最後の文は

For many more stat related functions install the software R and the interface package rpy.

(これ以外の統計関係の関数についてはRをインストールしてrpyパッケージを使ってね)

とのことなので、外部プログラムと連携させる必要があるようです。もしRとつなげるのであれば、今はrpyやrpy2よりPypeRのほうが良いというはなしです。ここここに解説があります。

(2要因以上の分散分析はstatsmodelsにも入っているのだけど、まだ繰り返し要因などの実装がないので、現時点ではRを使うしかない感じ。scikit-learnも見てみたい。)