(57)【要約】      （修正有）【課題】開発したソフトウェアの不具合発生を精度よく予測することができる装置を提供する。【解決手段】ソフトウェアの不具合の発生数と該不具合発生の説明変数を含む複数のデータを入力するデータ入力部８と、データ入力部８から学習用のデータを入力し、ソフトウェアの不具合の発生の説明変数を機械学習し、予測モデルを生成する機械学習部９と、データ入力部８からソフトウェアの不具合の発生数を予測するためのデータを入力し、予測モデルを用いてソフトウェアの不具合の発生数を予測する予測部１０と、表示部１１とを有する。【選択図】図１
2019194818.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアの不具合の発生数と該不具合発生の説明変数を含む複数のデータを入力するデータ入力部と、
前記データ入力部から学習用のデータを入力し、ソフトウェアの不具合の発生の説明変数を機械学習し、予測モデルを生成する機械学習部と、
前記データ入力部からソフトウェアの不具合の発生数を予測するためのデータを入力し、前記予測モデルを用いてソフトウェアの不具合の発生数を予測する予測部と、
前記機械学習部と前記予測部の出力を表示する表示部と、を有することを特徴とするソフトウェア不具合予測装置。
【請求項２】
前記機械学習部は、ランダムフォレストによる機械学習を行うことを特徴とする請求項１に記載のソフトウェア不具合予測装置。
【請求項３】
前記機械学習部は、
前記学習用データから、重複を許してランダムに抽出するブートストラップサンプリングモジュールと、
前記データと説明変数を用いて複数の決定木を生成する決定木生成モジュールと、
前記決定木の集合体からなる予測モデルを評価する評価モジュールと、を有することを特徴とする請求項２に記載のソフトウェア不具合予測装置。
【請求項４】
前記予測モデルの説明変数は、ソフトウェアの開発者、ベンダ、経験的障害予測値、開発規約違反数、ステップ数、複雑度、制御文数、重複行数の少なくとも一部を含むことを特徴とする請求項１〜３のいずれか一項に記載のソフトウェア不具合予測装置。
【請求項５】
ソフトウェアの開発システムと接続し、開発したソフトウェアと関係づけて、ソフトウェアの不具合発生数を取得するリンクツールと、
開発規約違反数、ステップ数、複雑度、制御文数、重複行数を取得するコーティングツールと、
開発者、ベンダを取得するソース管理ツールと、
経験的障害予測値を取得する経験的障害予測ツールと、
データを相互に比較可能に整形するデータ整形部と、をさらに有することを特徴とする請求項１〜４のいずれか一項に記載のソフトウェア不具合予測装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの不具合の発生を予測する装置に関する。
【背景技術】
【０００２】
ソフトウェアの開発において、不具合が発生することを完全に防止することは難しい。しかし、リリースしたソフトウェアに障害が発生するとその影響は甚大になる。そのため、ソフトウェアのリリース前に品質確保のための作業に多大な工数をかけている。
【０００３】
このような現状において、実用的な時間とコストの範囲内でソフトウェアの品質を確保するために、不具合の潜在が疑われるソフトウェアやモジュールを早期に予測することが求められている。
【０００４】
最近では、ソフトウェアの不具合の発生を予測する装置や方法がいくつか提案されている。
【０００５】
非特許文献１によれば、ソフトウェアの不具合の発生に関する複数の研究論文が出されており、そのうち不具合と発生要因の相関関係に関する研究論文が複数ある。非特許文献２には、それら不具合との相関関係に基づいてソフトウェアの不具合発生を予測する方法が示唆されている。ここでは、ソフトウェアの不具合発生の要因として、開発者やテスタの経験、時間の制限、要求仕様の品質等が挙げられている。
【０００６】
一方、特許文献１には、ソフトウェアプログラムの障害位置を特定し、その障害位置における不合格プログラム状態を、決定木学習を用いて決定する技術が記載されている。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】畑秀明、他２名著、「不具合予測に関するメトリクスについての研究論文の系統的レビュー」、コンピュータソフトウェア、Ｖｏｌ．２９  Ｎｏ．１  Ｆｅｂ．  ２０１２、ｐ．１０６−１１７
【非特許文献２】畑秀明、他２名著、「不具合予測に関するメトリクスについての研究論文の系統的レビュー」、コンピュータソフトウェア、Ｖｏｌ．２９  Ｎｏ．１  Ｆｅｂ．  ２０１２、ｐ．１０６−１１７
【特許文献１】特開２０１７−１０２９１２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかし、特許文献１の技術は特定のプログラムの障害位置を特定し修復処理するものであり、開発したソフトウェアの不具合の発生数を予測することはできない。
【０００９】
非特許文献２は、開発したソフトウェアの不具合の発生の予測に関係するものであるが、ソフトウェアの不具合発生に関係する要因が適切ではなく、実際に開発したソフトウェアの不具合の発生を予測した場合に、精度が高くない。
【００１０】
そこで、本発明の目的は、開発したソフトウェアの不具合発生を精度よく予測することができる装置を提供することにある。
【課題を解決するための手段】
【００１１】
上述した課題を解決するために、本発明のソフトウェア不具合予測装置は、ソフトウェアの不具合の発生数と該不具合発生の説明変数を含む複数のデータを入力するデータ入力部と、前記データ入力部から学習用のデータを入力し、ソフトウェアの不具合の発生の説明変数を機械学習し、予測モデルを生成する機械学習部と、前記データ入力部からソフトウェアの不具合の発生数を予測するためのデータを入力し、前記予測モデルを用いてソフトウェアの不具合の発生数を予測する予測部と、前記機械学習部と前記予測部の出力を表示する表示部と、を有することを特徴とする。
【００１２】
前記機械学習部は、ランダムフォレストによる機械学習を行うようにすることができる。
【００１３】
前記機械学習部は、前記学習用データから、重複を許してランダムに抽出するブートストラップサンプリングモジュールと、前記データと説明変数を用いて複数の決定木を生成する決定木生成モジュールと、前記決定木の集合体からなる予測モデルを評価する評価モジュールと、を有するようにすることができる。
【００１４】
前記予測モデルの説明変数は、ソフトウェアの開発者、ベンダ、経験的障害予測値、開発規約違反数、ステップ数、複雑度、制御文数、重複行数の少なくとも一部を含むようにすることができる。
【００１５】
ソフトウェアの開発システムと接続し、開発したソフトウェアと関係づけて、ソフトウェアの不具合発生数を取得するリンクツールと、開発規約違反数、ステップ数、複雑度、制御文数、重複行数を取得するコーティングツールと、開発者、ベンダを取得するソース管理ツールと、経験的障害予測値を取得する経験的障害予測ツールと、データを相互に比較可能に整形するデータ整形部と、をさらに有するようにすることができる。
【発明の効果】
【００１６】
本発明によれば、ソフトウェアの不具合の発生数と該不具合発生に関連付けられた説明変数を具備するデータを用いて機械学習することにより、不具合発生をよく説明する説明変数を有する予測モデルを生成する。この予測モデルに対して予測用データを入力することにより、開発したソフトウェアの不具合の発生を精度良く予測することができる。これにより、不具合が発生する可能性が高いソフトウェアに対して集中的に品質確保の工数を投入することができ、ソフトウェアの不具合発生を未然に防止することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の一実施形態にソフトウェア不具合予測装置を含む障害予測自動化システム全体の構成を示したブロック図。
【図２】本発明の一実施形態によるソフトウェア不具合予測装置の各ブロックの機能を示した説明図。
【図３】ソフトウェアの不具合発生の説明変数の学習と、ソフトウェアの不具合発生の予測に使用する機械学習のアルゴリズムの説明図。
【図４】本発明で選定した説明変数に対するソフトウェアの不具合発生の依存度を示す説明図。
【図５】決定木の数とＯＯＢ  ｅｒｒｏｒ  ｒａｔｅの関係を示したグラフ。
【図６】ソフトウェアの不具合発生の実績値と予測値を比較して示したグラフ。
【図７】本発明のソフトウェア不具合予測装置の出力の一例を示した説明図。
【図８】本発明のソフトウェア不具合予測装置の出力の画面の動作を示した説明図。
【発明を実施するための形態】
【００１８】
以下に本発明の実施形態を、図面を用いて説明する。
【００１９】
図１は、本発明の一実施形態によるソフトウェア不具合予測装置１を含む障害予測自動化システム２の全体の構成を示している。
【００２０】
ソフトウェア不具合予測装置１は付加的に、ソフトウェア開発システムに接続して障害数を自動的に取得するリンクツール３と、開発したソフトウェアの構文解析を行って開発規約違反数、ステップ数、複雑度、制御文数、重複行数を取得するコーティングツール４と、開発者やベンダの情報を取得するソース管理ツール５と、経験的障害予測値を取得する経験的障害予測ツール６と、データを相互に比較可能に整形するデータ整形部７を備えることができる。これらを合わせて、全体として障害予測自動化システム２を構成することができる。
【００２１】
ソフトウェア不具合予測装置１は、学習対象となるシステム、ソフトウェア、ソースコード、プロジェクトをそれぞれ対象とし、学習対象の範囲で、ソフトウェア開発システムのリンクツール３から障害数等をインポートし、コーティングツール４からルール違反数、ステップ数、複雑度、制御文数、重複行数等をインポートし、ソース管理ツール５からサブシステム名、ベンダ名、画面・帳票ID、開発者等をインポートし、データ入力部８に入力される。入力されたデータは、学習用データ又は評価用データとして用いられる。同様に、予測用データも入力される。予測用データが入力される際には、必ずしも、ソフトウェア開発システムのリンクツール３から障害数等がインポートされるとは限らない。例えば、初期テスト前又は初期稼働前には実際の障害数はソフトウェア開発システムのリンクツール３に入力されていない。その段階では、予測対象となるシステム、ソフトウェア、ソースコード、プロジェクトについての、ルール違反数、ステップ数、複雑度、制御文数、重複行数、サブシステム名、ベンダ名、画面・帳票ID、開発者等を用いて、不具合予測を行う。そして、例えば、不具合予測が所定程度以下であればそのまま初期テスト又は初期稼働に移行し、実際の障害数を取得し、不具合予測との対比を行うこともでき、不具合予測が所定程度以上であれば予測対象となるシステム、ソフトウェア、ソースコード、プロジェクトを、不具合予測が所定程度以下になるまで修正を行う。
【００２２】
ソフトウェア不具合予測装置１は、リンクツール３、コーティングツール４及びソース管理ツール５と連携することもでき、ソフトウェア不具合予測装置１でシステム、ソフトウェア、ソースコード、プロジェクトを指定することで、所望の入力データを得る構成とすることもできる。
【００２３】
コーティングツール４は、ソースコードの品質確認を行うツールであり、ソースコードを入力することで、開発規約違反、複雑か否か、重複行を検査し、問題部分のソースコード上の位置を特定し、開発規約違反数、ステップ数、複雑度、制御文数及び重複行数等を集計することもできる。ユーザの入力を受け、所望の問題箇所であるソースコードを表示し、修正することもできる。修正後に、再度検査を行うことで、問題箇所が解消し、開発規約違反数、ステップ数、複雑度、制御文数及び重複行数等も変動することになる。ソフトウェア不具合予測装置１で不具合予測を行った後に、ユーザが予測対象物を修正したい場合には、ソフトウェア不具合予測装置１から予測対象物の識別情報をコーティングツール４に渡して起動することで、予測対象物を円滑に修正することができ、修正保存後に再度予測対象物に対して不具合予測をソフトウェア不具合予測装置１で行うこともできる。
【００２４】
以下、障害予測自動化システム２の中心部分であるソフトウェア不具合予測装置１について説明する。
【００２５】
ソフトウェア不具合予測装置１は、データ入力部８と、機械学習部９と、予測部１０と、表示部１１と、機械学習ライブラリ１２とを有している。
【００２６】
図２は、ソフトウェア不具合予測装置１の各構成部分の機能を示している。
【００２７】
図２に示すように、ソフトウェア不具合予測装置１において、すべてのデータはデータ入力部８を介して入力される。データ入力部８が入力するデータとして、学習用データと予測用データがある。学習用データは、この数字に限定されることがないが数万件ないし数十万件のオーダーの多数のデータからなる。各データは、それぞれ所定のソフトウェア（モジュールを含む）の不具合発生数（実績値）とその不具合を発生させた可能性のある複数の説明変数を具備している。学習用データにおいて重要なのは、説明変数を具備していることと、どのソースコードが修正されたかをトレースできるようになっていることである。また、ソフトウェアの解析にツールを使用した場合に、再現性があることも重要である。実績データは、一部は学習用データとして使用し、他の一部は学習用データから生成された予測モデルの性能を評価するための評価用データとして使用するのが好ましい。
【００２８】
学習用データは機械学習部９に入力されると、機械学習部９によってソフトウェアの不具合発生の説明変数が機械学習される。本実施形態の機械学習部９は、ブートストラップサンプリングモジュール１３と、決定木生成モジュール１４と、評価モジュール１５とを有している。
【００２９】
機械学習部９においては、学習用データから学習対象となるデータが選定される。ここで学習対象データの選定とは、たとえば、１００〜２００画面の修正されたソフトウェアに学習対象を絞るようにすることが考えられる。
【００３０】
機械学習においては、目的に合った機械学習のアルゴリズムが使用されるようにする。機械学習により、ソフトウェアの不具合と因果関係があるモデルが定義される。
【００３１】
本実施形態では、機械学習のアルゴリズムとしてランダムフォレストを採用している。ブートストラップサンプリングモジュール１３は、学習用データから重複を許して訓練標本を生成する。決定木生成モジュール１４は、各訓練標本から決定木を生成し、訓練標本の数だけ決定木を生成する。所定の数の決定木を生成することにより、それらの決定木の集合体からなる予測モデルが生成される。
【００３２】
評価モジュール１５は、学習用データを用いて生成された予測モデルに対して、実際に開発したプログラムで不具合発生数の実績値を有するデータを入力して不具合発生数を試算する。算出した不具合発生数と不具合発生数の実績値を比較することによって、生成した予測モデルの評価を行うことができる。
【００３３】
そのほか、評価モジュール１５は、選定した説明変数に対する不具合発生数の依存度や、ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅの安定性等を評価することができる。
【００３４】
表示部１１により、予測モデルの計算結果や評価が適宜表示される。予測モデルは機械学習ライブラリ１２に格納される。
【００３５】
次に予測段階では、完成した予測モデルに対して、不具合発生数が未知の予測用データを入力する。予測用データは、学習用データが具備する説明変数の少なくとも一部の説明変数の数値を有している。また、予測用データは学習用データとデータの規模を揃えるようにする（予測対象の標準化）。予測用データはデータ入力部８から予測部１０に入力され、予測部１０によってソフトウェアが発生する不具合の数が予測される。予測された不具合発生数は小数点以下の数値は標準化され、表示部１１によって表示される。
【００３６】
図３は、本実施形態の機械学習に用いるアルゴリズムを示している。ここに述べるアルゴリズムに限られることはないが、本実施形態の機械学習は、いわゆるランダムフォレストと呼ばれる機械学習のアルゴリズムを使用する。ランダムフォレストは、アンサンブル学習モデルの一種で、データの欠損に対しても良い結果を出力することができる。ランダムフォレストは、多数の決定木を生成して、予測用データに対して多数決的に予測結果を決定する。
【００３７】
本実施形態では、ブートストラップサンプリングと呼ばれる方法で、学習用データから、データ（説明変数）を重複を許してランダムに選択して、元の学習用データより多いサンプリングデータ（訓練標本）（図３のＳａｍｐｌｉｎｇ  １，２，・・・，Ｂ）を生成する。次に、各サンプリングデータ（訓練標本）から決定木Ｔｒｅｅ  １，２，・・・，Ｂを生成する。各決定木は、説明変数によって分岐することによって情報利得が最大となるように成長させる。情報利得の指標としてはジニ係数やエントロピーが使われる。すなわち、エントロピーが高くなるように説明変数を選択する。各決定木の説明変数は同じ数とする。
【００３８】
このようにして生成された予測モデルは、評価を経て、予測に使用される。
【００３９】
予測段階では、予測用データを予測モデルに入力する。予測用データは、説明変数の少なくとも一部を有している。予測用データを対応する説明変数の予測モデルに入力することにより、該予測モデルの各決定木が不具合発生数をそれぞれ算出することができる（Ｒｅｓｕｌｔ１，２，・・・，Ｂ）。最終的には、各決定木の予測結果を合計し平均することにより予測結果を算出する。
【００４０】
図４は、本発明で選定した説明変数に対するソフトウェアの不具合発生の依存度を示している。予測モデルの説明変数の選定が適切であれば、不具合発生数はその説明変数の所定の値に強く依存する。すなわち、その説明変数による分割が大きな情報利得を得られる。
【００４１】
本発明では、機械学習の結果、説明変数として、ソフトウェアの開発者、ベンダ、経験的障害予測値、開発規約違反数、ステップ数、複雑度、制御文数、重複行数を選択することができた。図４と図５に本発明で選択した説明変数の幾つかについて、その有効性を示す。
【００４２】
図４（ａ）は、ソフトウェアの複雑度（ＣＯＭＰＬＥＸＩＴＹ）を説明変数とした場合の不具合発生数を示している。図４（ａ）に示すように、複雑度（循環複雑度）が７５以上で不具合発生数が急激に増加することが分かる。すなわち、循環複雑度が７５でデータを分割することで大きな情報利得が得られることが分かる。図４（ｂ）は、ベンダを説明変数とした場合の不具合発生数を示している。図４（ｂ）に示すように、ベンダにより不具合発生数が大きく異なり、ベンダによる分割に情報利得があることが分かる。図４（ｃ）は、Ｎｏｎ-Ｃｏｍｍｅｎｔ  Ｌｉｎｅ  ｏｆ  Ｃｏｄｅ（ＮＣＬＯＣ）、すなわちステップ数（コメント行を除く）を説明変数とした場合の不具合発生数を示している。図４（ｃ）に示すように、ステップ数が１５０を超えると不具合発生数が急激に増加することが分かる。
【００４３】
図５は、本発明による決定木の数とＯＯＢ  ｅｒｒｏｒ  ｒａｔｅの関係を示したグラフである。ブートストラップサンプリングは、Ｎ個のデータから重複を許してランダムにＮ個のデータを抽出して訓練標本を作成する。各訓練標本から決定木が生成される。訓練標本は多ければ多いほど予測モデルの精度が上がる。ここで訓練標本の数をＢとする。各訓練標本はＮ個のデータから重複を許してランダムにＮ個のデータを抽出するため、ｉ番目のデータに着目すると、Ｂ個の訓練標本のうち、ｉ番目のデータが使われていない訓練標本がいくつか存在する。ｉ番目のデータが使われなかった訓練標本から生成された決定木を集めて精度を評価したのがＯＯＢ  ｅｒｒｏｒ  ｒａｔｅである。ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅは、予測モデルの評価の指標として使用される。すなわち、適切な予測モデルであれば、決定木の数が大きくなるにつれて、ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅが安定する。逆に、予測モデルが適切でなければ、決定木の数を増やしても、ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅは安定しない。また、決定木の数をどのぐらい大きくすれば予測結果が安定するかの目安となる。
【００４４】
本実施形態によれば、決定木あたりの説明変数の数を２にした場合に、図５に示すように、決定木の数が１００個を超えるとＯＯＢ  ｅｒｒｏｒ  ｒａｔｅが安定し、特に決定木の数が３００個を超えると予測結果がきわめて安定する。したがって、説明変数の数を２とすると、１００個以上の決定木を生成することにより、安定した予測結果を得ることができるということである。
【００４５】
図６は、ソフトウェアの不具合発生の実績値と本実施形態による予測値を比較して示したグラフである。
【００４６】
図６（ａ）と図６（ｂ）は、異なるプロジェクトで開発したソフトウェアの障害実績値と障害予測値を示している。
【００４７】
グラフの“画面ＩＤ”の欄は、開発したソフトウェアの各画面に関連するソフトウェア部分を示している。各画面の棒グラフの棒の上側は障害の実績値、下側は本実施形態の予測モデルが算出した予測値を示している。
【００４８】
ソフトウェア開発において、画面ごとにソフトウェアのまとまりがよく、開発者も同じであることが多い。このため、全ソフトウェアから各画面に関連するソフトウェア部分を対象とすることにより、画面ごとに不具合の発生を説明でき、不具合発生数を予測することができる。
【００４９】
図６（ａ）に示すように、本実施形態の予測モデルによれば、最初の２画面で障害実績値と障害予測値が異なるが他の画面では障害実績値と障害予測値がほぼ一致している。図６（ｂ）では、多くの画面で障害実績値と障害予測値が異なるが、障害の数の傾向はほぼ一致している。
【００５０】
本発明の目的は、不具合が発生する可能性が高いソフトウェアを事前に予測して品質確保の工数を投入することにあるため、図６に示すように障害実績値と障害予測値の傾向が一致していることが重要である。障害が発生する可能性が高いソフトウェアを事前に予測できれば、そのソフトウェアに対して集中的に品質確保の工数をかけることができるからである。この点で、本実施形態の予測モデルが障害の発生の予測に十分機能を発揮することができると言える。
【００５１】
図７は、本発明のソフトウェア不具合予測装置１の出力の一例を示している。図７の出力画面は、説明変数依存度のウィンドウ１６と、ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅウィンドウ１７と、障害発生ウィンドウ１８を有している。
【００５２】
説明変数依存度のウィンドウ１６は、機械学習した説明変数への依存度を示している。説明変数依存度のウィンドウ１６のグラフの縦軸は説明変数を示し、横軸は説明変数の貢献度を示している。グラフに各説明変数の貢献度がプロットされている。
【００５３】
ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅウィンドウ１７は、説明変数の数ごとに、ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅと決定木の数との関係を示している。このグラフにより、安定した予測結果を得るための説明変数の数と決定木の数を把握することができる。
【００５４】
障害発生ウィンドウ１８は、ソフトウェアの不具合の障害実績数と障害予測数を比較可能に示した棒グラフを示している。
【００５５】
図８は、図７の画面の動作を示している。説明変数依存度のウィンドウ１６はさらに詳しい情報を提示することができるようになっている。たとえば、説明変数依存度のウィンドウ１６のステップ数１９の点は、図８の右下のようなグラフをポップアップで表示することができる。このグラフにより、ステップ数が１５０を超えると不具合発生数が急激に増加することが分かる。また、説明変数依存度のウィンドウ１６の循環複雑度２０の点は、図８の左下のようなグラフをポップアップで表示することができる。このグラフにより、循環複雑度が７５を超えると不具合発生数が急激に増加することが分かる。
【００５６】
以上の説明から分かるように、本発明によれば不具合発生をよく説明する説明変数を有する予測モデルを生成することができる。この予測モデルを使用することにより、開発したソフトウェアの不具合の発生を精度良く予測することができる。
【００５７】
上記の記載に基づいて、当業者であれば、本発明の追加の効果や種々の変形を想到できるかもしれないが、本発明の態様は、上述した実施形態に限定されるものではない。特許請求の範囲に規定された内容及びその均等物から導き出される本発明の概念的な思想と趣旨を逸脱しない範囲で種々の追加、変更及び部分的削除が可能である。
【符号の説明】
【００５８】
１  ソフトウェア不具合予測装置
２  障害予測自動化システム
３  リンクツール
４  コーティングツール
５  ソース管理ツール
６  経験的障害予測ツール
７  データ整形部
８  データ入力部
９  機械学習部
１０  予測部
１１  表示部
１２  機械学習ライブラリ
１３  ブートストラップサンプリングモジュール
１４  決定木生成モジュール
１５  評価モジュール
１６  説明変数依存度のウィンドウ
１７  ＯＯＢ  ｅｒｒｏｒ  ｒａｔｅウィンドウ
１８  障害発生ウィンドウ
１９  ステップ数
２０  循環複雑度
【図１】
2019194818.tif 000003
【図２】
2019194818.tif 000004
【図３】
2019194818.tif 000005
【図４】
2019194818.tif 000006
【図５】
2019194818.tif 000007
【図６】
2019194818.tif 000008
【図７】
2019194818.tif 000009
【図８】
2019194818.tif 000010