Jan 24, 2009

統計学復習メモ7: t検定で独立性の検定

前のエントリーではカイ2乗検定を用いてノンパラメトリック(定性的)な独立性の検定を試したが、次はパラメトリック(定量的)な場合をやってみる。独立かどうかを確かめたい2つの属性が定量的な値を持つパラメーター、C言語で言うとenum型やchar型でなくint型やfloat型の変数である場合に、その2変数間に相関があるかどうかを検定するものである。

なお、統計学では独立、相関という言葉はノンパラメトリックかパラメトリックかで使い分けるのが通常なのかも知れないが、ここでは区別せず、独立である/ないと相関がない/あるは同じ意味で使う。

まず、実際に例題でやってみる。

ある事業分野において、過去に優秀なプログラマーが書いた、読んで理解し易いしその後の仕様変更にも強いと評判の良い、模範的なC言語のソースコード一式があったとする。ソースファイル中のコード量(文の数や式の数、a=0;やb=foo(a);は1つ、while(式)はwhileと式とで2つ、for(式1;式2;式3)は4つ等)とコメントの量(/*~*/内の文字数)の関係が以下であった時、コード量とコメント量との間に相関がある無いかを検定したいとする。













ファイル名コード量コメント量
gentoo.h88234
emperor.h98413
macaroni.h485687
rockhopper.h285438
fairy.h184194
magellan.h487174
humboldt.h818344
king.h69139
adelie.h306244
cape.h219222












ファイル名コード量コメント量
gentoo.c5191876
emperor.c5152995
macaroni.c78517
rockhopper.c3131839
fairy.c3922142
magellan.c3691783
humboldt.c3452762
king.c73489
adelie.c7292202
cape.c4452309

統計学で相関と言えば、まず思い付くのは相関係数である。とりあえず、ヘッダファイルとソースファイルに分けて、コード量とコメント量の相関係数を求めてみる。
よく使われる相関係数は、共分散÷それぞれの分散の幾何平均、というもので、式で書くと、2つのパラメーターを持つ標本が(x1,y1)~(xn,yn)の時、
r_{xy}=¥frac {¥sum_{i=1}^{n}(x_i-¥bar{x})(y_i-¥bar{y})} { ¥sqrt{ ¥sum_{i=1}^{n}(x_i-¥bar{x})^2 ¥sum_{i=1}^{n}(y_i-¥bar{y})^2 }}
と表されるものである。(ピアソンの積率相関係数という名前が付いているらしい。)
例によってMaximaに計算させると、ヘッダファイルについてはr≒0.327、ソースファイルについてはr≒0.746であった。

さて、この値をどう考えれば良いのだろう。2つのパラメーターに十分に直線関係があるかどうかの基準として使われるものの1つに、相関係数が0.99以上(強い正の相関)または-0.99以下(強い負の相関)か、というのがある。検量線などの回帰直線の適切さの基準として使われることがあるようだが、そのように基準を決める自由がある場合ならそれでいいだろうが、一般的には(一般論としては)0.99という数字に根拠が無い。では相関係数がどういう値なら何なのだろうか。

そこで、検定統計量
T=¥frac{r_{xy}¥sqrt{n-2}}{¥sqrt{1-r_{xy}^2}}
が自由度n-2のt分布に従うという定理を使うのが、統計学の尊い教えである。

仮説を「相関がない」とし、有意水準を0.05(信頼度を95%)とすると、自由度n-2のt分布で右側(tが大きい方)の棄却域はt≧2.3くらいである。それに対し、ヘッダファイルについてはT≒0.978、ソースファイルについてはT≒3.17なので、ヘッダファイルについては仮説が棄却されず、コード量とコメント量の間に相関があるとは言えない、ソースファイルについては仮説が棄却され、コード量とコメント量の間に(正の)相関がある、ということになる。

結局、この方法では、相関係数はいくらぐらいだと相関があると言えるのだろうか。
まず、相関係数rと検定統計量Tの関係を見ておく。n=5,10,15,20の時のTのグラフは、次のようになる。
r-T
単調増加、点対称である。
Tがt分布に従うと、rの分布は次のグラフのようになる。
P(r)
当たり前だが、rが-1(負の相関)や+1(正の相関)に近いのは稀だということになっていることがわかる。
Tがt分布の両側5%の境目になるrの絶対値は、以下の値である。

nr
50.878
100.632
150.514
200.444

相関係数の絶対値がこれらより大きければ、相関があるということになる。
思ったより緩い基準である。

See more ...

Posted at 19:30 in 数学 | WriteBacks (1)
WriteBacks

I think you've just cpatuerd the answer perfectly[link]

Posted by Cah at 04/08/2012 03:35:04 AM

Jan 18, 2009

FMS(JAVA PRESS Vol.11より)

JAVA Press VOL.11のp.92から始まる「Java2で作るネットワークプログラム」という記事のコピーが手元にあった。いつかJavaの勉強のために読もうと思っていた、約9年前に発行された雑誌のコピーである。UDPを使って相手を探し、TCPを使ってメッセージやファイルをやり取りする、簡単なチャットアプリのTCP/UDP通信の部分のソースコードが掲載され、解説されている。画面イメージも載っている。"File&Message Send"の頭文字を取って"FMS"という名前のアプリだそうだ。当時はGUIの部分と合わせてフルセットコードがJAVA PRESSのWebサイトにあったらしいが、今は入手できないと思う。

