2015-01-30

Commonality Analysis

Commonality Analysis(日本語では共通性分析と呼ぶらしい)とは、一連のデータに潜む共通性を見つけ出すための解析です。そのため、状況によって解析のアプローチは様々ですが、今回は、複数ある製造工程において、収率に影響を与える工程を見つけ出すケースを扱います。

LOTIDSTAGE_ASTAGE_BSTAGE_CSTAGE_DSTAGE_ESTAGE_FYIELD
P01A01B01C01D01E01F0194.08
P02A01B02C04D02E03F0192.84
P03A02B03C01D01E01F0396.52
P04A02B01C03D03E02F0496.34
P05A02B03C02D02E03F0194.11
P06A01B01C03D01E03F0394.36
P07A03B02C02D02E01F0493.14
P08A02B02C01D01E02F0294.94
P09A03B03C02D03E03F0496.33
P10A01B03C03D03E02F0398.81
P11A03B01C01D01E01F0296.13
P12A02B02C01D01E01F0294.26
P13A01B02C04D02E01F0292.06
P14A03B01C03D02E02F0195.94
P15A03B03C02D02E03F0498.62
P16A02B02C03D01E01F0393.24
P17A01B01C04D03E01F0394.23
P18A01B03C03D03E02F0494.32
P19A02B03C02D02E03F0196.16
P20A03B02C01D03E02F0291.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)

トレンドチャートをみて、収率が低いロットを抽出すると以下のようになります。

LOTIDSTAGE_ASTAGE_BSTAGE_CSTAGE_DSTAGE_ESTAGE_FYIELD
P02A01B02C04D02E03F0192.84
P07A03B02C02D02E01F0493.14
P13A01B02C04D02E01F0292.06
P16A02B02C03D01E01F0393.24
P20A03B02C01D03E02F0291.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 からダウンロードできるようにしてあります。

リスト:commonality.R 
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 を繰り返すことで、真のシグナル(収率に影響を与える工程)を炙り出すというアプローチは、生産情報をそのまま利用する安価かつリアルタイムなアプローチと言えるかもしれません。

関連サイト

  1. R-Source - 68. 多群の検定

 

0 件のコメント: