Commonality Analysis(日本語では共通性分析と呼ぶらしい)とは、一連のデータに潜む共通性を見つけ出すための解析です。そのため、状況によって解析のアプローチは様々ですが、今回は、複数ある製造工程において、収率に影響を与える工程を見つけ出すケースを扱います。
LOTID | STAGE_A | STAGE_B | STAGE_C | STAGE_D | STAGE_E | STAGE_F | YIELD |
---|---|---|---|---|---|---|---|
P01 | A01 | B01 | C01 | D01 | E01 | F01 | 94.08 |
P02 | A01 | B02 | C04 | D02 | E03 | F01 | 92.84 |
P03 | A02 | B03 | C01 | D01 | E01 | F03 | 96.52 |
P04 | A02 | B01 | C03 | D03 | E02 | F04 | 96.34 |
P05 | A02 | B03 | C02 | D02 | E03 | F01 | 94.11 |
P06 | A01 | B01 | C03 | D01 | E03 | F03 | 94.36 |
P07 | A03 | B02 | C02 | D02 | E01 | F04 | 93.14 |
P08 | A02 | B02 | C01 | D01 | E02 | F02 | 94.94 |
P09 | A03 | B03 | C02 | D03 | E03 | F04 | 96.33 |
P10 | A01 | B03 | C03 | D03 | E02 | F03 | 98.81 |
P11 | A03 | B01 | C01 | D01 | E01 | F02 | 96.13 |
P12 | A02 | B02 | C01 | D01 | E01 | F02 | 94.26 |
P13 | A01 | B02 | C04 | D02 | E01 | F02 | 92.06 |
P14 | A03 | B01 | C03 | D02 | E02 | F01 | 95.94 |
P15 | A03 | B03 | C02 | D02 | E03 | F04 | 98.62 |
P16 | A02 | B02 | C03 | D01 | E01 | F03 | 93.24 |
P17 | A01 | B01 | C04 | D03 | E01 | F03 | 94.23 |
P18 | A01 | B03 | C03 | D03 | E02 | F04 | 94.32 |
P19 | A02 | B03 | C02 | D02 | E03 | F01 | 96.16 |
P20 | A03 | B02 | C01 | D03 | E02 | F02 | 91.78 |
例題
ある製造工程において、最近の 20 ロット (LOTID) の製品収率 (YIELD) の結果が右表のようになりました。収率とは、製品の最終テストにおいて、良品としてパスした同一ロット中の製品比率のことで、単位は % です。
この製品の製造工程には、STEP_A から STEP_F までの 6 工程があり、それぞれの工程で複数の装置(A01, A02, A03 など)のどれかを使用しています。これら複数の装置は区別なく使用できるようになっています。右の表には、それぞれの工程で使用した装置の履歴も加えられています。
区別なく使用できる工程内の複数の装置は、処理性能が製造要求仕様を満たすような範囲に収まるように調整されていますが、全く同一の性能というわけではありません。また、仕様で規定していない特性や性能などについてズレがある場合もあります。
このような状況で、各工程の装置差(ここでは機差と呼ぶことにします)が収率に影響を与えていないかどうかを調査することが今回のテーマです。
このような機差解析をすることを Tool Commonality Analysis と呼んでいます。
とりあえず、収率 (YIELD) のトレンドチャートを作成して、ばらつき具合をみることにしましょう。
R を起動して、クリップボードにコピーした右表を、データフレーム tbl に取り込みます。
$ R R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet" ... (省略) ... 'q()' と入力すれば R を終了します。 > tbl <- read.table("clipboard", header = T) > tbl LOTID STAGE_A STAGE_B STAGE_C STAGE_D STAGE_E STAGE_F YIELD 1 P01 A01 B01 C01 D01 E01 F01 94.08 2 P02 A01 B02 C04 D02 E03 F01 92.84 3 P03 A02 B03 C01 D01 E01 F03 96.52 4 P04 A02 B01 C03 D03 E02 F04 96.34 5 P05 A02 B03 C02 D02 E03 F01 94.11 6 P06 A01 B01 C03 D01 E03 F03 94.36 7 P07 A03 B02 C02 D02 E01 F04 93.14 8 P08 A02 B02 C01 D01 E02 F02 94.94 9 P09 A03 B03 C02 D03 E03 F04 96.33 10 P10 A01 B03 C03 D03 E02 F03 98.81 11 P11 A03 B01 C01 D01 E01 F02 96.13 12 P12 A02 B02 C01 D01 E01 F02 94.26 13 P13 A01 B02 C04 D02 E01 F02 92.06 14 P14 A03 B01 C03 D02 E02 F01 95.94 15 P15 A03 B03 C02 D02 E03 F04 98.62 16 P16 A02 B02 C03 D01 E01 F03 93.24 17 P17 A01 B01 C04 D03 E01 F03 94.23 18 P18 A01 B03 C03 D03 E02 F04 94.32 19 P19 A02 B03 C02 D02 E03 F01 96.16 20 P20 A03 B02 C01 D03 E02 F02 91.78 >
次に、横軸に LOTID、縦軸に YIELD をとってトレンドチャートを作成します。
> plot(1:20, tbl$YIELD, xlab = "LOTID", ylab = "YIELD", type = "o", xaxt = "n") > axis(1, 1:20, tbl$LOTID, las = 2)
トレンドチャートをみて、収率が低いロットを抽出すると以下のようになります。
LOTID | STAGE_A | STAGE_B | STAGE_C | STAGE_D | STAGE_E | STAGE_F | YIELD |
---|---|---|---|---|---|---|---|
P02 | A01 | B02 | C04 | D02 | E03 | F01 | 92.84 |
P07 | A03 | B02 | C02 | D02 | E01 | F04 | 93.14 |
P13 | A01 | B02 | C04 | D02 | E01 | F02 | 92.06 |
P16 | A02 | B02 | C03 | D01 | E01 | F03 | 93.24 |
P20 | A03 | B02 | C01 | D03 | E02 | F02 | 91.78 |
各工程の処理装置を見比べると、STAGE_B の装置 B02 が収率の低いロットにおいて共通して使用されていることが判ります。この結果から、装置 B02 が収率に影響を与えていると結論できます。次のステップとして、工程 STAGE_B における装置 B02 の詳細な調査に入ることになるでしょう。
分散分析による Tool Commonality Analysis
今回の例では、トレンドチャートから低収率のロットを抜き出して整理することによって、共通する処理装置を容易に見つけ出すことができました。データが 20 ロット、6 工程程度であれば、あまり苦にならない作業かもしれませんが、工程やロットの数がもっと多くなれば、この方法では、なかなか大変な作業になりそうです。
そこで、一元配置の分散分析を利用して Tool Commonality Analysis をする方法を紹介します。下記のスクリプト commonality.R に示しました。このスクリプトでは、上記 20 ロットの収率データを CSV ファイルとして読み込むようにしています。そのため、その CSV ファイルは sample_commonality.csv.zip からダウンロードできるようにしてあります。
require("tcltk") ############################################################################### # pval.oneway ############################################################################### pval.oneway <- function(src, x.label, y.label) { tmp <- data.frame(X = src[, x.label], Y = src[, y.label]) result.test <- oneway.test(Y ~ X, data = tmp, var.equal = TRUE) return(result.test$p.value) } ############################################################################### # chart.boxplot ############################################################################### chart.boxplot <- function(src, x.val, y.val, gTitle = "", x.label = "", y.label = "") { tmp <- data.frame(x = src[, x.val], y = src[, y.val]) y_max <- max(tmp$y, na.rm = TRUE) y_min <- min(tmp$y, na.rm = TRUE) y.limit <- c(y_min, y_max) boxplot(y ~ x, data = tmp, ylim = y.limit, main = gTitle, xlab = x.label, ylab =y.label, col = "LightBlue", cex.main = 1, outcol = "Orchid") } ############################################################################### # MAIN ############################################################################### # READ CSV DATA file.name <-tclvalue(tkgetOpenFile(filetypes="{{CSV} {.csv}}", title = "Open CSV file")) tbl.data <- read.csv(file.name, header = T, as.is = T) # first column should be always LOTID # last column should be always YIELD n.col <- length(tbl.data) list.stage <- names(tbl.data)[2:(n.col - 1)] yield <- names(tbl.data)[n.col] # CHECK 1-WAY ANOVA df <- data.frame(STAGE = list.stage, P.VALUE = rep(1, length(list.stage))) for (stage in list.stage) { pval <- pval.oneway(tbl.data, stage, yield) df[df[, "STAGE"] == stage, "P.VALUE"] <- pval # SIGNIFICANT LEVEL: p-value < 0.02 if (pval < 0.02) { grpTitle <- paste(stage, "\np-value = ", format(pval, digits = 2)) chart.boxplot(tbl.data, stage, yield, grpTitle, "EQUIPMENT", "YIELD [%]") df[df[, "STAGE"] == stage, "SIG"] <- "*" } else { df[df[, "STAGE"] == stage, "SIG"] <- "" } } print(df)
実行例を下記に示します。R を起動して、source コマンドでスクリプトを読み込みます。
$ R R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet" ... (省略) ... 'q()' と入力すれば R を終了します。 > source("commonality.R") 要求されたパッケージ tcltk をロード中です
読み込む CSV ファイルを選択します。
各工程毎に、装置を因子(水準)とした収率の一元配置分散分析を実施します。
帰無仮説 H0 は、『工程 STAGE_X における装置 X01, X02 ... による処理によって、収率に差は生じない』になります。この例では、有意水準を 2% としています。p-value が 2% 未満の工程には、この工程の機差が収率に影響を与えている可能性を示すアスタリスク * を SIG (Significant) の列に付けています。
STAGE P.VALUE SIG 1 STAGE_A 0.678511601 2 STAGE_B 0.001784216 * 3 STAGE_C 0.239092024 4 STAGE_D 0.849674707 5 STAGE_E 0.435107778 6 STAGE_F 0.422098879 >
また、p-value が 2% 未満の工程については、装置別のボックスプロットが作成されます。
先の低収率のロットを抽出して分析した結論と同じく、分散分析でも STAGE_B における機差が収率に与える影響を無視できない(有意である)、という結果になりました。
分散分析を利用した Tool Commonality Analysis は、半導体デバイス製造のような長大な製造工程や、大量の生産ロットのデータ解析に威力を発揮します。定常的にこのようなチェックをすることで、収率に影響を与える機差を少なくする活動に繋げるためのシグナル(=機差が有意となる工程)を検出することができます。
ただし、この例のような装置の組み合わせは、あとで解析することを考慮して決められてはいない、ということに注意する必要があります。収率に対して装置の組み合わせが似ている(交絡している)工程で、どちらも有意になる可能性があります。この場合、どちらか、あるいは両方共、偽のシグナルになるかもしれません。しかし、詳細な調査を始めるための十分なヒントになるでしょう。
複数の工程の効果を分離して解析するためには、各因子の効果を分離できるように組み合わせが考慮された、すなわち、デザイン(計画)された、実験を行う必要があります。
しかし、実験計画法 (DOE) を量産ラインに適用するにはコストが掛かります。因子の交絡による偽シグナルがあることを認識した上で、今回のような Tool Commonality Analysis を繰り返すことで、真のシグナル(収率に影響を与える工程)を炙り出すというアプローチは、生産情報をそのまま利用する安価かつリアルタイムなアプローチと言えるかもしれません。
関連サイト