バグの妥当な検出率?〜IPAのデータ白書と信頼区間とR〜

ソフトウェアテスト アドベントカレンダー 12/21担当のあさこです。

qiita.com

  

はじめに

テスト実施時には、バグが想定通り(?)に出ているかどうかのメトリクス分析を行う方は多いと思います。

割と、そこでベンチマークとして使われるのが、IPAから発行されているデータ白書。

参考:SEC BOOKS:ソフトウェア開発データ白書2016-2017:IPA 独立行政法人 情報処理推進機構

  

ここで多く使われているのが、二つのメトリクス(変数)を散布図で表し、回帰分析結果とその信頼区間(50%、95%)を算出したグラフです。

多くの企業が協力しているデータなので、ベンチマークには最適です。

以下例です。

f:id:okandayo:20171221060150p:plain

出典:https://sec.ipa.go.jp/files/secbooks/000057880.pdf

  

自社にて、部門間ベンチマークを行う際にも同じようにできるといいですよね。

Excelで分析のできるツールがIPAで公開されており、サイトからダウンロードできますが、ツール内でどんなことをやっているか、気になりませんか?

 内容を一部ご紹介します。

ぜひ、自社のデータでも試していただけると幸いです。

  

基本のおさらい

 メトリクスを取得する目的と、メトリクスの間の関係式を微分方程式で示すことを簡単にまとめたブログです。

 

okandayo.hatenablog.com

 

 IPAのデータ白書で散布図を用いて分析・表現されているものには、いろいろなものがあります。

基本的には以下のメトリクスが挙げられます。

  • 工数
  • 工期
  • 製造量(SLOC実績値)
  • 累積不具合検出率

 これらそれぞれの数値同志の相関をみて、その相関係数にて、上記ブログ内にある4つのタイプからその現象を説明する式を選択します。

 今回ご紹介しようとする例は、

  • 累積不具合検出率
  • 製造量(SLOC実績値)

を使って考えていきましょう。

 

考え方

  1. 対象の二つのメトリクスの関係性をみる
  2. 1で求めた関係性を使用して回帰分析を行い、近似式を求める
  3. 2で求めた近似式をもとに、信頼区間式を求める

 

1.対象の二つのメトリクスの関係性をみる

「基本のおさらい」で取り上げました内容に従い、メトリクス同士がどの微分方程式の関係性の時が相関が高いかを見ます。

自社のデータをもとに試したときは、以下の4タイプのうち、4のものが多かったので、それをとりあげます。

 

f:id:okandayo:20171221042927p:plain

 

2.1で求めた関係性を使用して回帰分析を行い、近似式を求める

回帰分析して求めた結果を使用する。

近似式の求め方は、Excelだとこんな感じ。中に書かれている値は、例です。

 

f:id:okandayo:20171221050120p:plain

 

 

3.2で求めた近似式をもとに、信頼区間式を求める

 数式で説明すると、こんな感じ。

f:id:okandayo:20171221051410p:plain

  

Rでやってみた

  1.  回帰分析を行い、近似式を求める
  2. 1で求めた近似式をもとに、信頼区間式を求める

 

0. 準備

# ①データの読み込み
WhitePaper.data <- read.csv("testdata.csv", header=T)
head(WhitePaper.data) #読み込んだデータを確認
LIN <- WhitePaper.data$Line
TH <- WhitePaper.data$TotalBug

#②散布図のプロット

 plot(log10(LIN),log10(TH)) # 生産量(LIN)と総工数(TH)

 #③回帰分析

 # lm関数に、説明変数をLIN、被説明変数をTHとして代入

result <- lm(log10(TH) ~ log10(LIN))

 

1. 回帰分析を行い、近似式を求める

# 分析結果の要約
summary(result)
abline(result) # 回帰直線を描く

#④対数スケール(回帰直線)⇒もとのスケール(回帰曲線)にもどしてグラフを描く(データを重ねがき) #####
##summary(result) の結果から係数をもってくる。
# 回帰分析の結果 log10(y) = 2.4615 + (0.8331)*log10(x) より

x <- 0.01*c(0:7000)
prediction <- 10^(2.4615)*x^(0.8331)
plot(x, prediction , col=2,type="l", xlim=c(0,70), ylim=c(0,11000),
xlab="", ylab="", main="")
par(new=TRUE)
plot(LIN, TH, col=4, xlim=c(0,70), ylim=c(0,11000),
xlab="LIN", ylab="TH", main="")

 

2. 1で求めた近似式をもとに、信頼区間式を求める

 ###### 信頼区間
alp2 <- 0.05 # 有意水準alp/2 ⇒ 信頼係数1-alp ⇒ 95%信頼区間のとき alp=1-0.95

# 95% のとき alp2 <- 0.025
# 90% のとき alp2 <- 0.05
# 50% のとき alp2 <- 0.25

n <- length(LIN) # データ数
bar_log <- sum(log10(LIN))/n
y_hat <- 10^(2.4615)*LIN^(0.8331)

# 残差分散の平方根
s <- sqrt( 1/(n-2)*sum*1^2) ) 

### 信頼区間の計算
C <- sqrt( 1/n+(log10(x)-bar_log)^2/sum((log10(LIN)-bar_log)^2) )

K <- 0.8331*log10(x)+2.4615 + qt(1-alp2,n-2)*s*C
confidence_U <- 10^K

K <- 0.8331*log10(x)+2.4615 - qt(1-alp2,n-2)*s*C
confidence_L <- 10^K

plot(x, confidence_U, col=3,type="l", xlim=c(0,70), ylim=c(0,11000),
xlab="", ylab="", main="")
par(new=TRUE)

plot(x, confidence_L , col=3,type="l", xlim=c(0,70), ylim=c(0,11000),
xlab="", ylab="", main="")
par(new=TRUE)

 

結果

信頼区間95%の時と、50%の場合を両方求めてプロットしました。

f:id:okandayo:20171221052909p:plain

いろいろとアレなので、メモリの数字などはとっぱらてありますw

 

 さいごに

 メトリクスは扱いを間違えるとアカンことになります。

 

 

 

たまたま、この記事を書く前日にこんな感じのやり取りをしたので、参考までに。。

数値データの裏の背景などのにも目を向けて取得してつかわなきゃ~とおもいました。

 

ここまでお付き合いくださり、ありがとうございました!

 

*1:log10(TH)-log10(y_hat