這篇是以晶圓曝光時間(能量)和線寬(cd)資料分析, 討論資料相關性分析。
半導體製程要將光罩上的電子線路轉移到晶圓上, 通常分成光阻, 曝光, 顯影, 蝕刻和去光阻等多道製程。
蝕刻製程是指去除晶圓薄膜的半導體技術。 https://www.appliedmaterials.com/zh-hant/semiconductor/products/etch/info
蝕刻製程中, 使用電漿將薄膜去除, 電漿能量將影響蝕刻後的線寬。
本資料分析範例, 分析蝕刻製程中能量與線寬關係, 解說資料分析的步驟。假設線寬的製程目標值(target)為2.1,製程規格為(2.0,2.2)。
library(data.table) #載入套件 data.table 才可使用fread()函數
<-"H:/Etch分析講義/stat_etch.csv" #完整資料路徑與名稱, 學生要根據自己的資料放的位置與名稱修改這條指令
filename<-fread(filename,header="auto") x
str(x)
## Classes 'data.table' and 'data.frame': 165 obs. of 2 variables:
## $ 能量: num 28.9 29.3 28.9 28.9 28.7 ...
## $ 線寬: num 2.13 2.13 2.14 2.13 2.11 ...
## - attr(*, ".internal.selfref")=<externalptr>
head(x, 6)
## 能量 線寬
## 1: 28.94 2.133501
## 2: 29.32 2.133610
## 3: 28.85 2.137660
## 4: 28.95 2.128999
## 5: 28.68 2.105443
## 6: 29.82 2.079087
tail(x, 6)
## 能量 線寬
## 1: 24.17 2.047422
## 2: 22.72 2.017259
## 3: 24.93 2.063129
## 4: 25.23 2.086112
## 5: 23.81 2.043845
## 6: 23.57 2.051075
mean(x$能量,na.rm=TRUE)
## [1] 27.146
mean(x$線寬,na.rm=TRUE)
## [1] 2.082079
#使用apply() 求算每個變數的統計量
apply(x,2, mean)
## 能量 線寬
## 27.146000 2.082079
median(x$能量,na.rm=TRUE)
## [1] 26.2
median(x$線寬,na.rm=TRUE)
## [1] 2.078988
sd(x$能量,na.rm=TRUE)
## [1] 3.528171
sd(x$線寬,na.rm=TRUE)
## [1] 0.04130594
#第25, 50,75個百分位數和最大最小值
quantile(x$能量,type=2,na.rm=TRUE)
## 0% 25% 50% 75% 100%
## 20.37 24.48 26.20 29.34 36.66
quantile(x$線寬,type=2,na.rm=TRUE)
## 0% 25% 50% 75% 100%
## 2.001263 2.052519 2.078988 2.104579 2.207242
#其他百分位數
quantile(x$能量,probs=0.45,type=2,na.rm=TRUE)
## 45%
## 25.93
quantile(x$線寬,probs=0.65,type=2,na.rm=TRUE)
## 65%
## 2.093503
min(x$能量,na.rm=TRUE);min(x$線寬,na.rm=TRUE)
## [1] 20.37
## [1] 2.001263
max(x$能量,na.rm=TRUE);max(x$線寬,na.rm=TRUE)
## [1] 36.66
## [1] 2.207242
summary(x)
## 能量 線寬
## Min. :20.37 Min. :2.001
## 1st Qu.:24.48 1st Qu.:2.053
## Median :26.20 Median :2.079
## Mean :27.15 Mean :2.082
## 3rd Qu.:29.34 3rd Qu.:2.105
## Max. :36.66 Max. :2.207
summary()是一個簡便的函數, 可以顯示資料中每一個變數幾項統計量
這些統計量有最小值(Min), 最大值(Max), 三個四分位數(1st Qu, Median, 3rt Qu)與平均值(Mean)
sd(資料向量,na.rm=TRUE): 標準差
sd(x$能量,na.rm=TRUE)
## [1] 3.528171
sd(x$線寬,na.rm=TRUE)
## [1] 0.04130594
#使用apply()
apply(x,2,sd)
## 能量 線寬
## 3.52817109 0.04130594
<-2.0;usl<-2.2 #規格界線
lsl<-which(x$線寬<lsl |x$線寬>usl) # 找出超出規格界線的線寬資料
idx<-length(idx)/length(x$線寬)*100
losspaste("不良率=", loss ,"%",sep="")
## [1] "不良率=0.606060606060606%"
<-mean(x$線寬);sdx<-sd(x$線寬)
mx<-pnorm(lsl,mx,sdx)+1-pnorm(usl,mx,sdx)
pp<-pp*100
losspaste("不良率=", loss ,"%",sep="")
## [1] "不良率=2.56083732531527%"
par(mfrow=c(1,2))
<-seq(min(x$能量)-1,max(x$能量)+1,length.out=25) # 能量變數之X軸切割點
brs1<-seq(min(x$線寬)-0.01,max(x$線寬)+0.01,length.out=25) # 線寬變數之X軸切割點
brs2<-hist(x$能量,breaks=brs1,main="能量的直方圖")
ht1<-lowess(ht1$mids, ht1$counts,f=0.3) #平滑函數
lw1lines(lw1$x,lw1$y,lwd=2,col="blue") #繪製平滑曲線
<-hist(x$線寬,breaks=brs2,main="線寬的直方圖")
ht2lines(c(lsl,lsl),c(0,15),col="green4",lwd=2,lty=2)#規格下界
lines(c(usl,usl),c(0,15),col="green4",lwd=2,lty=2)#規格上界
<-lowess(ht2$mids, ht2$counts,f=0.3)
lw2lines(lw2$x,lw2$y,lwd=2,col="blue")
seq(a, b, length.out=c): 將 a 到 b的區間, 切隔成 c-1 段, 包含a, b兩點, 共有c+1個等差序列值。
lowess() 是一個資料平滑函數, 將波動大的數據取臨邊資料加權平均, 可以使波動較為平順, 目的是要將主要結構呈現出來
lowess()中的f值是平滑取樣數, 指取多少比例的資料來平滑, f值越大取樣筆數越多, 結果越平滑, 但可能失真, 不具意義。
由平滑線看出這個變數的資料都不像常態分配
par(mfrow=c(1,2))
<-seq(min(x$能量)-1,max(x$能量)+1,length.out=25)
brs1<-seq(min(x$線寬)-0.01,max(x$線寬)+0.01,length.out=25)
brs2<-hist(x$能量,breaks=brs1,main="能量的直方圖")
ht1<-lowess(ht1$mids, ht1$counts,f=0.3) #平滑函數
lw1lines(lw1$x,lw1$y,lwd=2,col="blue") #繪製平滑曲線
## 常態曲線
<-mean(x$能量)
mx<-sd(x$能量)
sdx<-ht1$mids[2]-ht1$mids[1] #組距
stepx<-seq(min(x$能量)-1,max(x$能量)+1,length.out=250)
cut1<-dnorm(cut1,mx,sdx)
norm.curve<-norm.curve*length(x$能量)*stepx
norm.curve.adjlines(cut1,norm.curve.adj,col="red",lwd=2)
<-hist(x$線寬,breaks=brs2,main="線寬的直方圖")
ht2lines(c(lsl,lsl),c(0,15),col="green4",lwd=2,lty=2)#規格下界
lines(c(usl,usl),c(0,15),col="green4",lwd=2,lty=2)#規格上界
<-lowess(ht2$mids, ht2$counts,f=0.3)
lw2lines(lw2$x,lw2$y,lwd=2,col="blue")
## 常態曲線
<-mean(x$線寬)
my<-sd(x$線寬)
sdy<-ht2$mids[2]-ht2$mids[1]
stepy<-seq(min(x$線寬)-0.01,max(x$線寬)+0.01,length.out=250)
cut2<-dnorm(cut2,my,sdy)
norm.curve<-norm.curve*length(x$線寬)*stepy
norm.curve.adjlines(cut2,norm.curve.adj,col="red",lwd=2)
紅色線為假設資料為常態分配下, 以資料的平均值和標準差推估它的常態曲線
若紅色與藍色貼合表示資料像常態分配, 視覺上, 這兩個變數資料都不像常態分配
par(mfrow=c(2,1),mar=c(3,3,3,3))
boxplot(x$能量,horizontal=TRUE,col="blue",main="能量的盒形圖")
boxplot(x$線寬,horizontal=TRUE,col="purple",main="線寬的盒形圖")
par(mfrow=c(1,2))
plot(x$能量,type="b",pch=19,xlab="run",ylab="能量")
plot(x$線寬,type="b",pch=19,xlab="run",ylab="線寬")
- 這兩張圖發現, 能量趨勢圖與線寬趨勢圖似乎非常相像, 都有下降的趨勢。 - 可以使用lm() 函數驗證是否有線性下降或上升趨勢, lm 是linear model的簡寫
par(mfrow=c(1,2))
<-1:length(x$能量)
runsplot(x$能量,type="b",pch=19,xlab="run",ylab="能量")
<-lm(x$能量~runs) #估算線性模式
out1abline(out1,lwd=2,col="blue")#加入線性趨勢線
plot(x$線寬,type="b",pch=19,xlab="run",ylab="線寬")
<-lm(x$線寬~runs)#估算線性模式
out2abline(out2,lwd=2,col="blue")#加入線性趨勢線
out1
##
## Call:
## lm(formula = x$能量 ~ runs)
##
## Coefficients:
## (Intercept) runs
## 31.66423 -0.05444
這表示能量與批次的線性模型為 \[能量=31.66423-0.0544\times runs\]
截距項為31.66423可以解釋為起始能量值, 斜率為 -0.0544表示能量隨批次的變化量
使用summary()函數可以查看模型的合適性
summary(out1)
##
## Call:
## lm(formula = x$能量 ~ runs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.4491 -1.4952 -0.1273 1.4357 6.0367
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 31.664226 0.374048 84.65 <2e-16 ***
## runs -0.054436 0.003909 -13.93 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.391 on 163 degrees of freedom
## Multiple R-squared: 0.5434, Adjusted R-squared: 0.5406
## F-statistic: 194 on 1 and 163 DF, p-value: < 2.2e-16
sd(out1$residuals);sd(out1$residuals)*sqrt(164/163)
## [1] 2.384155
## [1] 2.391457
-上述報告中有``Residual standard error: 2.391 on 163 degrees of freedom", 自由度(degrees of freedom,d.f.)為163, 等於\(n-2\) (減2是因為有兩個參數截距和斜率需要估計)
所以由標準差要修正成標準誤, 必須乘上係數\(\sqrt{164/163}\)修正。當 \(n\) 很大, \(\sqrt{164/163}\)接近1, 是否修正差異不大。
par(mfrow=c(1,3))
<-hist(out1$residuals,nclass=25)
ht3## 常態曲線
<-mean(out1$residuals)
mr<-sd(out1$residuals)
sr<-ht3$mids[2]-ht3$mids[1]
stepr<-seq(min(out1$residuals)-0.01,max(out1$residuals)+0.01,length.out=250)
cut3<-dnorm(cut3,mr,sr)
norm.curve<-norm.curve*length(out1$residuals)*stepr
norm.curve.adjlines(cut3,norm.curve.adj,col="red",lwd=2)
boxplot(out1$residuals) #盒形圖
qqnorm(out1$residuals);qqline(out1$residuals,col="blue",lwd=2) #常態機率繪圖
\[H_0: 係數為0, H_1: 係數不為0\] - 截距(Intercept)和斜率(runs)的p-value都小於0.05, 故說模型中截距=31.664226 , 斜率=-0.05444都是顯著的
out2
##
## Call:
## lm(formula = x$線寬 ~ runs)
##
## Coefficients:
## (Intercept) runs
## 2.1272766 -0.0005445
summary(out2)
##
## Call:
## lm(formula = x$線寬 ~ runs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.093436 -0.019111 -0.000157 0.020606 0.096302
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.1272766 0.0050336 422.62 <2e-16 ***
## runs -0.0005445 0.0000526 -10.35 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.03218 on 163 degrees of freedom
## Multiple R-squared: 0.3967, Adjusted R-squared: 0.393
## F-statistic: 107.2 on 1 and 163 DF, p-value: < 2.2e-16
plot(x$能量,x$線寬,pch=19,type="p")
plot(x$能量,x$線寬,pch=19,type="p")
<-lm(x$線寬~x$能量) #線寬與能量間的線性模型估計
out3abline(out3,lwd=2,col="blue")
summary(out3)
##
## Call:
## lm(formula = x$線寬 ~ x$能量)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.051184 -0.013388 0.000204 0.012988 0.058739
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.8082108 0.0127352 141.99 <2e-16 ***
## x$能量 0.0100887 0.0004652 21.68 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.02102 on 163 degrees of freedom
## Multiple R-squared: 0.7426, Adjusted R-squared: 0.741
## F-statistic: 470.2 on 1 and 163 DF, p-value: < 2.2e-16
plot(out3$residuals,xlab="runs",pch=19,col="blue",type="b")
par(mfrow=c(2,2),mar=c(3,3,3,3))
<-1:100
runs<-runs+rnorm(100,0,10)-50.5;
y#線性
plot(runs, y,ylab="residuals",main="線性")
lines(runs,runs-50.5,lty=2,col="blue",lwd=2)
#週期波動
plot(runs, sin(runs/10)+rnorm(100,0,1),ylab="residuals",main="週期波動")
lines(runs,sin(runs/10),lty=2,col="blue",lwd=2)
#分層
plot(runs,c(rnorm(50,2,1),c(rnorm(50,-2,1))),ylab="residuals",main="分層")
lines(runs,c(rep(2,50),rep(-2,50)),lty=2,col="blue",lwd=2)
<-rnorm(100,1,abs(runs-50.5))
y#變異不均
plot(runs, y,ylab="residuals",main="變異不均")
lines(runs,rep(0,100),lty=2,col="blue",lwd=2)
par(mfrow=c(2,2))
<-hist(out3$residuals,nclass=25)
ht5## 常態曲線
<-mean(out3$residuals)
mr<-sd(out3$residuals)
sr<-ht5$mids[2]-ht5$mids[1]
stepr<-seq(min(out3$residuals)-0.005,max(out3$residuals)+0.005,length.out=250)
cut5<-dnorm(cut5,mr,sr)
norm.curve<-norm.curve*length(out3$residuals)*stepr
norm.curve.adjlines(cut5,norm.curve.adj,col="red",lwd=2)
boxplot(out3$residuals,horizontal=TRUE)
qqnorm(out3$residuals);qqline(out3$residuals,col="blue",lwd=2)
plot(out3$fitted, out3$residuals,pch=19,main="fitted vs residuals")
根據殘差分析,我們接受殘差服從常態分配, 且變異無特殊型態(iid)
我們建立線寬與能量的模型為 \[線寬=1.8082108+0.0100887\times 能量\] 增加一單位能量可以使先寬增加約0.01。
討論: