First we will monitor: Number of defects per wafer

In semiconductor manufacturing, wafers are produced in batches, and each wafer contains hundreds or even thousands of individual chips. During the production process, defects can occur such as dust landing on the wafer, or misalignment during lithography. These defects can affect performance or yield of the chips.

Wafer inspection is generally done insome variant of: 1. capture high-res images of wafer surface; 2. use computer vision to detect and measure particles on the wafer’s surface; 3. compare the defects against a standard/ threshold; 4. count the number of defects that breach the threshold.

Our data consists of 100 inspected wafers sampled in the past. These samples will be used to establish in-control limits on the number of defects per wafer.

library(qcc)
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
#c Charts - Wafer Defects ... number of defects on wafer
n_defects_retro <- read.csv("wafer_defect_retrospective.csv", header = TRUE)
qcc(data=n_defects_retro,type="c") #C-chart first trial

## List of 11
##  $ call      : language qcc(data = n_defects_retro, type = "c")
##  $ type      : chr "c"
##  $ data.name : chr "n_defects_retro"
##  $ data      : int [1:99, 1] 1 7 3 4 2 1 4 4 1 2 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named int [1:99] 1 7 3 4 2 1 4 4 1 2 ...
##   ..- attr(*, "names")= chr [1:99] "1" "2" "3" "4" ...
##  $ sizes     : int [1:99] 1 1 1 1 1 1 1 1 1 1 ...
##  $ center    : num 3
##  $ std.dev   : num 1.73
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 8.2
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"

From our initial analysis, all the samples are in-control and the upper in-control limit (UCL) = 8.196152. Of note the in-control center line is 3 i.e there are on average three (3) defects on a wafer (kinda good, but this depends on who you ask).

With this information, we will use the established in-control limits to monitor the manufacturing process - i.e. we will sample 30 wafers from the current (or online) manufacturing process.

n_defects_online <- read.csv("wafer_defect_online.csv", header = TRUE)


qcc(data=n_defects_retro,type="c",
    newdata=n_defects_online) #add online data to in-control c chart

## List of 15
##  $ call        : language qcc(data = n_defects_retro, type = "c", newdata = n_defects_online)
##  $ type        : chr "c"
##  $ data.name   : chr "n_defects_retro"
##  $ data        : int [1:99, 1] 1 7 3 4 2 1 4 4 1 2 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics  : Named int [1:99] 1 7 3 4 2 1 4 4 1 2 ...
##   ..- attr(*, "names")= chr [1:99] "1" "2" "3" "4" ...
##  $ sizes       : int [1:99] 1 1 1 1 1 1 1 1 1 1 ...
##  $ center      : num 3
##  $ std.dev     : num 1.73
##  $ newstats    : Named int [1:29] 1 3 3 2 3 2 3 0 2 4 ...
##   ..- attr(*, "names")= chr [1:29] "100" "101" "102" "103" ...
##  $ newdata     : int [1:29, 1] 1 3 3 2 3 2 3 0 2 4 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ newsizes    : int [1:29] 1 1 1 1 1 1 1 1 1 1 ...
##  $ newdata.name: chr "n_defects_online"
##  $ nsigmas     : num 3
##  $ limits      : num [1, 1:2] 0 8.2
##   ..- attr(*, "dimnames")=List of 2
##  $ violations  :List of 2
##  - attr(*, "class")= chr "qcc"

The result suggests that the process is, statistically, in-control.

Next we will monitor: Number (or percent) of defective chips on a wafer.

As mentioned earlier, wafers are produced in batches, and each wafer contains hundreds or even thousands of individual chips.

In our case, the company inspects 100 batches, and each batch consists of 50 wafers (chips). We will use these samples to establish in-control limits.

n_defected_retro <- read.csv("retrospective_semiconductor_np_chart.csv", header = TRUE)

qcc(data=n_defected_retro,sizes=50,type="np") #np-chart first trial

## List of 11
##  $ call      : language qcc(data = n_defected_retro, type = "np", sizes = 50)
##  $ type      : chr "np"
##  $ data.name : chr "n_defected_retro"
##  $ data      : int [1:99, 1] 4 4 4 2 5 2 5 3 5 7 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named int [1:99] 4 4 4 2 5 2 5 3 5 7 ...
##   ..- attr(*, "names")= chr [1:99] "1" "2" "3" "4" ...
##  $ sizes     : num [1:99] 50 50 50 50 50 50 50 50 50 50 ...
##  $ center    : num 4.08
##  $ std.dev   : num 1.94
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 9.89
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"

We will remove the points outside control limits UCL= 9.888539 LCL=0. Then re-establish the control limits.

# remove points outside control limits UCL= 9.888539 LCL=0
n_defected_retro2<-n_defected_retro[n_defected_retro<=9.888539 & n_defected_retro>=0,] #keep only points within limits
qcc(data=n_defected_retro2,sizes=50,type="np") #np-chart second trial

## List of 11
##  $ call      : language qcc(data = n_defected_retro2, type = "np", sizes = 50)
##  $ type      : chr "np"
##  $ data.name : chr "n_defected_retro2"
##  $ data      : int [1:98, 1] 4 4 4 2 5 2 5 3 5 7 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named int [1:98] 4 4 4 2 5 2 5 3 5 7 ...
##   ..- attr(*, "names")= chr [1:98] "1" "2" "3" "4" ...
##  $ sizes     : num [1:98] 50 50 50 50 50 50 50 50 50 50 ...
##  $ center    : num 3.97
##  $ std.dev   : num 1.91
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 9.7
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"

Now that there were no out-of-control samples used to determine the in-control limits, most notably, UCL = 9.704229, we will use these limits as the final control limits, then examine the online process.

n_defected_online <- read.csv("wafer_defect_online.csv", header = TRUE)

# establish in-control limits and monitor the online  process using these limits
qcc(data=n_defected_retro2, sizes=50,type="np",
    newdata=n_defected_online, newsizes =50) #add online data to in-control np chart

## List of 15
##  $ call        : language qcc(data = n_defected_retro2, type = "np", sizes = 50, newdata = n_defected_online,      newsizes = 50)
##  $ type        : chr "np"
##  $ data.name   : chr "n_defected_retro2"
##  $ data        : int [1:98, 1] 4 4 4 2 5 2 5 3 5 7 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics  : Named int [1:98] 4 4 4 2 5 2 5 3 5 7 ...
##   ..- attr(*, "names")= chr [1:98] "1" "2" "3" "4" ...
##  $ sizes       : num [1:98] 50 50 50 50 50 50 50 50 50 50 ...
##  $ center      : num 3.97
##  $ std.dev     : num 1.91
##  $ newstats    : Named int [1:29] 1 3 3 2 3 2 3 0 2 4 ...
##   ..- attr(*, "names")= chr [1:29] "99" "100" "101" "102" ...
##  $ newdata     : int [1:29, 1] 1 3 3 2 3 2 3 0 2 4 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ newsizes    : num [1:29] 50 50 50 50 50 50 50 50 50 50 ...
##  $ newdata.name: chr "n_defected_online"
##  $ nsigmas     : num 3
##  $ limits      : num [1, 1:2] 0 9.7
##   ..- attr(*, "dimnames")=List of 2
##  $ violations  :List of 2
##  - attr(*, "class")= chr "qcc"

From this result, the online process is in control and there are on average, ~4 bad chips per wafer.

Both control charts are essential for both retrospective and online monitoring because they provide visual indicators of process stability and highlights any points where the manufacturing process may need corrective action.