Pacote QCC

Com o pacote QCC podemos:

-Traçar gráficos de controle de qualidade Shewhart para dados contínuos, de atributos e de contagem;

-Traçar gráficos Cusum e EWMA para dados contínuos;

-Produzir gráficos de CEQ para dados multivaridados;

-Desenhar curvas características de operação;

-Realizar análises de capacidade de processo;

-Desenhar gráficos de Pareto e diagramas de causa e efeito.


Introdução: Importação e Instalação

options(htmltools.dir.version = FALSE)

# install.packages("qcc")

library(qcc)
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
library(readxl)

Sobre o pacote

Sobre Luca Scrucca (Desenvolvedor do pacote): https://luca-scr.github.io/

Sobre a versão 3.0 do pacote: https://luca-scr.github.io/qcc/

packageVersion("qcc")
## [1] '2.7'

Datasets do pacote qcc

data("circuit")

data("pistonrings")

Pacote circuit: “Número de não conformidades observadas em 26 amostras sucessivas de 100 placas de circuito impresso. As amostras 6 e 20 estão fora dos limites de controle. A amostra 6 foi examinada por um novo inspetor e ele não reconheceu vários tipos de não conformidades que poderiam estar presentes. Além disso, o número anormalmente grande de não conformidades na amostra 20 resultou de um problema de controle de temperatura na máquina de solda por onda, que foi posteriormente reparada. As últimas 20 amostras são amostras adicionais coletadas em unidades de inspeção (cada uma formada por 100 placas).”

Pacote pistonrings: Anéis de pistão para um motor automotivo são produzidos por um processo de forjamento. O diâmetro interno dos anéis fabricados pelo processo é medido em 25 amostras, cada uma de 5 peças, para a fase de controle I, quando amostras preliminares de um processo considerado ‘em controle’ são usadas para construir gráficos de controle. Em seguida, outras 15 amostras, novamente cada uma de 5 peças, são obtidas para a fase II.”

Principais Comandos do Qcc

