亀の歩み

備忘録として

分散分析と多重比較法(Tukey-Kramer・Bonferroni)前編

年が明けましたが、年末年始は統計学の勉強をざっとしていました。
使った本はこれ。

入門 統計学 −検定から多変量解析・実験計画法まで−

入門 統計学 −検定から多変量解析・実験計画法まで−

その中で、すぐ使いそうな分散分析(ANOVA)と多重比較法をまとめておくことにしました。

分散分析

3つ以上の群の平均がすべて同じかどうか調べます。
検定には、F検定が使われます。

適当にデータをでっちあげて、とりあえずやってみることにします。

群1 群2 群3 群4
標本1 10 15 24 28
標本2 11 12 26 30
標本3 8 13 23 31


群ごとに何か1つの要因が、強さを変えてはたらいている場合を考えます。
その要因が効果を影響を及ぼしているか、調べようと思います。

このとき、
帰無仮説:要因による影響はない。
となります。

群間変動(要因による)と群内変動(誤差による)の分散の比を算出し、F境界値よりもその値が大きければ帰無仮説は棄却されます。
つまり、要因に効果があると言うことができます。

今回は、エクセルの関数を使って(分析ツールを使わないで)計算していきます。

群間変動

  1. 群ごとの平均と総平均を算出します。

    群1 群2 群3 群4
    群平均 9.67 13.3 24.3 29.7 総平均 18.4

  2. 群平均から総平均を引きます。

    群1 群2 群3 群4
    群平均-総平均 -9.58 -5.91 5.08 10.4

  3. 偏差平方和を求めます。
    群平均-総平均を群ごとに二乗した後、それぞれ足し合わせ、標本サイズ(今回は3)をかけます。

    偏差平方和 784

  4. 偏差平方和を自由度で割って、分散を求めます。
    自由度=群数-1
    今回は3です。

    分散 261


群内変動

  1. 群ごとの偏差平方和をDEVSQ関数で算出し、合計します。

    群1 群2 群3 群4
    偏差平方和 4.67 4.67 4.67 4.67 合計 18.7

  2. 偏差平方和を自由度で割って、分散を求めます。
    群間変動のときの自由度とは、異なります。
    自由度=(標本サイズ-1) × 群数
    今回は8です。

    分散 2.33


F値とp値

群間・郡内変動の分散が分かったので、検定に入っていきます。
 \displaystyle \mathrm{F}値=\frac{群間変動の分散}{群内変動の分散}
p値とF境界値は、エクセルの関数で求められます。
p値=FDIST(F値,群間変動の自由度,群内変動の自由度)
F境界値=FINV(有意水準,群間変動の自由度,群内変動の自由度)

有意水準を0.05とすると

F値 112
F境界値 4.07
p値 <0.001

となり帰無仮説が棄却され、いずれかの群間で要因による影響はあると言えます。

しかし、どの群間で要因による影響があるのかは分からないので、それを知りたい場合は多重比較が必要になります。
多重比較については、明日書く予定です。


追記:後編も書きました。合わせて、標本の数値を一部変更しました。
   標本数→標本サイズに修正。


分析ツールを使う場合は、
http://www.aoni.waseda.jp/abek/document/anova.html
が参考になります。

Python用にサクラエディタをインストールしてみた

家では対話型シェルでポチポチしていたが、そろそろ何かのエディタを入れてみようかと思いました。
そこで、評判のいいサクラエディタを入れてみることにしました。


サクラエディタ初心者なら必ず入れたい便利機能3選 | Code部
取りあえず、リンク先の「インストールして真っ先にやっておきたい設定」をしました。
1.設定→共通設定→タブバー
2.「タブバーを表示」にチェック。
3.設定→共通設定→ファイル
4.「自動的に保存する」にチェック。


次に、Python用にタイプ別設定をしました。
これによって、キーワードが強調表示されます。
chonan blog: サクラエディタでPython mode

1.メニューバーの"設定">"共通設定"と選び、"強調キーワード"タブをクリックする。
2."セット追加ボタン"をクリックし、セット名をPythonとする。
3."インポート"から、python_2.5_kwdを選んで、OKを押す。
4.メニューバーの"設定">"タイプ別設定一覧"を選択し、設定されていない設定(設定17等)を選択して"設定変更"をクリックする。
5.設定の名前をPythonとし、ファイル拡張子にpyと入れる。
6."カラー"タブをクリックし、強調キーワード1にPythonのセットを選択する。
7.コメントスタイルはブロック型(F)"""~(T)"""、ブロック型(A)#~(Z)として、OKを押す。

設定されていない設定は、「追加」ボタンで追加できます。
また、コメントスタイルには、ブロック型'''~'''を追加しました。


加えて、インデントと文字コードも変えておきます。
1.設定→タイプ別設定→スクリーン
2.タブ幅を4に、「SPACEの挿入」にチェック。
3.設定→タイプ別設定→ウィンドウ
4.文字コードUTF-8に。


ボタンを押すだけで実行できると便利だと思ったので、そのためのマクロを登録することにしました。
Python §48 : 開発環境をエディターで行う(サクラエディターのマクロを使って実行)|hitochan007のブログ(Pythonの勉強ブログ)

Editor.FileSave();
Editor.ExecCommand("python " + '"' + Editor.GetFilename() + '"', 1)
// '"' はパスに空白が含まれている場合に有効

をpythondebug.jsという名前で保存。

1.設定→共通設定→マクロ
2.pythondebug.jsのあるディレクトリを参照します。
3.マクロ名を入力、ファイルはpythondebug.jsを選び、「設定」ボタンをクリック。 
4.設定→共通設定→キー割り当て
5.種別を外部マクロにし、マクロ名とキーの組み合わせを選び、「割付」ボタンを押します。
これで割り当てられたボタンを押すと、【アウトプット】というタブが出現し、結果が出力されるようになりました。

numpy arrayの保存

numpy配列をそのままファイルに保存できることに気付きました。
リストと同じようにcsvモジュールで保存していたのは何だったのでしょうか……


Numpy.savetxtでcsv出力をする方法 | memotoxin
という訳で、上のページに書いているのを参考にしてnp.savetxtで配列を保存してみます。

import numpy as np

x = np.ones((2, 3, 4))
np.savetxt("save.txt", x, fmt="%.0f", delimiter=",")

実行すると、float argument required, not numpy.ndarrayとエラーが出ました。

python - How to write a multidimensional array to a text file? - Stack Overflow
どうやら3次元以上の配列だと、2次元配列に変換しないとnp.savetxtで保存できないらしい。
そこで、もう1つの保存する関数であるnp.saveを使うことにしました。

np.save("save.npy", x)

今度は正常にファイルが保存できました。
.npy以外の拡張子を付けると、自動で.npyがファイル名の最後に付くようです。


保存したデータを読み込みたいときは、

y = np.load("save.npy")

で読み込むことができます。

ちなみにnp.savetxtで保存した配列は、np.loadtxtで読み込むことができるが、delimiterを正しく設定する必要があります。