rで実験計画法 後編
DESCRIPTION
This slide was presented in Tokyo.R #22.It describes about design of experiment with R. DoE.base package is useful for software testing because it makes easier for us to make orthogonal array.TRANSCRIPT
はじめに
•所属する組織の意見・見解ではありません
•つまらなかったら睡眠学習や復習に当てましょう
•コメント歓迎します(メール、twitterも含めて)
•実験計画法を味わってみましょう
2
自己紹介
• Twitter ID : @ito_yan
•最近読んでる統計本
•一般化線形モデル入門
•統計解析入門(赤平)
• Rに初めて触れて6年
• Rパッケージガイドブックの記事を書く
3
前編のキーワード
•一元配置 / 二元配置
•因子による影響の有無を調べる
•ラテン方格、グレコ・ラテン方格
•多元配置よりもさらに効率よく実験するための表
•交互作用
•二元配置で見られる、組合せによる効果
•プーリング
•不要な因子はなかったものとして誤差に取り込む
•前回のスライドは下記URLを参照
• http://www.slideshare.net/itoyan110/r-9139125
4
今日の話題
•二元配置から直交表へ
•直交表の性質
•直交表による実験方法
•データの分解
•交互作用の考慮
•直交表のソフトウェアテストへの応用
• GUI画面のテスト
• Rによる直交表生成
5
二元配置から直交表へ
6
復習:直交表とは
• k水準の2因子からなる二元配置に、新たに組み込めるk水準の因子はk-1個まで
• k^2回の実験でk水準の因子がk+1個まで調べられる
• k=p^s(pは素数、sは正の整数)の場合しか配置が知られていない
• k水準の因子がk+1個まで調べられる配置を整理したものは直交表と呼ばれる
•注:因子ごとに水準数が異なる直交表もある
7
復習:因子の組込の例(k=3とした場合)
•二元配置の表に因子を組み込む
• 3水準の因子なら(3-1)個まで組み込める
• 3=3^1なので、組み込み可能である
8
B1 B2 B3
A1 C1 C2 C3
A2 C2 C3 C1
A3 C3 C1 C2
B1 B2 B3
A1 C1D1 C2D3 C3D2
A2 C2D2 C3D1 C1D3
A3 C3D3 C1D2 C2D1
直交表として整理する A B C D
1 1 1 1 1
2 1 2 2 3
3 1 3 3 2
4 2 1 2 2
5 2 2 3 1
6 2 3 1 3
7 3 1 3 3
8 3 2 1 2
9 3 3 2 1
9
B1 B2 B3
A1 C1D1 C2D3 C3D2
A2 C2D2 C3D1 C1D3
A3 C3D3 C1D2 C2D1
1つのセルが直交表の1行に対応する
3^4=81回の実験が9回に減る
直交表の重要な性質
• 2列の水準の組合せがすべて同数出現する
10
1 2 3 4 5 6 7
1 1 1 1 1 1 1 1
2 1 1 1 2 2 2 2
3 1 2 2 1 1 2 2
4 1 2 2 2 2 1 1
5 2 1 2 1 2 1 2
6 2 1 2 2 1 2 1
7 2 2 1 1 2 2 1
8 2 2 1 2 1 1 2
1 2 3 4
1 1 1 1 1
2 1 2 2 3
3 1 3 3 2
4 2 1 2 2
5 2 2 3 1
6 2 3 1 3
7 3 1 3 3
8 3 2 1 2
9 3 3 2 1
なぜ直交表というのか?
•因子による水準の影響は平均0になると考える
• 2水準の因子は+aと-aの影響を与える
11
1 2
+a(1) +b(1)
+a(1) +b(1)
+a(1) -b(2)
+a(1) -b(2)
-a(2) +b(1)
-a(2) +b(1)
-a(2) -b(2)
-a(2) -b(2)
直交表は直交性を維持したまま、
できるだけ列を詰め込んだ表である
•表の任意の2列を取ってきて内積をとると0
•水準の組合せが同数あるため
•この状態を「直交性がある」という
直交表による実験方法
12
直交表を用いた実験計画の問題
• 2水準をもつ4つの因子(A~D)を設定し、製品の強度実験を行いたい。必要な直交表は?
•因子は原材料の割合(3%と5%)、作業員熟練度(3
年目と10年目)など
•直交表のサイズ(実験回数)を見積もる
•水準が最も多い2因子の水準数の積
• Σ(各因子の水準数 - 1) + 1 (自由度に注目)
•上記の見積もりの結果はそれぞれ4、5となる
• 5回以上実験する直交表で、2水準の4因子を組み込めるのは
13
直交表を用いた実験例
•因子を割り付けて実験を行った結果は次の通り
• Aに原材料の割合、Bに熟練度…と割り当てる
•問題:有意な因子はA、B、C、Dのどれか?
14
A 2 B 4 C 6 D データ
1 1 1 1 1 1 1 1 40
2 1 1 1 2 2 2 2 46
3 1 2 2 1 1 2 2 28
4 1 2 2 2 2 1 1 18
5 2 1 2 1 2 1 2 32
6 2 1 2 2 1 2 1 26
7 2 2 1 1 2 2 1 32
8 2 2 1 2 1 1 2 58
データの分解(1)
•基本は二元配置などと同じ
•データを平均、因子の効果、誤差に分解する
•平均
• m = (40+46+28+18+32+26+32+58)/8 = 35
•因子Aの効果
• a1 = (40+46+28+18)/4 - m = -2
• a2 = (32+26+32+58)/4 - m = 2
•他の因子も同様にして計算する
• b1 = 9, b2=-9, c1=3, c2=-3, d1=-6, d2=6
15
データの分解(2)
•ベクトル形式で分解式を表現する
16
40
46
28
18
32
26
32
58
35
35
35
35
35
35
35
35
-2
-2
-2
-2
2
2
2
2
9
9
-9
-9
-9
-9
9
9
3
-3
3
-3
-3
3
-3
3
-6
6
6
-6
6
-6
-6
6
1
1
-5
3
1
1
-5
3
+ + + + + =
データ 平均m 因子A 因子B 因子C 因子D 誤差項
データの分解(3)
•全変動(全データの2乗和)
•平均変動
•主効果(因子の効果)
•残差変動
17
合計10912
SSに一致
データの分解(4)
•全変動は平均変動+因子の効果+残差変動
•利用していない列の主効果の合計は残差変動
18
2 4 6 データ
1 1 1 40
1 2 2 46
2 1 2 28
2 2 1 18
1 1 1 32
1 2 2 26
2 1 2 32
2 2 1 58
2 4 6
水準1の平均 36 33 37
水準2の平均 34 37 33
全体平均35
つまり72
全変動の分解公式の導出
• x,yを直交するデータとすると、次式が成立
•直交表に割り付けられた列は互いに直交
•平均ベクトルと直交表に割り付けられた列も直交
19
上の性質を拡張して、互いに直交するベクトル(x1~xn)について次式が成り立つ
左辺のデータの二乗和
(全変動)
データの各要素の二乗和
(平均変動+主効果+残差変動)
全要素が同じ値
Rによる分析
A <- paste("A",c(1,1,1,1,2,2,2,2),sep="")
B <- paste("B",c(1,1,2,2,2,2,1,1),sep="")
C <- paste("C",c(1,2,1,2,2,1,2,1),sep="")
D <- paste("D",c(1,2,2,1,2,1,1,2),sep="")
V <- c(40,46,28,18,32,26,32,58)
data <- data.frame(A=A,B=B,C=C,D=D,V=V)
result <- summary(aov(V~A+B+C+D,data=data))
20
BとDが有意な因子と判断できる
二元配置分散分析と同様にできる!
カテゴリごとの平均の違い
21
B、Dは平均を結ぶ
直線の傾きが大きい!
列の割当について
•先程は適当に1、3、5、7列を割り当てたが、仮にA、B、C、Dを1、2、3、4列目に割り当てると?
• A=1、B=1の行はC=1のみになる
→AとBの排他的論理和がC列に
(AとBが同じ値のときCは1、2とならない)
22
A B C D
1 1 1 1
1 1 1 2
1 2 2 1
1 2 2 2
2 1 2 1
2 1 2 2
2 2 1 1
2 2 1 2
これは1列目と2列目の交互作用は3列目に
出ていることを示しており、交互作用を考慮する際は列の割当に注意が必要である
では、どうやって交互作用列を見つけるか?
交互作用列の見つけ方
•交互作用一覧表
• 4列目と2列目の交互作用は6列目に出る
•線点図
• 点は主効果
• 点と点の間が交互作用
• 2列目と4列目の交互作用が6列目
23
列 1 2 3 4 5 6 7
(1) 3 2 5 4 7 6
(2) 1 6 7 4 5
(3) 7 6 5 4
(4) 1 2 3
(5) 3 2
(6) 1
•直交表とセットで与えられる以下の図表を利用する
1
3
6
4
2
7
5
交互作用がある場合の列の割当
•因子A、B、C、Dと交互作用A×B、B×Cの列を割当
24
1
3 6
4
2
7
5 A
B
C D
A×B B×C
A B A
×B
D C 6 B
×C
データ
1 1 1 1 1 1 1 1 40
2 1 1 1 2 2 2 2 46
3 1 2 2 1 1 2 2 28
4 1 2 2 2 2 1 1 18
5 2 1 2 1 2 1 2 32
6 2 1 2 2 1 2 1 26
7 2 2 1 1 2 2 1 32
8 2 2 1 2 1 1 2 58
点の位置に主効果、
線の位置に交互作用
を配置する
交互作用を考慮した結果
•仮にAとB、BとCに交互作用があるとして、同様の実験を行うと、有意な因子はない(分析失敗)
• F値が小さい(2以下)ものはプーリングして対処
• A、A:B、B:Cをプーリングの対象とする
25
直交表のソフトウェアテストへの適用
26
直交表とソフトウェアテスト
•直交表の目的
•少ない実験で組み合わせを網羅する
•ソフトウェアテストの目的
•最小限のコストで実装された機能を網羅して
バグを可能な限り見つける
どちらも少ない試行回数で網羅しようとしている
→ソフトウェアテストと直交表はよく似ている!
27
直交表がテストに利用できる根拠
•事例研究による
•比較的小規模な開発であれば、2因子網羅で90%
以上のバグを検出できる
• 詳しくは参考資料の論文を参照
• 1因子ずつの場合のバグの発見率がpなら(直交表を利用して2因子の組合せの評価をすれば)それに比較してほぼp^2に期待される(田口玄一)
• p^3のバグはほとんど0とみなしても差し支えない
28
直交表の応用例
•例題
次のようなGUIをテストする手法を考えよう
29
男性 女性
ユーザ登録画面
性別
ユーザ名
登録する
生年月日 2012 04 28
DM配信 希望する
http://foo.bar.com/register.cgi
テキストボックス
ラジオボタン
コンボボックス
チェックボックス
テストにおける出力の分類
•異常系
•入力に対しエラーを出すべきもの
• 例:年齢が-1歳、2月30日生まれ
登録ユーザ名に@`:|¥’)など
•正常系
•入力に対しエラーを吐かずに終了するもの
30
直交表で扱うのは正常系のみ
直交表で利用する入力について
•正常系のみとする理由
•エラーを出す入力を直交表で扱うと、異常系のテストケースばかりになる
• 例えば、2水準のうち1つの水準でエラーメッセージが出る因子を3つ用意し、直交表を利用してテストケースを作成すると、87.5%は異常系になるため、正常系のテストがほとんどできなくなる
•バグがある場合、あるエラーが別のエラーを隠すといったことが起きてしまう
• 複数のエラーのうち、先にチェックした方だけが現れるため、後半のチェックに関するテストができない
31
異常系のテスト
•ドメイン分析テスト(右下の表に従いテストする)
• 1つだけ境界値(on)、異常値(off)とし、
残りは正常値(in)とする
•境界値分析の多変数版
• バグの切り分けに使える
•例題におけるテスト例
• 2012/2/29、2012/2/30
•ユーザ名が空
32
変数 タイプ 1 2 3 4 5 6
a
on ○
off ○
in ○ ○ ○ ○
b
on ○
off ○
in ○ ○ ○ ○
c
on ○
off ○
in ○ ○ ○ ○
結果
正常系テストにおける考え方(一例)
•チェックボックス
•チェックを入れる / 入れない (2通り)
•ラジオボタン
• 1つだけ選択する (2通り)
•テキストボックス
•受け付ける入力(3通り)
•コンボボックス
•代表値(2通り)
33
2因子網羅のテストケースを生成する
•複雑な直交表の列を手で作る?
• 7水準など出てくると厄介
•ぎりぎりまで効率よく詰め込んだ表の作成は難しい
• 数学的な理論(有限数学という分野)があるらしいが…
•でもRユーザなら大丈夫!
• DoE.baseパッケージで直交表を自動生成できる
• 因子と水準名を与えるだけでよい
34
Design of Experimentの略
Rによる生成例
library("DoE.base")
name <- c("sato","SUZUKI","takahasi")
gender <- c("male","female")
year <- c("1980","1965")
month <- c("3","12")
day <- c("5","28")
mail <- c("YES","NO")
oaTable <- oa.design(
factor.names=list(name=name,
gender=gender,year=year,
month=month,day=day,mail=mail),
seed=1
)
35
全部試すと96通り、直交表では24通り に減っている!
参考資料
• よくわかる実験計画法(著:中村 義作)
• Rと分散分析(金明哲先生のWebページ)
• http://mjin.doshisha.ac.jp/R/12.html
• 直交表によるソフトウェアテスト 『HAYST法』の解説と学習
• http://www.geocities.jp/ka_hayst/hayst.pdf
• D.Richard Kuhn et al. : “Software Fault Interactions and
Implications for Software Testing”, IEEE TRANSACTIONS
ON SOFTWARE ENGINEERING, VOL. 30, NO. 6,pp.418-
421 (JUN. 2004).
36
ご清聴ありがとうございました
37
補足:21枚目のグラフを描画するコード A <- paste("A",c(1,1,1,1,2,2,2,2),sep="")
B <- paste("B",c(1,1,2,2,2,2,1,1),sep="")
C <- paste("C",c(1,2,1,2,2,1,2,1),sep="")
D <- paste("D",c(1,2,2,1,2,1,1,2),sep="")
V <- c(40,46,28,18,32,26,32,58)
data <- data.frame(A=A,B=B,C=C,D=D,V=V) # スライド中の強度実験データ
result <- summary(aov(V~A+B+C+D,data=data))
rng <- range(V) # 描画範囲を全部のグラフで設定しておく
f <- function(fac, val, rng){
res <- aggregate(val, by = list(fac) , FUN = mean )
p <- par(cex=1,mai=c(0.8,0.6,0.6,0.3))
plot(fac,val,ylim=rng,type="n")
par(p)
lines(res[,1],res[,2],col="red",lwd=5)
}
oldpar <- par(mfrow=c(2,2))
lapply(data[,1:4], f, data$V, rng)
par(oldpar)
38
補足:因子の割り付け技法
•多水準化
•ある複数列とその交互作用の列をまとめる
•下の例では1~3列をまとめて4水準化している
39
1 2 3 4 5 6 7
1 1 1 1 1 1 1 1
2 1 1 1 2 2 2 2
3 1 2 2 1 1 2 2
4 1 2 2 2 2 1 1
5 2 1 2 1 2 1 2
6 2 1 2 2 1 2 1
7 2 2 1 1 2 2 1
8 2 2 1 2 1 1 2
1’ 4 5 6 7
1 1 1 1 1 1
2 1 2 2 2 2
3 2 1 1 2 2
4 2 2 2 1 1
5 3 1 2 1 2
6 3 2 1 2 1
7 4 1 2 2 1
8 4 2 1 1 2
補足:2水準系直交表の作り方(1)
40
1 2
1 1
1 2
2 1
2 2
①大きさを2倍にする
1
1
1
2
2
1
1
2
②水準を均等に割り振った列をつける
1
1
1
2
2
補足:2水準系直交表の作り方(2)
③排他的論理和の結果を追加する
41
1 2
1 1
1 2
2 1
2 2
1 2 3
1 1 1
1 2 2
2 1 2
2 2 1
①~③を繰り返しにより、全因子が2水準である
サイズが2^nとなる直交表が作成可能
の直交表