掲載されているのは8つのクラスの内5つのクラスのソースコードで、合わせて300行程度である。画面イメージから読み取れるGUIはシンプルなものである。似たようなGUIさえ作れば動くんだろう、と思って作ってみたら、4倍近いコードに膨れ上がってしまった。記事に載っていたコードも、1台のマシンでもテストできるよう、動的にポートを切り替えるように改造したりしたので、結局大半のコードに手が入ってしまった。
折角なので、ここで公開することにする。

FMSアプリ(改)のソースコードとクラスファイル一式(JARファイル)

・画面イメージ

●起動方法
まず、FMSアプリを動かすそれぞれのマシンにfms.jarをダウンロードして、以下のコマンドで展開してください。(JREはそれぞれのマシンにインストール済だとします。)

jar xvf fms.jar

次に、接続先として検索するIPアドレスのリスト(seekips.txt)とユーザ名のリスト(uesrs.txt)を編集してください。ブロードキャストアドレスも指定可能です。ユーザ名は、名前とキーワード(2つ合わせて1つのユーザ名となる)をコロンで区切ってください。
・seekips.txtの例
192.168.0.255
172.1.1.1

・users.txtの例
John:America
Yamada:Hanako
Penguin:Antarctica
Whitebear:Arctica

次に、コマンドラインから下記のjavaコマンドで起動してください。
java fms.Run (自分の名前) (自分のキーワード)

1つのマシンで複数起動してもOKです。

●使用方法
アプリを起動すると、seekips.txtに書かれたIPアドレスとローカルマシンの別ポートに対してUDPのパケットが送信され、相手から返信があると、ウィンドウの左上の領域に相手が表示されます。但し、相手の名前が自分のusers.txtに無い場合は、表示されません(自分の名前が相手のusers.txtにある場合は、相手のウィンドウには自分の名前が表示されます)。
相手から検索があるとユーザ名の後ろが[COMING]となり、相手から検索の応答があると[ONLINE]となります。

[COMING]または[ONLINE]の相手が見つかったら、リスト上の接続相手を選択して、メニューバーの"Users"→"Connect"で接続します。接続に成功すると、相手の名前の後ろが[CONNECTED]になります。

接続に成功したら、メッセージまたはファイルを送る相手を選択し、ウィンドウ下段の入力フォームにメッセージまたはローカルマシン上のファイル名を入力して、"Msg Send"ボタンまたは"File Send"ボタンを押してください。送信に成功すると、相手側のウィンドウにメッセージが表示され、ファイルの場合は相手側のローカルマシンに同じファイル名で保存されます。

●ソースコードの説明
Seeker.java
相手を探したり自分の状態を伝えたりするためのUDPパケットを発信するクラス。
オリジナルのコードに動的ポート対応を加えている。
Watcher.java
UDPパケットを受信するクラス。
オリジナルのコードではユーザ情報の管理を別クラス(Users)にしていたらしいが、想像がつかなかったので、ここで管理するようにした。
SendPack.java
TCPで送信する1回分の情報を持つクラス。
オリジナルのコードから変更無し。
Connector.java
1つのTCP接続のソケットと入出力ストリームを保持するクラス。
オリジナルのコードに動的ポート対応を加えた。
Accepter.java
サーバーとしてTCPの接続要求を待つ(acceptする)クラス。接続要求が来る度にConnectorのインスタンスを作成する。
オリジナルのコードから変更無し。
Run.java
FMSアプリを起動するクラス。Seeker, Watcher, Accepter,MainPanelのインスタンスを作る。
GUIとしては、SwingのJFrameのインスタンスを用意して、メニューバー付きのウィンドウを作る。
全て自作。
MainPanel.java
ウィンドウ内の各部品を作り、それぞれに対する操作や要求を処理するクラス。実質のメイン処理。
全て自作。

より詳しく書くとJAVA PRESSの記事と被るので、説明はここまでとする。
なお、Run.JavaとMainPanel.JavaはEclipse+VisualEditor(GUIエディタ)で作ったので、他の環境のEclipse+VEでもGUIが読み込めるはず。

See more ...

Posted at 11:53 in Java | WriteBacks (0)
WriteBacks

Jan 04, 2009

数独解きアプレット

一時期、数独にはまったことがあり、腕には覚えがある身であり、一般紙に載る程度の問題は朝飯前であるはずだったのだが、年末年始に帰省して暇を持て余して、ある新聞の正月版に載っていた、懸賞問題の数独を暇潰しに解こうとしたら、解けなかった。
数字を埋め始めた直後から決して順調では無かったのだが、5分くらいかかって1/3程度埋めた後、10分以上1つも埋められなかった。問題が難しいというよりは、解無しな感触だった。まさかそれなりに発行部数が多い新聞で不完全な問題は出るまい、と思って粘っていたのだが、諦めた。

しかし、その問題のことが気になって気になって仕方が無かった。
数独ソルバーアプレットのページへのリンク
ソースコード

See more ...

Posted at 18:13 in Java | WriteBacks (0)
WriteBacks