今回は 3 因子の実験です。因子数と水準数が増えると実験数は飛躍的に大きくなりますので、まずは繰り返し実験がなく、水準数を 2 にしたシンプルな例を取り上げます。
3 因子 2 水準の実験(繰り返しなし)
条件 | 温度 | 流量 | 回転数 | 収率 |
1 | 1低 | 1小 | 1低 | 81.08 |
2 | 1低 | 1小 | 2高 | 80.66 |
3 | 1低 | 2大 | 1低 | 80.73 |
4 | 1低 | 2大 | 2高 | 76.14 |
5 | 2高 | 1小 | 1低 | 83.39 |
6 | 2高 | 1小 | 2高 | 81.98 |
7 | 2高 | 2大 | 1低 | 83.83 |
8 | 2高 | 2大 | 2高 | 78.81 |
例)
ある製品の製造工程において、「温度」、「流量」、「回転数」の 3 つの因子が収量に影響を与えるかどうかを調べるため、2 水準の実験を計画し、各条件の収量を測定した結果を右に示した。この 3 因子が収量に及ぼす影響を分析せよ。ただし、過去の知見から「流量」と「回転数」には交互作用のあることが判っているものとする。
右のテーブル全体を選択して(クリップボードへ)コピーしてから、R 上で次のコマンドを実行してください。クリップボードの値が R のデータフレーム(テーブル)へ読み込まれます。
> tbl <- read.table("clipboard", header = T)
>
因子「流量」と「回転数」の間には交互作用が存在するとして、aov() 関数で分散分析をしてみましょう。
> result.aov <- aov(収率 ~ 温度 + 流量 * 回転数, data = tbl)
> summary(result.aov)
Df Sum Sq Mean Sq F value Pr(>F)
温度 1 11.045 11.045 38.36 0.00848 **
流量 1 7.220 7.220 25.08 0.01533 *
回転数 1 16.359 16.359 56.82 0.00484 **
流量:回転数 1 7.566 7.566 26.28 0.01437 *
Residuals 3 0.864 0.288
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
「収率」に対する各主因子と交互作用因子による影響の差は、有意水準 5% で有意であるという結果になりました。
各水準の平均
model.tables() で、各水準の "平均値" を算出します。
> mm <- model.tables(result.aov, type = "mean")
> mm
Tables of means
Grand mean
80.8275
温度
温度
1低 2高
79.65 82.00
流量
流量
1小 2大
81.78 79.88
回転数
回転数
1低 2高
82.26 79.40
流量:回転数
回転数
流量 1低 2高
1小 82.23 81.32
2大 82.28 77.47
>
上記の数字をグラフにしてみます。
> ylist <- c(mm$tables$温度, mm$tables$流量, mm$tables$回転数, mm$tables$"流量: 回転数")
> plot(0, 0, xlim = c(1, 8), ylim = c(min(ylist), max(ylist)), xaxt = "n", xlab = "", ylab="収 率")
> points(1:6, c(mm$tables$温度, mm$tables$流量, mm$tables$回転数), cex = 2, pch = 16)
> lines(1:2, mm$tables$温度)
> axis(1, at = 1:2, c(names(mm$tables$温度)))
> axis(1, at = 1.5, "温度", tick = F, padj = 1.5)
> lines(3:4, mm$tables$流量)
> axis(1, at = 3:4, c(names(mm$tables$流量)))
> axis(1, at = 3.5, "流量", tick = F, padj = 1.5)
> lines(5:6, mm$tables$回転数)
> axis(1, at = 5:6, c(names(mm$tables$回転数)))
> axis(1, at = 5.5, "回転数", tick = F, padj = 1.5)
> points(7:8, c(mm$tables$"流量:回転数"[1, ]), cex = 2, pch = 0)
> lines(7:8, mm$tables$"流量:回転数"[1, ], lty = 2)
> points(7:8, c(mm$tables$"流量:回転数"[2, ]), cex = 2, pch = 2)
> lines(7:8, mm$tables$"流量:回転数"[2, ], lty = 2)
> axis(1, at = 7:8, c(names(mm$tables$"流量:回転数"[1, ])))
> axis(1, at = 7.5, "(回転数)", tick = F, padj = 1.5)
> axis(1, at = 7.5, "流量×回転数", tick = F, padj = 3)
> text(7.5, mm$tables$"流量:回転数"[1, 2] + 0.5, labels = "(流量)1小")
> text(7.5, mm$tables$"流量:回転数"[2, 2] + 0.5, labels = "(流量)1大")
>
ここで各水準の "平均値" について、データフレーム tbl を使って、いくつか検算をしておきましょう。
まず Grand mean ですが、これは単純に、全収率の平均値(全平均)になります。
> gm <-mean(tbl$収率)
[1] 80.8275
次に、3 因子の各水準の平均ですが、例えば、因子「温度」の場合、次のように算出します。他の因子も同じように算出します。
> mean(tbl[tbl$温度 == "1低", "収率"])
[1] 79.6525
> mean(tbl[tbl$温度 == "2高", "収率"])
[1] 82.0025
因子「流量」と「回転数」の交互作用については、次のような計算になります。
> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "1低"), "収率"])
[1] 82.235
> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "2高"), "収率"])
[1] 81.32
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "1低"), "収率"])
[1] 82.28
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "2高"), "収率"])
[1] 77.475
>
効果の算出
model.tables() で、各水準の "効果" を算出します。
> ee <- model.tables(result.aov, type = "effects")
> ee
Tables of effects
温度
温度
1低 2高
-1.175 1.175
流量
流量
1小 2大
0.95 -0.95
回転数
回転数
1低 2高
1.43 -1.43
流量:回転数
回転数
流量 1低 2高
1小 -0.9725 0.9725
2大 0.9725 -0.9725
>
効果の方も、収率の平均と同じようにグラフにしてみます。
> ylist <- c(ee$tables$温度, ee$tables$流量, ee$tables$回転数, ee$tables$"流量:回転数")
> plot(0, 0, xlim = c(1, 8), ylim = c(min(ylist), max(ylist)), xaxt = "n", xlab = "", ylab="要 因 効 果")
> points(1:6, c(ee$tables$温度, ee$tables$流量, ee$tables$回転数), cex = 2, pch = 16)
> lines(1:2, ee$tables$温度)
> axis(1, at = 1:2, c(names(ee$tables$温度)))
> axis(1, at = 1.5, "温度", tick = F, padj = 1.5)
> lines(3:4, ee$tables$流量)
> axis(1, at = 3:4, c(names(ee$tables$流量)))
> axis(1, at = 3.5, "流量", tick = F, padj = 1.5)
> lines(5:6, ee$tables$回転数)
> axis(1, at = 5:6, c(names(ee$tables$回転数)))
> axis(1, at = 5.5, "回転数", tick = F, padj = 1.5)
> points(7:8, c(ee$tables$"流量:回転数"[1, ]), cex = 2, pch = 0)
> lines(7:8, ee$tables$"流量:回転数"[1, ], lty = 2)
> points(7:8, c(ee$tables$"流量:回転数"[2, ]), cex = 2, pch = 2)
> lines(7:8, ee$tables$"流量:回転数"[2, ], lty = 2)
> axis(1, at = 7:8, c(names(ee$tables$"流量:回転数"[1, ])))
> axis(1, at = 7.5, "(回転数)", tick = F, padj = 1.5)
> axis(1, at = 7.5, "流量×回転数", tick = F, padj = 3)
> text(7, ee$tables$"流量:回転数"[1, 1] * 1.1, labels = "(流量)1小")
> text(7, ee$tables$"流量:回転数"[2, 1] * 1.1, labels = "(流量)1大")
> abline(h = 0)
>
ここで各水準の "効果" についても "平均値" のときと同様に、データフレーム tbl を使って、いくつか検算をしておきましょう。
主効果については、各水準の平均から全平均を引いた値を効果としています。以下は、因子「流量」と「回転数」における、各水準の効果の算出例です。
> eff.flow_s <- mean(tbl[tbl$流量 == "1小", "収率"]) - gm
> eff.flow_s
[1] 0.95
> eff.flow_l <- mean(tbl[tbl$流量 == "2大", "収率"]) - gm
> eff.flow_l
[1] -0.95
> eff.rpm_l <- mean(tbl[tbl$回転数 == "1低", "収率"]) - gm
> eff.rpm_l
[1] 1.43
> eff.rpm_h <- mean(tbl[tbl$回転数 == "2高", "収率"]) - gm
> eff.rpm_h
[1] -1.43
交互効果については、各水準の平均から全平均を引いた値から、さらに、各主効果の該当する水準の効果を差し引いた値を、効果としています。因子「流量」と「回転数」の交互効果の算出例です。
> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "1低"), "収率"]) - gm - eff.flow_s - eff.rpm_l
[1] -0.9725
> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "2高"), "収率"]) - gm - eff.flow_s - eff.rpm_h
[1] 0.9725
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "1低"), "収率"]) - gm - eff.flow_l - eff.rpm_l
[1] 0.9725
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "2高"), "収率"]) - gm - eff.flow_l - eff.rpm_h
[1] -0.9725
>