cat("
 qcc
 qcc.groups
 ewma
 process.capability
 pareto.chart
 limits.xbar
 qcc.options

")
## 
##  qcc
##  qcc.groups
##  ewma
##  process.capability
##  pareto.chart
##  limits.xbar
##  qcc.options

Causa e efeito - W

library(qcc)

# #Estrutura do comando

# cause.and.effect(
#   cause = list(),
#   effect = 
# )

# Criacao Macro e Micro

Efeito="Queda na quantidade de vendas"
cMarketing=c("Redes Sociais","GoogleMaps","ComunicaçãoEfetiva")
cConcorrencia=c("Novas Ideias","Aumento qtd de anuncios")
cColaboradores=c("Treinamentos","Transporte","Demora nas atividades")
cAvaliacoes=c("Comentarios Negativos","Atendimento demorado","Resolução lenta")
cAtendimento=c("Robos não efetivos","Resolução Ineficaz","Ausencia de treinamento")
cProcessos=c("Cadastro lento","Documentos e validação","Excesso de ferramentas")
Causas=c()
# fig.width = 12, fig.height = 12
cause.and.effect(
  cause = list(Marketing=cMarketing,
               Concorrencia=cConcorrencia,
               Colaboradores=cColaboradores,
               Avaliacoes=cAvaliacoes,
               Atendimento=cAtendimento,
               Processos=cProcessos),
  effect = Efeito
)

Exemplo produção de macarrão - M

cause.and.effect(
  cause = list(
    Mão_de_Obra = c(
      "Operadores de Máquinas",
      "Equipe de Contr. de Qualid.",
      "Treinamen. de Novos Func."
    ),
    Máquinas = c(
      "Máquinas de Mistura",
      "Equipamentos de Extrusão",
      "Máquinas de Corte"
    ),
    Métodos = c(
      "Procedimentos de Mistura",
      "Configurações de Extrusão",
      "Processo de Secagem"
    ),
    Materiais = c(
      "Tipo/Quali. de Farinha",
      "Aditivos Alimentares",
      "Água de Processo"
    ),
    Meio_Ambiente = c(
      "Condiç. de Temp. e Umid.",
      "Higiene da Fábrica",
      "Controle de Pragas"
    ),
    Manutenção = c(
      "Programa de Manutenção Preventiva",
      "Reparos Rápidos de Máquinas",
      "Substituição de Peças"
    )
  ),
  effect = "Variação na Qualidade do Produto Final",
  title = "Diagrama de Causa e Efeito - Produção de Macarrão"
)

Gráfico de Pareto - M

exemplo.pareto <- c(20, 25, 25, 15, 10)

pareto.chart(exemplo.pareto,
             names = c("M. obra", "Máquinas", "Mét.", "Materiais", "M. amb."),
             ylab = "Porcentagem de causas",
             xlab = "Causas")

##    
## Pareto chart analysis for exemplo.pareto
##     Frequency Cum.Freq. Percentage Cum.Percent.
##   B  25.00000  25.00000   26.31579     26.31579
##   C  25.00000  50.00000   26.31579     52.63158
##   A  20.00000  70.00000   21.05263     73.68421
##   D  15.00000  85.00000   15.78947     89.47368
##   E  10.00000  95.00000   10.52632    100.00000

Gráficos de Controle (Gráficos de Shewhart) - W

# Criando uma coluna com as medidas 
dados <- rnorm(500, 100,25)

# Tamanho da amostra n = 5
sample_size <- 5

# quantidade de amostras
number_of_samples <- length(dados)/sample_size

# Associando medidas com amostras
sample <- rep(1:number_of_samples, each = sample_size)

# Criando um data frame com as informações
df <- data.frame(dados, sample)

# Agrupando as medidas e suas respectivas amostras
dados <-qcc.groups(dados, sample)

# Visualização inicial 
head(dados)
##        [,1]      [,2]      [,3]      [,4]      [,5]
## 1 110.00756 129.87265  97.28349  83.86098  71.15542
## 2  99.96911  69.30878  39.98839  69.43791 117.50025
## 3 132.68985 152.21936  92.95393 109.80140  90.61172
## 4 126.02119  95.14770 105.06342  66.71914  81.71886
## 5 117.88443  94.64737 119.42394  80.54621 132.43945
## 6  53.59686 123.02255 148.67190  72.11359 112.79700
xbar <- qcc(dados, type = "xbar")

Criando um objeto qcc - W

xbar <- qcc(dados, type = "xbar",plot = F)

Caso não queira que o grafico seja plotado automaticamente, use plot = FALSE dentro do qcc

Configurando o qcc: - M

Podemos ver que a função qcc recebe um argumento type. O type pode receber as seguintes definições:

“xbar”: Gera um gráfico X¯em que as médias da amostra são plotadas para controlar o nível médio de uma variável de processo contínuo.

“xbar.one”: Gera um gráfico X¯sabendo que a amostra é de tamanho n=1.

“R”: Gera um gráfico R em que intervalos de amostra são plotados para controlar a variabilidade de uma variável de processo contínuo.

“S”: Gera um gráfico S em que os desvios padrão da amostra são plotado para controlar a variabilidade de uma variável de processo contínuo.

“p”: Gera um gráfico p em que a proporção de unidades não conformes é traçada. Limites de controle são baseados na disitribuição binomial.

“np”: Gera um gráfico np em que o número de não conformes unidades são plotadas. Limites de controle são baseados na distribuição binomial

“c”: Gera um gráfico c em que o número de defeituosos por unidade são plotados. Este gráfico assume que os defeitos do atributos de qualidade são raros, e os limites de controle são calculados com base na distribuição de Poisson.

“u”: Gera um gráfico u em que o número médio de defeituosos por unidade é plotado. A distribuição de Poisson é usada para calcular os limites de controle, mas, ao contrário do gráfico c, este gráfico não requer número constante de unidades.

Adicionar Limites mudando variação dos sigmas - W

warn.limits.2 = limits.xbar(xbar\(center, xbar\)std.dev, xbar$sizes, 2)

abline(h = warn.limits.2, lty = 2, col = “red”) abline(h = warn.limits.1, lty = 2, col = “yellow”)

warn.limits.2 = limits.xbar(xbar$center, xbar$std.dev, xbar$sizes, 2)
warn.limits.1 = limits.xbar(xbar$center, xbar$std.dev, xbar$sizes, 1)
xbar <- qcc(dados, type = "xbar",plot = F)
plot(xbar,restore.par = FALSE)

abline(h = warn.limits.2, lty = 2, col = "red")
abline(h = warn.limits.1, lty = 2, col = "yellow")

Se esta adicionando algo dentro do plot use restore.par = FALSE, exemplo as linhas

Pesonalizando o visual do grafico - W

# Primeiramente salve a configuracao atual
old <- qcc.options()

qcc.options(old)
plot(xbar)

# Destacar pontos além dos limites de controle.

# beyond.limits = list(pch = "#FF5CAD")

# Destacar fundo do grafico

# bg.figure="#FF5CAD"

# Destacar margem do grafico

# bg.margin= "#D8BFD8"

qcc.options(bg.margin = "#D8BFD8",bg.figure="#FF5CAD")

xbar <- qcc(dados, type = "xbar",plot = F)
plot(xbar)

# save defaults
qcc.options(old)
qcc.options("cex.stats") # get a single parameter
## [1] 0.9
qcc.options("cex.stats"=1.2) # change parameters
qcc.options(bg.margin="azure2")
qcc.options("violating.runs" = list(pch = 15, col = "purple"))
qcc.options("beyond.limits" = list(pch = 15, col = "orangered"))
qcc(rnorm(100), type = "xbar.one", std.dev = 0.7) # see the results

## List of 11
##  $ call      : language qcc(data = rnorm(100), type = "xbar.one", std.dev = 0.7)
##  $ type      : chr "xbar.one"
##  $ data.name : chr "rnorm(100)"
##  $ data      : num [1:100, 1] 1.3056 2.0939 0.9865 0.0915 0.0435 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:100] 1.3056 2.0939 0.9865 0.0915 0.0435 ...
##   ..- attr(*, "names")= chr [1:100] "1" "2" "3" "4" ...
##  $ sizes     : int [1:100] 1 1 1 1 1 1 1 1 1 1 ...
##  $ center    : num 0.0229
##  $ std.dev   : num 0.7
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] -2.08 2.12
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"
# restore old defaults

