ソフトウエア・メトリクスの分野(特にエンピリカル・ソフトウエア工学)の分野では、
障害の原因となる要因を、過去のプロジェクトから探し出し、それを元に、新規プロジェクト
に適用して、障害予測や各種見積もり予測に役立てようとしている。
そのために、
PROMISE Software Engineering Repository
http://promise.site.uottawa.ca/SERepository/datasets-page.html
なんかで、プロジェクトデータが公開されているということは、前に書いた。
今日は、そこで興味深いことを見つけたので、書いてみる。
そこにある2つの(はじめにある、NASAのプロジェクト)CM1とJM1について
普通だと、障害原因を探るのに、ステップワイズ法(変数増減法)を使うと思うけど、
ここでは、決定木を使って、確かめられないか、考えてみよう。
CM1をWekaの決定木J48(C4.5と同じようなもの)で分析すると

となる。つまり、障害は、lOComment(Halstead's count of lines of comments)と
ev(g)(McCabe "essential complexity")で説明付いてしまう。
ほ~、正答率88%だそうな。。。
とおもって、じゃあ、JM1でやると・・・

なんじゃこりゃ(-_-;)ちなみに正答率79.5%
なので、主要3要因、Loc、IOBlank、Total_Opでやると、こうなる

loc(McCabe's line count of code)、total_Op(total operators)
で説明付くらしい・・・
正答率81.1%なので、ぐちゃぐちゃなのより、よくなった。
あれ・・・指標、変わってない?
じゃあ、CM1のデータを、JM1の指標Loc,IOBlank,Total_Opとdefeateの値
だけを残して、決定木で分析したら?

なにもでてこないし、
逆にJM1のデータを、CM1の指標IOComment,ev(g)とdefeateだけを使って
決定木を分析すると、

出てくるけど、正答率は下がる。
つまり、決定木を使うと、
CM1の指標は、lOComment、ev(g)
JM1の指標は、Loc,Total_Op
が向いていて、他の変数ではあまりせつめいできなさそう。
・・・ということは、プロジェクトによって、障害が起こる要因はちがうってこと・・
障害の原因となる銀の弾丸はないってこと?
だとしたら、ステップワイズ法で変数を決定し、それを「ほかの」プロジェクトに適用することは無理ということになり、もしそのようなことがやりたいのなら、
(1)先に、いろいろなプロジェクトにおいて、
何が障害を予見する要因かを探し出し、
→J48でもいいけど、他にもっと適切な方法があると思う
(2)適用しようとするプロジェクトが(1)のどのプロジェクトと
類似しているかを、K-NN法などで確認し、
(3)その似ているプロジェクトの障害説明要因を使って、
適用したいプロジェクトの予測を行う
っていうように、やり方をがらりと変えないといけなくなると思うんですけど・・・
・・・データマイニングとか、この分野は専門外だから、よくわかんないんですけど、
どう思います?
P.S 実はこれ、大学院のレポート&発表で出したもの。
そのときのコメントが、「でも、この要因でも、説明しているとはいえないよね。当てはまりはよくない。意外と、プログラマの技術力とかが測れたとして、その指標を入れたら、ガラリと変わるといったようなこともありえるかもね?」という意見がありました。
障害の原因となる要因を、過去のプロジェクトから探し出し、それを元に、新規プロジェクト
に適用して、障害予測や各種見積もり予測に役立てようとしている。
そのために、
PROMISE Software Engineering Repository
http://promise.site.uottawa.ca/SERepository/datasets-page.html
なんかで、プロジェクトデータが公開されているということは、前に書いた。
今日は、そこで興味深いことを見つけたので、書いてみる。
そこにある2つの(はじめにある、NASAのプロジェクト)CM1とJM1について
普通だと、障害原因を探るのに、ステップワイズ法(変数増減法)を使うと思うけど、
ここでは、決定木を使って、確かめられないか、考えてみよう。
CM1をWekaの決定木J48(C4.5と同じようなもの)で分析すると

となる。つまり、障害は、lOComment(Halstead's count of lines of comments)と
ev(g)(McCabe "essential complexity")で説明付いてしまう。
ほ~、正答率88%だそうな。。。
とおもって、じゃあ、JM1でやると・・・

なんじゃこりゃ(-_-;)ちなみに正答率79.5%
なので、主要3要因、Loc、IOBlank、Total_Opでやると、こうなる

loc(McCabe's line count of code)、total_Op(total operators)
で説明付くらしい・・・
正答率81.1%なので、ぐちゃぐちゃなのより、よくなった。
あれ・・・指標、変わってない?
じゃあ、CM1のデータを、JM1の指標Loc,IOBlank,Total_Opとdefeateの値
だけを残して、決定木で分析したら?

なにもでてこないし、
逆にJM1のデータを、CM1の指標IOComment,ev(g)とdefeateだけを使って
決定木を分析すると、

出てくるけど、正答率は下がる。
つまり、決定木を使うと、
CM1の指標は、lOComment、ev(g)
JM1の指標は、Loc,Total_Op
が向いていて、他の変数ではあまりせつめいできなさそう。
・・・ということは、プロジェクトによって、障害が起こる要因はちがうってこと・・
障害の原因となる銀の弾丸はないってこと?
だとしたら、ステップワイズ法で変数を決定し、それを「ほかの」プロジェクトに適用することは無理ということになり、もしそのようなことがやりたいのなら、
(1)先に、いろいろなプロジェクトにおいて、
何が障害を予見する要因かを探し出し、
→J48でもいいけど、他にもっと適切な方法があると思う
(2)適用しようとするプロジェクトが(1)のどのプロジェクトと
類似しているかを、K-NN法などで確認し、
(3)その似ているプロジェクトの障害説明要因を使って、
適用したいプロジェクトの予測を行う
っていうように、やり方をがらりと変えないといけなくなると思うんですけど・・・
・・・データマイニングとか、この分野は専門外だから、よくわかんないんですけど、
どう思います?
P.S 実はこれ、大学院のレポート&発表で出したもの。
そのときのコメントが、「でも、この要因でも、説明しているとはいえないよね。当てはまりはよくない。意外と、プログラマの技術力とかが測れたとして、その指標を入れたら、ガラリと変わるといったようなこともありえるかもね?」という意見がありました。