O objetivo desta seção é construir e interpretar gráficos de controle para variáveis. Procure entender os comandos do R e interpretar os resultados.
Utilizaremos os dados do exemplo sobre 'anéis de pistão' (Montgomery, 1997), disponível no pacote qcc
.
> require(qcc) > data(pistonrings) > attach(pistonrings) > pistonrings
Esse conjunto de dados corresponde a avaliação dos diâmetros dos anéis, obtidos de 40 amostras de tamanho n=5.
As primeiras 25 amostras (trial=TRUE) foram utilizadas para a obtenção do gráfico de controle e as amostras subseqüentes (trial=FALSE) foram utilizadas para monitoramento do processo.
Inicialmente pode-se fazer uma análise exploratória dos dados para conhecer o comportamento da variável resposta.
> summary(pistonrings) > boxplot(diameter ~ sample) > plot(sample[trial==TRUE], diameter[trial==TRUE], cex=0.7) > plot(sample, diameter, cex=0.7) > lines(tapply(diameter,sample,mean))
Para utilizar a função qcc
, é necessário que o objeto a ser analisado esteja no formato exigido pela função. Por isso, utiliza-se a outra função chamada de qcc.groups
para formatar os dados.
> diametro<-qcc.groups(diameter,sample) > diametro > class(diametro)
Observe que o objeto diametro
é uma matriz. A função qcc
reconhece, automaticamente, que o número de colunas é o tamanho de cada amostra.
Gráfico
Para fazer o gráfico de controle para utilizando as primeiras 25 amostras utilizamos os seguintes comandos:
> qcc(diametro[1:25,],type='xbar')
Observe que, para esse conjunto de dados, não há violação de nenhuma regra. Ou seja, nesse caso, diz-se que o processo está sob controle.
Uma vez construído o gráfico de controle para o processo, pode-se monitorar novas amostras, apenas acrescentado os novos dados no gráfico já construído.
> qcc(diametro[1:25,],type='xbar',newdata=diametro[26:40,])
Observa-se, agora, que algumas observações estão acima do limite de controle superior, indicando que o processo deve estar fora de controle.
Causas especiais de variação devem estar ocorrendo nesse processo, fazendo com que o diâmetro esteja muito acima da média. Nesse caso, ações corretivas devem ser tomadas para corrigir o problema.
Ainda, é possível que pontos discrepantes causem esse comportamento dos dados. Para verificar essa possibilidade, é recomendável analisar as amostras individualmente para saber se existe alguma observação que possa ter originado tal problema. Para um tamanho de amostra pequeno () pode-se utilizar um gráfico de dispersão e para amostras maiores, pode-se fazer um boxplot, como preferir.
> plot(sample[126:200],diametro[126:200])
Observando o gráfico, podemos ver que não há indícios de que alguma observação seja considerada um dados discrepante.
Se for de interesse, limites de aviso ou alerta podem ser inseridos no gráfico. Por exemplo, pode-se inserir uma linha com dois desvios.
> qcc(diametro[1:25,],type='xbar',newdata=diametro[26:40,]) > names(qcc.xbar) > qcc.xbar<-qcc(diametro[1:25,],type='xbar', newdata=diametro[26:40,],nsigmas=2,plot=FALSE) > abline(h=qcc.xbar$lim[1],col="red",lty=2) > abline(h=qcc.xbar$lim[2],col="red",lty=2)
Gráfico R
Para construir o gráfico de controle R, basta definir o argumento type
como R
.
> qcc(diametro[1:25,], type="R") > qcc(diametro[1:25,], type="R", newdata=diametro[26:40,])
Observe que na primeira parte do gráfico, há um ponto em destaque que representa uma seqüência de observações abaixo da amplitude média. O R identificou essa observação como um possível ponto fora de controle.
Se for de interesse, pode-se obter a amplitude média utilizando os seguintes comandos:
> dm.25<-diametro[1:25,] > R<-numeric() > for(i in 1:25){R[i]<-diff(range(dm.25[i,]))} > mean(R)
Como visto na teoria, para construir os limites de controle dos gráficos de controle são utilizadas algumas constantes. Essas constantes podem ser obtidas por simulação computacional.
Inicialmente, vamos obter o valor da constante . Para tanto, consideraremos o valor de
. Assim, deve-se gerar 4 amostras da distribuição Normal padrão. Depois de geradas, tomam-se amostras de 4 observações e calcula-se a amplitude de cada amostra.
A amplitude média dessas amostras é que vai originar a constante
.
> N1<-rnorm(1000) > N2<-rnorm(1000) > N3<-rnorm(1000) > N4<-rnorm(1000) > N<-cbind(N1,N2,N3,N4) > d<-numeric() > for(i in 1:1000) { d[i]<- diff(range(N[i,])) } mean(d)
Esta simulação deve ser realizada com um grande. Para um valor de n=4, o valor tabelado para
é 2,059.
Para obter o valor de , basta calcular o desvio padrão de
. Os valores de
e
são obtidos calculando-se as expressões desenvolvidas na parte teórica.
> d2<-mean(d);d2 > d3<-sd(d2);d3 > D4<-1+(3*d3/d2);D4 > D3<-1-(3*d3/d2);D3
Como é um valor negativo (e não existe amplitude negativa!) ele é substituído por zero.
Para
,
Os valores de
e
são tabelados para diferentes valores de
(1).
Para construir o gráfico de controle S, basta definir o argumento type
como S
.
> qcc(diametro[1:25,], type="S") > qcc(diametro[1:25,], type="S", newdata=diametro[26:40,])
Observe que, os limites do gráfico de baseado no desvio padrão é idêntico ao gráfico de
baseado em R. Para amostrs pequenas isso é esperado.
> set.seed(1) # semente para simulação > a1<-rnorm(30,25,.5);a1 #30 obs. média 25; DP 0.5 > set.seed(2) # semente para simulação > a2<-rnorm(30,25,.5);a2 > set.seed(3) # semente para simulação > a3<-rnorm(30,25,.5);a3 > dados<-cbind(a1,a2,a3);dados
Experimente eliminar uma observação da segunda amostra ou alterar um valor:
> dados[2,2]<-NA # ou > dados[2,2]<-50Refaça os gráficos.
Mude a semente e os parâmetros da Normal e analise os dados. Experimente também variar o tamanho das amostras do processo.
qcc
modificando argumentos e estude as opções de construção de um gráfico de controle para
qAnalyst
também possui algumas funções aplicadas ao controle estatístico de qualidade. Experimente fazer alguns gráficos de controle e compare-os com os gráficos do pacote qcc
.
Veja alguns exemplos
require(qAnalyst) data(cranks) xbarchart=spc(x=cranks$crankshaft, sg=cranks$workingDay, type="xbar", name="crankshaft") rbarchart=spc(x=cranks$crankshaft, sg=cranks$workingDay, type="r", name="crankshaft") plot(xbarchart) plot(rbarchart)
Veja a aplicação nos dados dos anéis de pistão (pistonrings):
#pistonrings xbarchart.piston=spc(x=pistonrings$diameter, sg=pistonrings$sample, type="xbar", name="pistonrings") rbarchart.piston=spc(x=pistonrings$diameter, sg=pistonrings$sample, type="r", name="pistonrings") plot(xbarchart.piston) plot(rbarchart.piston)
Outro exemplo:
data(brakeCap) x=brakeCap$hardness sg=brakeCap$subgroup go=spc(x=x,sg=sg,type="xbar") plot(go)
E o gráfico de Pareto:
require(MASS) data(Cars93) paretoData=Cars93$Manufacturer[1:45] paretoChart(x=paretoData,mergeThr=.8)
adilson dos anjos 2008-09-18