This report analyzes semiconductor PCM (Parametric Control Monitor) data using statistical process control tools. The goal is to evaluate the stability and capability of a selected PCM characteristic across 14 wafers and 5 measurement sites per wafer. A small set of rows in the dataset contain specification limits (LSL, Target, and USL), while the remaining rows contain actual PCM measurements.
The analysis uses X-bar and R control charts to check whether the process is stable, and a capability study (Cp, Cpk, and Cpm) to measure how well the process fits within the specification limits. The focus of this report is on PCM15, but the structure applies to any PCM parameter in the dataset.
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
library(qcc)
## Warning: package 'qcc' was built under R version 4.4.3
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
This section loads the dataset, identifies PCM measurement columns, separates specification rows from measurement rows, and extracts the specification limits for the selected PCM. The data is then reshaped into a wafer-by-site format so that each wafer forms a subgroup for control chart analysis.
# 1) Load the CSV
dat <- read.csv(
"C:/Users/rijul/Desktop/IE 4331 Seminconductor/Semiconductor_PCM_with_specs_and_targets.csv",
stringsAsFactors = FALSE
)
# 2) Confirm structure
names(dat)[1:15]
## [1] "X" "LOT." "WAFER." "SITE." "DATE" "TIME" "PCM1" "PCM2"
## [9] "PCM3" "PCM4" "PCM5" "PCM6" "PCM7" "PCM8" "PCM9"
pcm_cols <- grep("^PCM[0-9]+$", names(dat), value = TRUE)
length(pcm_cols)
## [1] 50
pcm_cols[1:10]
## [1] "PCM1" "PCM2" "PCM3" "PCM4" "PCM5" "PCM6" "PCM7" "PCM8" "PCM9"
## [10] "PCM10"
length(pcm_cols)
## [1] 50
spec_labels <- c("USL", "LSL", "Target")
spec_idx <- apply(
dat,
1,
function(r) any(trimws(as.character(r)) %in% spec_labels, na.rm = TRUE)
)
spec_rows <- dat[spec_idx, , drop = FALSE]
measure_rows <- dat[!spec_idx, , drop = FALSE]
nrow(spec_rows)
## [1] 3
nrow(measure_rows)
## [1] 70
spec_rows
## X LOT. WAFER. SITE. DATE TIME PCM1 PCM2 PCM3
## 71 USL NA NA 0.009173779 74.22111 0.004880995
## 72 LSL NA NA 0.006368221 54.57180 0.003965863
## 73 Target NA NA 0.007849575 64.05749 0.004467099
## PCM4 PCM5 PCM6 PCM7 PCM8 PCM9 PCM10
## 71 126.51533 0.002577805 227.6964 0.001710144 326.2291 0.001303463 432.1314
## 72 99.66375 0.002171052 193.6106 0.001538427 289.9696 0.001165395 378.7194
## 73 115.03557 0.002341591 212.6071 0.001633062 311.0399 0.001239390 401.9382
## PCM11 PCM12 PCM13 PCM14 PCM15 PCM16 PCM17
## 71 0.0010469330 529.7991 1132.558 26.478419 -0.8122365 1.1939760 1.384630e-05
## 72 0.0009423813 475.4693 1010.294 5.042095 -2.4230492 0.4236525 3.277005e-07
## 73 0.0009926687 501.8296 1070.757 16.312247 -1.5620054 0.8252239 8.248952e-06
## PCM18 PCM19 PCM20 PCM21 PCM22 PCM23
## 71 -0.0003236199 2644.8684 -0.0001439084 4211.3891 -8.088724e-05 6470.633
## 72 -0.0022623801 500.2064 -0.0016620630 294.6397 -1.080941e-03 540.140
## 73 -0.0011977299 1664.9423 -0.0008556373 2524.3710 -5.317625e-04 3741.267
## PCM24 PCM25 PCM26 PCM27 PCM28 PCM29
## 71 -0.0001110670 8955.7937 -6.966755e-05 10599.078 -9.843982e-05 12195.452
## 72 -0.0007546759 457.6965 -6.247039e-04 1146.981 -4.800173e-04 1899.939
## 73 -0.0004549238 5213.8209 -3.589505e-04 6195.076 -2.979475e-04 7016.222
## PCM30 PCM31 PCM32 PCM33 PCM34 PCM35 PCM36
## 71 22697.208 1826.9959 -6.906653 5.039886 0.0040545863 -0.0001012769 10379.326
## 72 3955.937 233.0227 -10.159432 3.493143 0.0007682708 -0.0006114088 1104.634
## 73 12424.833 1103.4228 -8.488142 4.337370 0.0026487738 -0.0003574927 6542.399
## PCM37 PCM38 PCM39 PCM40 PCM41 PCM42
## 71 -2.871637e-05 20071.53953 -1.583066e-05 34887.695 -8.582558e-06 58091.649
## 72 -3.811408e-04 -53.30695 -2.076722e-04 1903.849 -1.449689e-04 -4519.602
## 73 -1.778620e-04 9102.28513 -1.129460e-04 18389.188 -7.747921e-05 22497.575
## PCM43 PCM44 PCM45 PCM46 PCM47 PCM48
## 71 -1.442708e-05 78672.671 -5.013352e-06 88175.0841 178643.972 2952.5201
## 72 -1.024758e-04 -8278.224 -8.932379e-05 -914.9252 6404.598 175.8334
## 73 -5.120150e-05 41719.180 -4.298998e-05 44134.6193 81572.243 1557.5804
## PCM49 PCM50 Unnamed..55 Unnamed..56 Unnamed..57 Unnamed..58
## 71 -0.3658308 1.5802222 NA NA NA NA
## 72 -3.4115406 0.3085493 NA NA NA NA
## 73 -2.0363228 1.0362574 NA NA NA NA
## Unnamed..59 Unnamed..60 Unnamed..61 Unnamed..62 Unnamed..63 Unnamed..64
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..65 Unnamed..66 Unnamed..67 Unnamed..68 Unnamed..69 Unnamed..70
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..71 Unnamed..72 Unnamed..73 Unnamed..74 Unnamed..75 Unnamed..76
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..77 Unnamed..78 Unnamed..79 Unnamed..80 Unnamed..81 Unnamed..82
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..83 Unnamed..84 Unnamed..85 Unnamed..86 Unnamed..87 Unnamed..88
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..89 Unnamed..90 Unnamed..91 Unnamed..92 Unnamed..93 Unnamed..94
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..95 Unnamed..96 Unnamed..97 Unnamed..98 Unnamed..99 Unnamed..100
## 71 NA NA NA NA NA NA
## 72 NA NA NA NA NA NA
## 73 NA NA NA NA NA NA
## Unnamed..101 Unnamed..102 Unnamed..103 Unnamed..104 Unnamed..105
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..106 Unnamed..107 Unnamed..108 Unnamed..109 Unnamed..110
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..111 Unnamed..112 Unnamed..113 Unnamed..114 Unnamed..115
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..116 Unnamed..117 Unnamed..118 Unnamed..119 Unnamed..120
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..121 Unnamed..122 Unnamed..123 Unnamed..124 Unnamed..125
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..126 Unnamed..127 Unnamed..128 Unnamed..129 Unnamed..130
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..131 Unnamed..132 Unnamed..133 Unnamed..134 Unnamed..135
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..136 Unnamed..137 Unnamed..138 Unnamed..139 Unnamed..140
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..141 Unnamed..142 Unnamed..143 Unnamed..144 Unnamed..145
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..146 Unnamed..147 Unnamed..148 Unnamed..149 Unnamed..150
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..151 Unnamed..152 Unnamed..153 Unnamed..154 Unnamed..155
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..156 Unnamed..157 Unnamed..158 Unnamed..159 Unnamed..160
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..161 Unnamed..162 Unnamed..163 Unnamed..164 Unnamed..165
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..166 Unnamed..167 Unnamed..168 Unnamed..169 Unnamed..170
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..171 Unnamed..172 Unnamed..173 Unnamed..174 Unnamed..175
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..176 Unnamed..177 Unnamed..178 Unnamed..179 Unnamed..180
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..181 Unnamed..182 Unnamed..183 Unnamed..184 Unnamed..185
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..186 Unnamed..187 Unnamed..188 Unnamed..189 Unnamed..190
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..191 Unnamed..192 Unnamed..193 Unnamed..194 Unnamed..195
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..196 Unnamed..197 Unnamed..198 Unnamed..199 Unnamed..200
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..201 Unnamed..202 Unnamed..203 Unnamed..204 Unnamed..205
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..206 Unnamed..207 Unnamed..208 Unnamed..209 Unnamed..210
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..211 Unnamed..212 Unnamed..213 Unnamed..214 Unnamed..215
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..216 Unnamed..217 Unnamed..218 Unnamed..219 Unnamed..220
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..221 Unnamed..222 Unnamed..223 Unnamed..224 Unnamed..225
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..226 Unnamed..227 Unnamed..228 Unnamed..229 Unnamed..230
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..231 Unnamed..232 Unnamed..233 Unnamed..234 Unnamed..235
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..236 Unnamed..237 Unnamed..238 Unnamed..239 Unnamed..240
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..241 Unnamed..242 Unnamed..243 Unnamed..244 Unnamed..245
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..246 Unnamed..247 Unnamed..248 Unnamed..249 Unnamed..250
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..251 Unnamed..252 Unnamed..253 Unnamed..254 Unnamed..255
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..256 Unnamed..257 Unnamed..258 Unnamed..259 Unnamed..260
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..261 Unnamed..262 Unnamed..263 Unnamed..264 Unnamed..265
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..266 Unnamed..267 Unnamed..268 Unnamed..269 Unnamed..270
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..271 Unnamed..272 Unnamed..273 Unnamed..274 Unnamed..275
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..276 Unnamed..277 Unnamed..278 Unnamed..279 Unnamed..280
## 71 NA NA NA NA NA
## 72 NA NA NA NA NA
## 73 NA NA NA NA NA
## Unnamed..281 Unnamed..282 Unnamed..283
## 71 NA NA NA
## 72 NA NA NA
## 73 NA NA NA
measure_rows <- measure_rows[
rowSums(!is.na(measure_rows[pcm_cols])) > 0,
,
drop = FALSE
]
nrow(measure_rows)
## [1] 70
get_spec_value <- function(label, pcm_name) {
if (nrow(spec_rows) == 0) return(NA_real_)
# Which rows contain the label anywhere?
row_idx <- apply(
spec_rows,
1,
function(r) any(trimws(as.character(r)) == label, na.rm = TRUE)
)
if (!any(row_idx, na.rm = TRUE)) return(NA_real_)
# Extract the PCM column for those rows
raw_vals <- spec_rows[row_idx, pcm_name, drop = TRUE]
# Convert to numeric
num_vals <- suppressWarnings(as.numeric(raw_vals))
num_vals <- num_vals[!is.na(num_vals)]
if (length(num_vals) == 0) return(NA_real_)
num_vals[1]
}
test_pcm <- "PCM1"
LSL_vals <- get_spec_value("LSL", test_pcm)
USL_vals <- get_spec_value("USL", test_pcm)
TGT_vals <- get_spec_value("Target", test_pcm)
LSL_vals
## [1] 0.006368221
USL_vals
## [1] 0.009173779
TGT_vals
## [1] 0.007849575
test_pcm <- "PCM1"
X-bar and R charts are generated using the qcc package. The X-bar chart checks whether the wafer means are stable over time, while the R chart evaluates stability in the variation between measurement sites within each wafer. Subgroups consist of 5 site measurements for all 14 wafers.
df_pcm <- data.frame(
WAFER = measure_rows$WAFER.,
SITE = measure_rows$SITE.,
VALUE = measure_rows[[test_pcm]]
)
df_pcm <- df_pcm[!is.na(df_pcm$WAFER) &
!is.na(df_pcm$SITE) &
!is.na(df_pcm$VALUE), ]
head(df_pcm)
## WAFER SITE VALUE
## 1 1 1 0.00793
## 2 1 2 0.00791
## 3 1 3 0.00776
## 4 1 4 0.00810
## 5 1 5 0.00799
## 6 2 1 0.00779
df_pcm <- df_pcm[order(df_pcm$WAFER, df_pcm$SITE), ]
wide_pcm <- df_pcm %>%
tidyr::pivot_wider(
id_cols = WAFER,
names_from = SITE,
values_from = VALUE
) %>%
arrange(WAFER)
head(wide_pcm)
## # A tibble: 6 × 6
## WAFER `1` `2` `3` `4` `5`
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 0.00793 0.00791 0.00776 0.0081 0.00799
## 2 2 0.00779 0.00788 0.00765 0.00798 0.0078
## 3 3 0.00797 0.00803 0.00782 0.00822 0.00804
## 4 4 0.0077 0.00773 0.00761 0.00804 0.00774
## 5 5 0.00778 0.00801 0.0077 0.00808 0.00788
## 6 6 0.00776 0.00786 0.00768 0.00814 0.00787
x_mat <- as.matrix(wide_pcm[, -1, drop = FALSE])
mode(x_mat) <- "numeric"
dim(x_mat)
## [1] 14 5
x_mat[1:5, ]
## 1 2 3 4 5
## [1,] 0.00793 0.00791 0.00776 0.00810 0.00799
## [2,] 0.00779 0.00788 0.00765 0.00798 0.00780
## [3,] 0.00797 0.00803 0.00782 0.00822 0.00804
## [4,] 0.00770 0.00773 0.00761 0.00804 0.00774
## [5,] 0.00778 0.00801 0.00770 0.00808 0.00788
qcc_xbar <- qcc(x_mat, type = "xbar") # Plot X-Bar
qcc_R <- qcc(x_mat, type = "R") # Plot R-Bar
test_pcm <- "PCM1"
LSL_vals
## [1] 0.006368221
USL_vals
## [1] 0.009173779
TGT_vals
## [1] 0.007849575
Using the extracted specification limits (LSL, Target, USL), a process capability study is performed. Capability indices Cp, Cpk, and Cpm measure how consistent and centered the PCM data is relative to the specification limits. This helps determine whether the process is capable of meeting engineering requirements.
process.capability( # Plot Capability Plot
object = qcc_xbar,
spec.limits = c(LSL_vals,USL_vals),
target = TGT_vals
)
##
## Process Capability Analysis
##
## Call:
## process.capability(object = qcc_xbar, spec.limits = c(LSL_vals, USL_vals), target = TGT_vals)
##
## Number of obs = 70 Target = 0.00785
## Center = 0.007771 LSL = 0.006368
## StdDev = 0.0002073 USL = 0.009174
##
## Capability indices:
##
## Value 2.5% 97.5%
## Cp 2.256 1.880 2.631
## Cp_l 2.256 1.933 2.578
## Cp_u 2.256 1.933 2.578
## Cp_k 2.256 1.871 2.640
## Cpm 2.109 1.739 2.479
##
## Exp<LSL 0% Obs<LSL 0%
## Exp>USL 0% Obs>USL 0%
For PCM15, the X-bar chart shows that most wafer means fall within the control limits, but two wafers (7 and 14) fall below the lower limit, indicating possible issues that may require investigation. The R chart shows no points outside the control limits, although there are a couple of minor run-rule violations that indicate non-random variation.
The capability analysis shows very strong values for PCM15. The Cp and Cpk values are both approximately 1.95, which indicates excellent process capability. The Cpm value of about 1.81 suggests the process is also well-centered relative to the target. No observations fall outside the specification limits.
Overall, PCM15 displays strong stability and high capability, with only a few isolated control chart exceptions.