plot(xbar)

Summary dos graficos - M

summary(xbar)
## 
## Call:
## qcc(data = dados, type = "xbar", plot = F)
## 
## xbar chart for dados 
## 
## Summary of group statistics:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##  75.55225  93.76202 100.69979 101.52335 110.56504 129.35551 
## 
## Group sample size:  5
## Number of groups:  100
## Center of group statistics:  101.5233
## Standard deviation:  24.11046 
## 
## Control limits:
##       LCL      UCL
##  69.17578 133.8709

Tipo de dados/grafico - W

O tipo de gráfico de controle depende do tipo de dados e sua distribuição. Há uma árvore de decisão para a seleção do gráfico.

DiagrammeR::mermaid(
  "graph TB
    A(Select Control Chart)-->B{data type}
    B --> |Discrete| C{Distribution}
    B --> |Continuous| D{Sample Size}
    C --> |Poisson| E{Sample Size}
    C --> |Binominal| F{Frequency}
    E --> |constant| G[c-chart]
    E --> |variable| H[u-chart]
    F --> |count| I[np-chart]
    F --> |proportion| J[p-chart]
    D --> |n = 1| K[x.one + R chart]
    D --> |n = 2-10| L[x + R chart]
    D --> |n > 10| M[x + S chart]
"
)

Gráfico x_barra - M

data(pistonrings) # Carregando dados

