ソフトウェアテスト アドベントカレンダー 12/21担当のあさこです。
はじめに
テスト実施時には、バグが想定通り(?)に出ているかどうかのメトリクス分析を行う方は多いと思います。
割と、そこでベンチマークとして使われるのが、IPAから発行されているデータ白書。
参考:SEC BOOKS:ソフトウェア開発データ白書2016-2017:IPA 独立行政法人 情報処理推進機構
ここで多く使われているのが、二つのメトリクス(変数)を散布図で表し、回帰分析結果とその信頼区間(50%、95%)を算出したグラフです。
多くの企業が協力しているデータなので、ベンチマークには最適です。
以下例です。
出典:https://sec.ipa.go.jp/files/secbooks/000057880.pdf
自社にて、部門間ベンチマークを行う際にも同じようにできるといいですよね。
Excelで分析のできるツールがIPAで公開されており、サイトからダウンロードできますが、ツール内でどんなことをやっているか、気になりませんか?
内容を一部ご紹介します。
ぜひ、自社のデータでも試していただけると幸いです。
基本のおさらい
メトリクスを取得する目的と、メトリクスの間の関係式を微分方程式で示すことを簡単にまとめたブログです。
IPAのデータ白書で散布図を用いて分析・表現されているものには、いろいろなものがあります。
基本的には以下のメトリクスが挙げられます。
- 工数
- 工期
- 製造量(SLOC実績値)
- 累積不具合検出率
これらそれぞれの数値同志の相関をみて、その相関係数にて、上記ブログ内にある4つのタイプからその現象を説明する式を選択します。
今回ご紹介しようとする例は、
- 累積不具合検出率
- 製造量(SLOC実績値)
を使って考えていきましょう。
考え方
- 対象の二つのメトリクスの関係性をみる
- 1で求めた関係性を使用して回帰分析を行い、近似式を求める
- 2で求めた近似式をもとに、信頼区間式を求める
1.対象の二つのメトリクスの関係性をみる
「基本のおさらい」で取り上げました内容に従い、メトリクス同士がどの微分方程式の関係性の時が相関が高いかを見ます。
自社のデータをもとに試したときは、以下の4タイプのうち、4のものが多かったので、それをとりあげます。
2.1で求めた関係性を使用して回帰分析を行い、近似式を求める
回帰分析して求めた結果を使用する。
近似式の求め方は、Excelだとこんな感じ。中に書かれている値は、例です。
3.2で求めた近似式をもとに、信頼区間式を求める
数式で説明すると、こんな感じ。
Rでやってみた
- 回帰分析を行い、近似式を求める
- 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%の場合を両方求めてプロットしました。
いろいろとアレなので、メモリの数字などはとっぱらてありますw
さいごに
メトリクスは扱いを間違えるとアカンことになります。
我々の仕事で言えば、コンポーネントテストで見つかった不具合とシステムテストで見つかった不具合の件数を足したり、それらを合わせて使ってソフトウェア信頼度成長曲線を描くひとはいまだに多いですよ。
— あきやま🍻 (@akiyama924) 2017年12月20日
②について、例えば因数分解の問題で係数が違うだけとかなら、平均を取る意味はあると思います(教え方を変えた結果を測るなど)。
— あきやま🍻 (@akiyama924) 2017年12月20日
そうではなく、因数分解と確率計算の問題なら、それは①と同じく平均を取って比較するのは間違いだと思います。
取得方法が同一で、同じ単位。
— あさこ (@acha_821) 2017年12月20日
そういうものが同じ土俵で比較することができる、という原理に基づくなら、やっぱり違うテストレベルのバグ件数は足し合わせないほうがいいんだろうなあ。
ノイズとかそんな話ではないからなあ。
たまたま、この記事を書く前日にこんな感じのやり取りをしたので、参考までに。。
数値データの裏の背景などのにも目を向けて取得してつかわなきゃ~とおもいました。
ここまでお付き合いくださり、ありがとうございました!
*1:log10(TH)-log10(y_hat