Controllo Statistico della Qualità Dispense distribuite in classe a.a. 2006/2007 Luca Scrucca Dipartimento di Economia, Finanza e Statistica Sezione di Statistica Università degli Studi di Perugia luca@stat.unipg.it Ultima modifica: 4 ottobre 2006
Esempio: viscosità inchiostro Un responsabile di produzione tiene sotto osservazione la viscosità dell inchiostro prodotto da un processo chimico. La viscosità è misurata con un viscosimetro e l unità di misura è il cetipoide. > x = c(40,50,43,70,60,65,78,52,35,73,72,30,79,63,80,45,42,56,33,32) > n = length(x) 20 > summary(x) Min. 1st Qu. Median Mean 3rd Qu. Max. 30.0 41.5 54.0 54.9 70.5 80.0 > sd(x) [1] 16.96405 > sd(x)/abs(mean(x)) [1] 0.3089991 > b = c(20,30,40,50,60,70,80) > xc = cut(x, breaks=b) > tab = table(xc) > tab = cbind("freq" = tab, "Freq Cum" = cumsum(tab), "Freq Rel" = tab/sum(tab), "Freq Rel Cum" = cumsum(tab)/sum(tab)) > print(tab) Freq Freq Cum Freq Rel Freq Rel Cum (20,30] 1 1 0.05 0.05 (30,40] 4 5 0.20 0.25 (40,50] 4 9 0.20 0.45 (50,60] 3 12 0.15 0.60 (60,70] 3 15 0.15 0.75 (70,80] 5 20 0.25 1.00 > hist(x, breaks=c(20,30,40,50,60,70,80), xlab="viscosità", main="istogramma: classi uguale ampiezza") > h = hist(x, breaks=c(20,35,50,60,80), xlab="viscosità", main="istogramma: classi diversa ampiezza") > str(h) List of 7 $ breaks : num [1:5] 20 35 50 60 80 $ counts : int [1:4] 4 5 3 8 $ intensities: num [1:4] 0.0133 0.0167 0.0150 0.0200 $ density : num [1:4] 0.0133 0.0167 0.0150 0.0200 $ mids : num [1:4] 27.5 42.5 55 70 $ xname : chr "x" $ equidist : logi FALSE - attr(*, "class")= chr "histogram" > diff(h$breaks) * h$density * n [1] 3.999999 5.000000 3.000000 8.000000 1
Istogramma: classi uguale ampiezza Istogramma: classi diversa ampiezza Frequency 0 1 2 3 4 5 Density 0.000 0.005 0.010 0.015 0.020 20 30 40 50 60 70 80 viscosità 20 30 40 50 60 70 80 viscosità Esempio: percentuale acetone (Messina, 1991, pag. 47 48) Il responsabile di produzione di un impianto di produzione chimica per valutare la produzione di acetone tiene sotto controllo la variabile chiave del processo, la percentuale di acetone. I dati sono raccolti misurando la percentuale di acetone per i lotti prodotti durante una settimana. > x = c(6, 24, 12, 11, 34, 32, 28, 19, 31, 22, 29, 58, 15, 5, 17, 25) > summary(x) Min. 1st Qu. Median Mean 3rd Qu. Max. 5.00 14.25 23.00 23.00 29.50 58.00 > bxp <- boxplot(x, ylab="percentuale di acetone", main="boxplot") > axis(2, at=seq(0,60,by=5)) > text(1,bxp$out,paste("x(",which(x==bxp$out),") = ",bxp$out,sep=""), pos=4, offset=1) Esempio: spessore di una lamina Un processo produttivo genera lamine in acciaio su due linee di produzione. Si è interessati a valutare se le due linee di produzione funzionano allo stesso modo. A tal fine si ottengono 50 misurazioni per ciascuna linea e si pongono a confronto. > set.seed(1234) # "seme" di partenza per dati simulati > x1 = round(rnorm(50, 10, 1/2), 1) > x2 = round(9+rchisq(50, 2), 1) > summary(cbind(x1,x2)) x1 x2 Min. : 8.800 Min. : 9.00 1st Qu.: 9.500 1st Qu.: 9.50 Median : 9.700 Median :10.25 Mean : 9.774 Mean :10.77 3rd Qu.: 9.975 3rd Qu.:11.25 Max. :11.200 Max. :18.80 > boxplot(list(x1,x2), main="side-by-side Boxplot", ylab="spessore lamina (mm)", xlab="linea di produzione") > mean(x1) [1] 9.774 > sd(x1) [1] 0.4443799 > mean(x2) 2
[1] 10.766 > sd(x2) [1] 1.85347 > t.test(x1, x2, alternative = "two.sided", # "less", "greater" mu = 0, var.equal = TRUE, conf.level = 0.95) Two Sample t-test data: x1 and x2 t = -3.6802, df = 98, p-value = 0.0003811 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -1.5269106-0.4570894 sample estimates: mean of x mean of y 9.774 10.766 > t.test(x1, x2, alternative = "two.sided", # "less", "greater" mu = 0, var.equal = FALSE, conf.level = 0.95) Welch Two Sample t-test data: x1 and x2 t = -3.6802, df = 54.615, p-value = 0.0005346 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -1.5322733-0.4517267 sample estimates: mean of x mean of y 9.774 10.766 Boxplot Side by side Boxplot Percentuale di acetone 5 10 15 20 25 30 35 40 45 50 55 60 X(12) = 58 Spessore lamina (mm) 10 12 14 16 18 1 2 linea di produzione 3
Esempio: saldatura ad onda (Messina, 1991, pag. 31 32, 35 38) Si consideri un processo di saldatura ad onda in cui si voglia migliorare la qualità di una linea di produzione. Nel corso di una settimana in cui sono stati fabbricati 2000 circuiti stampati PCB, 800 di questi presentano difetti così distribuiti: > difetti = as.table(c(440, 120, 80, 64, 56, 40)) > names(difetti) = c("saldante insuff.", "Bolle d aria", "Non deossidanti", "Non saldanti", "Punte di spillo", "Cortocircuiti") > difetti Saldante insuff. Bolle d aria Non deossidanti Non saldanti 440 120 80 64 Punte di spillo Cortocircuiti 56 40 > library(qcc) > pareto.chart(difetti, ylab = "Frequenze assolute difetti", ylim=c(0,820)) Pareto Chart analysis for difetti Frequency Cum.Freq. Percentage Cum.Percent. Saldante insuff. 440 440 55 55 Bolle d aria 120 560 15 70 Non deossidanti 80 640 10 80 Non saldanti 64 704 8 88 Punte di spillo 56 760 7 95 Cortocircuiti 40 800 5 100 > mtext("(prima del cambiamento di processo)", side=3, line=0.5) > difetti2 = as.table(c(180, 40, 35, 25, 15, 5)) > names(difetti2) = names(difetti) > difetti2 Saldante insuff. Bolle d aria Non deossidanti Non saldanti 180 40 35 25 Punte di spillo Cortocircuiti 15 5 > pareto.chart(difetti2, ylab = "Frequenze assolute difetti", ylim=c(0,820)) Pareto Chart analysis for difetti2 Frequency Cum.Freq. Percentage Cum.Percent. Saldante insuff. 180 180 60.000000 60.00000 Bolle d aria 40 220 13.333333 73.33333 Non deossidanti 35 255 11.666667 85.00000 Non saldanti 25 280 8.333333 93.33333 Punte di spillo 15 295 5.000000 98.33333 Cortocircuiti 5 300 1.666667 100.00000 > mtext("(dopo il cambiamento di processo)", side=3, line=0.5) 4
Frequenze assolute difetti 0 200 400 600 800 Pareto Chart for difetti (prima del cambiamento di processo) 0% 25% 50% 75% 100% Saldante insuff. Bolle d'aria Non deossidanti Cumulative Percentage Non saldanti Punte di spillo Frequenze assolute difetti Cortocircuiti 0 200 400 600 800 Pareto Chart for difetti2 (dopo il cambiamento di processo) Saldante insuff. Bolle d'aria Non deossidanti Non saldanti Punte di spillo Cortocircuiti 0% 50% 100% Cumulative Percentage Esempio: saldatura a bagno d onda (continua) Durante un operazione di saldatura a bagno d onda che interviene in fase di fabbricazione di una piastra di circuito stampato, il numero di gocce di saldante viene tenuto sotto osservazione. Il corrispondente diagramma di causa ed effetto è il seguente: > library(qcc) > cause = list(macchina=c("velocità nastro", "Manutenzione"), Saldante=c("Temperatura", "Altezza dell onda", "Onda noin nota", "Fludità", "Tempo di contatto"), Flusso=c("Quantitativo", "Gravità specifica"), Componenti=c("Orientazione", "Saldabilità", "Connettori sporchi"), Preriscaldamento=c("Tempo", "Temperatura")) > cause.and.effect(cause, effect=paste("gocce di saldante"), title = "Diagramma di causa ed effetto") 5
Diagramma di causa ed effetto Macchina Saldante Flusso Velocità nastro Manutenzione Temperatura Quantitativo Altezza dell'onda Gravità specifica Onda noin nota Fludità Tempo di contatto Gocce di saldante Connettori sporchi Saldabilità Temperatura Orientazione Tempo Componenti Preriscaldamento Esempio: carico di rottura di una fibra sintetica Si consideri le seguenti misurazioni ottenute da un campione casuale inerenti il carico di rottura a trazione di una fibra sintetica: > x = c(48.99, 52.07, 49.29, 51.66, 52.16, 49.72, 48, 49.96, 49.2, 48.1, 47.9, 46.94, 51.76, 50.75, 49.86, 51.57) > mean(x) [1] 49.87062 > var(x) [1] 2.747380 > length(x) [1] 16 > t.test(x, alternative="two.sided", mu=50) One Sample t-test data: x t = -0.3122, df = 15, p-value = 0.7592 alternative hypothesis: true mean is not equal to 50 95 percent confidence interval: 48.987 50.754 sample estimates: mean of x 49.871 > (mean(x)-50)/sqrt(var(x)/length(x)) [1] -0.31221 > qt(0.975, df=15) # livello critico del test α = 0.05 [1] 2.1314 > pt(-0.3122, df=15)*2 # p-value [1] 0.75919 Esempio: durata di un catalizzatore in una reazione chimica: Si consideri la durata in minuti di un catalizzatore impiegato 6
> x = c(1176, 1191, 1214, 1220, 1205, 1192, 1201, 1190, 1183, 1185) > qqnorm(x) > qqline(x) > shapiro.test(x) Shapiro-Wilk normality test data: x W = 0.9541, p-value = 0.7173 Normal Q Q Plot Sample Quantiles 1180 1190 1200 1210 1220 1.5 1.0 0.5 0.0 0.5 1.0 1.5 Theoretical Quantiles Esempio: tempo di trasporto del metallo fuso Il metallo fuso è trasportato su rotaia dall altoforno all acciaieria. Il tempo di trasporto (in minuti) è stato misurato per 31 colate consecutive: > x = c(10, 14, 15, 16, 19, 20, 16, 18, 23, 20, 24, 21, 19, 21, 19, 22, 34, 27, 16, 25, 34, 32, 36, 38, 43, 55, 56, 58, 52, 51, 77) > par(mfrow=c(2,2)) > hist(x) > qqnorm(x); qqline(x) > boxcox(lm(x~1), lambda=seq(-2,2,by=0.1)) > x1 = 1/x > qqnorm(x1); qqline(x1) > shapiro.test(x) Shapiro-Wilk normality test data: x W = 0.8645, p-value = 0.001050 > shapiro.test(x1) Shapiro-Wilk normality test data: x1 W = 0.9464, p-value = 0.1240 7
Esempio: calcolo di una curva della caratteristica operativa d <- seq(0,5,by=0.1) prob.errorii <- function(d,n) pnorm(1.96-d*sqrt(n))-pnorm(-1.96-d*sqrt(n)) plot(d, prob.errorii(d,1), type="l", ylim=c(0,1), xaxs="i", xlab=expression(paste("d = ", abs( delta )/sigma)), ylab=expression(beta), main="curve della caratteristica operativa") lines(d, prob.errorii(d,2), lty=2, col=2) lines(d, prob.errorii(d,3), lty=3, col=3) lines(d, prob.errorii(d,5), lty=4, col=4) lines(d, prob.errorii(d,10), lty=5, col=5) lines(d, prob.errorii(d,20), lty=6, col=6) legend(3,1, c("n=1", "n=2", "n=3", "n=5", "n=10", "n=20"), lty=1:6, col=1:6) 8
Curve della caratteristica operativa β 0.0 0.2 0.4 0.6 0.8 1.0 n=1 n=2 n=3 n=5 n=10 n=20 0 1 2 3 4 5 d = δ σ 9