## Estatística descritiva dos dados
summary(pistonrings)
##     diameter         sample        trial        
##  Min.   :73.97   Min.   : 1.00   Mode :logical  
##  1st Qu.:74.00   1st Qu.:10.75   FALSE:75       
##  Median :74.00   Median :20.50   TRUE :125      
##  Mean   :74.00   Mean   :20.50                  
##  3rd Qu.:74.01   3rd Qu.:30.25                  
##  Max.   :74.04   Max.   :40.00
dados_organizados <- qcc.groups(pistonrings$diameter, pistonrings$sample)
xbar_qcc <- qcc(dados_organizados[1:25,], newdata=dados_organizados[26:40,], type = "xbar")

Gráfico r - M

r_qcc <- qcc(dados_organizados[1:25,], newdata=dados_organizados[26:40,], type = "R")


plot(r_qcc)

Gráfico S - M

s_qcc <- qcc(dados_organizados[1:25,], newdata=dados_organizados[26:40,], type = "S")


plot(s_qcc)

Gráfico CUSUM - W

Eles são úteis para detectar pequenas variações na média do processo.

set.seed(2024)
# cusum(dados,intervalo,decision desvio)

data(pistonrings)
pistao=pistonrings
attach(pistao)
## The following object is masked _by_ .GlobalEnv:
## 
##     sample
head(pistao)
##   diameter sample trial
## 1   74.030      1  TRUE
## 2   74.002      1  TRUE
## 3   74.019      1  TRUE
## 4   73.992      1  TRUE
## 5   74.008      1  TRUE
## 6   73.995      2  TRUE
dim(diameter)
## NULL
diameter <- qcc.groups(pistao$diameter, pistao$sample)
dim(diameter)
## [1] 40  5
head(diameter)
##     [,1]   [,2]   [,3]   [,4]   [,5]
## 1 74.030 74.002 74.019 73.992 74.008
## 2 73.995 73.992 74.001 74.011 74.004
## 3 73.988 74.024 74.021 74.005 74.002
## 4 74.002 73.996 73.993 74.015 74.009
## 5 73.992 74.007 74.015 73.989 74.014
## 6 74.009 73.994 73.997 73.985 73.993
q1 <- cusum(diameter[1:25,], decision.interval = 10, se.shift = 1)

q5 <- cusum(diameter[1:25,], decision.interval = 1, se.shift = 1)

Gráfico ewma - M

ewma(dados_organizados[1:25,], newdata=dados_organizados[26:40,], lambda=0.2, nsigmas=3)

## List of 19
##  $ call        : language ewma(data = dados_organizados[1:25, ], lambda = 0.2, nsigmas = 3, newdata = dados_organizados[26:40,      ])
##  $ type        : chr "ewma"
##  $ data.name   : chr "dados_organizados[1:25, ]"
##  $ data        : num [1:25, 1:5] 74 74 74 74 74 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics  : Named num [1:25] 74 74 74 74 74 ...
##   ..- attr(*, "names")= chr [1:25] "1" "2" "3" "4" ...
##  $ sizes       : Named int [1:25] 5 5 5 5 5 5 5 5 5 5 ...
##   ..- attr(*, "names")= chr [1:25] "1" "2" "3" "4" ...
##  $ center      : num 74
##  $ std.dev     : num 0.00979
##  $ newstats    : Named num [1:15] 74 74 74 74 74 ...
##   ..- attr(*, "names")= chr [1:15] "26" "27" "28" "29" ...
##  $ newdata     : num [1:15, 1:5] 74 74 74 74 74 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ newsizes    : Named int [1:15] 5 5 5 5 5 5 5 5 5 5 ...
##   ..- attr(*, "names")= chr [1:15] "26" "27" "28" "29" ...
##  $ newdata.name: chr "dados_organizados[26:40, ]"
##  $ x           : int [1:40] 1 2 3 4 5 6 7 8 9 10 ...
##  $ y           : Named num [1:40] 74 74 74 74 74 ...
##   ..- attr(*, "names")= chr [1:40] "1" "2" "3" "4" ...
##  $ sigma       : Named num [1:40] 0.000875 0.001121 0.001253 0.001331 0.001378 ...
##   ..- attr(*, "names")= chr [1:40] "1" "2" "3" "4" ...
##  $ lambda      : num 0.2
##  $ nsigmas     : num 3
##  $ limits      : num [1:40, 1:2] 74 74 74 74 74 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ violations  : Named int [1:4] 37 38 39 40
##   ..- attr(*, "names")= chr [1:4] "37" "38" "39" "40"
##  - attr(*, "class")= chr "ewma.qcc"

