Location : Home > Languages > Perl > Package
Title : Statistics::ChiSquare
Toolbox Logo

名称

 Statistics::ChiSquare - χ2検定の計算


概要

use Statistics::Chisquare;

print chisquare(@array_of_numbers);

 Statistics::ChiSquare は CPAN サイトで入手可能である。


説明

 100回コインを投げて70回表が出た。このコインは公平だろうか?
 さいころを100回振って30回6が出た。このさいころには何か詰めてあるのだろうか?

 統計学では、ある数の列がどの程度ランダムであるかを確かめる方法としてχ2(chi-square)検定を行う。しかし結果が「イエス」または「ノー」で得られるわけではない。その代わりにあなたのデータが偶然その並びになる尤もらしさの上限と下限である信頼区間が得られる。以下に例を示す。

 もし遺伝学の基本を学んだのならおそらくゲオルグ・メンデル(Georg Mendel)の名前を耳にしたことがあるだろう。彼は風変わりなオーストリアの植物学者で、1865年に属性は予測可能な範囲で遺伝することを発見した。彼は多くのエンドウ豆(緑色の豆・黄色の豆・丸い豆・しわの入った豆)を交配した。マメ科の植物の新しい世界を切り開くためだった。
 しかしメンデルはデータを偽造した。統計学者 R. A. Fisher がχ2検定を用いてそれを証明したのだ。

 本モジュールには1つの関数 chisquare() しかない。信頼区間の上下限を配列で返すのではなくて、ある英語の文字列を返す。χ2検定の結果を誤って解釈する人が多いため、敢えてそうしている。表示される文字列は意味を明らかにするには役に立つであろう。

 chisquare() が返す文字列は以下のパターンになる。

"There's a >\d+% chance, and a <\d+% chance, that this data is random."

または

"There's a <\d+% chance that this data is random."

または

"I can't handle \d+ choices without a better table."

 最後の表示には説明が必要であろう。最近のχ2検定では、膨大な計算を省くためピアソン(Pearson)推定に基づく表を用いる。この表のおかげで chisquare() の計算はきわめて速くなっている。その代わり31種類以上のデータを集めても扱えない。つまり50面のさいころのランダムさの計算は計算できないことになる。
 自由度が異なれば対応する値も異なる。Jon Orwant の当初の版では 100%, 99%, 95%, 90%, 70%, 50%, 30%, 10%, 5%, 1% の尤度に関する値しかなかった。David Cantrell のよって後に 100%, 99%, 95%, 90%, 75%, 50%, 25%, 10%, 5%, 1% の尤度に関する値が追加された。


使用例

 1000回コインを投げたら、最も起こりやすいのは500回表がでて、500回裏が出ることであろう。

@coin = (500, 500);
print chisquare(@coin);

 この場合、"There's a >90% chance, and a <100% chance, that this data is random." という結果を出力する。
 60回さいころを振って、6が少し多く出た場合には

@die1  = (8, 7, 9, 8, 8, 20);
print chisquare(@die1);

  "There's a >1% chance, and a <5% chance, that this data is random." という結果を返す。
 600回さいころを振って、6が頻繁に出た場合には

@die2  = (80, 70, 90, 80, 80, 200);
print chisquare(@die2);

  "There's a <1% chance that this data is random." という結果を返す。

 rand() はどれくらいランダムなのだろう?

srand(time ^ $$);
@rands = ();
for ($i = 0; $i < 60000; $i++) {
   $slot = int(rand(6));
   $rands[$slot]++;
}
print "@rands\n";
print chisquare(@rands);

と私のマシンで動かすと

10156 10041 9991 9868 10034 9910
There's a >10% chance, and a <50% chance, that this data is random.

となる。擬似乱数生成ではせいぜいこの程度であろう。


著者

 Jon Orwant, Readable Publications, Inc; orwant@oreilly.com

 2003年10月以降は David Cantrell david@cantrell.org.uk のよりメンテナンス及びアップデートが行われている。

Toolbox Logo
Updated : 2006/10/13