Advertisement

Rで実験計画法 後編

itoyan110
Sep. 12, 2012
Advertisement

More Related Content

Advertisement
Advertisement

Rで実験計画法 後編

  1. Rで実験計画法(後編) @ito_yan E-mail:1mail2itoh3@gmail.com 2012.04.28 Tokyo.R #22
  2. 2 はじめに • 所属する組織の意見・見解ではありません • つまらなかったら睡眠学習や復習に当てましょう • コメント歓迎します(メール、twitterも含めて) • 実験計画法を味わってみましょう
  3. 3 自己紹介 • Twitter ID : @ito_yan • 最近読んでる統計本 • 一般化線形モデル入門 • 統計解析入門(赤平) • Rに初めて触れて6年 • Rパッケージガイドブックの記事を書く
  4. 4 前編のキーワード • 一元配置 / 二元配置 • 因子による影響の有無を調べる • ラテン方格、グレコ・ラテン方格 • 多元配置よりもさらに効率よく実験するための表 • 交互作用 • 二元配置で見られる、組合せによる効果 • プーリング • 不要な因子はなかったものとして誤差に取り込む • 前回のスライドは下記URLを参照 • http://www.slideshare.net/itoyan110/r-9139125
  5. 5 今日の話題 • 二元配置から直交表へ • 直交表の性質 • 直交表による実験方法 • データの分解 • 交互作用の考慮 • 直交表のソフトウェアテストへの応用 • GUI画面のテスト • Rによる直交表生成
  6. 6 二元配置から直交表へ
  7. 7 復習:直交表とは • k水準の2因子からなる二元配置に、新たに組み込 めるk水準の因子はk-1個まで • k^2回の実験でk水準の因子がk+1個まで調べられる • k=p^s(pは素数、sは正の整数)の場合しか配置が知 られていない • k水準の因子がk+1個まで調べられる配置を整理し たものは直交表と呼ばれる • 注:因子ごとに水準数が異なる直交表もある
  8. 8 復習:因子の組込の例(k=3とした場合) • 二元配置の表に因子を組み込む • 3水準の因子なら(3-1)個まで組み込める • 3=3^1なので、組み込み可能である B1 B2 B3 B1 B2 B3 A1 C1 C2 C3 A1 C1D1 C2D3 C3D2 A2 C2 C3 C1 A2 C2D2 C3D1 C1D3 A3 C3 C1 C2 A3 C3D3 C1D2 C2D1
  9. 9 直交表として整理する A B C D B1 B2 B3 1 1 1 1 1 A1 C1D1 C2D3 C3D2 2 1 2 2 3 A2 C2D2 C3D1 C1D3 3 1 3 3 2 A3 C3D3 C1D2 C2D1 4 2 1 2 2 1つのセルが直交表の1行に 5 2 2 3 1 対応する 6 2 3 1 3 7 3 1 3 3 3^4=81回の実験が9回に減る 8 3 2 1 2 9 3 3 2 1
  10. 10 直交表の重要な性質 • 2列の水準の組合せがすべて同数出現する 1 2 3 4 5 6 7 1 2 3 4 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 2 2 1 2 2 3 3 1 2 2 1 1 2 2 3 1 3 3 2 4 1 2 2 2 2 1 1 4 2 1 2 2 5 2 1 2 1 2 1 2 5 2 2 3 1 6 2 1 2 2 1 2 1 6 2 3 1 3 7 2 2 1 1 2 2 1 7 3 1 3 3 8 2 2 1 2 1 1 2 8 3 2 1 2 9 3 3 2 1
  11. 11 なぜ直交表というのか? • 因子による水準の影響は平均0になると考える • 2水準の因子は+aと-aの影響を与える • 表の任意の2列を取ってきて内積をとると0 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)
  12. 12 直交表による実験方法
  13. 13 直交表を用いた実験計画の問題 • 2水準をもつ4つの因子(A~D)を設定し、製品の 強度実験を行いたい。必要な直交表は? • 因子は原材料の割合(3%と5%)、作業員熟練度(3 年目と10年目)など • 直交表のサイズ(実験回数)を見積もる • 水準が最も多い2因子の水準数の積 • Σ(各因子の水準数 - 1) + 1 (自由度に注目) • 上記の見積もりの結果はそれぞれ4、5となる • 5回以上実験する直交表で、2水準の4因子を組み 込めるのは
  14. 14 直交表を用いた実験例 • 因子を割り付けて実験を行った結果は次の通り • Aに原材料の割合、Bに熟練度…と割り当てる • 問題:有意な因子はA、B、C、Dのどれか? 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
  15. 15 データの分解(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
  16. 16 データの分解(2) • ベクトル形式で分解式を表現する データ 平均m 因子A 因子B 因子C 因子D 誤差項 40 35 -2 9 3 -6 1 46 35 -2 9 -3 6 1 28 35 -2 -9 3 6 -5 18 35 -2 -9 -3 -6 3 = + + + + + 32 35 2 -9 -3 6 1 26 35 2 -9 3 -6 1 32 35 2 9 -3 -6 -5 58 35 2 9 3 6 3
  17. 17 データの分解(3) • 全変動(全データの2乗和) • 平均変動 • 主効果(因子の効果) 合計10912 SSに一致 • 残差変動
  18. 18 データの分解(4) • 全変動は平均変動+因子の効果+残差変動 • 利用していない列の主効果の合計は残差変動 2 4 6 2 4 6 データ 水準1の平均 36 33 37 全体平均35 1 1 1 40 水準2の平均 34 37 33 1 2 2 46 2 1 2 28 2 2 1 18 1 1 1 32 1 2 2 26 2 1 2 32 つまり72 2 2 1 58
  19. 19 全変動の分解公式の導出 • x,yを直交するデータとすると、次式が成立 • 直交表に割り付けられた列は互いに直交 • 平均ベクトルと直交表に割り付けられた列も直交 全要素が同じ値 上の性質を拡張して、互いに直交するベクトル (x1~xn)について次式が成り立つ 左辺のデータの二乗和 データの各要素の二乗和 (全変動) (平均変動+主効果+残差変動)
  20. 20 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) BとDが有意な因子 result <- summary(aov(V~A+B+C+D,data=data)) と判断できる
  21. 21 カテゴリごとの平均の違い B、Dは平均を結ぶ 直線の傾きが大きい!
  22. 22 列の割当について • 先程は適当に1、3、5、7列を割り当てたが、仮に A、B、C、Dを1、2、3、4列目に割り当てると? • A=1、B=1の行はC=1のみになる A B C D →AとBの排他的論理和がC列に 1 1 1 1 (AとBが同じ値のときCは1、2とならない) 1 1 1 2 1 2 2 1 これは1列目と2列目の交互作用は3列目に 1 2 2 2 出ていることを示しており、交互作用を考慮 2 1 2 1 する際は列の割当に注意が必要である 2 1 2 2 では、どうやって交互作用列を見つけるか? 2 2 1 1 2 2 1 2
  23. 23 交互作用列の見つけ方 • 直交表とセットで与えられる以下の図表を利用する • 交互作用一覧表 • 線点図 • 4列目と2列目の交互作用 • 点は主効果 は6列目に出る • 点と点の間が交互作用 列 1 2 3 4 5 6 7 • 2列目と4列目の交互作用が6列目 (1) 3 2 5 4 7 6 2 (2) 1 6 7 4 5 3 7 (3) 7 6 5 4 6 (4) 1 2 3 (5) 3 2 1 5 4 (6) 1
  24. 24 交互作用がある場合の列の割当 • 因子A、B、C、Dと交互作用A×B、B×Cの列を割当 A B A D C 6 B データ B2 × × B C A×B 3 7 B×C 1 1 1 1 1 1 1 1 40 6 2 1 1 1 2 2 2 2 46 A1 5C 3 1 2 2 1 1 2 2 28 D4 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
  25. 25 交互作用を考慮した結果 • 仮にAとB、BとCに交互作用があるとして、同様 の実験を行うと、有意な因子はない(分析失敗) • F値が小さい(2以下)ものはプーリングして対処 • A、A:B、B:Cをプーリングの対象とする
  26. 26 直交表のソフトウェアテストへの適用
  27. 27 直交表とソフトウェアテスト • 直交表の目的 • 少ない実験で組み合わせを網羅する • ソフトウェアテストの目的 • 最小限のコストで実装された機能を網羅して バグを可能な限り見つける どちらも少ない試行回数で網羅しようとしている →ソフトウェアテストと直交表はよく似ている!
  28. 28 直交表がテストに利用できる根拠 • 事例研究による • 比較的小規模な開発であれば、2因子網羅で90% 以上のバグを検出できる • 詳しくは参考資料の論文を参照 • 1因子ずつの場合のバグの発見率がpなら(直交 表を利用して2因子の組合せの評価をすれば)そ れに比較してほぼp^2に期待される(田口玄一) • p^3のバグはほとんど0とみなしても差し支えない
  29. 29 直交表の応用例 • 例題 次のようなGUIをテストする手法を考えよう ユーザ登録画面 http://foo.bar.com/register.cgi ユーザ名 テキストボックス 性別 男性 女性 ラジオボタン 生年月日 2012 04 28 コンボボックス DM配信 希望する チェックボックス 登録する
  30. 30 テストにおける出力の分類 • 異常系 • 入力に対しエラーを出すべきもの • 例:年齢が-1歳、2月30日生まれ 登録ユーザ名に@`:|¥’)など • 正常系 • 入力に対しエラーを吐かずに終了するもの 直交表で扱うのは正常系のみ
  31. 31 直交表で利用する入力について • 正常系のみとする理由 • エラーを出す入力を直交表で扱うと、異常系のテス トケースばかりになる • 例えば、2水準のうち1つの水準でエラーメッセージが出る 因子を3つ用意し、直交表を利用してテストケースを作成 すると、87.5%は異常系になるため、正常系のテストがほ とんどできなくなる • バグがある場合、あるエラーが別のエラーを隠すと いったことが起きてしまう • 複数のエラーのうち、先にチェックした方だけが現れるた め、後半のチェックに関するテストができない
  32. 32 異常系のテスト • ドメイン分析テスト(右下の表に従いテストする) • 1つだけ境界値(on)、異常値(off)とし、 残りは正常値(in)とする 変数 タイプ 1 2 3 4 5 6 • 境界値分析の多変数版 on ○ a off ○ • バグの切り分けに使える in ○○○○ • 例題におけるテスト例 on ○ b off ○ • 2012/2/29、2012/2/30 in ○○ ○○ • ユーザ名が空 on ○ c off ○ in ○○○○ 結果
  33. 33 正常系テストにおける考え方(一例) • チェックボックス • チェックを入れる / 入れない (2通り) • ラジオボタン • 1つだけ選択する (2通り) • テキストボックス • 受け付ける入力(3通り) • コンボボックス • 代表値(2通り)
  34. 34 2因子網羅のテストケースを生成する • 複雑な直交表の列を手で作る? • 7水準など出てくると厄介 • ぎりぎりまで効率よく詰め込んだ表の作成は難しい • 数学的な理論(有限数学という分野)があるらしいが… • でもRユーザなら大丈夫! • DoE.baseパッケージで直交表を自動生成できる • 因子と水準名を与えるだけでよい Design of Experimentの略
  35. 35 Rによる生成例 全部試すと96通り、直交表では 24通り に減っている! 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 )
  36. 36 参考資料 • よくわかる実験計画法(著:中村 義作) • 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).
  37. 37 ご清聴ありがとうございました
  38. 38 補足: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)
  39. 39 補足:因子の割り付け技法 • 多水準化 • ある複数列とその交互作用の列をまとめる • 下の例では1~3列をまとめて4水準化している 1 2 3 4 5 6 7 1’ 4 5 6 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 2 2 1 2 2 2 2 3 1 2 2 1 1 2 2 3 2 1 1 2 2 4 1 2 2 2 2 1 1 4 2 2 2 1 1 5 2 1 2 1 2 1 2 5 3 1 2 1 2 6 2 1 2 2 1 2 1 6 3 2 1 2 1 7 2 2 1 1 2 2 1 7 4 1 2 2 1 8 2 2 1 2 1 1 2 8 4 2 1 1 2
  40. 40 補足:2水準系直交表の作り方(1) ①大きさを2倍にする 1 1 1 1 1 2 2 2 ②水準を均等に割り振った列をつける 1 1 2 1 1 1 1 1 2 2 2 1 2 2 2
  41. 41 補足:2水準系直交表の作り方(2) ③排他的論理和の結果を追加する 1 2 1 2 3 1 1 1 1 1 1 2 1 2 2 の直交表 2 1 2 1 2 2 2 2 2 1 ①~③を繰り返しにより、全因子が2水準である サイズが2^nとなる直交表が作成可能
Advertisement