Curvas Características de Operação - M

oc.curves.xbar(xbar_qcc)

Capacidade do Processo - M

data(pistonrings) 

dados_organizados <- qcc.groups(pistonrings$diameter, pistonrings$sample)


xbar_qcc <- qcc(dados_organizados[1:25,], type = "xbar")

process.capability(xbar_qcc, spec.limits=c(73.95,74.05))

## 
## Process Capability Analysis
## 
## Call:
## process.capability(object = xbar_qcc, spec.limits = c(73.95,     74.05))
## 
## Number of obs = 125          Target = 74
##        Center = 74              LSL = 73.95
##        StdDev = 0.009785        USL = 74.05
## 
## Capability indices:
## 
##       Value   2.5%  97.5%
## Cp    1.703  1.491  1.915
## Cp_l  1.743  1.555  1.932
## Cp_u  1.663  1.483  1.844
## Cp_k  1.663  1.448  1.878
## Cpm   1.691  1.480  1.902
## 
## Exp<LSL 0%    Obs<LSL 0%
## Exp>USL 0%    Obs>USL 0%

MQCC MULTIVARIATE - W

https://cran.r-project.org/web/packages/qcc/qcc.pdf

multivariate ellipseChart,9 mqcc, 14 stats.T2, 43 stats.T2.single, 44

# Ryan (2000, Table 9.2) data with p = 2 variables, m = 20 samples, n = 4 sample size:
X1 <- matrix(c(72, 56, 55, 44, 97, 83, 47, 88, 57, 26, 46,
49, 71, 71, 67, 55, 49, 72, 61, 35, 84, 87, 73, 80, 26, 89, 66,
50, 47, 39, 27, 62, 63, 58, 69, 63, 51, 80, 74, 38, 79, 33, 22,
54, 48, 91, 53, 84, 41, 52, 63, 78, 82, 69, 70, 72, 55, 61, 62,
41, 49, 42, 60, 74, 58, 62, 58, 69, 46, 48, 34, 87, 55, 70, 94,
49, 76, 59, 57, 46), ncol = 4)
X2 <- matrix(c(23, 14, 13, 9, 36, 30, 12, 31, 14, 7, 10,
11, 22, 21, 18, 15, 13, 22, 19, 10, 30, 31, 22, 28, 10, 35, 18,
11, 10, 11, 8, 20, 16, 19, 19, 16, 14, 28, 20, 11, 28, 8, 6,
15, 14, 36, 14, 30, 8, 35, 19, 27, 31, 17, 18, 20, 16, 18, 16,
13, 10, 9, 16, 25, 15, 18, 16, 19, 10, 30, 9, 31, 15, 20, 35,
12, 26, 17, 14, 16), ncol = 4)
X <- list(X1 = X1, X2 = X2)
q <- mqcc(X, type = "T2")
plot(q)

summary(q)
## 
## Call:
## mqcc(data = X, type = "T2")
## 
## T2 chart for X 
## 
## Summary of group statistics:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  0.12429  1.32496  2.50272  6.47013  5.34912 63.76042 
## 
## Number of variables:  2
## Number of groups:  20
## Group sample size:  4
## 
## Center: 
##      X1      X2 
## 60.3750 18.4875 
## 
## Covariance matrix:
##          X1        X2
## X1 222.0333 103.11667
## X2 103.1167  56.57917
## |S|:  1929.414 
## 
## Control limits:
##  LCL      UCL
##    0 11.03976
ellipseChart(q)

ellipseChart(q, show.id = TRUE)

Fim!