(57)【要約】【課題】バグモジュールの予測について不均衡データに基づく精度の低下を回避すること。【解決手段】プログラムの改版前のソースコードと、前記プログラムの改版後のソースコードとのそれぞれから、前記プログラムを構成する複数のモジュールのそれぞれの静的メトリクス情報及びコードクローンメトリクス情報を抽出し、前記改版前に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報と、前記改版前における前記モジュールごとのバグの有無とに基づいて、予測モデルを導出し、前記改版後に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報を前記予測モデルに入力して、バグ混入確率の予測値を前記モジュールごとに計算し、前記複数のモジュールのうちの一部のモジュールのバグ混入確率の予測値に基づいて、バグを含むモジュールを判定するための閾値を決定する。【選択図】図３
2019003333.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの改版前のソースコードと、前記プログラムの改版後のソースコードとのそれぞれから、前記プログラムを構成する複数のモジュールのそれぞれの静的メトリクス情報及びコードクローンメトリクス情報を抽出する抽出部と、
前記改版前に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報と、前記改版前における前記モジュールごとのバグの有無とに基づいて、予測モデルを導出する導出部と、
前記改版後に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報を前記予測モデルに入力して、バグ混入確率の予測値を前記モジュールごとに計算する計算部と、
前記複数のモジュールのうちの一部のモジュールのバグ混入確率の予測値に基づいて、バグを含むモジュールを判定するための閾値を決定する決定部と、
としてコンピュータを機能させることを特徴とするバグ混入確率計算プログラム。
【請求項２】
前記決定部は、前記複数のモジュールのうち、バグ混入確率の予測値が相対的に高い一部のモジュールのバグ混入確率の予測値に基づいて閾値を決定する、
ことを特徴とする請求項１記載のバグ混入確率計算プログラム。
【請求項３】
プログラムの改版前のソースコードと、前記プログラムの改版後のソースコードとのそれぞれから、前記プログラムを構成する複数のモジュールのそれぞれの静的メトリクス情報及びコードクローンメトリクス情報を抽出する抽出手順と、
前記改版前に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報と、前記改版前における前記モジュールごとのバグの有無とに基づいて、予測モデルを導出する導出手順と、
前記改版後に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報を前記予測モデルに入力して、バグ混入確率の予測値を前記モジュールごとに計算する計算手順と、
前記複数のモジュールのうちの一部のモジュールのバグ混入確率の予測値に基づいて、バグを含むモジュールを判定するための閾値を決定する決定手順と、
をコンピュータが実行することを特徴とするバグ混入確率計算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バグ混入確率計算プログラム及びバグ混入確率計算方法に関する。
【背景技術】
【０００２】
情報システムが経済・社会の様々な分野で必要不可欠なものとなっている現在、信頼性の高いソフトウェア開発に対する要求が高まっている。信頼性の高いソフトウェアを開発するためには、ソフトウェア品質を定量的に評価し、開発途上の早い段階でバグを摘出することが、当該ソフトウェアを用いたサービスの開始の判断を適切に実施するためにも不可欠である。
【０００３】
開発途上の残存バグを推定する方法として広く利用されているのは、Ｆａｕｌｔ−Ｐｒｏｎｅ分析技術である。Ｆａｕｌｔ−Ｐｒｏｎｅ分析技術は、主に、自プログラムのソースコードから得られる情報から、バグが混入している可能性の高いモジュールを予測する技術である。特にテスト工程前にＦａｕｌｔ−Ｐｒｏｎｅ分析技術を適用してバグモジュールを予測して、品質リスクの高いモジュールにテスト稼働を集中させるなどの対策を講じることにより、品質を向上させることができる。
【０００４】
バグモジュール予測技術では、基本的に以下の方法を利用して予測モデルの構築が行われる。
（１）過去のバージョンのソースコードから得られるメトリクス情報及びバグ情報から、メトリクス値とバグ情報との関係をロジスティック回帰やランダムフォレスト等の機械学習技術を用いて分析し、その関係から予測モデルを構築する。次に、予測対象バージョンのメトリクス情報に予測モデルを適用し、バグモジュール予測を行う。
（２）ソースコードから得られるメトリクス情報には、ソースコードの構造の複雑さに関連があると考えられているプログラム行数、サイクロマチック数などの静的メトリクスが用いられている。これらの静的メトリクスは、例えば、市販ツールであるテクマトリクス社の「Ｕｎｄｅｒｓｔａｎｄ」メトリクス計測ツールを用いることにより、容易にメトリクス値を収集することができる。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】「Understand −ソースコード解析ツール−」、［online］、［平成２８年４月７日検索］、インターネット＜https://www.techmatrix.co.jp/quality/understand/function/metrics.html＞
【非特許文献２】鈴木英之進、正確な学習よりも得する学習−学習コストを考慮する分類学習−（１）評価偏、情報処理、Vol.45、No.4、pp.395-401、2004
【発明の概要】
【発明が解決しようとする課題】
【０００６】
他方において、近年、ソフトウェア開発は既存プログラムに対して機能を追加変更する保守型開発が主流となってきた。保守型開発では、既存機能のコピーアンドペーストにより重複コードの追加変更が繰り返され、コードクローンが大量に発生してプログラム品質に影響を与える。
【０００７】
機能を追加変更する保守型開発では、既存の機能（母体機能）が存在しているため、全く新規に新たな機能を開発する新規型開発に比べて発生するバグが少ない。保守型開発では、プログラムを構成する最小単位であるモジュールを単位に捉えると、全モジュール数に対するバグを発生させるモジュール数の比率が数％〜２０％と、バグを含まないモジュールが圧倒的に多い。このような不均衡データ（アンバランスデータ）を用いて予測モデルを構築した場合、予測結果が多数を占めるデータ側に偏ってしまう問題が指摘されている（非特許文献２）。その結果、予測の精度が低くなり、テストの実施についての過不足が大きくなる可能性が有る。
【０００８】
本発明は、上記の点に鑑みてなされたものであって、バグモジュールの予測について不均衡データに基づく精度の低下を回避することを可能とすることを目的とする。
【課題を解決するための手段】
【０００９】
そこで上記課題を解決するため、バグ混入確率計算プログラムは、プログラムの改版前のソースコードと、前記プログラムの改版後のソースコードとのそれぞれから、前記プログラムを構成する複数のモジュールのそれぞれの静的メトリクス情報及びコードクローンメトリクス情報を抽出する抽出部と、前記改版前に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報と、前記改版前における前記モジュールごとのバグの有無とに基づいて、予測モデルを導出する導出部と、前記改版後に係る前記モジュールごとの静的メトリクス情報及びコードクローンメトリクス情報を前記予測モデルに入力して、バグ混入確率の予測値を前記モジュールごとに計算する計算部と、前記複数のモジュールのうちの一部のモジュールのバグ混入確率の予測値に基づいて、バグを含むモジュールを判定するための閾値を決定する決定部、としてコンピュータを機能させる。
【発明の効果】
【００１０】
バグモジュールの予測について不均衡データに基づく精度の低下を回避することができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の実施の形態の概要を説明するための図である。
【図２】本発明の実施の形態におけるバグモジュール予測装置１０のハードウェア構成例を示す図である。
【図３】本発明の実施の形態におけるバグモジュール予測装置１０の機能構成例を示す図である。
【図４】モジュールごとのバグ情報の集計処理の処理手順の一例を説明するためのフローチャートである。
【図５】メトリクス情報の取得処理の処理手順の一例を説明するためのフローチャートである。
【図６】予測情報記憶部１１１に記憶される情報の構成例を示す図である。
【図７】予測モデルの導出処理の処理手順の一例を説明するためのフローチャートである。
【図８】予測モデル導出用データの学習用データと検証用データへの分割の一例を説明するための図である。
【図９】予測モデルの一例を示す図である。
【図１０】最新バージョンに関するモジュールごとのバグ混入確率の予測値の導出処理の処理手順の一例を説明するためのフローチャートである。
【図１１】予測結果の出力処理の処理手順の一例を説明するためのフローチャートである。
【図１２】予測結果の出力例を示す図である。
【図１３】バグ混入確率が高いモジュールから順にテストを行った場合の効果を説明するための図である。
【図１４】本実施の形態による適合率の向上を説明するための図である。
【発明を実施するための形態】
【００１２】
以下、図面に基づいて本発明の実施の形態を説明する。図１は、本発明の実施の形態の概要を説明するための図である。図１の上段には、複数のモジュールから構成されるプログラムの改版後のバージョン（以下、単に「最新バージョン」という。）の開発工程が示されている。開発工程において、当該プログラムの改版前のバージョン（以下、単に「過去バージョン」という。）のソースコードが修正され、変更後ソースコード（最新バージョンのソースコード）が生成される。モジュールとは、例えば、関数又はクラス等によって区別される、プログラムの構成単位である。
【００１３】
一方、図１の下段には、本実施の形態の予測モデル構築方法及びバグモジュール予測方法が示されている。
【００１４】
予測モデル構築方法では、過去バージョンのバグ情報と、当該過去バージョンのソースコードから得られるソフトウェアメトリクスとの２つの情報を入力とした機械学習分析手法によってバグモジュールの予測モデル（以下、単に「予測モデル」という。）が導出される。バグ情報とは、バグごとに、当該バグがいずれのモジュールのバグであったのかを示す情報をいう。ソフトウェアメトリクスとは、静的メトリクス情報とコードクローンメトリクス情報とを含む情報である。静的メトリクス情報とは、例えば、プログラム行数、サイクロマチック数等を含む情報である。コードクローンメトリクス情報とは、例えば、ソースコードにおけるコードクローンの行数、コードクローンの割合等を示す情報である。
【００１５】
バグモジュール予測方法では、導出された予測モデルに対して、変更後ソースコードから得られる、モジュールごとの静的メトリクス情報とコードクローンメトリクス情報を入力することで、最新バージョンのモジュールごとのバグ混入確率の予測値が得られる。バグ混入確率は、モジュールにバグが含まれている確率（又は可能性の大きさ）を示す指標である。最新バージョンのモジュールごとのバグ混入確率の予測値は、分析対象選別方法に入力される。分析対象選別方法では、入力されたモジュールごとのバグ混入確率の予測値のうち、予め設定される基準値未満の予測値に対応するモジュールが分析対象から外され、当該基準値以上のモジュールが分析対象として選別される。分析対象として選別されたソフトウェアメトリクス（静的メトリクス情報及びコードクローンメトリクス情報）は、次に実行される予測モデルに基づくモジュールごとのバグ混入確率の予測値の計算の入力となる。モジュールの選別と予測値の計算とは、Ｎ回繰り返され、Ｎ回目の実行結果が、最終的な結果として出力される。なお、Ｎは、１以上の整数である。
【００１６】
このような予測モデル構築方法及びバグモジュール予測方法を実現するバグモジュール予測装置１０について説明する。図２は、本発明の実施の形態におけるバグモジュール予測装置１０のハードウェア構成例を示す図である。図２のバグモジュール予測装置１０は、それぞれバスＢで相互に接続されているドライブ装置１００、補助記憶装置１０２、メモリ装置１０３、ＣＰＵ１０４、インタフェース装置１０５、表示装置１０６、及び入力装置１０７等を有する。
【００１７】
バグモジュール予測装置１０での処理を実現するプログラムは、ＣＤ−ＲＯＭ等の記録媒体１０１によって提供される。プログラムを記憶した記録媒体１０１がドライブ装置１００にセットされると、プログラムが記録媒体１０１からドライブ装置１００を介して補助記憶装置１０２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１０１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１０２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００１８】
メモリ装置１０３は、プログラムの起動指示があった場合に、補助記憶装置１０２からプログラムを読み出して格納する。ＣＰＵ１０４は、メモリ装置１０３に格納されたプログラムに従ってバグモジュール予測装置１０に係る機能を実現する。インタフェース装置１０５は、ネットワークに接続するためのインタフェースとして用いられる。表示装置１０６はプログラムによるＧＵＩ（Graphical User Interface）等を表示する。入力装置１０７はキーボード及びマウス等で構成され、様々な操作指示を入力させるために用いられる。
【００１９】
図３は、本発明の実施の形態におけるバグモジュール予測装置１０の機能構成例を示す図である。図３において、バグモジュール予測装置１０は、バグ情報解析部１１、ソースコード解析部１２、予測モデル導出部１３、予測値計算部１４、分析対象選別部１５及び予測結果出力部１６等を有する。これら各部は、バグモジュール予測装置１０にインストールされた１以上のプログラムが、ＣＰＵ１０４に実行させる処理により実現される。バグモジュール予測装置１０は、また、予測情報記憶部１１１及び予測モデル記憶部１１２等を利用する。これら各記憶部は、例えば、補助記憶装置１０２若しくはメモリ装置１０３、又はバグモジュール予測装置１０にネットワークを介して接続可能な記憶装置等を用いて実現可能である。なお、バグ情報解析部１１、ソースコード解析部１２、予測モデル導出部１３、及び予測情報記憶部１１１は、予測モデル構築方法に関する構成要素である。一方、予測値計算部１４、分析対象選別部１５、予測結果出力部１６、及び予測モデル記憶部１１２は、バグモジュール予測方法に関する構成要素である。
【００２０】
バグ情報解析部１１は、開発データリポジトリ装置２０に記憶されている、過去バージョンのバグ情報に基づいて、モジュールごと（モジュール単位）のバグ数を集計し、集計結果（モジュールごとのバグ数及びバグの有無）を予測情報記憶部１１１に記憶する。
【００２１】
なお、開発データリポジトリ装置２０は、最新バージョン及び過去バージョンのそれぞれのソースコードや、過去バージョンのバグ情報等が記憶されている装置であり、例えば、ネットワークを介してバグモジュール予測装置１０に接続される。なお、開発データリポジトリ装置２０に相当する記憶部を、バグモジュール予測装置１０が有していてもよい。
【００２２】
ソースコード解析部１２は、開発データリポジトリ装置２０に記憶されている、最新バージョン及び過去バージョンのそれぞれのソースコードの静的メトリクス情報及びコードクローンメトリクス情報を、モジュールごとに測定（又は抽出）し、測定結果である静的メトリクス情報及びコードクローンメトリクス情報を予測情報記憶部１１１に記憶する。なお、バージョンごとに、モジュールの種類やモジュール数が異なってもよい。
【００２３】
ソースコードの静的メトリクス情報は、公知のソフトウェアメトリクス計測技術を利用して測定することができる（例えば、非特許文献１等）。また、ソースコードのコードクローンメトリクス情報は、公知のコードクローン分析技術を利用して測定することができる（例えば、「http://www.ccfinder.net/ccfinderx-j.html」等）。
【００２４】
予測情報記憶部１１１は、バグ情報解析部１１の出力情報である、過去バージョンのモジュールごとのバグ数及びバグの有無と、ソースコード解析部１２の出力情報である、各バージョンのモジュールごとの静的メトリクス情報及びコードクローンメトリクス情報等とを記憶する。
【００２５】
予測モデル導出部１３は、予測情報記憶部１１１に記憶されている過去バージョンのモジュールごとのバグの有無、静的メトリクス情報、及びコードクローンメトリクス情報に基づいて、機械学習の技術を適用して予測モデルを導出する。当該予測モデルは、静的メトリクス情報及びコードクローンメトリクス情報を入力とし、バグ混入確率を出力するモデルである。予測モデル導出部１３は、導出した予測モデルを、予測モデル記憶部１１２に記憶する。
【００２６】
機械学習は、入力された大量のデータセットから得られる傾向を導出する技術である。機械学習については、これまでに多数のモデルが提案されており、バグ混入確率のような数値を求める回帰モデルと、バグの有無のような場合分けを求める分類モデルが存在する。本実施の形態では、バグ混入確率を求める必要があるため、回帰モデルが利用される。回帰の機械学習モデルとしては、例えば、ロジスティック回帰モデル、ランダムフォレストモデル、深層学習（DeepLearning）等が知られている。また、ロジスティック回帰モデル、ランダムフォレストモデル、深層学習（DeepLearning）等のような機械学習モデルは、オープンソースとして配布されている統計解析ツールＲに実装されているので、容易に機械学習によるモデル化が可能である。
【００２７】
予測モデル記憶部１１２は、予測モデル導出部１３によって導出された予測モデルを記憶する。予測モデルは、回帰式の形式で記憶される。
【００２８】
予測値計算部１４は、予測モデル記憶部１１２に記憶された予測モデル（回帰式）に対し、予測情報記憶部１１１に記憶された最新バージョンの静的メトリクス情報及びコードクローンメトリクス情報をモジュールごとに入力し、バグ混入確率の予測値をモジュールごとに計算する。
【００２９】
分析対象選別部１５は、予め設定される基準値に基づき、バグ混入確率の予測値が基準値未満のモジュールを分析対象から除外し、当該予測値が基準値以上のモジュールを分析対象として選別する。分析対象選別部１５は、また、析対象として選別した一部のモジュールのバグ混入確率の予測値に基づいて、予測結果出力部１６によってバグモジュール（バグが混入している可能性の高いモジュール）の判定に利用される閾値αを決定する。
【００３０】
予測結果出力部１６は、予測値計算部１４によって計算されたモジュールごとのバグ混入確率に基づく情報を、表形式又はグラフ形式等で出力すると共に、バグ混入確率と閾値αとの比較に基づいて、バグモジュールの判定結果を出力する。
【００３１】
まず、予測モデル構築方法に関する各処理手順について説明する。
【００３２】
図４は、モジュールごとのバグ情報の集計処理の処理手順の一例を説明するためのフローチャートである。
【００３３】
ステップＳ１０１において、バグ情報解析部１１は、過去バージョンに関するバグ情報を開発データリポジトリ装置２０から取得する。ここで、過去バージョンとは、最新バージョンが、ｖ＋１番目のバージョンであれば、ｖ番目のバージョンである。以下、当該過去バージョンを「バージョンｖ」という。
【００３４】
続いて、バグ情報解析部１１は、バージョンｖのモジュール情報を、ソースコード解析部１２から取得する（Ｓ１０２）。モジュール情報とは、どのようなモジュールが含まれているのかを示す情報である。例えば、モジュール名（モジュールの識別情報）の集合が、モジュール情報である。なお、ソースコード解析部１２は、開発データリポジトリ装置２０に記憶されている、バージョンｖのソースコードを解析することにより、モジュール情報を抽出する。
【００３５】
続いて、バグ情報解析部１１は、バグ情報に含まれている各バグを、モジュール別に分類する（Ｓ１０３）。バグ情報には、発見されたバグごとに、バグの識別番号（以下、「バグ番号」という。）と、当該バグを含んでいたモジュールのモジュール名との対応情報が含まれている。ステップＳ１０３では、モジュールごとに、モジュール名に対して当該モジュールに含まれていたバグのバグ番号が対応付けられる。
【００３６】
続いて、バグ情報解析部１１は、モジュールごとに、バグ数を集計する（Ｓ１０４）。或るモジュールのバグ数は、当該モジュールのモジュール名に対してステップＳ１０３において対応付けられたバグ番号の数を集計することで得られる。
【００３７】
続いて、バグ情報解析部１１は、バグ数が１件以上の各モジュールには、バグが有ることを表す「１」を対応付け、バグ数が０件である各モジュールには、バグが無いことを表す「０」を対応付ける（Ｓ１０５）。
【００３８】
続いて、バグ情報解析部１１は、モジュールごとに、集計結果であるバグ数及びバグの有無情報を、当該モジュールのモジュール名に関連付けて予測情報記憶部１１１に記憶する（Ｓ１０６）。
【００３９】
図５は、メトリクス情報の取得処理の処理手順の一例を説明するためのフローチャートである。図５の処理手順は、バージョンｖ及び最新バージョン（バージョンｖ＋１）のそれぞれについて実行される。以下、処理対象とされているバージョン（バージョンｖ又は最新バージョン）を、「対象バージョン」という。
【００４０】
ステップＳ１１１において、ソースコード解析部１２は、対象バージョンのソースコードを開発データリポジトリ装置２０から取得する。
【００４１】
続いて、ソースコード解析部１２は、ソースコードを解析して、静的メトリクス情報をモジュールごとに測定（抽出）する（Ｓ１１２）。続いて、ソースコード解析部１２は、モジュールごとに、測定結果（静的メトリクス情報）を、当該モジュールのモジュール名に関連付けて予測情報記憶部１１１に記憶する（Ｓ１１３）。
【００４２】
続いて、ソースコード解析部１２は、ソースコードを解析して、コードクローンメトリクス情報をモジュールごとに測定（抽出）する（Ｓ１１４）。続いて、ソースコード解析部１２は、モジュールごとに、測定結果（コードクローンメトリクス情報）を、当該モジュールのモジュール名に関連付けて予測情報記憶部１１１に記憶する（Ｓ１１５）。
【００４３】
図６は、予測情報記憶部１１１に記憶される情報の構成例を示す図である。図６において、予測モデル導出用データＴ１は、バージョンｖに関する図４及び図５の実行結果が記憶されるテーブルである。図６に示されるように、予測モデル導出用データＴ１には、モジュールごとに、モジュール名、静的メトリクス情報、コードクローンメトリクス情報、バグ数、及びバグの有無が記憶される。
【００４４】
一方、予測用データＴ２は、最新バージョンに関する図５の実行結果が記憶されるテーブルである。図６に示されるように、予測用データＴ２には、モジュールごとに、モジュール名、静的メトリクス情報、及びコードクローンメトリクス情報が記憶される。
【００４５】
なお、図６には、バージョンｖのモジュール構成と、最新バージョンのモジュール構成とが同じである例が示されているが、それぞれのモジュール構成は、異なっていてもよい。
【００４６】
また、バージョンｖより前のバージョンに関して、予測モデル導出用データＴ１と同様のテーブルが予測情報記憶部１１１に蓄積されていてもよい。例えば、バージョンｖが最新バージョンだった際に、バージョンｖ−１に関して図４及び図５の処理手順が実行されることにより得られた情報が予測モデル導出用データＴ１に蓄積されていてもよい。
【００４７】
図７は、予測モデルの導出処理の処理手順の一例を説明するためのフローチャートである。
【００４８】
ステップＳ１２１において、予測モデル導出部１３は、予測情報記憶部１１１に記憶されている予測モデル導出用データＴ１を取得する。続いて、予測モデル導出部１３は、予測モデル導出用データＴ１のレコード群を、Ｌｅａｖｅ−ｏｎｅ−ｏｕｔ交差検証を行うために、学習用データと検証用データとに任意に分割する。交差検証とは、モデル構築の際、使用するデータ（サンプルデータ）を分割し、一部を使ってモデルを構築するための学習をし、残りのデータを使ってモデルの検証する手法をいう。
【００４９】
例えば、ステップＳ１２１では、いずれか一つのレコードが検証用データとされ、残りの３つのレコードが学習用データとされる。
【００５０】
図８は、予測モデル導出用データの学習用データと検証用データへの分割の一例を説明するための図である。図８の例では、モジュールＡ、モジュールＢ、及びモジュールＣに関する３レコードが学習用データとされ、モジュールＤに関する１レコードが検証用データとされた例が示されている。
【００５１】
続いて、予測モデル導出部１３は、学習用データの静的メトリクス情報、コードクローンメトリクス情報及びバグの有無を入力として、機械学習に基づいて、予測モデルの候補（以下、「予測モデル候補」という。）を導出する（Ｓ１２３）。ここで導出される予測モデル候補は、最終的に予測モデルとして採用されるとは限らないため、説明の便宜上「候補」が付加されている。
【００５２】
続いて、予測モデル導出部１３は、予測モデル候補に検証用データを入力として、バグ混入確率の予測値を計算する（Ｓ１２４）。
【００５３】
続いて、予測モデル導出部１３は、計算された予測値と、検証用データの実績値との差分の絶対値を予測誤差として計算する（Ｓ１２５）。なお、実績値は、０又は１（１００％）である。すなわち、検証用データのバグ数が０であれば、バグ混入確率の実績値は、バグが無いことを示す０（０％）であり、検証用データのバグ数が１以上であれば、バグ混入確率の実績値は、１（１００％）である。一方、予測値は、中間の値をとりうる。
【００５４】
続いて、予測モデル導出部１３は、当該予測モデル候補に対応付けて、当該予測誤差をメモリ装置１０３又は補助記憶装置１０２に記憶する（Ｓ１２６）。
【００５５】
続いて、予測モデル導出部１３は、予測モデル導出用データＴ１の分割について、全ての組み合わせを実行したか否かを判定する（Ｓ１２７）。すなわち、予測モデル導出用データＴ１の４つのレコードのそれぞれが、検証用データとして利用されたか否かが判定される。本実施の形態において、予測モデル導出用データＴ１は４つのレコードを含むため、ステップＳ１２２以降が４回実行されることになる。
【００５６】
全ての組み合わせが実行されていない場合（Ｓ１２７でＮｏ）、未実行の組み合わせに関してステップＳ１２２以降が実行される。全ての組合せが実行済みであれば（Ｓ１２７でＹｅｓ）、予測モデル導出部１３は、ステップＳ１２６において記憶された予測モデル候補の中で、対応付けられている予測誤差が最小である予測モデル候補を、予測モデルとして選択し、当該予測モデルを予測モデル記憶部１１２に記憶する（Ｓ１２８）。
【００５７】
図９は、予測モデルの一例を示す図である。図９には、バージョンｖに関して一つの予測モデルが予測モデル記憶部１１２に記憶されている状態が示されている。また、予測モデルとして、回帰式（１）が示されている。回帰式（１）は、ロジスティック回帰モデルにより構築された予測モデルの一例である。
【００５８】
なお、回帰式（１）において、Ｐは、バグ混入確率、ｘｉは説明変数として選択したメトリクス（静的メトリクス情報のパラメータ又はコードクローンメトリクス情報のパラメータ）、ｃｉは標準化偏回帰係数を示す。
【００５９】
なお、予測モデル記憶部１１２には、バージョンｖより前のバージョンに関して過去に導出された予測モデルが蓄積されていてもよい。
【００６０】
次に、バグモジュール予測方法に関する処理手順について説明する。
【００６１】
図１０は、最新バージョンに関するモジュールごとのバグ混入確率の予測値の導出処理の処理手順の一例を説明するためのフローチャートである。
【００６２】
ステップＳ１３１において、予測値計算部１４は、予測モデル（回帰式（１））を予測モデル記憶部１１２から取得する。続いて、予測値計算部１４は、予測用データＴ２を予測情報記憶部１１１（図６）から取得する（Ｓ１３２）。ここで取得された予測用データＴ２に含まれる各モジュールが、初期状態において分析対象のモジュールである。
【００６３】
続いて、予測値計算部１４は、分析対象のモジュールごとに、当該レコードの静的メトリクス情報及びコードクローンメトリクス情報を予測モデルに入力して、当該モジュールのバグ混入確率を計算する（Ｓ１３３）。図６の例によれば、４つのモジュールが有るため、４回の計算が行われ、４つのバグ混入確率が得られる。
【００６４】
続いて、分析対象選別部１５は、バグ混入確率が予め設定された基準値未満のモジュールを分析対象から除去する（Ｓ１３４）。すなわち、バグ混入確率が相対的に高い一部のモジュールが分析対象として残される。基準値は、分析対象の各モジュールのバグ混入確率の分布等に基づいて決定されてもよい。例えば、基準値は、例えば、上位Ｘ％番目であってもよい。基準値が、上位Ｘ％番目である場合、ステップＳ１３４では、降順にソートした場合に上位Ｘ％番目未満のバグ混入確率に対応するモジュールが分析対象から除去される。なお、バグ混入確率が下位Ｙ個のモジュールが分析対象から除去されるようにしてもよい。
【００６５】
続いて、分析対象選別部１５は、分析対象として残っている各モジュールのバグ混入確率に基づいて閾値αを決定する（Ｓ１３５）。ここで、分析対象として残っている各モジュールは、バグ混入確率が相対的に高い一部のモジュールである。斯かるモジュールのバグ混入確率に基づいて閾値αが決定されることで、閾値αに対して、バグのリスクの低いモジュールの影響を小さくすることができる。すなわち、多数を占めるモジュール側に閾値αが偏ってしまう可能性を低下させることができる。なお、閾値αは、分析対象として残っている各モジュールのバグ混入確率の分布等に基づいて算出されてもよい。例えば、当該バグ混入確率の集合の中央値が閾値αとされてもよい。
【００６６】
続いて、分析対象選別部１５は、ステップＳ１３３〜Ｓ１３５の実行回数が、予め設定されたＮ回に達したか否かを判定する（Ｓ１３６）。当該実行回数がＮ回未満であれば（Ｓ１３６でＮｏ）、ステップＳ１３３以降が繰り返される。ステップＳ１３３以降が繰り返されることにより、分析対象のモジュールが変化し、閾値αが更新される。なお、各モジュールのバグ混入確率は変化しないため、ステップＳ１３３は、繰り返しの範囲に含まれなくてもよい。
【００６７】
一方、当該実行回数がＮ回に達した場合（Ｓ１３６でＹｅｓ）、分析対象選別部１５は、この時点で分析対象として残っている各モジュールのモジュール名に対応付けて、当該モジュールのバグ混入確率を、メモリ装置１０３又は補助記憶装置１０２に記憶する。又は、全てのモジュールのバグ混入確率がメモリ装置１０３又は補助記憶装置１０２に記憶されてもよい。また、この時点における閾値αもメモリ装置１０３又は補助記憶装置１０２に記憶される。
【００６８】
図１１は、予測結果の出力処理の処理手順の一例を説明するためのフローチャートである。
【００６９】
ステップＳ１４１において、予測結果出力部１６は、図１０の処理手順の終了時にメモリ装置１０３又は補助記憶装置１０２に記憶されたモジュールごとのバグ混入確率（モジュール名及びバグ混入確率の組）をメモリ装置１０３又は補助記憶装置１０２から取得する。当該モジュールは、分析対象として最終的に残った一部のモジュールでもよいし、全てのモジュールでもよい。
【００７０】
続いて、予測結果出力部１６は、モジュール名及びバグ混入確率の組を、バグ混入確率の降順にソートする（Ｓ１４２）。続いて、予測結果出力部１６は、縦軸をバグ混入確率、横軸をソート結果のモジュール名の並びとする座標に対して、バグ混入確率がプロットされたグラフを、例えば、表示装置１０６に描画する（Ｓ１４３）。
【００７１】
図１２は、予測結果の出力例を示す図である。図１２には、縦軸をバグ混入確率とし、横軸をモジュールとする座標に、各モジュールのバグ混入確率がプロットされたグラフの描画例が示されている。図１２においては、便宜上、横軸がモジュール数とされている。なお、グラフの代わりに表形式によってモジュールごとのバグ混入確率が出力されてもよい。
【００７２】
続いて、予測結果出力部１６は、バグの有無を判定するための閾値αを、当該グラフに描画する（Ｓ１４４）。当該閾値αは、図１０の処理手順の終了時にメモリ装置１０３又は補助記憶装置１０２に記憶されたものである。なお、図１２では、閾値αが、約０．１５である例が示されている。
【００７３】
続いて、予測結果出力部１６は、閾値αより大きいバグ混入確率を判定し、当該バグ混入確率に対応するモジュール名をバグモジュールのモジュール名として出力する（Ｓ１４５）。
【００７４】
利用者は、例えば、出力されたモジュール名に係るモジュールについて、バグ混入確率が高いものから順にテストを行ったり、修正確認テストや回帰テストを重点的に行ったりすることで、効率的にバグを摘出することができる。
【００７５】
図１３は、バグ混入確率が高いモジュールから順にテストを行った場合の効果を説明するための図である。図１３には、縦軸が累積バグ比率（累積バグモジュール数／全バグモジュール数）であり、横軸がテストを行ったモジュール数であるグラフが示されている。
【００７６】
直線Ｌ１は、バグ混入確率によって順位付けせずにテストした場合の累積バグ比率（累積バグ発見率）の推移を示す。この場合、テストするモジュール数に比例して累積バグ比率は単調増加する。
【００７７】
一方、折れ線Ｌ２は、バグ混入確率の予測値の高いモジュールから順にテストした場合の累積バグ比率（累積バグ発見率）の推移を示す。折れ線Ｌ２では、早期の段階で、累積バグ比率が高くなっていることを示す。すなわち、図１３の網掛け部分が示すように、バグ混入確率の予測値の高いモジュールから順にテストした場合、早期にバグを摘出することができる。
【００７８】
上述したように、本実施の形態によれば、説明変数候補であるメトリクスに、従来からのソースコードの構造の複雑さに起因するメトリクスに加え、機能追加型開発である保守型開発において問題となっている、機能のコピーアンドペーストに起因するコードクローン情報を加えることにより、保守型開発で問題となるコードクローンによる品質への影響を加味したバグを含む予測モデルの構築が可能とされている。
【００７９】
したがって、本実施の形態によれば、コードクローンの影響を考慮したバグモジュールの判定を可能とすることができる。
【００８０】
その結果、図１３に示したように、バグ混入確率が高いモジュールに対して重点的にテスト工数を割り当てることができ、信頼性の確保及び無駄なテスト工数の削減の両立を期待することができる。
【００８１】
すなわち、ソフトウェア開発において既存のソフトウェアの改良により開発を進める際において、改良に伴い、一定の品質を担保するために、どの程度の規模の検証をするべきかの指標を得ることができ、必要以上の検証の実施や、必要であるにも拘わらず検証工数が小さくなってしまう、といったことを回避することができる。
【００８２】
また、バグ混入確率が相対的に低いモジュールが分析対象から除かれた上で、バグ混入の有無を判定するための閾値αが決定されるため、適合率を向上させることもできる。すなわち、バグモジュールの予測について不均衡データに基づく精度の低下を回避することができる。
【００８３】
図１４は、本実施の形態による適合率の向上を説明するための図である。図１４において、（１）は、予測モデルの生成のための機械学習モデルとして、ランダムフォレストモデルを利用した場合の適合率を示す。（２）は、予測モデルの生成のための機械学習モデルとして、深層学習（DeepLearning）を利用した場合の適合率を示す。
【００８４】
また、（１）及び（２）のそれぞれにおいて、「全データ・同」、「高リスクデータ・同」、「全データ・異」、「高リスクデータ・同」における「全データ」は、分析対象のモジュールの一部を除去しない場合（すなわち、図１０のＳ１３４を実行せず、かつ、Ｓ１３４を繰り返さない場合）を示す。「高リスクデータ」は、分析対象のモジュールの一部を除去した場合（すなわち、図１０の通りの処理手順を実行する場合）を示す。
【００８５】
また、「同」は、予測対象のプログラムが、予測モデルの構築に用いたプログラムの改版であることを示す。「異」は、予測対象のプログラムが、予測モデルの構築に用いたプログラムとは異なるプログラムであることを示す。
【００８６】
したがって、「高リスクデータ・同」及び「高リスクデータ・異」は、本実施の形態の全部が適用された場合を示す。一方、「全データ・同」及び「全データ・異」は、本実施の形態の一部が適用されない場合を示す。
【００８７】
上記より、図１４には、予測モデルの生成のための機械学習モデルの種類と、使用する予測用データ（全データ又は高リスクデータ）との組み合わせによる４通りの例について、本実施の形態の一部を適用しない場合と全部を適用した場合との適合率の比較結果が示されている。図１４から明らかなように、４例中３例において、適合率が上昇していることが分かる。
【００８８】
なお、本実施の形態において、バグモジュール予測装置１０は、バグ混入確率計算装置の一例である。ソースコード解析部１２は、抽出部の一例である。予測モデル導出部１３は、導出部の一例である。予測値計算部１４は、計算部の一例である。分析対象選別部１５は、決定部の一例である。
【００８９】
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【符号の説明】
【００９０】
１０          バグモジュール予測装置
１１          バグ情報解析部
１２          ソースコード解析部
１３          予測モデル導出部
１４          予測値計算部
１５          分析対象選別部
１６          予測結果出力部
２０          開発データリポジトリ装置
１００        ドライブ装置
１０１        記録媒体
１０２        補助記憶装置
１０３        メモリ装置
１０４        ＣＰＵ
１０５        インタフェース装置
１０６        表示装置
１０７        入力装置
１１１        予測情報記憶部
１１２        予測モデル記憶部
Ｂ            バス
【図１】
2019003333.tif 000003
【図２】
2019003333.tif 000004
【図３】
2019003333.tif 000005
【図４】
2019003333.tif 000006
【図５】
2019003333.tif 000007
【図６】
2019003333.tif 000008
【図７】
2019003333.tif 000009
【図８】
2019003333.tif 000010
【図９】
2019003333.tif 000011
【図１０】
2019003333.tif 000012
【図１１】
2019003333.tif 000013
【図１２】
2019003333.tif 000014
【図１３】
2019003333.tif 000015
【図１４】
2019003333.tif 000016