Controle Estatístico de Processos - Métodos e Filosofia

Baseado no Capítulo 5 - Montgomery, D. C. (2017)

Prof. Marcelo R.P. Ferreira

DE-UFPB - Bacharelado em Estatística e Ciência de Dados

junho, 2026

Controle Estatístico de Processos

“A qualidade deve ser garantida durante o processo, não apenas inspecionada ao final.”

— W. A. Shewhart

Mapa do Capítulo 5

Controle Estatístico de Processos (CEP) Causas Aleatórias vs. Atribuíveis Gráfico de Controle Shewhart · Limites · ARL Sete Ferramentas da Qualidade Subgrupos Racionais Abordagem 1 · Abordagem 2 Padrões e Regras WECO Zonas · Ciclos · Tendência Fase I e Fase II Retrospectiva · Prospectiva Fase Controlar — DMAMC

Por que Controle Estatístico de Processos?

  • Na manufatura ou serviços, inspecionar 100% dos produtos finais é inviável econômica e operacionalmente
  • A qualidade deve ser garantida durante o processo (on-line), não apenas na inspeção final (off-line)
  • O objetivo central: tornar o processo inerentemente estável com mínima variabilidade
Processo Produção Amostragem Subgrupo racional Gráfico de Controle Sob controle? Sim Não Investigar causa atribuível

O Gráfico de Controle de Shewhart — Elementos

  • Criado por Walter A. Shewhart (Bell Labs, 1924) — coração do CEP on-line
  • Diferente do Teste de Hipótese clássico (aplicado uma vez), o CEP testa o processo repetidamente

Elementos do gráfico:

  • Abscissa (X): ordem cronológica da amostra — escala temporal uniforme
  • Ordenada (Y): valores da característica da qualidade (variável ou atributo)
  • Linha Média (LM): valor médio da característica quando o processo está sob controle
  • LSC / LIC: pontos entre eles indicam ausência de causas atribuíveis
  • Suposição: pontos amostrais são independentes

Causas Aleatórias vs. Atribuíveis

Causas Aleatórias (comuns)

  • Variação de “ruído de fundo” — inevitável
  • Pequenas perturbações: vibração da máquina, flutuação elétrica, variação natural de matéria-prima
  • Processo com apenas causas aleatórias está “Sob Controle Estatístico”
  • Processo estável: média e dispersão constantes no tempo

Causas Atribuíveis (especiais)

  • Fontes anômalas: falha no maquinário, lote defeituoso, erro humano atípico
  • Produzem deslocamento da média ou aumento da dispersão
  • Presença → processo “Fora de Controle”
  • Objetivo do CEP: detectar a causa atribuível no momento exato em que surge

Processo Sob Controle — Distribuições Estáveis no Tempo

Quando o processo opera apenas com causas aleatórias, as distribuições das amostras são estáveis ao longo do tempo:

Clique para ver o código
library(ggplot2)
set.seed(3)
mu0 <- 74; sigma <- 0.01
df_dist <- do.call(rbind, lapply(1:4, function(i)
  data.frame(x=rnorm(300,mu0,sigma), tempo=paste0("T",i))))
ggplot(df_dist,aes(x=x,fill=tempo)) +
  geom_density(alpha=.5) +
  scale_fill_manual(values=c("#7ecff7","#a8f77e","#f7c87e","#c87ef7")) +
  geom_vline(xintercept=c(mu0-3*sigma, mu0, mu0+3*sigma),
             color=c("#f07050","white","#f07050"),
             linetype=c("dashed","solid","dashed"),linewidth=.9) +
  labs(title="Sob controle: distribuições idênticas nos quatro instantes",
       x="Diametro (mm)",y="Densidade",fill="Instante") +
  theme_minimal(base_size=13)

Causas Atribuíveis — Efeito nas Distribuições

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(4)
mu0 <- 74; sigma <- 0.01
d1a <- data.frame(x=rnorm(300,mu0,sigma), g="Sob controle")
d1b <- data.frame(x=rnorm(300,mu0+.02,sigma), g="Média deslocada")
d2a <- data.frame(x=rnorm(300,mu0,sigma),     g="Sob controle")
d2b <- data.frame(x=rnorm(300,mu0,sigma*2.5), g="Variância inflada")
p1 <- ggplot(rbind(d1a,d1b),aes(x=x,fill=g)) +
  geom_density(alpha=.6) +
  scale_fill_manual(values=c("#7ecff7","#f07050")) +
  geom_vline(xintercept=c(mu0-3*.0045,mu0+3*.0045),
             color="#f07050",linetype="dashed",linewidth=1) +
  labs(title="Deslocamento de média",x="mm",y="",fill="") +
  theme_minimal(base_size=11)
p2 <- ggplot(rbind(d2a,d2b),aes(x=x,fill=g)) +
  geom_density(alpha=.6) +
  scale_fill_manual(values=c("#7ecff7","#a8f77e")) +
  geom_vline(xintercept=c(mu0-3*.0045,mu0+3*.0045),
             color="#f07050",linetype="dashed",linewidth=1) +
  labs(title="Aumento de variância",x="mm",y="",fill="") +
  theme_minimal(base_size=11)
p1 + p2

Causas Aleatórias vs. Atribuíveis — Visualização

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(42)
# Processo sob controle
y_ctrl <- rnorm(20, 74, 0.0045)
# Causa atribuível: deslocamento de média a partir do ponto 11
y_atrib <- c(rnorm(10, 74, 0.0045), rnorm(10, 74.015, 0.0045))
# Causa atribuível: aumento da variância a partir do ponto 11
y_var   <- c(rnorm(10, 74, 0.0045), rnorm(10, 74, 0.012))

lm_ <- 74; lsc <- 74 + 3*0.0045; lic <- 74 - 3*0.0045
mk <- function(y, titulo, cor) {
  df <- data.frame(t=1:20, y=y, fora=y>lsc|y<lic)
  ggplot(df, aes(t,y)) +
    geom_line(color="white", linewidth=.6) +
    geom_point(aes(color=fora), size=2.5) +
    scale_color_manual(values=c("FALSE"=cor,"TRUE"="#f07050"),guide="none") +
    geom_hline(yintercept=c(lsc,lm_,lic),
               color=c("#f07050","#a8f77e","#f07050"),
               linetype=c("dashed","solid","dashed"), linewidth=.8) +
    labs(title=titulo, x="Amostra", y=expression(bar(x))) +
    theme_minimal(base_size=11)
}
mk(y_ctrl, "Sob controle", "#7ecff7") +
mk(y_atrib,"Causa atrib.:\ndeslocamento de média","#f7c87e") +
mk(y_var,  "Causa atrib.:\naumento de variância","#c87ef7")

A Metáfora do Ajuste Excessivo (Overadjustment)

  • Se um operador corrige cada pequena flutuação aleatória, ele piora o processo
  • Tentar controlar causas aleatórias é chamado de ajuste excessivo — análogo ao overfitting em ML
  • O gráfico de controle é o filtro que indica quando não intervir
Clique para ver o código
library(ggplot2)
set.seed(7)
n <- 40
sem <- numeric(n); sem[1] <- rnorm(1,0,1)
for(i in 2:n) sem[i] <- sem[i-1] + rnorm(1,0,1)
com <- numeric(n); com[1] <- rnorm(1,0,1)
for(i in 2:n) com[i] <- com[i-1] + rnorm(1, -com[i-1]*0.9, 1)
df <- data.frame(t=rep(1:n,2),
                 y=c(sem,com),
                 tipo=rep(c("Sem ajuste (correto)","Com ajuste excessivo"),each=n))
ggplot(df, aes(t,y,color=tipo)) +
  geom_line(linewidth=1.1) + geom_point(size=1.5) +
  scale_color_manual(values=c("Sem ajuste (correto)"="#7ecff7",
                               "Com ajuste excessivo"="#f07050")) +
  labs(title="Ajuste excessivo amplifica a variabilidade do processo",
       x="Tempo", y="Desvio em relação ao alvo", color="") +
  theme_minimal(base_size=13)

A Escolha de \(L=3\): Por que não 2 ou 4?

Clique para ver o código
library(ggplot2)
Ls     <- seq(1, 5, by=0.1)
alphas <- 1-(pnorm(Ls)-pnorm(-Ls))
ARL0s  <- 1/alphas
df_L   <- data.frame(L=Ls, alpha=alphas, ARL0=ARL0s)
library(patchwork)
p1 <- ggplot(df_L,aes(L,alpha)) +
  geom_line(color="#f07050",linewidth=1.3) +
  geom_vline(xintercept=3,color="#f7c87e",linetype="dashed",linewidth=1) +
  annotate("text",x=3.1,y=.03,label="L=3\nalpha=0.0027",
           color="#f7c87e",size=3.5,hjust=0) +
  labs(title="alpha vs L",x="L (sigmas)",y="Probabilidade de falso alarme") +
  theme_minimal(base_size=11)
p2 <- ggplot(df_L,aes(L,ARL0)) +
  geom_line(color="#7ecff7",linewidth=1.3) +
  geom_vline(xintercept=3,color="#f7c87e",linetype="dashed",linewidth=1) +
  annotate("text",x=3.1,y=100,label="L=3\nARL0=370",
           color="#f7c87e",size=3.5,hjust=0) +
  scale_y_log10() +
  labs(title="ARL0 vs L (escala log)",x="L (sigmas)",y="ARL0") +
  theme_minimal(base_size=11)
p1 + p2

Base Estatística: Limites de Controle de Shewhart

Seja \(T\) um estimador da característica de qualidade, com \(\mu_T = E(T)\) e \(\sigma_T = \sqrt{\text{Var}(T)}\):

\[LIC = \mu_T - L\,\sigma_T \qquad LM = \mu_T \qquad LSC = \mu_T + L\,\sigma_T\]

  • Prática americana (Shewhart): \(L = 3\) — limites três-sigma
  • Sob normalidade: \(P(\text{falso alarme}) = \alpha = 0{,}0027\) (2,7 falsos alarmes em 1.000 amostras)
  • Prática europeia: limites de probabilidade com \(\alpha\) fixado diretamente (ex: \(\alpha = 0{,}001 \Rightarrow L \approx 3{,}09\))

Exemplo: Anéis de Pistão (Montgomery, Cap. 5)

Exemplo: Diâmetro interno de anéis de pistão. \(\mu_0 = 74\) mm, \(\sigma = 0{,}01\) mm, \(n = 5\) anéis por hora.

\[\sigma_{\bar{X}} = \frac{\sigma}{\sqrt{n}} = \frac{0{,}01}{\sqrt{5}} \approx 0{,}0045 \text{ mm}\]

\[LIC = 74 - 3 \times 0{,}0045 = 73{,}9865 \text{ mm} \qquad LSC = 74 + 3 \times 0{,}0045 = 74{,}0135 \text{ mm}\]

mu0 <- 74; sigma <- 0.01; n <- 5
s_xb <- sigma / sqrt(n)
cat(sprintf("sigma_xbar = %.5f mm\nLIC = %.4f mm\nLM  = %.4f mm\nLSC = %.4f mm\n",
            s_xb, mu0-3*s_xb, mu0, mu0+3*s_xb))
sigma_xbar = 0.00447 mm
LIC = 73.9866 mm
LM  = 74.0000 mm
LSC = 74.0134 mm

Exemplo: Anéis de Pistão — Gráfico de Controle

Clique para ver o código
library(ggplot2)
set.seed(11)
mu0 <- 74; sigma <- 0.01; n <- 5; s_xb <- sigma/sqrt(n)
medias <- c(rnorm(15, mu0, s_xb), rnorm(5, mu0+0.01, s_xb))
df <- data.frame(t=1:20, xbar=medias,
                 fora=medias > mu0+3*s_xb | medias < mu0-3*s_xb)
ggplot(df, aes(t, xbar)) +
  geom_line(color="white", linewidth=.7) +
  geom_point(aes(color=fora), size=3) +
  scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),
                     labels=c("Sob controle","Fora de controle"), name="") +
  geom_hline(yintercept=c(mu0+3*s_xb, mu0, mu0-3*s_xb),
             color=c("#f07050","#a8f77e","#f07050"),
             linetype=c("dashed","solid","dashed"), linewidth=1) +
  annotate("text",x=20.4,y=mu0+3*s_xb,label="LSC",color="#f07050",size=3.5,hjust=0) +
  annotate("text",x=20.4,y=mu0,        label="LM", color="#a8f77e",size=3.5,hjust=0) +
  annotate("text",x=20.4,y=mu0-3*s_xb,label="LIC",color="#f07050",size=3.5,hjust=0) +
  labs(title="Gráfico de Controle: Diametro de Aneis de Pistao",
       x="Amostra (hora)", y="Média amostral (mm)") +
  theme_minimal(base_size=13)

Relação com o Teste de Hipóteses

Os limites de controle equivalem às regiões de aceitação e rejeição de:

\[H_0: \mu = \mu_0 \qquad H_1: \mu \neq \mu_0\]

\[\alpha = 1 - P(LIC \leq \bar{X} \leq LSC \mid \mu = \mu_0) \qquad \beta = P(LIC \leq \bar{X} \leq LSC \mid \mu = \mu_0 + \delta)\]

Teste de Hipótese Gráfico de Controle
Aplicação Uma vez, sobre um conjunto de dados Repetidamente, ao longo do tempo
Objetivo Verificar suposições sobre parâmetros Verificar a estabilidade do processo
Tipo de mudança Permanente no modelo Pode ser transitória, sazonal ou gradual

Limites de Controle vs. Limites de Especificação

Importante

Erro frequente: confundir Limites de Controle com Limites de Especificação.

Limites de Especificação (LIE, LSE)

  • Definidos pela Engenharia/cliente com base na aptidão ao uso
  • Representam a tolerância aceitável para o produto funcionar
  • São fixos — não dependem dos dados do processo

Limites de Controle (LIC, LSC)

  • Gerados pelos dados estatísticos do processo
  • Representam o comportamento natural da máquina sob controle
  • São estimados a partir da variabilidade observada

⚠️ Um processo estatisticamente “sob controle” pode gerar 100% de peças defeituosas se os limites de controle forem mais largos que os de especificação!

Probabilidade do Erro Tipo I — Limites \(3\sigma\)

\[\alpha = 1 - [\Phi(3) - \Phi(-3)]\]

alpha_3s <- 1 - (pnorm(3) - pnorm(-3))
alpha_2s <- 1 - (pnorm(2) - pnorm(-2))
cat(sprintf("Limites 3-sigma: alpha = %.6f  =>  ARL0 = %.1f\n",
            alpha_3s, 1/alpha_3s))
Limites 3-sigma: alpha = 0.002700  =>  ARL0 = 370.4
cat(sprintf("Limites 2-sigma: alpha = %.6f  =>  ARL0 = %.1f\n",
            alpha_2s, 1/alpha_2s))
Limites 2-sigma: alpha = 0.045500  =>  ARL0 = 22.0

Probabilidade do Erro Tipo I — Limites \(3\sigma\)

Clique para ver o código
library(ggplot2)
x  <- seq(-4,4,length.out=500)
df <- data.frame(x=x, y=dnorm(x))
ggplot(df,aes(x,y)) +
  geom_line(color="white",linewidth=1.2) +
  geom_area(data=subset(df,x< -3),fill="#f07050",alpha=.6) +
  geom_area(data=subset(df,x>  3),fill="#f07050",alpha=.6) +
  geom_area(data=subset(df,x>=-3&x<=-2),fill="#f7c87e",alpha=.35) +
  geom_area(data=subset(df,x>= 2&x<= 3),fill="#f7c87e",alpha=.35) +
  geom_area(data=subset(df,x>= -2&x<= 2),fill="cyan",alpha=.2) +
  geom_vline(xintercept=c(-3,3),color="#f07050",linetype="dashed",linewidth=1.1) +
  annotate("text",x=0,y=.18,label="99.73%\n(não alarme)",color="forestgreen",size=4) +
  annotate("text",x=3.6,y=.04,label="alpha/2",color="#f07050",size=3.5) +
  labs(title="Distribuição de X-barra com limites 3-sigma",x="Z",y="f(Z)") +
  theme_minimal(base_size=13)

Limites de Probabilidade

\[LIC = \mu_0 - Z_{\alpha/2}\,\sigma_{\bar{X}} \qquad LSC = \mu_0 + Z_{\alpha/2}\,\sigma_{\bar{X}}\]

Exemplo: Anéis de pistão com \(\alpha = 0{,}001\) (1 falso alarme a cada 1.000 amostras):

mu0 <- 74; s_xb <- 0.01/sqrt(5); alpha <- 0.001
z   <- qnorm(1 - alpha/2)
cat(sprintf("Z_(alpha/2) = %.4f\nLIC = %.4f mm\nLSC = %.4f mm\n",
            z, mu0-z*s_xb, mu0+z*s_xb))
Z_(alpha/2) = 3.2905
LIC = 73.9853 mm
LSC = 74.0147 mm
cat(sprintf("Comparação: L=3 -> LIC=%.4f | L=3.29 -> LIC=%.4f\n",
            mu0-3*s_xb, mu0-z*s_xb))
Comparação: L=3 -> LIC=73.9866 | L=3.29 -> LIC=73.9853

Com \(\alpha = 0{,}001\), \(Z_{\alpha/2} \approx 3{,}29\) — limites ligeiramente mais largos que os três-sigma.

Limites de Alerta (Warning Limits)

  • Limites de ação (\(\pm 3\sigma\)): ponto fora → investigar e agir
  • Limites de alerta (\(\pm 2\sigma\)): ponto entre alerta e controle → vigilância aumentada
Clique para ver o código
library(ggplot2)
set.seed(11)
dados <- data.frame(t=1:25, y=rnorm(25,50,1))
ggplot(dados, aes(t,y)) +
  geom_line(color="white",linewidth=.7) +
  geom_point(size=2.5, color="#7ecff7") +
  geom_hline(yintercept=c(48,52),color="#f7c87e",
             linetype="dotted",linewidth=1.1) +
  geom_hline(yintercept=c(47,53),color="#f07050",
             linetype="dashed",linewidth=1.1) +
  geom_hline(yintercept=50,color="#a8f77e",linewidth=1) +
  annotate("text",x=24,y=52.2,label="LSA (2sigma)",
           color="#f7c87e",size=3.2,hjust=0) +
  annotate("text",x=24,y=53.2,label="LSC (3sigma)",
           color="#f07050",size=3.2,hjust=0) +
  annotate("text",x=26,y=50.2,label="LM",
           color="#a8f77e",size=3.2,hjust=0) +
  labs(title="Gráfico de Controle com Limites de Ação (3s) e Alerta (2s)",
       x="Amostra",y=expression(bar(x))) +
  theme_minimal(base_size=13)

Erros Tipo I (\(\alpha\)) e Tipo II (\(\beta\)) no CEP

\[\alpha = 1 - P(LIC \leq \bar{X} \leq LSC \mid \mu = \mu_0)\]

\[\beta = \Phi(L - k\sqrt{n}) - \Phi(-L - k\sqrt{n})\]

onde \(\delta = k\sigma\) é o deslocamento da média e \(L\) é o múltiplo de \(\sigma\) dos limites.

Limites \(\alpha\) \(\text{ARL}_0\) \(\beta\) (\(k=1,n=5\)) \(\text{ARL}_1\)
\(L = 2\) 0,0455 22 0,083 1,09
\(L = 3\) 0,0027 370 0,489 1,96
\(L = 4\) 0,000063 15.787 0,843 6,36

\(L = 3\) é o equilíbrio empírico entre sensibilidade e taxa de falso alarme.

Curva Característica de Operação (Curva CO)

A Curva CO fornece \(\beta\) em função do deslocamento \(k\) para diferentes \(n\):

\[\beta = \Phi(L - k\sqrt{n}) - \Phi(-L - k\sqrt{n})\]

Clique para ver o código
library(ggplot2)
L <- 3; k_vals <- seq(0,4,by=0.05)
ns    <- c(1,3,5,10,20)
cores <- c("#f07050","#f7c87e","#7ecff7","#a8f77e","#c87ef7")
df <- do.call(rbind, lapply(seq_along(ns), function(i){
  n <- ns[i]
  data.frame(k=k_vals,
             beta=pnorm(L-k_vals*sqrt(n))-pnorm(-L-k_vals*sqrt(n)),
             n=paste0("n=",n))
}))
ggplot(df, aes(k,beta,color=n)) +
  geom_line(linewidth=1.2) +
  scale_color_manual(values=cores) +
  labs(title="Curva CO: probabilidade beta vs deslocamento k (L=3)",
       x="Deslocamento k (multiplos de sigma)",
       y="beta (prob. de não detectar)",color="") +
  theme_minimal(base_size=13)

Calculando o Risco \(\beta\)

Exemplo: Qual é o risco \(\beta\) de não detectar um deslocamento de \(k = 1{,}5\sigma\) na primeira amostra após a falha, com \(n = 5\)?

k <- 1.5; n <- 5; L <- 3
beta <- pnorm(L - k*sqrt(n)) - pnorm(-L - k*sqrt(n))
cat(sprintf("beta (n=5, k=1.5sigma) = %.4f\n", beta))
beta (n=5, k=1.5sigma) = 0.3616
cat(sprintf("Prob. de DETECTAR na 1a amostra: %.4f (%.1f%%)\n",
            1-beta, (1-beta)*100))
Prob. de DETECTAR na 1a amostra: 0.6384 (63.8%)

Com \(n=5\) e deslocamento de \(1{,}5\sigma\), há 36% de chance de não detectar na primeira amostra — amostras maiores são necessárias para falhas sutis.

Average Run Length (ARL)

O ARL é o número esperado de amostras até que um alarme seja emitido:

\[\text{ARL}_0 = \frac{1}{\alpha} \qquad \text{(processo sob controle)}\]

\[\text{ARL}_1 = \frac{1}{1-\beta} \qquad \text{(processo fora de controle)}\]

Para limites \(3\sigma\): \(\alpha = 0{,}0027 \Rightarrow \text{ARL}_0 \approx 370\)

Interpretação: mesmo quando a fábrica opera perfeitamente, haverá em média 1 falso alarme a cada 370 inspeções.

Calculando ARL no R

Exercício (Montgomery): Indústria farmacêutica monitora envase de xarope. Comparar o ARL\(_0\) dos limites \(3\sigma\) com limites de probabilidade \(\alpha = 0{,}002\). Em qual carta ocorrem mais falsos alarmes?

# Limites 3-sigma
alpha_3s <- 1 - (pnorm(3) - pnorm(-3))
ARL0_3s  <- 1 / alpha_3s
cat(sprintf("Limites 3-sigma:  alpha=%.6f | ARL0=%.1f amostras\n",
            alpha_3s, ARL0_3s))
Limites 3-sigma:  alpha=0.002700 | ARL0=370.4 amostras
# Limites de probabilidade
alpha_p  <- 0.002
ARL0_p   <- 1 / alpha_p
cat(sprintf("Limites prob.:    alpha=%.3f   | ARL0=%.1f amostras\n",
            alpha_p, ARL0_p))
Limites prob.:    alpha=0.002   | ARL0=500.0 amostras
cat("\nOs limites de probabilidade (ARL0=500) geram MENOS falsos alarmes\n")

Os limites de probabilidade (ARL0=500) geram MENOS falsos alarmes
cat("que os limites 3-sigma (ARL0=370): carta mais conservadora.\n")
que os limites 3-sigma (ARL0=370): carta mais conservadora.

Comparando \(\alpha\), ARL\(_0\) e ARL\(_1\) para Diferentes \(L\)

L_vals <- c(2, 3, 4)
k_vals_comp <- c(0.5, 1, 1.5, 2)
n_comp <- 5
tab <- do.call(rbind, lapply(L_vals, function(L) {
  alpha_L <- 1-(pnorm(L)-pnorm(-L))
  ARL0_L  <- 1/alpha_L
  sapply(k_vals_comp, function(k) {
    beta_k <- pnorm(L-k*sqrt(n_comp))-pnorm(-L-k*sqrt(n_comp))
    round(1/(1-beta_k),2)
  })
}))
rownames(tab) <- paste0("L=",L_vals)
colnames(tab) <- paste0("k=",k_vals_comp)
cat("ARL1 (n=5) para diferentes L e deslocamentos k:\n\n")
ARL1 (n=5) para diferentes L e deslocamentos k:
print(tab)
     k=0.5   k=1 k=1.5  k=2
L=2   5.27  1.69  1.10 1.01
L=3  33.40  4.50  1.57 1.08
L=4 506.03 25.73  3.86 1.47
cat("\nARL0: L=2 -> 22 | L=3 -> 370 | L=4 -> 15787\n")

ARL0: L=2 -> 22 | L=3 -> 370 | L=4 -> 15787

ARL\(_1\) e Tempo Médio para Alerta (ATS)

\[\text{ATS} = \text{ARL}_1 \times h\]

onde \(h\) é o intervalo temporal entre coletas.

beta <- 0.3615
ARL1 <- 1 / (1 - beta)
h_opcoes <- c(0.5, 1, 2, 4)
tabela <- data.frame(
  "h (horas)"        = h_opcoes,
  "ARL1 (amostras)"  = round(ARL1, 2),
  "ATS (horas)"      = round(ARL1 * h_opcoes, 2),
  check.names = FALSE
)
print(tabela)
  h (horas) ARL1 (amostras) ATS (horas)
1       0.5            1.57        0.78
2       1.0            1.57        1.57
3       2.0            1.57        3.13
4       4.0            1.57        6.26
cat(sprintf("\nCom coleta a cada 2h, detectamos o deslocamento em média em %.2f horas.\n",
            ARL1 * 2))

Com coleta a cada 2h, detectamos o deslocamento em média em 3.13 horas.

Tamanho da Amostra e Frequência de Amostragem

  • Tamanho \(n\): amostras maiores detectam pequenas mudanças; amostras menores detectam apenas grandes mudanças
  • Frequência \(h\): coletas mais frequentes → ATS menor → detecção mais rápida
Clique para ver o código
library(ggplot2)
k  <- 1; L <- 3; ns <- 1:25
ARL1_vals <- 1/(1-(pnorm(L-k*sqrt(ns))-pnorm(-L-k*sqrt(ns))))
ggplot(data.frame(n=ns,ARL1=ARL1_vals), aes(n,ARL1)) +
  geom_line(color="#7ecff7",linewidth=1.3) +
  geom_point(color="#7ecff7",size=2) +
  geom_hline(yintercept=2,color="#f7c87e",linetype="dashed") +
  annotate("text",x=20,y=3,label="ARL1 = 2",color="#f7c87e",size=4) +
  labs(title=sprintf("ARL1 vs tamanho n (deslocamento k=%g sigma, L=%g)", k, L),
       x="Tamanho da amostra n",
       y="ARL1 (amostras ate detectar)") +
  theme_minimal(base_size=13)

Subgrupos Racionais — Conceito de Shewhart

Segundo Shewhart, os subgrupos devem ser selecionados de modo que:

“A chance de diferença entre subgrupos seja maximizada, enquanto a variação dentro de um subgrupo seja minimizada.”

  • A ordem temporal é a base lógica para seleção em processos de produção
  • O arranjo do subgrupo dita o sucesso ou falha do gráfico de controle
  • Na prática: coletar de 20 a 25 subgrupos na Fase I

Abordagem 1 — Instantânea

Unidades produzidas simultaneamente

→ Detecta saltos repentinos da média

→ Estimativa fiel do \(\sigma\) do processo

Abordagem 2 — Aleatória

Unidades representativas de toda a produção desde a última amostragem

→ Decisão sobre aceitação do lote

→ Risco: inflação da variância

Problema do Subgrupo Misto — Comparação Numérica

Exemplo: Comparar a variância de um subgrupo puro (Abordagem 1) com um subgrupo misto coletado durante uma mudança de nível (Abordagem 2).

set.seed(4)
# Abordagem 1: todas as unidades no mesmo instante
puro  <- rnorm(5, 10, 1)
# Abordagem 2: coletado ao longo do tempo — nível muda no meio
misto <- c(rnorm(2, 10, 1), rnorm(3, 18, 1))
cat(sprintf("Variância subgrupo puro  (Abordagem 1): %.2f\n", var(puro)))
Variância subgrupo puro  (Abordagem 1): 0.65
cat(sprintf("Variância subgrupo misto (Abordagem 2): %.2f\n", var(misto)))
Variância subgrupo misto (Abordagem 2): 27.97
cat("\nA variância foi inflada pela mudanca de nível.\nOs limites calculados com a Abordagem 2 serão excessivamente largos,\nmascarando futuras causas atribuíveis.\n")

A variância foi inflada pela mudanca de nível.
Os limites calculados com a Abordagem 2 serão excessivamente largos,
mascarando futuras causas atribuíveis.

Efeito do Subgrupo no Gráfico de Controle

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(99)
d1 <- data.frame(sg=rep(1:12,each=5),
                 y=c(rnorm(50,10,1),rnorm(10,16,1)))
medias1 <- aggregate(y~sg, d1, mean)
sig1    <- mean(aggregate(y~sg, d1, sd)$y)

d2 <- data.frame(sg=rep(1:12,each=5),
  y=unlist(lapply(1:12,function(i)
    if(i %in% 5:8) c(rnorm(2,10,1),rnorm(3,16,1)) else rnorm(5,10,1))))
medias2 <- aggregate(y~sg, d2, mean)
sig2    <- mean(aggregate(y~sg, d2, sd)$y)

mk_cc <- function(med, sig, titulo, cor) {
  lsc_cc <- 10+3*sig/sqrt(5); lic_cc <- 10-3*sig/sqrt(5)
  med$fora <- med$y > lsc_cc | med$y < lic_cc
  ggplot(med, aes(sg,y)) +
    geom_line(color="white",linewidth=.6) +
    geom_point(aes(color=fora),size=2.5) +
    scale_color_manual(values=c("FALSE"=cor,"TRUE"="#f07050"),guide="none") +
    geom_hline(yintercept=c(lsc_cc,10,lic_cc),
               color=c("#f07050","#a8f77e","#f07050"),
               linetype=c("dashed","solid","dashed")) +
    labs(title=titulo, x="Subgrupo", y=expression(bar(x))) +
    theme_minimal(base_size=11)
}
mk_cc(medias1,sig1,"Abordagem 1: detecta salto (limites estreitos)","#7ecff7") +
mk_cc(medias2,sig2,"Abordagem 2: limites inflados, falha mascarada","#f7c87e")

Padrões Não Aleatórios em Gráficos de Controle

Um gráfico indica condição fora de controle quando:

  1. Um ou mais pontos fora dos limites de controle, ou
  2. Os pontos exibem algum padrão de comportamento não aleatório
Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(5); lsc_p <- 3; lic_p <- -3; lm_p <- 0

mk_pad <- function(y, titulo, cor="#7ecff7") {
  df <- data.frame(t=seq_along(y), y=y, fora=y>lsc_p|y<lic_p)
  ggplot(df,aes(t,y))+
    geom_line(color="white",linewidth=.5)+
    geom_point(aes(color=fora),size=2)+
    scale_color_manual(values=c("FALSE"=cor,"TRUE"="#f07050"),guide="none")+
    geom_hline(yintercept=c(lsc_p,lm_p,lic_p),
               color=c("#f07050","#a8f77e","#f07050"),
               linetype=c("dashed","solid","dashed"),linewidth=.7)+
    labs(title=titulo,x="Tempo",y="")+theme_minimal(base_size=10)
}
y_ctrl  <- rnorm(20,0,1)
y_tend  <- seq(-1.5,2.5,length.out=20)+rnorm(20,0,.4)
y_ciclo <- 1.5*sin(seq(0,4*pi,length.out=20))+rnorm(20,0,.3)
y_shift <- c(rnorm(10,0,1),rnorm(10,1.8,1))
y_mistu <- c(rnorm(10,0,1)+rep(c(-1.5,1.5),5))
y_estrat<- rnorm(20,0,.3)

(mk_pad(y_ctrl,"Sob controle","#7ecff7") + mk_pad(y_tend,"Tendencia","#f7c87e")) /
(mk_pad(y_ciclo,"Ciclo","#a8f77e") + mk_pad(y_shift,"Deslocamento","#c87ef7")) /
(mk_pad(y_mistu,"Mistura","#f07050") + mk_pad(y_estrat,"Estratificação","#7ecff7"))

Padrões: Causas e Interpretações

Padrão Descrição Causas típicas
Tendência Movimento gradual contínuo em uma direção Desgaste de ferramenta, degradação de reagente
Ciclo Oscilação periódica repetitiva Flutuação de temperatura, alternância de operadores
Deslocamento Aglomeração repentina de um lado da LM Novo lote de matéria-prima, troca de operador
Mistura Pontos evitando a linha central, agrupando-se nas bordas Ajuste excessivo, mistura de duas populações
Estratificação Pontos agrupados muito próximos à linha central Subgrupo mal formado, limites calculados incorretamente

As Zonas do Gráfico de Controle (Western Electric)

A B C C B A +3σ (LSC) +2σ +1σ LM -1σ -2σ -3σ (LIC)
  • Zona C (\(\pm 1\sigma\)): contém ~68% dos pontos
  • Zona B (\(1\sigma\) a \(2\sigma\)): contém ~27% dos pontos
  • Zona A (\(2\sigma\) a \(3\sigma\)): contém ~4,2% dos pontos

As Regras Sensibilizantes da Western Electric (WECO)

As 10 regras da Western Electric para detectar padrões não aleatórios:

# Critério
1 1 ponto além de \(\pm 3\sigma\) (Zona A ou além)
2 2 de 3 consecutivos na Zona A ou além, mesmo lado
3 4 de 5 consecutivos na Zona B ou além, mesmo lado
4 8 consecutivos de um mesmo lado da LM
5 6 pontos em tendência crescente ou decrescente
6 15 consecutivos dentro da Zona C (estratificação)
7 14 consecutivos alternando para cima e para baixo
8 8 consecutivos de ambos os lados, nenhum na Zona C
9 Padrão não usual ou não aleatório nos dados
10 1 ou mais pontos próximos dos limites de alerta ou controle

Implementando Regras WECO em R — Detecção Geral

detectar_weco <- function(pts, lc=0, sigma=1) {
  lado <- sign(pts - lc)
  n    <- length(pts)
  alarmes <- character(0)
  # Regra 1: 1 ponto alem de 3sigma
  if(any(abs(pts-lc) > 3*sigma))
    alarmes <- c(alarmes, sprintf("Regra 1: ponto(s) %s",
      paste(which(abs(pts-lc)>3*sigma), collapse=",")))
  # Regra 4: 8 consecutivos do mesmo lado
  for(i in seq_len(n-7)){
    j <- lado[i:(i+7)]
    if(all(j==1)||all(j==-1)){
      alarmes <- c(alarmes, sprintf("Regra 4: pts %d-%d",i,i+7)); break}
  }
  # Regra 5: 6 em tendencia
  for(i in seq_len(n-5)){
    d <- diff(pts[i:(i+5)])
    if(all(d>0)||all(d<0)){
      alarmes <- c(alarmes, sprintf("Regra 5: pts %d-%d",i,i+5)); break}
  }
  if(length(alarmes)==0) "Processo OK" else alarmes
}

Implementando Regras WECO em R — Detecção Geral

set.seed(20)
pts_ok    <- rnorm(25,0,1)
pts_shift <- c(rnorm(10,0,1), rnorm(15,1.5,0.8))
cat("=== Processo OK ===\n")
=== Processo OK ===
print(detectar_weco(pts_ok))
[1] "Processo OK"
cat("\n=== Processo com deslocamento ===\n")

=== Processo com deslocamento ===
print(detectar_weco(pts_shift))
[1] "Regra 4: pts 11-18"

Visualizando as Regras WECO

Clique para ver o código
library(ggplot2)
set.seed(12)
pts <- c(rnorm(9,0,1), rnorm(12,1.5,0.8))
df  <- data.frame(t=seq_along(pts), y=pts,
                  weco=c(rep("Normal",9),rep("Regra 4",12)))
ggplot(df, aes(t,y)) +
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=2,ymax=3,
           fill="#f07050",alpha=.15) +
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=-3,ymax=-2,
           fill="#f07050",alpha=.15) +
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=1,ymax=2,
           fill="#f7c87e",alpha=.12) +
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=-2,ymax=-1,
           fill="#f7c87e",alpha=.12) +
  geom_line(color="white",linewidth=.7)+
  geom_point(aes(color=weco),size=3)+
  scale_color_manual(values=c("Normal"="#7ecff7","Regra 4"="#f7c87e"))+
  geom_hline(yintercept=c(3,2,1,0,-1,-2,-3),
             color=c("#f07050","#f7c87e","#a8f77e","#a8f77e",
                     "#a8f77e","#f7c87e","#f07050"),
             linetype=c("dashed","dotted","dotted","solid",
                        "dotted","dotted","dashed"),linewidth=.8)+
  annotate("segment",x=10,xend=17,y=-0.5,yend=-0.5,
           color="#f7c87e",linewidth=1.2,
           arrow=arrow(ends="both",length=unit(.15,"cm")))+
  annotate("text",x=13.5,y=-0.85,
           label="8 pts acima da LM (Regra 4)",
           color="#f7c87e",size=3.5)+
  labs(title="Gráfico de Controle com Detecção da Regra 4",
       x="Amostra",y="Estatistica",color="")+
  theme_minimal(base_size=13)

Exercício — O Padrão Parece Aleatório?

Exercício: Os gráficos abaixo apresentam padrões não aleatórios. Identifique qual regra WECO é violada em cada caso.

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(77)
# Gráfico 1: tendencia descendente
y1 <- seq(2,-2,length.out=20)+rnorm(20,0,.3)
# Gráfico 2: ponto fora de controle
y2 <- c(rnorm(9,0,1), 3.5, rnorm(10,0,1))

mk2 <- function(y,titulo){
  df <- data.frame(t=seq_along(y),y=y,fora=abs(y)>3)
  ggplot(df,aes(t,y))+
    geom_line(color="white",linewidth=.6)+
    geom_point(aes(color=fora),size=2.5)+
    scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),
                       guide="none")+
    geom_hline(yintercept=c(3,2,0,-2,-3),
               color=c("#f07050","#f7c87e","#a8f77e","#f7c87e","#f07050"),
               linetype=c("dashed","dotted","solid","dotted","dashed"),
               linewidth=c(1,.8,1,.8,1))+
    labs(title=titulo,x="Amostra",y="")+theme_minimal(base_size=11)
}
mk2(y1,"Gráfico 1 — Qual regra e violada?") +
mk2(y2,"Gráfico 2 — Qual regra e violada?")

Solução — Exercício de Padrões

Gráfico 1: Apresenta tendência descendente contínua ao longo de todos os 20 pontos. Viola a Regra 5 (6 pontos consecutivos em tendência) e a Regra 4 (8 pontos consecutivos do mesmo lado da LM após o cruzamento).

Gráfico 2: O ponto 10 está além de \(+3\sigma\) (LSC). Viola a Regra 1 (1 ponto fora dos limites de controle).

set.seed(77)
y1 <- seq(2,-2,length.out=20)+rnorm(20,0,.3)
y2 <- c(rnorm(9,0,1), 3.5, rnorm(10,0,1))
cat("=== Gráfico 1 ===\n")
=== Gráfico 1 ===
print(detectar_weco(y1))
[1] "Regra 4: pts 1-8"   "Regra 5: pts 12-17"
cat("\n=== Gráfico 2 ===\n")

=== Gráfico 2 ===
print(detectar_weco(y2))
[1] "Regra 1: ponto(s) 10"

Cuidados com as Regras Sensibilizantes

Importante

O uso simultâneo de todas as regras WECO aumenta significativamente a taxa global de falso alarme \(\alpha\).

  • Com apenas a Regra 1: \(\alpha = 0{,}0027\), \(\text{ARL}_0 \approx 370\)
  • Ao adicionar mais regras, \(\alpha\) cresce e \(\text{ARL}_0\) cai
set.seed(99); B <- 10000; n_pts <- 50
ar1 <- 0; ar14 <- 0; ar145 <- 0
for(b in 1:B){
  pts  <- rnorm(n_pts)
  lado <- sign(pts)
  r1   <- any(abs(pts)>3)
  r4   <- any(sapply(1:(n_pts-7),function(i) all(lado[i:(i+7)]==1)|all(lado[i:(i+7)]==-1)))
  r5   <- any(sapply(1:(n_pts-5),function(i){d<-diff(pts[i:(i+5)]);all(d>0)|all(d<0)}))
  if(r1)        ar1   <- ar1+1
  if(r1||r4)    ar14  <- ar14+1
  if(r1||r4||r5)ar145 <- ar145+1
}
cat(sprintf("Regra 1 apenas:     alpha=%.4f | ARL0=%5.0f\n", ar1/B,  B/ar1))
Regra 1 apenas:     alpha=0.1294 | ARL0=    8
cat(sprintf("Regras 1+4:         alpha=%.4f | ARL0=%5.0f\n", ar14/B, B/ar14))
Regras 1+4:         alpha=0.2666 | ARL0=    4
cat(sprintf("Regras 1+4+5:       alpha=%.4f | ARL0=%5.0f\n", ar145/B,B/ar145))
Regras 1+4+5:       alpha=0.3402 | ARL0=    3

Fase I e Fase II do Gráfico de Controle

Fase I — Análise Retrospectiva

  • Coletar 20 a 25 subgrupos históricos
  • Construir gráficos tentativos
  • Identificar e remover pontos com causa atribuível identificada
  • Recalcular limites após cada remoção
  • Iterar até todos os pontos estarem sob controle
  • Objetivo: estimar \(\mu_0\) e \(\sigma_0\) confiáveis

Fase II — Monitoramento Prospectivo

  • Limites da Fase I tornam-se padrão fixo
  • Novos dados plotados em tempo real
  • Pontos fora dos limites → investigação imediata
  • Novos dados não alteram os limites
  • Objetivo: detectar mudanças em relação ao padrão estabelecido

Fase I — Simulação do Expurgo em R

Exemplo: Fase I com uma causa atribuível no subgrupo 8 — identificar, remover e recalibrar os limites.

set.seed(33)
fase1     <- rnorm(20, 50, 1)
fase1[8]  <- 56  # causa atribuível identificada

m_tent <- mean(fase1); s_tent <- sd(fase1)
cat(sprintf("Fase I (com anomalia):\n  Média=%.3f | LSC=%.3f | LIC=%.3f\n\n",
            m_tent, m_tent+3*s_tent, m_tent-3*s_tent))
Fase I (com anomalia):
  Média=50.328 | LSC=55.034 | LIC=45.623
fase1_ok <- fase1[-8]
m_ok <- mean(fase1_ok); s_ok <- sd(fase1_ok)
cat(sprintf("Fase I (sem anomalia):\n  Média=%.3f | LSC=%.3f | LIC=%.3f\n",
            m_ok, m_ok+3*s_ok, m_ok-3*s_ok))
Fase I (sem anomalia):
  Média=50.030 | LSC=52.569 | LIC=47.491
cat(sprintf("\nLimites para Fase II: LIC=%.3f | LM=%.3f | LSC=%.3f\n",
            m_ok-3*s_ok, m_ok, m_ok+3*s_ok))

Limites para Fase II: LIC=47.491 | LM=50.030 | LSC=52.569

Visualizando as Fases I e II

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(33)
f1 <- rnorm(20,50,1); f1[8] <- 56
f2 <- rnorm(15,50,1)
m_ok <- mean(f1[-8]); s_ok <- sd(f1[-8])
lsc_ok <- m_ok+3*s_ok; lic_ok <- m_ok-3*s_ok

mk_fase <- function(y, titulo, cor, extra=NULL){
  df <- data.frame(t=seq_along(y),y=y,fora=y>lsc_ok|y<lic_ok)
  p  <- ggplot(df,aes(t,y))+
    geom_line(color="white",linewidth=.6)+
    geom_point(aes(color=fora),size=2.5)+
    scale_color_manual(values=c("FALSE"=cor,"TRUE"="#f07050"),guide="none")+
    geom_hline(yintercept=c(lsc_ok,m_ok,lic_ok),
               color=c("#f07050","#a8f77e","#f07050"),
               linetype=c("dashed","solid","dashed"))+
    labs(title=titulo,x="Subgrupo",y="")+
    theme_minimal(base_size=11)
  if(!is.null(extra)) p <- p + extra
  p
}
p1 <- mk_fase(f1,"Fase I: Analise Retrospectiva","#7ecff7",
  annotate("point",x=8,y=56,color="#f07050",size=5,shape=4,stroke=2.5))
p2 <- mk_fase(f2,"Fase II: Monitoramento Prospectivo","#a8f77e")
p1 + p2

As Sete Ferramentas da Qualidade

O CEP integra-se a um conjunto de sete ferramentas para controle de qualidade:

1. Histograma

Ramo-e-Folhas

2. Folha de Verificação

Check Sheet

3. Gráfico de Pareto

Poucos vitais

4. Diagrama de Ishikawa

Causa-e-Efeito

5. Concentração de Defeitos

Mapa espacial

6. Diagrama de Dispersão

Correlação X-Y

7. Gráfico de Controle

Shewhart · CEP

Ferramenta 1: Histograma e Ramo-e-Folhas

  • Exibe frequências dos valores observados — forma, tendência central e dispersão
  • Não leva em conta a ordem temporal — complementar ao gráfico de controle
  • Sem verificar a distribuição antes da Fase I, os limites são essencialmente arbitrários
Clique para ver o código
library(ggplot2)
set.seed(5)
dados <- data.frame(d=c(rnorm(90,74,.008), rnorm(10,74.02,.006)))
ggplot(dados, aes(x=d)) +
  geom_histogram(aes(y=after_stat(density)),bins=20,
                 fill="#7ecff7",color="black",alpha=.8)+
  stat_function(fun=dnorm,args=list(mean=74,sd=.008),
                color="#f07050",linewidth=1.3)+
  geom_vline(xintercept=c(74-3*.008,74,74+3*.008),
             color=c("#f07050","#a8f77e","#f07050"),
             linetype=c("dashed","solid","dashed"),linewidth=1)+
  annotate("text",x=74-3.5*.008+.001,y=20,label="LIC",
           color="#f07050",size=3.5,hjust=0)+
  annotate("text",x=74+3*.008+.001,y=20,label="LSC",
           color="#f07050",size=3.5,hjust=0)+
  labs(title="Histograma com Limites 3-sigma sobrepostos",
       x="Diametro (mm)",y="Densidade")+
  theme_minimal(base_size=13)

Ferramenta 2: Folha de Verificação (Check Sheet)

  • Registro sistemático do histórico — hoje implementado como banco de dados estruturado
  • Categoriza, no momento da ocorrência, o tipo exato de defeito com metadados cronológicos
  • Permite separar defeitos por turno, operador, máquina, lote de insumo

Exemplo:

Data Turno Tipo de defeito Qtd
01/06 Manhã Dimensão incorreta 3
01/06 Tarde Solda desalinhada 1
02/06 Manhã Falha no adesivo 2
02/06 Noite Partes danificadas 4

A folha de verificação é a entrada obrigatória para o Gráfico de Pareto.

Ferramenta 3: Gráfico de Pareto

  • Princípio de Pareto/Juran: 80% dos defeitos decorrem de 20% das causas
  • Ordena as causas por frequência — separa os “poucos vitais” dos “muitos triviais”

Exemplo: Defeitos registrados em válvulas industriais: Vazamento (140), Ferrugem (40), Quebra (15), Furo (5).

Clique para ver o código
library(ggplot2)
defeitos <- data.frame(
  Falha   =factor(c("Vazamento","Ferrugem","Quebra","Furo"),
                  levels=c("Vazamento","Ferrugem","Quebra","Furo")),
  Contagem=c(140,40,15,5))
defeitos$Cum <- cumsum(defeitos$Contagem)/sum(defeitos$Contagem)
total <- sum(defeitos$Contagem)
ggplot(defeitos, aes(x=Falha)) +
  geom_col(aes(y=Contagem),fill="#7ecff7",color="black")+
  geom_line(aes(y=Cum*total,group=1),color="#f07050",linewidth=1.3)+
  geom_point(aes(y=Cum*total),color="#f07050",size=3)+
  geom_hline(yintercept=.8*total,color="#f7c87e",
             linetype="dashed",linewidth=.9)+
  annotate("text",x=3.5,y=.82*total,label="80%",color="#f7c87e",size=4)+
  scale_y_continuous(name="Frequencia",
    sec.axis=sec_axis(~./total,name="Frequencia Acumulada",
                      labels=scales::percent))+
  labs(title="Gráfico de Pareto: Defeitos em Valvulas",x="")+
  theme_minimal(base_size=13)

Ferramenta 4: Diagrama de Ishikawa (Espinha de Peixe)

  • Organiza o brainstorming após o Pareto identificar a causa prioritária
  • O efeito fica na “cabeça do peixe”; as espinhas representam categorias causais
  • 6 M’s na manufatura: Máquinas, Materiais, Mão de Obra, Métodos, Medição, Meio Ambiente
EFEITO (Vazamento) Maquinas Desgaste, folgas Materiais Lote defeituoso Mao de Obra Treinamento Metodos Procedimentos Medição Calibração Meio Ambiente Temperatura, umidade

Ferramenta 5: Diagrama de Concentração de Defeitos

  • Figura esquemática do produto com a localização dos defeitos marcada espacialmente
  • Fornece evidência visual direta: concentração em uma região → causa localizada sem inferência
Clique para ver o código
library(ggplot2)
set.seed(7)
loc <- data.frame(
  x    = c(runif(15,.6,.9), runif(5,.1,.4)),
  y    = c(runif(15,.3,.7), runif(5,.1,.9)),
  tipo = c(rep("Lateral direita (70%)",15), rep("Outras regioes (30%)",5))
)
ggplot(loc, aes(x,y,color=tipo)) +
  annotate("rect",xmin=0,xmax=1,ymin=0,ymax=1,
           fill="grey15",color="#7ecff7",linewidth=1.2)+
  geom_point(size=5,shape=4,stroke=2)+
  scale_color_manual(values=c("Lateral direita (70%)"="#f07050",
                               "Outras regioes (30%)"="#7ecff7"))+
  scale_x_continuous(breaks=c(0,1),labels=c("Esq.","Dir."))+
  scale_y_continuous(breaks=c(0,1),labels=c("Inf.","Sup."))+
  labs(title="Diagrama de Concentração de Defeitos (Vista Frontal)",
       x="",y="",color="")+
  theme_minimal(base_size=13)

Ferramenta 6: Diagrama de Dispersão

  • Avalia se as hipóteses do Ishikawa têm suporte quantitativo
  • Relaciona causa \(X\) com o efeito \(Y\) na característica da qualidade

Exemplo: “A velocidade de corte da fresa (\(X\)) aumenta o desvio de nivelamento (\(Y\))?”

Clique para ver o código
library(ggplot2)
set.seed(88)
velocidade  <- runif(30,100,200)
nivelamento <- 5 + 0.05*velocidade + rnorm(30,0,1.5)
d <- data.frame(velocidade, nivelamento)
r <- cor(velocidade, nivelamento)
ggplot(d, aes(velocidade,nivelamento)) +
  geom_point(color="#7ecff7",size=3)+
  geom_smooth(method="lm",color="#f07050",
              linetype="dashed",linewidth=1.2,se=TRUE)+
  annotate("text",x=110,y=15,
           label=sprintf("r = %.3f",r),color="#f7c87e",size=5)+
  labs(title="Dispersao: Velocidade da Fresa vs Desvio de Nivelamento",
       x="Velocidade da fresa (rpm)",y="Desvio de nivelamento (mm)")+
  theme_minimal(base_size=13)

Estudo de Caso: Placas de Circuito Impresso

  • Fabricante detectou perdas por defeitos de cobertura de cobre eletroquímica
  • Pareto: “Defeito na cobertura do cilindro” representava ~60% das perdas
  • Ishikawa: foco em manutenção de relés e concentração do banho químico
  • CEP: gráficos detectaram quebra estrutural após período de feriado (colorímetro descalibrado)

Verificação: Testando se o reparo do colorímetro produziu melhoria estatisticamente significativa.

placa_antes <- c(22.1,23.5,24.1,23.8,25.0,24.2,23.1,24.6,25.5,23.9)
placa_apos  <- c(18.1,18.2,17.9,18.0,18.5,18.3,17.8,18.1,18.2,18.0)
tt <- t.test(placa_antes, placa_apos)
cat(sprintf("Média antes: %.2f | Média apos: %.2f\n",
            mean(placa_antes), mean(placa_apos)))
Média antes: 23.98 | Média apos: 18.11
cat(sprintf("t=%.4f | GL=%.1f | p=%.2e\n",
            tt$statistic, tt$parameter, tt$p.value))
t=18.8313 | GL=9.8 | p=5.13e-09
cat(sprintf("IC 95%% diferenca: [%.3f ; %.3f]\n",
            tt$conf.int[1], tt$conf.int[2]))
IC 95% diferenca: [5.173 ; 6.567]
cat("\nO reparo reduziu significativamente a espessura média.\n")

O reparo reduziu significativamente a espessura média.
cat("O CEP detectou a falha do colorimetro e quantificou a melhoria.\n")
O CEP detectou a falha do colorimetro e quantificou a melhoria.

Estudo de Caso — Visualização

Clique para ver o código
library(ggplot2)
df_caso <- data.frame(
  y    = c(placa_antes, placa_apos),
  fase = rep(c("Antes do reparo","Apos o reparo"), each=10),
  obs  = rep(1:10, 2)
)
ggplot(df_caso, aes(x=obs,y=y,color=fase)) +
  geom_line(linewidth=1.1) + geom_point(size=3) +
  scale_color_manual(values=c("Antes do reparo"="#f07050",
                               "Apos o reparo"="#7ecff7"))+
  geom_hline(yintercept=mean(placa_antes),color="#f07050",
             linetype="dashed",linewidth=.8)+
  geom_hline(yintercept=mean(placa_apos),color="#7ecff7",
             linetype="dashed",linewidth=.8)+
  labs(title="Espessura de Cobre: Antes e Apos Reparo do Colorimetro",
       x="Observação",y="Espessura (unidades)",color="")+
  theme_minimal(base_size=13)

CEP em Serviços e Processos Transacionais

  • O CEP não é exclusivo da manufatura — aplica-se a qualquer processo com fluxo mensurável
  • O “custo oculto” de retrabalho em documentos e processos pode ser maior que na manufatura

Diferenças na aplicação:

  • A característica de qualidade passa a ser: fração de pedidos com erro, tempo de atendimento, taxa de devolução
  • Frequentemente os processos de serviço têm distribuições não normais → gráficos para atributos (\(p\), \(c\), \(u\))
  • A definição operacional do “defeito” deve ser rigorosa e documentada

Exemplo de definição: “Um defeito logístico ocorre quando o pacote excede rigorosamente 24 horas após a assinatura no balcão, sem ressalva médica ou condição climática extrema.”

Testando Diferença entre Agências Antes do CEP

Exemplo: Antes de implantar o CEP, o analista verifica se duas agências têm o mesmo nível de desempenho.

agencia_A <- c(15,14,16,15,17,14,15)
agencia_B <- c(22,25,23,24,21,25,24)
tt2 <- t.test(agencia_A, agencia_B)
cat(sprintf("Média A: %.2f min | Média B: %.2f min\n",
            mean(agencia_A), mean(agencia_B)))
Média A: 15.14 min | Média B: 23.43 min
cat(sprintf("t=%.4f | p=%.2e\n", tt2$statistic, tt2$p.value))
t=-11.8392 | p=1.60e-07
cat(sprintf("IC 95%%: [%.2f ; %.2f]\n",
            tt2$conf.int[1], tt2$conf.int[2]))
IC 95%: [-9.83 ; -6.74]
cat("\nAs agencias operam em estados distintos — implantação do CEP\n")

As agencias operam em estados distintos — implantação do CEP
cat("deve ser separada para cada agencia.\n")
deve ser separada para cada agencia.

Comparando Variâncias e Proporções em Serviços

# Variabilidade entre dois caixas bancarios
caixa_A <- c(4.1,4.3,4.2,4.1,4.0,4.2)
caixa_B <- c(5.5,3.1,4.5,6.2,2.9,4.4)
tf      <- var.test(caixa_A,caixa_B)
cat(sprintf("[F-test] F=%.3f | p=%.4f\n",tf$statistic,tf$p.value))
[F-test] F=0.007 | p=0.0000
cat(sprintf("Var A=%.3f | Var B=%.3f\n\n",var(caixa_A),var(caixa_B)))
Var A=0.011 | Var B=1.679
# Proporcoes: filial atrasou 12/100 hoje vs 3/100 ontem
tp <- prop.test(c(12,3),c(100,100),correct=FALSE)
cat(sprintf("[Prop.] chi2=%.4f | p=%.4f\n",tp$statistic,tp$p.value))
[Prop.] chi2=5.8378 | p=0.0157
cat("Evidencia de mudanca na taxa de atraso — sinalizar no dashboard CEP.\n")
Evidencia de mudanca na taxa de atraso — sinalizar no dashboard CEP.

Validação do Pressuposto Normal na Fase I

  • Se a normalidade não for atendida, os limites \(3\sigma\) produzirão taxas de falso alarme incorretas
  • Verificação obrigatória antes de consolidar os limites da Fase I
set.seed(55)
fase_i <- rnorm(50,200,5)
sw <- shapiro.test(fase_i)
cat(sprintf("Shapiro-Wilk: W=%.4f | p=%.4f\n",sw$statistic,sw$p.value))
Shapiro-Wilk: W=0.9897 | p=0.9382
cat(ifelse(sw$p.value>0.05,
    "Normalidade não rejeitada — Fase I valida.",
    "Atenção: normalidade rejeitada — revisar dados."),"\n")
Normalidade não rejeitada — Fase I valida. 

Validação do Pressuposto Normal na Fase I

Clique para ver o código
library(ggplot2)
ggplot(data.frame(v=fase_i),aes(sample=v)) +
  stat_qq(color="#7ecff7",size=2.5) +
  stat_qq_line(color="#f07050",linewidth=1.2) +
  labs(title="Q-Q Plot: Validação Normal dos Dados da Fase I",
       x="Quantis Teoricos",y="Quantis Amostrais") +
  theme_minimal(base_size=13)

ANOVA para Análise Retrospectiva (Fase I)

Exemplo: Verificar diferenças entre semanas de produção antes de definir os limites da Fase I.

semana  <- factor(rep(1:3,each=4))
y_cobre <- c(10.1,10.0,10.2,10.1, 11.5,11.2,11.4,11.1, 10.0,9.9,10.1,10.0)
mod_av  <- aov(y_cobre ~ semana)
summary(mod_av)
            Df Sum Sq Mean Sq F value   Pr(>F)    
semana       2  4.187  2.0933   134.6 1.97e-07 ***
Residuals    9  0.140  0.0156                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

\(p \approx 3{,}5 \times 10^{-6}\): a Semana 2 possui nível diferente e deve ser investigada antes de calcular os limites da Fase I.

Tamanho da Amostra — Impacto Visual

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(10)
# Dados "originais" com mudanca de nível em t=25
pop <- c(rnorm(24,10,1), rnorm(24,12,1))
# Subgrupos de n=3
sg3 <- tapply(pop, rep(1:16, each=3), mean)
# Subgrupos de n=8
sg8 <- tapply(pop, rep(1:6, each=8), mean)

mk_sg <- function(med, n_sg, titulo) {
  sig_p <- 1; lsc_p <- 10+3*sig_p/sqrt(n_sg); lic_p <- 10-3*sig_p/sqrt(n_sg)
  df <- data.frame(t=seq_along(med), y=med, fora=med>lsc_p|med<lic_p)
  ggplot(df,aes(t,y)) +
    geom_line(color="white",linewidth=.6) +
    geom_point(aes(color=fora),size=2.5) +
    scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),guide="none") +
    geom_hline(yintercept=c(lsc_p,10,lic_p),
               color=c("#f07050","#a8f77e","#f07050"),
               linetype=c("dashed","solid","dashed")) +
    labs(title=titulo, x="Subgrupo", y=expression(bar(x))) +
    theme_minimal(base_size=11)
}
mk_sg(sg3, 3, "n=3: detecta grandes mudancas") +
mk_sg(sg8, 8, "n=8: detecta mudancas menores")

Considerações Práticas: \(n\) Típico na Indústria

  • \(n = 4\) ou \(5\): padrão histórico da manufatura — bom equilíbrio entre custo e poder
  • \(n = 1\): quando o processo produz uma unidade por vez (processo contínuo) — usa-se gráfico de indivíduos (\(I\)-\(MR\))
  • \(n > 10\): raramente justificado economicamente, exceto em processos de altíssimo risco (aeroespacial, farmacêutico)
  • Regra prática: usar amostras pequenas (\(n = 4\) a \(8\)) com alta frequência de coleta

Frequência de Amostragem — Trade-off

Coleta muito frequente

  • ATS menor → detecção mais rápida
  • Custo operacional maior
  • Pode gerar autocorrelação entre amostras consecutivas
  • Viola a premissa de independência do gráfico de Shewhart

Coleta pouco frequente

  • ATS maior → falha pode durar horas
  • Custo operacional menor
  • Menos risco de autocorrelação
  • Adequado para processos lentos ou estáveis

Solução ótima: modelo econômico de Duncan (1956) determina \(n\) e \(h\) que minimizam o custo total por unidade de tempo produzida.

Considerações sobre Subgrupos Racionais — Casos Especiais

  • Múltiplas cabeças/cavidades: não misturar peças de cavidades diferentes no mesmo subgrupo — cada cavidade tem sua própria variação
  • Múltiplos turnos: se turnos diferem sistematicamente, tratar como processos distintos na Fase I
  • Autocorrelação: se os dados dentro de um subgrupo são correlacionados no tempo (processo contínuo), os estimadores de \(\sigma\) ficam viesados
set.seed(4)
# Demonstrando inflação da variância por mistura de cavidades
cav1 <- rnorm(3, 10.0, 0.5)   # Cavidade 1: média 10
cav2 <- rnorm(3, 11.5, 0.5)   # Cavidade 2: média 11.5 (desajustada)
subgrupo_misto <- c(cav1, cav2)
cat(sprintf("Var cavidade 1 isolada: %.3f\n", var(cav1)))
Var cavidade 1 isolada: 0.129
cat(sprintf("Var cavidade 2 isolada: %.3f\n", var(cav2)))
Var cavidade 2 isolada: 0.083
cat(sprintf("Var subgrupo misto:     %.3f  <- inflada pela diferenca de médias!\n",
            var(subgrupo_misto)))
Var subgrupo misto:     1.159  <- inflada pela diferenca de médias!

As 10 Regras WECO — Padrões com Simulação

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(42); lm0 <- 0

# Regra 6: 15 pontos consecutivos dentro da Zona C (estratificação)
y6 <- rnorm(20, 0, 0.4)  # baixa variância → pontos colados na LM

# Regra 7: 14 pontos alternando acima/abaixo
y7 <- rep(c(1.2,-1.2), 10) + rnorm(20,0,.15)

mk3 <- function(y, titulo, cor="#7ecff7") {
  df <- data.frame(t=seq_along(y), y=y, fora=abs(y)>3)
  ggplot(df,aes(t,y)) +
    geom_line(color="white",linewidth=.5) +
    geom_point(aes(color=fora),size=2) +
    scale_color_manual(values=c("FALSE"=cor,"TRUE"="#f07050"),guide="none") +
    geom_hline(yintercept=c(3,2,1,0,-1,-2,-3),
               color=c("#f07050","#f7c87e","#a8f77e","#a8f77e",
                       "#a8f77e","#f7c87e","#f07050"),
               linetype=c("dashed","dotted","dotted","solid",
                          "dotted","dotted","dashed"),linewidth=.7) +
    labs(title=titulo,x="",y="") + theme_minimal(base_size=10)
}
mk3(y6, "Regra 6: 15 pts na Zona C (estratificação)", "#a8f77e") +
mk3(y7, "Regra 7: 14 pts alternando cima/baixo",      "#f7c87e")

Padrões Visualmente Similares — Como Distinguir

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(7)

# Mistura vs Estratificação
y_mist  <- c(rnorm(10,0,1) + rep(c(-1.8,1.8),5))
y_estra <- rnorm(20,0,0.3)

# Deslocamento vs Tendencia
y_desl <- c(rnorm(10,0,1), rnorm(10,2,1))
y_tend <- seq(0,3,length.out=20)+rnorm(20,0,.25)

mk3v <- function(y,titulo,cor="#7ecff7") {
  df <- data.frame(t=seq_along(y),y=y,fora=abs(y)>3)
  ggplot(df,aes(t,y)) +
    geom_line(color="white",linewidth=.5) +
    geom_point(aes(color=fora),size=2) +
    scale_color_manual(values=c("FALSE"=cor,"TRUE"="#f07050"),guide="none") +
    geom_hline(yintercept=c(3,0,-3),
               color=c("#f07050","#a8f77e","#f07050"),
               linetype=c("dashed","solid","dashed"),linewidth=.7) +
    labs(title=titulo,x="",y="") + theme_minimal(base_size=10)
}
(mk3v(y_mist,"Mistura: pontos nas bordas","#f07050") +
 mk3v(y_estra,"Estratificação: pontos no centro","#a8f77e")) /
(mk3v(y_desl,"Deslocamento: salto abrupto","#c87ef7") +
 mk3v(y_tend,"Tendencia: subida gradual","#f7c87e"))

Implementando Todas as Regras WECO — Código Completo

detectar_weco_completo <- function(pts, lc=0, sigma=1) {
  n    <- length(pts); lado <- sign(pts-lc); alarmes <- character(0)
  z    <- (pts-lc)/sigma
  # Regra 1
  if(any(abs(z)>3)) alarmes <- c(alarmes,
    sprintf("R1: 1pt>3s em %s", paste(which(abs(z)>3),collapse=",")))
  # Regra 2: 2/3 na Zona A, mesmo lado
  for(i in 1:(n-2)){j<-z[i:(i+2)]
    if(sum(j>2)>=2||sum(j< -2)>=2)
      {alarmes<-c(alarmes,sprintf("R2: 2/3 ZonaA pts%d-%d",i,i+2));break}}
  # Regra 3: 4/5 na Zona B, mesmo lado
  for(i in 1:(n-4)){j<-z[i:(i+4)]
    if(sum(j>1)>=4||sum(j< -1)>=4)
      {alarmes<-c(alarmes,sprintf("R3: 4/5 ZonaB pts%d-%d",i,i+4));break}}
  # Regra 4: 8 mesmo lado
  for(i in 1:(n-7)){j<-lado[i:(i+7)]
    if(all(j==1)||all(j==-1))
      {alarmes<-c(alarmes,sprintf("R4: 8 lado pts%d-%d",i,i+7));break}}
  # Regra 5: 6 em tendencia
  for(i in 1:(n-5)){d<-diff(pts[i:(i+5)])
    if(all(d>0)||all(d<0))
      {alarmes<-c(alarmes,sprintf("R5: tendencia pts%d-%d",i,i+5));break}}
  if(length(alarmes)==0) return("Processo OK")
  alarmes
}
set.seed(15)
cat("=== Processo com deslocamento ===\n")
=== Processo com deslocamento ===
print(detectar_weco_completo(c(rnorm(10,0,1), rnorm(12,1.8,.8))))
[1] "R2: 2/3 ZonaA pts20-22" "R3: 4/5 ZonaB pts11-15" "R4: 8 lado pts11-18"   

Fase I — Critério de Coleta e Iteração

Protocolo da Fase I segundo Montgomery:

  1. Coletar 20 a 25 subgrupos (mínimo) — tipicamente \(m = 25\) subgrupos de \(n = 4\) ou \(5\)
  2. Calcular \(\bar{\bar{x}}\) (média das médias) e \(\bar{R}\) (média das amplitudes) → limites tentativos
  3. Identificar pontos fora dos limites → investigar o diário de produção
  4. Se causa identificada: remover o subgrupo e recalcular
  5. Se causa não identificada: manter o ponto (não se remove sem justificativa física)
  6. Repetir até que todos os pontos estejam sob controle
  7. Resultado: \(\hat{\mu}_0\) e \(\hat{\sigma}_0\) — base para a Fase II

Importante

Na Fase I não se “aumentam” os limites para incluir pontos — remove-se apenas quando a causa é identificada e corrigida.

Fase I — Quantos Subgrupos São Suficientes?

Clique para ver o código
library(ggplot2)
# Simulando a instabilidade da estimativa de sigma com poucos subgrupos
set.seed(22)
sigma_true <- 1
resultados <- sapply(5:40, function(m) {
  medias_R <- replicate(500, {
    dados <- matrix(rnorm(m*5, 0, sigma_true), nrow=m)
    R_bar <- mean(apply(dados,1,function(x) diff(range(x))))
    R_bar / 2.326  # d2 para n=5
  })
  c(media=mean(medias_R), dp=sd(medias_R))
})
df_m <- data.frame(m=5:40,
                   media=resultados["media",],
                   dp=resultados["dp",])
ggplot(df_m,aes(m,dp)) +
  geom_line(color="#7ecff7",linewidth=1.3) +
  geom_vline(xintercept=c(20,25),color=c("#f7c87e","#a8f77e"),
             linetype="dashed",linewidth=1) +
  annotate("text",x=21,y=.035,label="m=20",color="#f7c87e",size=3.5,hjust=0) +
  annotate("text",x=26,y=.035,label="m=25",color="#a8f77e",size=3.5,hjust=0) +
  labs(title="Variabilidade da estimativa de sigma vs numero de subgrupos m (n=5)",
       x="Numero de subgrupos m",y="DP da estimativa de sigma") +
  theme_minimal(base_size=13)

Fase II — Gráfico de Controle para Indivíduos (\(I\)-\(MR\))

Quando \(n = 1\) (uma observação por subgrupo), usa-se o gráfico de Indivíduos e Amplitude Móvel:

\[LC_I = \bar{X} \qquad LSC_I = \bar{X} + 3\frac{\overline{MR}}{d_2} \qquad d_2 = 1{,}128 \text{ para } n=2\]

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(8)
x_ind <- c(rnorm(18,50,2), rnorm(7,54,2))
MR    <- c(NA, abs(diff(x_ind)))
xbar  <- mean(x_ind[1:18]); MRbar <- mean(MR[2:19],na.rm=TRUE)
d2    <- 1.128
LSC_I <- xbar + 3*MRbar/d2; LIC_I <- xbar - 3*MRbar/d2
LSC_MR <- 3.267*MRbar

df_i  <- data.frame(t=seq_along(x_ind), y=x_ind,
                    fora=x_ind>LSC_I|x_ind<LIC_I)
df_mr <- data.frame(t=seq_along(MR),    y=MR,
                    fora=!is.na(MR)&MR>LSC_MR)

p1 <- ggplot(df_i,aes(t,y))+
  geom_line(color="white",linewidth=.6)+
  geom_point(aes(color=fora),size=2.5)+
  scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),guide="none")+
  geom_hline(yintercept=c(LSC_I,xbar,LIC_I),
             color=c("#f07050","#a8f77e","#f07050"),
             linetype=c("dashed","solid","dashed"))+
  labs(title="Gráfico I (Individuos)",x="",y="X")+theme_minimal(base_size=11)

p2 <- ggplot(df_mr,aes(t,y))+
  geom_line(color="white",linewidth=.6)+
  geom_point(aes(color=fora),size=2.5)+
  scale_color_manual(values=c("FALSE"="#a8f77e","TRUE"="#f07050"),guide="none")+
  geom_hline(yintercept=c(LSC_MR,MRbar,0),
             color=c("#f07050","#a8f77e","#a8f77e"),
             linetype=c("dashed","solid","solid"))+
  labs(title="Gráfico MR (Amplitude Móvel)",x="Observação",y="MR")+
  theme_minimal(base_size=11)
p1/p2

Capacidade do Processo — Conexão com o CEP

Após estabilizar o processo na Fase II, estima-se a capacidade de atender as especificações:

\[C_p = \frac{LSE - LIE}{6\hat{\sigma}} \qquad C_{pk} = \min\!\left(\frac{LSE - \hat{\mu}}{3\hat{\sigma}},\;\frac{\hat{\mu} - LIE}{3\hat{\sigma}}\right)\]

# Estimando capacidade a partir dos dados da Fase II
set.seed(8)
fase2_dados <- rnorm(100, 74, 0.008)  # processo estabilizado
mu_hat  <- mean(fase2_dados)
sig_hat <- sd(fase2_dados)
LIE <- 73.98; LSE <- 74.02

Cp  <- (LSE - LIE)/(6*sig_hat)
Cpk <- min((LSE - mu_hat)/(3*sig_hat),
           (mu_hat - LIE)/(3*sig_hat))
cat(sprintf("mu_hat = %.4f mm | sigma_hat = %.5f mm\n", mu_hat, sig_hat))
mu_hat = 73.9993 mm | sigma_hat = 0.00863 mm
cat(sprintf("Cp  = %.3f\n", Cp))
Cp  = 0.773
cat(sprintf("Cpk = %.3f\n", Cpk))
Cpk = 0.744
cat(ifelse(Cpk >= 1.33,
    "Processo capaz (Cpk >= 1.33)",
    "Processo não capaz — revisar especificacoes ou reduzir variância"), "\n")
Processo não capaz — revisar especificacoes ou reduzir variância 

Capacidade do Processo — Visualização

Clique para ver o código
library(ggplot2)
set.seed(8)
dados_cap <- rnorm(200, 74, 0.008)
LIE <- 73.98; LSE <- 74.02
mu_h <- mean(dados_cap); sg_h <- sd(dados_cap)
x_seq <- seq(73.96,74.04,length.out=400)
df_cap <- data.frame(x=x_seq, y=dnorm(x_seq,mu_h,sg_h))
ggplot(df_cap,aes(x,y)) +
  geom_line(color="white",linewidth=1.3) +
  geom_area(data=subset(df_cap,x<LIE),fill="#f07050",alpha=.6) +
  geom_area(data=subset(df_cap,x>LSE),fill="#f07050",alpha=.6) +
  geom_area(data=subset(df_cap,x>LIE&x<LSE),fill="#7ecff7",alpha=.2) +
  geom_vline(xintercept=c(LIE,LSE),color="#f7c87e",
             linetype="dashed",linewidth=1.2) +
  geom_vline(xintercept=c(mu_h-3*sg_h,mu_h+3*sg_h),color="#7ecff7",
             linetype="dotted",linewidth=1) +
  annotate("text",x=LIE-.002,y=20,label="LIE",color="#f7c87e",size=4,hjust=1) +
  annotate("text",x=LSE+.002,y=20,label="LSE",color="#f7c87e",size=4,hjust=0) +
  labs(title=sprintf("Capacidade do Processo: Cp=%.2f, Cpk=%.2f",
                     (LSE-LIE)/(6*sg_h),
                     min((LSE-mu_h)/(3*sg_h),(mu_h-LIE)/(3*sg_h))),
       x="Diametro (mm)",y="Densidade") +
  theme_minimal(base_size=13)

Gráfico de Controle para a Variância — Gráfico \(R\) e Gráfico \(S\)

Além do gráfico \(\bar{X}\) para monitorar a média, é essencial monitorar a dispersão:

  • Gráfico \(R\) (Amplitude): usa a amplitude \(R_i = X_{max} - X_{min}\) de cada subgrupo
  • Gráfico \(S\) (Desvio-padrão): usa \(s_i\) de cada subgrupo — mais eficiente para \(n > 10\)

\[LM_R = \bar{R} = d_2\hat{\sigma} \qquad LSC_R = D_4\bar{R} \qquad LIC_R = D_3\bar{R}\]

onde \(d_2\), \(D_3\) e \(D_4\) são constantes tabeladas que dependem de \(n\).

# Constantes para n=5
n <- 5
d2 <- 2.326; D3 <- 0; D4 <- 2.114
sigma_est <- 0.01
Rbar <- d2 * sigma_est
cat(sprintf("Para n=%d: d2=%.3f | D3=%.3f | D4=%.3f\n",n,d2,D3,D4))
Para n=5: d2=2.326 | D3=0.000 | D4=2.114
cat(sprintf("LM_R = %.5f | LIC_R = %.5f | LSC_R = %.5f\n",
            Rbar, D3*Rbar, D4*Rbar))
LM_R = 0.02326 | LIC_R = 0.00000 | LSC_R = 0.04917

Simulando o Par \(\bar{X}\)-\(R\)

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(13)
m <- 20; n <- 5; mu0 <- 74; sigma0 <- 0.01
dados_xr <- matrix(rnorm(m*n, mu0, sigma0), nrow=m)
xbars <- apply(dados_xr,1,mean)
Rs    <- apply(dados_xr,1,function(x) diff(range(x)))
xbb   <- mean(xbars); Rbar  <- mean(Rs)
d2 <- 2.326; D3 <- 0; D4 <- 2.114; A2 <- 0.577

lsc_x <- xbb + A2*Rbar; lic_x <- xbb - A2*Rbar
lsc_r <- D4*Rbar;        lic_r <- D3*Rbar

df_x <- data.frame(t=1:m,y=xbars,fora=xbars>lsc_x|xbars<lic_x)
df_r <- data.frame(t=1:m,y=Rs,   fora=Rs>lsc_r|Rs<lic_r)

px <- ggplot(df_x,aes(t,y)) +
  geom_line(color="white",linewidth=.6) +
  geom_point(aes(color=fora),size=2.5) +
  scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),guide="none") +
  geom_hline(yintercept=c(lsc_x,xbb,lic_x),
             color=c("#f07050","#a8f77e","#f07050"),
             linetype=c("dashed","solid","dashed")) +
  labs(title=expression(paste("Gráfico ",bar(X))),x="",y=expression(bar(x))) +
  theme_minimal(base_size=11)

pr <- ggplot(df_r,aes(t,y)) +
  geom_line(color="white",linewidth=.6) +
  geom_point(aes(color=fora),size=2.5) +
  scale_color_manual(values=c("FALSE"="#a8f77e","TRUE"="#f07050"),guide="none") +
  geom_hline(yintercept=c(lsc_r,Rbar,lic_r),
             color=c("#f07050","#a8f77e","#a8f77e"),
             linetype=c("dashed","solid","solid")) +
  labs(title="Gráfico R",x="Subgrupo",y="R") +
  theme_minimal(base_size=11)
px/pr

Por que Usar Dois Gráficos Simultaneamente?

Importante

É impossível atestar qualidade apenas acompanhando a média. Um processo pode ter a média correta e dispersão explosiva — peças todas centradas, mas com variabilidade inaceitável.

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(14)
m <- 15; n <- 5; mu0 <- 74; sigma0 <- 0.01
dados_ok  <- matrix(rnorm(m*n,mu0,sigma0),nrow=m)
# Causa atribuível: sigma dobra a partir do subgrupo 9
dados_var <- rbind(matrix(rnorm(8*n,mu0,sigma0),nrow=8),
                   matrix(rnorm(7*n,mu0,sigma0*2.5),nrow=7))
xbb_ok <- mean(apply(dados_ok,1,mean))
Rbar_ok <- mean(apply(dados_ok,1,function(x) diff(range(x))))
A2 <- 0.577; D4 <- 2.114; D3 <- 0

mk_par <- function(mat, titulo) {
  xb <- apply(mat,1,mean); R <- apply(mat,1,function(x) diff(range(x)))
  lsc_x <- xbb_ok+A2*Rbar_ok; lic_x <- xbb_ok-A2*Rbar_ok
  lsc_r <- D4*Rbar_ok
  df1 <- data.frame(t=1:m,y=xb,fora=xb>lsc_x|xb<lic_x)
  df2 <- data.frame(t=1:m,y=R, fora=R>lsc_r)
  p1 <- ggplot(df1,aes(t,y))+geom_line(color="white",linewidth=.5)+
    geom_point(aes(color=fora),size=2)+
    scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),guide="none")+
    geom_hline(yintercept=c(lsc_x,xbb_ok,lic_x),
               color=c("#f07050","#a8f77e","#f07050"),linetype=c("dashed","solid","dashed"))+
    labs(title=paste(titulo,"- X-barra"),x="",y="")+theme_minimal(base_size=9)
  p2 <- ggplot(df2,aes(t,y))+geom_line(color="white",linewidth=.5)+
    geom_point(aes(color=fora),size=2)+
    scale_color_manual(values=c("FALSE"="#a8f77e","TRUE"="#f07050"),guide="none")+
    geom_hline(yintercept=c(lsc_r,Rbar_ok),
               color=c("#f07050","#a8f77e"),linetype=c("dashed","solid"))+
    labs(title=paste(titulo,"- R"),x="Subgrupo",y="")+theme_minimal(base_size=9)
  p1/p2
}
mk_par(dados_ok,"Processo OK")

Por que Usar Dois Gráficos Simultaneamente?

mk_par(dados_var,"Sigma dobra (t>=9)")

Exercício 5 — Gráfico de Controle Completo

Exercício 5: Uma fábrica de parafusos coleta 20 subgrupos de \(n = 5\) diâmetros. Os dados históricos fornecem \(\bar{\bar{x}} = 12{,}00\) mm e \(\bar{R} = 0{,}08\) mm. Constantes para \(n=5\): \(A_2 = 0{,}577\), \(D_3 = 0\), \(D_4 = 2{,}114\).

(a) Calcule os limites de controle para o gráfico \(\bar{X}\) e para o gráfico \(R\).

(b) Na Fase II, os últimos 5 subgrupos têm médias: 12.05, 11.95, 12.08, 12.12, 12.15. Algum ponto viola a Regra 1? E a Regra 3 (4/5 na Zona B)?

(c) Se \(LIE = 11{,}85\) mm e \(LSE = 12{,}15\) mm, estime \(C_p\) e \(C_{pk}\) usando \(\hat{\sigma} = \bar{R}/d_2\) com \(d_2 = 2{,}326\).

(d) O processo está capaz (\(C_{pk} \geq 1{,}33\))? O que recomendaria?

Solução — Exercício 5

xbb <- 12.00; Rbar <- 0.08; n <- 5
A2 <- 0.577; D3 <- 0; D4 <- 2.114; d2 <- 2.326

# (a) Limites
lsc_x5 <- xbb + A2*Rbar; lic_x5 <- xbb - A2*Rbar
lsc_r5 <- D4*Rbar;        lic_r5 <- D3*Rbar
cat(sprintf("(a) Gráfico X-barra: LIC=%.4f | LM=%.4f | LSC=%.4f\n",
            lic_x5, xbb, lsc_x5))
(a) Gráfico X-barra: LIC=11.9538 | LM=12.0000 | LSC=12.0462
cat(sprintf("    Gráfico R:       LIC=%.4f | LM=%.4f | LSC=%.4f\n\n",
            lic_r5, Rbar, lsc_r5))
    Gráfico R:       LIC=0.0000 | LM=0.0800 | LSC=0.1691
# (b) Regras WECO
novos <- c(12.05,11.95,12.08,12.12,12.15)
sigma_x <- A2*Rbar/3  # sigma_xbar estimado
cat("(b) Verificando regras WECO nos novos subgrupos:\n")
(b) Verificando regras WECO nos novos subgrupos:
cat(sprintf("    Regra 1 (|xb-xbb|>3*sigma_x): %s\n",
            paste(which(abs(novos-xbb)>lsc_x5-xbb),collapse=",")))
    Regra 1 (|xb-xbb|>3*sigma_x): 1,2,3,4,5
zonaB <- sum(abs(novos-xbb) > (lsc_x5-xbb)/3)
cat(sprintf("    Regra 3 (4/5 Zona B): %d/5 na Zona B ou alem -> %s\n\n",
            zonaB, ifelse(zonaB>=4,"ALARME","OK")))
    Regra 3 (4/5 Zona B): 5/5 na Zona B ou alem -> ALARME
# (c) Capacidade
sigma_hat <- Rbar/d2; LIE <- 11.85; LSE <- 12.15
Cp5  <- (LSE-LIE)/(6*sigma_hat)
Cpk5 <- min((LSE-xbb)/(3*sigma_hat),(xbb-LIE)/(3*sigma_hat))
cat(sprintf("(c) sigma_hat=%.5f | Cp=%.3f | Cpk=%.3f\n",sigma_hat,Cp5,Cpk5),sprintf("(d) %s\n",ifelse(Cpk5>=1.33,"Processo capaz.","Processo não capaz — reduzir variância ou recentrar a média.")))
(c) sigma_hat=0.03439 | Cp=1.454 | Cpk=1.454
 (d) Processo capaz.

Exercício 6 — CEP em Serviços

Exercício 6: Um hospital monitora o tempo (horas) da triagem à alta de pacientes internados. Fase I com 25 grupos de \(n=4\) fornece \(\bar{\bar{x}} = 48{,}2\) h e \(\bar{R} = 12{,}4\) h. Constantes para \(n=4\): \(A_2 = 0{,}729\), \(D_4 = 2{,}282\).

(a) Calcule os limites de controle para o gráfico \(\bar{X}\).

(b) Na Fase II, os primeiros 8 grupos têm médias: 50, 52, 54, 56, 58, 60, 62, 64. Qual padrão WECO é violado?

(c) Identifique a provável causa do padrão observado (discuta em termos de gestão hospitalar).

(d) O tempo tem distribuição Normal? Justifique e discuta implicações para o CEP.

Solução — Exercício 6

xbb6 <- 48.2; Rbar6 <- 12.4; n6 <- 4
A2_6 <- 0.729; D4_6 <- 2.282

# (a)
lsc_x6 <- xbb6 + A2_6*Rbar6; lic_x6 <- xbb6 - A2_6*Rbar6
cat(sprintf("(a) LIC=%.3f | LM=%.3f | LSC=%.3f horas\n\n",
            lic_x6, xbb6, lsc_x6))
(a) LIC=39.160 | LM=48.200 | LSC=57.240 horas
# (b)
novos6 <- c(50,52,54,56,58,60,62,64)
cat("(b) Verificando regras WECO:\n")
(b) Verificando regras WECO:
cat(sprintf("    Regra 1: %s\n",
            ifelse(any(novos6>lsc_x6),"ALARME","OK")))
    Regra 1: ALARME
# Regra 4: todos acima da LM
lado6 <- sign(novos6 - xbb6)
cat(sprintf("    Regra 4 (8 mesmo lado): %s\n",
            ifelse(all(lado6==1),"ALARME — todos acima da LM","OK")))
    Regra 4 (8 mesmo lado): ALARME — todos acima da LM
# Regra 5: tendencia
cat(sprintf("    Regra 5 (6 em tendencia): %s\n",
            ifelse(all(diff(novos6)>0),"ALARME — tendencia crescente","OK")))
    Regra 5 (6 em tendencia): ALARME — tendencia crescente
cat("(c) Causa provável: aumento progressivo no tempo de internação,\npossivelmente por redução gradual de leitos, cansaco da equipe,\nou aumento sazonal de internacoes. Investigar via Ishikawa.\n\n")
(c) Causa provável: aumento progressivo no tempo de internação,
possivelmente por redução gradual de leitos, cansaco da equipe,
ou aumento sazonal de internacoes. Investigar via Ishikawa.
cat("(d) Tempos de internação geralmente seguem distribuição assimetrica\n(log-normal ou gama). Para CEP classico, o TCL justifica o uso\nde gráficos Xbarra com n>=4, mas com cautela para n pequeno.\n")
(d) Tempos de internação geralmente seguem distribuição assimetrica
(log-normal ou gama). Para CEP classico, o TCL justifica o uso
de gráficos Xbarra com n>=4, mas com cautela para n pequeno.

Resumo Operacional — Rotina do Cientista de Dados em Qualidade

Mapear SIPOC + Ishikawa Coletar Dados passivos Fase I Limpar · Estimar mu0 e sigma0 Fase II Dashboard · WECO Tempo real Alarme Investigar · Agir Ciclo continuo de melhoria

Dashboard CEP — Exemplo de Estrutura em R

Clique para ver o código
library(ggplot2); library(patchwork)
set.seed(19)
m <- 25; n <- 5; mu0 <- 50; sigma0 <- 2
dados_db <- matrix(rnorm(m*n,mu0,sigma0),nrow=m)
xb_db <- apply(dados_db,1,mean)
R_db  <- apply(dados_db,1,function(x) diff(range(x)))
xbb_db <- mean(xb_db); Rbar_db <- mean(R_db)
A2_db <- 0.577; D4_db <- 2.114

ARL0_db <- 1/(1-(pnorm(3)-pnorm(-3)))
sigma_hat_db <- Rbar_db/2.326
Cpk_db <- min((55-xbb_db)/(3*sigma_hat_db),(xbb_db-45)/(3*sigma_hat_db))

# Painel resumo
df_xb <- data.frame(t=1:m,y=xb_db,fora=xb_db>xbb_db+0.577*Rbar_db|xb_db<xbb_db-0.577*Rbar_db)
px_db <- ggplot(df_xb,aes(t,y))+
  geom_line(color="white",linewidth=.6)+
  geom_point(aes(color=fora),size=2)+
  scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),guide="none")+
  geom_hline(yintercept=c(xbb_db+0.577*Rbar_db,xbb_db,xbb_db-0.577*Rbar_db),
             color=c("#f07050","#a8f77e","#f07050"),
             linetype=c("dashed","solid","dashed"))+
  labs(title=expression(paste("Gráfico ",bar(X))),x="Subgrupo",y="")+
  theme_minimal(base_size=11)+
  annotate("text",x=1,y=xbb_db+0.577*Rbar_db+.3,
           label=sprintf("LSC=%.2f",xbb_db+0.577*Rbar_db),
           color="#f07050",size=3,hjust=0)

pr_db <- ggplot(data.frame(t=1:m,y=R_db,fora=R_db>D4_db*Rbar_db),aes(t,y))+
  geom_line(color="white",linewidth=.6)+
  geom_point(aes(color=fora),size=2)+
  scale_color_manual(values=c("FALSE"="#a8f77e","TRUE"="#f07050"),guide="none")+
  geom_hline(yintercept=c(D4_db*Rbar_db,Rbar_db),
             color=c("#f07050","#a8f77e"),linetype=c("dashed","solid"))+
  labs(title="Gráfico R",x="Subgrupo",y="")+theme_minimal(base_size=11)

cat(sprintf("ARL0 = %.0f | sigma_hat = %.3f | Cpk = %.3f\n",
            ARL0_db, sigma_hat_db, Cpk_db))
ARL0 = 370 | sigma_hat = 1.968 | Cpk = 0.812
Clique para ver o código
px_db / pr_db

Exercício 7 — Integrador: Das Ferramentas ao CEP

Exercício 7 (Integrador): Uma empresa de embalagens registrou os seguintes defeitos no último mês:

Tipo Freq
Vazamento de cola 95
Impressão borrada 42
Corte irregular 28
Dobra desalinhada 18
Outros 7

(a) Construa o Gráfico de Pareto. Qual defeito deve ser priorizado?

(b) Monte um Diagrama de Ishikawa (esquematize em texto) para o defeito prioritário com pelo menos 3 causas raiz por categoria dos 6 M’s.

(c) Para monitorar o processo após a ação corretiva, seria mais adequado usar um gráfico de atributos (\(p\), \(c\)) ou de variáveis (\(\bar{X}\)-\(R\))? Justifique.

(d) Se decidir usar o gráfico \(p\) com amostras de \(n=100\) e a fração histórica de defeitos for \(\bar{p} = 0{,}05\), calcule LIC e LSC.

Solução — Exercício 7

Clique para ver o código
library(ggplot2)
defeitos7 <- data.frame(
  tipo=factor(c("Vazamento","Impressao","Corte","Dobra","Outros"),
              levels=c("Vazamento","Impressao","Corte","Dobra","Outros")),
  freq=c(95,42,28,18,7))
defeitos7$cum <- cumsum(defeitos7$freq)/sum(defeitos7$freq)
total7 <- sum(defeitos7$freq)

# (a) Pareto
p_pareto <- ggplot(defeitos7,aes(x=tipo)) +
  geom_col(aes(y=freq),fill="#7ecff7",color="black")+
  geom_line(aes(y=cum*total7,group=1),color="#f07050",linewidth=1.3)+
  geom_point(aes(y=cum*total7),color="#f07050",size=3)+
  geom_hline(yintercept=.8*total7,color="#f7c87e",linetype="dashed")+
  scale_y_continuous(sec.axis=sec_axis(~./total7,labels=scales::percent))+
  labs(title="Pareto: Vazamento representa 50% — defeito prioritario",x="",y="Freq.")+
  theme_minimal(base_size=12)
print(p_pareto)

Solução — Exercício 7

# (d) Gráfico p
p_bar <- 0.05; n_p <- 100
sigma_p <- sqrt(p_bar*(1-p_bar)/n_p)
LIC_p <- max(0, p_bar - 3*sigma_p)
LSC_p <- p_bar + 3*sigma_p
cat(sprintf("\n(d) Gráfico p: LIC=%.4f | LM=%.4f | LSC=%.4f\n",
            LIC_p, p_bar, LSC_p))

(d) Gráfico p: LIC=0.0000 | LM=0.0500 | LSC=0.1154
cat("(c) Gráfico de atributos (p ou c) e mais adequado pois o defeito\nex: vazamento) e uma variável discreta (conforme/não conforme).\nGráficos de variaveis requerem medição continua da caracteristica.\n")
(c) Gráfico de atributos (p ou c) e mais adequado pois o defeito
ex: vazamento) e uma variável discreta (conforme/não conforme).
Gráficos de variaveis requerem medição continua da caracteristica.

Implementação Sistêmica do CEP

A eficácia do CEP depende não apenas da estatística, mas da cultura organizacional:

  • O gráfico não é eficaz se a cultura pune os operadores por acionarem alarmes
  • Sem acompanhamento gerencial contínuo, o CEP vira burocracia
  • O CEP é trabalho de equipe: patrocinador executivo + engenheiro + cientista de dados + operadores experientes

Rotina do cientista de dados em qualidade:

  1. Mapear variáveis via SIPOC e Ishikawa
  2. Coletar dados passivos da linha
  3. Fase I: limpeza, remoção de causas atribuíveis identificadas, estimação de \(\mu_0\) e \(\sigma_0\)
  4. Implantar painel com limites \(3\sigma\)
  5. Automatizar detecção das regras WECO
  6. Alarme → investigar → agir → voltar ao monitoramento

Exercício 1 — Limites de Controle

Exercício 1: Fábrica de anéis de pistão: \(\mu_0 = 74\) mm, \(\sigma = 0{,}01\) mm, \(n = 5\).

(a) Determine os limites de controle dois-sigma (LIC e LSC).

(b) Calcule o \(\text{ARL}_0\) para os limites dois-sigma e compare com o dos limites três-sigma.

(c) Se a média deslocar para \(\mu_1 = 74{,}010\) mm (\(k = 1\sigma_{\bar{X}}\)), calcule \(\beta\) e \(\text{ARL}_1\) para \(L=2\) e \(L=3\).

(d) Justifique a escolha de \(L = 3\) como padrão industrial considerando o trade-off entre \(\alpha\) e \(\beta\).

Solução — Exercício 1

Solução completa:

mu0 <- 74; sigma <- 0.01; n <- 5
s_xb <- sigma/sqrt(n)

for(L in c(2,3)){
  alpha_L <- 1-(pnorm(L)-pnorm(-L))
  ARL0_L  <- 1/alpha_L
  k       <- 1  # deslocamento de 1*sigma_xbar
  beta_L  <- pnorm(L-k*sqrt(n))-pnorm(-L-k*sqrt(n))
  ARL1_L  <- 1/(1-beta_L)
  cat(sprintf(
    "L=%d: LIC=%.4f | LSC=%.4f | alpha=%.5f | ARL0=%6.1f | beta=%.4f | ARL1=%.2f\n",
    L, mu0-L*s_xb, mu0+L*s_xb, alpha_L, ARL0_L, beta_L, ARL1_L))
}
L=2: LIC=73.9911 | LSC=74.0089 | alpha=0.04550 | ARL0=  22.0 | beta=0.4067 | ARL1=1.69
L=3: LIC=73.9866 | LSC=74.0134 | alpha=0.00270 | ARL0= 370.4 | beta=0.7775 | ARL1=4.50
cat("\n(d) L=3 equilibra: alpha pequeno (poucos falsos alarmes) e ARL1 aceitável.\n")

(d) L=3 equilibra: alpha pequeno (poucos falsos alarmes) e ARL1 aceitável.
cat("L=2 detecta mais rapido (ARL1 menor) mas gera ~15x mais falsos alarmes.\n")
L=2 detecta mais rapido (ARL1 menor) mas gera ~15x mais falsos alarmes.

Exercício 2 — Limites de Probabilidade

Exercício 2: Molde automotivo com 5 cavidades. Espessura normalmente distribuída: \(\mu_0 = 1\) mm, \(\sigma = 0{,}01\) mm, \(n = 8\).

(a) Determine os limites três-sigma e os limites de probabilidade com \(\alpha = 0{,}001\).

(b) Calcule o \(\text{ARL}_0\) para cada conjunto. Quantos falsos alarmes em 5.000 amostras?

(c) Se \(\mu_1 = 1{,}015\) mm, calcule \(\beta\) e \(\text{ARL}_1\) para os dois conjuntos.

(d) Qual conjunto é mais adequado para um processo com alto custo de parada?

Solução — Exercício 2

mu0 <- 1; sigma <- 0.01; n <- 8
s_xb <- sigma/sqrt(n); delta <- 0.015; k <- delta/s_xb

# Limites 3-sigma
alpha_3 <- 1-(pnorm(3)-pnorm(-3))
ARL0_3  <- 1/alpha_3
beta_3  <- pnorm(3-k*sqrt(n))-pnorm(-3-k*sqrt(n))
ARL1_3  <- 1/(1-beta_3)

# Limites prob: alpha=0.001
alpha_p <- 0.001; Lp <- qnorm(1-alpha_p/2)
ARL0_p  <- 1/alpha_p
beta_p  <- pnorm(Lp-k*sqrt(n))-pnorm(-Lp-k*sqrt(n))
ARL1_p  <- 1/(1-beta_p)

cat(sprintf("3-sigma (L=%.2f): LIC=%.4f | LSC=%.4f\n",
            3, mu0-3*s_xb, mu0+3*s_xb))
3-sigma (L=3.00): LIC=0.9894 | LSC=1.0106
cat(sprintf("  alpha=%.6f | ARL0=%.1f | FA em 5000=%.0f\n",
            alpha_3, ARL0_3, 5000*alpha_3))
  alpha=0.002700 | ARL0=370.4 | FA em 5000=13
cat(sprintf("  beta=%.4f | ARL1=%.2f\n\n", beta_3, ARL1_3))
  beta=0.0000 | ARL1=1.00
cat(sprintf("Prob. (L=%.2f): LIC=%.4f | LSC=%.4f\n",
            Lp, mu0-Lp*s_xb, mu0+Lp*s_xb))
Prob. (L=3.29): LIC=0.9884 | LSC=1.0116
cat(sprintf("  alpha=%.3f  | ARL0=%.1f | FA em 5000=%.0f\n",
            alpha_p, ARL0_p, 5000*alpha_p))
  alpha=0.001  | ARL0=1000.0 | FA em 5000=5
cat(sprintf("  beta=%.4f | ARL1=%.2f\n\n", beta_p, ARL1_p))
  beta=0.0000 | ARL1=1.00
cat("(d) Com alto custo de parada, preferir limites de probabilidade\n(ARL0 maior => menos falsos alarmes => menos paradas desnecessarias).\n")
(d) Com alto custo de parada, preferir limites de probabilidade
(ARL0 maior => menos falsos alarmes => menos paradas desnecessarias).

Exercício 3 — Padrões e Regras WECO

Exercício 3: Médias amostrais (unidades de \(\sigma_{\bar{X}}\)), \(LM=0\), \(LSC=3\), \(LIC=-3\):

0.5, 0.8, 1.2, 1.5, 1.9, 2.1, 1.8, 2.4, 2.8, 3.1

(a) Alguma regra WECO é violada? Identifique qual(is) e em qual(is) ponto(s).

(b) Construa o gráfico de controle em R com as zonas coloridas indicando os pontos críticos.

(c) Calcule \(\alpha\) global com as Regras 1+4 via simulação Monte Carlo (\(B=10.000\), \(n=50\)).

(d) Por que o Montgomery recomenda cautela ao aplicar todas as regras simultaneamente?

Solução — Exercício 3

pts <- c(0.5,0.8,1.2,1.5,1.9,2.1,1.8,2.4,2.8,3.1)
cat("(a) Verificando regras WECO:\n")
(a) Verificando regras WECO:
# Regra 1: ponto alem de 3sigma
r1_pts <- which(abs(pts)>3)
cat(sprintf("Regra 1 (|x|>3): ponto(s) %s\n",
            ifelse(length(r1_pts)>0,paste(r1_pts,collapse=","),"nenhum")))
Regra 1 (|x|>3): ponto(s) 10
# Regra 4: 8 consecutivos mesmo lado
lado <- sign(pts)
for(i in 1:(length(pts)-7)){
  if(all(lado[i:(i+7)]==1)||all(lado[i:(i+7)]==-1))
    cat(sprintf("Regra 4 (8 mesmo lado): pts %d a %d\n",i,i+7))
}
Regra 4 (8 mesmo lado): pts 1 a 8
Regra 4 (8 mesmo lado): pts 2 a 9
Regra 4 (8 mesmo lado): pts 3 a 10
# Regra 2: 2 de 3 na Zona A (|x|>2), mesmo lado
for(i in 1:(length(pts)-2)){
  j <- pts[i:(i+2)]
  if(sum(j>2)>=2||sum(j< -2)>=2)
    cat(sprintf("Regra 2 (2/3 Zona A): pts %d a %d\n",i,i+2))
}
Regra 2 (2/3 Zona A): pts 6 a 8
Regra 2 (2/3 Zona A): pts 7 a 9
Regra 2 (2/3 Zona A): pts 8 a 10

Solução — Exercício 3 (continuação)

Clique para ver o código
library(ggplot2)
pts <- c(0.5,0.8,1.2,1.5,1.9,2.1,1.8,2.4,2.8,3.1)
df3 <- data.frame(t=1:10, y=pts,
  alert=factor(ifelse(abs(pts)>3,"Regra 1",
               ifelse(abs(pts)>2,"Zona A","Normal"))))
ggplot(df3,aes(t,y))+
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=2,ymax=3,fill="#f07050",alpha=.2)+
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=1,ymax=2,fill="#f7c87e",alpha=.15)+
  annotate("rect",xmin=-Inf,xmax=Inf,ymin=0,ymax=1,fill="#a8f77e",alpha=.12)+
  geom_line(color="white",linewidth=.7)+
  geom_point(aes(color=alert),size=4)+
  scale_color_manual(values=c("Normal"="#7ecff7","Zona A"="#f7c87e","Regra 1"="#f07050"))+
  geom_hline(yintercept=c(3,2,1,0),
             color=c("#f07050","#f7c87e","#a8f77e","#a8f77e"),
             linetype=c("dashed","dotted","dotted","solid"),linewidth=.9)+
  scale_x_continuous(breaks=1:10)+
  labs(title="Exercicio 3: Regras WECO violadas (Regra 1 no ponto 10, Regra 4 em 1-8, Regra 2 em 8-10)",
       x="Amostra",y="Estatistica",color="")+
  theme_minimal(base_size=12)

Exercício 4 — ARL e ATS

Exercício 4: Processo de envase de xarope: \(n = 4\), limites \(3\sigma\), \(\sigma = 2\) mL, \(h = 30\) min.

(a) Calcule o \(\text{ARL}_0\) e o tempo médio entre falsos alarmes em horas.

(b) Se a média deslocar de 500 para 503 mL (\(k = 1{,}5\sigma/\sqrt{n}\)), calcule \(\beta\), \(\text{ARL}_1\) e o \(\text{ATS}\) em minutos.

(c) Para reduzir o ATS para menos de 1 hora, qual o \(n\) mínimo mantendo \(h = 30\) min?

(d) Qual o trade-off entre aumentar \(n\) vs. diminuir \(h\)?

Solução — Exercício 4

sigma <- 2; n0 <- 4; L <- 3; h <- 30  # min
s_xb  <- sigma/sqrt(n0)
delta <- 3  # deslocamento em mL
k     <- delta/s_xb  # em unidades de sigma_xbar

# (a) ARL0
alpha_3 <- 1-(pnorm(L)-pnorm(-L))
ARL0    <- 1/alpha_3
cat(sprintf("(a) ARL0 = %.1f amostras | Tempo entre FA = %.1f horas\n",
            ARL0, ARL0*h/60))
(a) ARL0 = 370.4 amostras | Tempo entre FA = 185.2 horas
# (b) ARL1 e ATS
beta_k <- pnorm(L-k*sqrt(n0))-pnorm(-L-k*sqrt(n0))
ARL1   <- 1/(1-beta_k)
ATS    <- ARL1*h
cat(sprintf("\n(b) k=%.2f | beta=%.4f | ARL1=%.2f | ATS=%.1f min\n",
            k, beta_k, ARL1, ATS))

(b) k=3.00 | beta=0.0013 | ARL1=1.00 | ATS=30.0 min
# (c) n minimo para ATS < 60 min
cat("\n(c) Buscando n minimo para ATS < 60 min:\n")

(c) Buscando n minimo para ATS < 60 min:
for(nn in 4:25){
  s_nn <- sigma/sqrt(nn); k_nn <- delta/s_nn
  b_nn <- pnorm(L-k_nn*sqrt(nn))-pnorm(-L-k_nn*sqrt(nn))
  ATS_nn <- h/(1-b_nn)
  if(ATS_nn < 60){ cat(sprintf("    n=%d: ATS=%.1f min < 60 min\n",nn,ATS_nn)); break}
}
    n=4: ATS=30.0 min < 60 min
cat("\n(d) Aumentar n: mais custo por coleta, detecta falhas pequenas.\nDiminuir h:  mais coletas no tempo, detecta falhas rapidas.\nIdeal: escolha de n e h via minimização do custo total (modelo economico).\n")

(d) Aumentar n: mais custo por coleta, detecta falhas pequenas.
Diminuir h:  mais coletas no tempo, detecta falhas rapidas.
Ideal: escolha de n e h via minimização do custo total (modelo economico).

CEP em Serviços — Definição Operacional do Defeito

  • Em processos físicos, o defeito é medido por paquímetro ou balança — objetivo e preciso
  • Em serviços, a definição do que constitui um “defeito” deve ser rigorosa e documentada

Exemplos de definições operacionais:

Processo Definição operacional do defeito
Logística Pacote que excede 24h após assinatura no balcão
Bancário Formulário devolvido com mais de 1 campo incorreto
Hospitalar Tempo triagem→alta superior a 72h sem justificativa
SAC Chamada não resolvida no primeiro contato

Sem definição operacional rigorosa, os dados coletados na folha de verificação serão inconsistentes e o CEP produzirá resultados enganosos.

Comparação: CEP Clássico vs. CEP em Serviços

Aspecto Manufatura Serviços
Característica de qualidade Dimensão contínua (mm, g, °C) Tempo, fração defeituosa, contagem
Distribuição típica Normal Exponencial, Poisson, Binomial
Tipo de gráfico \(\bar{X}\)-\(R\), \(\bar{X}\)-\(S\), \(I\)-\(MR\) \(p\), \(np\), \(c\), \(u\)
Definição do defeito Especificação de engenharia Contrato, SLA, regulação
Subgrupo racional Lote de produção simultânea Janela temporal (ex: 1 hora)
Autocorrelação Baixa (peças independentes) Frequente (filas, sazonalidade)

Resumo: Das Causas ao Gráfico de Controle

Clique para ver o código
library(ggplot2)
# Resumo visual: distribuição amostral melhora com n
set.seed(1)
ns_tcl <- c(1, 2, 5, 30)
df_tcl <- do.call(rbind, lapply(ns_tcl, function(n)
  data.frame(x=replicate(3000, mean(rexp(n,0.5))),
             n=paste0("n=",n))))
ggplot(df_tcl, aes(x=x, fill=n)) +
  geom_density(alpha=.55) +
  scale_fill_manual(values=c("#f07050","#f7c87e","#7ecff7","#a8f77e")) +
  labs(title="TCL: distribuição de X-barra para diferentes n (população Exponencial)",
       x=expression(bar(x)), y="Densidade", fill="") +
  theme_minimal(base_size=13)

Exercício 8 — Gráfico \(I\)-\(MR\) e Capacidade

Exercício 8: Um processo contínuo de produção de resina gera uma medição de viscosidade a cada hora (\(n=1\)). Os últimos 20 valores são:

48.2, 47.9, 48.5, 48.1, 47.8, 48.3, 48.0, 48.6, 47.7, 48.4, 49.1, 49.5, 50.2, 50.8, 51.3, 51.9, 52.4, 52.8, 53.2, 53.5

Especificações: \(LIE = 45\), \(LSE = 55\) unidades.

(a) Calcule \(\bar{X}\), \(\overline{MR}\) e os limites do gráfico \(I\) (\(d_2 = 1{,}128\)).

(b) Construa os gráficos \(I\) e \(MR\) em R. Alguma regra WECO é violada?

(c) Estime \(C_p\) e \(C_{pk}\) com base nos dados da Fase I (primeiros 10 pontos).

(d) O que o padrão observado nos últimos 10 pontos sugere sobre o processo?

Solução — Exercício 8

x8  <- c(48.2,47.9,48.5,48.1,47.8,48.3,48.0,48.6,47.7,48.4,
         49.1,49.5,50.2,50.8,51.3,51.9,52.4,52.8,53.2,53.5)
MR8 <- c(NA, abs(diff(x8)))
# Fase I: primeiros 10
xbar8 <- mean(x8[1:10]); MRbar8 <- mean(MR8[2:10],na.rm=TRUE)
d2_8  <- 1.128
LSC_I8 <- xbar8 + 3*MRbar8/d2_8; LIC_I8 <- xbar8 - 3*MRbar8/d2_8
LSC_MR8 <- 3.267*MRbar8
cat(sprintf("(a) X-bar(FaseI)=%.3f | MR-bar=%.4f\n",xbar8,MRbar8))
(a) X-bar(FaseI)=48.150 | MR-bar=0.5111
cat(sprintf("    LIC_I=%.3f | LM=%.3f | LSC_I=%.3f\n\n",LIC_I8,xbar8,LSC_I8))
    LIC_I=46.791 | LM=48.150 | LSC_I=49.509
df_i8  <- data.frame(t=1:20,y=x8, fora=x8>LSC_I8|x8<LIC_I8)
df_mr8 <- data.frame(t=1:20,y=MR8,fora=!is.na(MR8)&MR8>LSC_MR8)
sigma_hat8 <- MRbar8/d2_8; LIE8 <- 45; LSE8 <- 55
Cp8  <- (LSE8-LIE8)/(6*sigma_hat8)
Cpk8 <- min((LSE8-xbar8)/(3*sigma_hat8),(xbar8-LIE8)/(3*sigma_hat8))
cat(sprintf("(c) Cp=%.2f | Cpk=%.2f\n",Cp8,Cpk8))
(c) Cp=3.68 | Cpk=2.32
cat("(d) Tendencia crescente clara a partir do ponto 11 -> Regras 4 e 5\nCausa provável: desgaste de equipamento ou deriva de temperatura.\n")
(d) Tendencia crescente clara a partir do ponto 11 -> Regras 4 e 5
Causa provável: desgaste de equipamento ou deriva de temperatura.

Solução — Exercício 8

Clique para ver o código
library(ggplot2); library(patchwork)
p1 <- ggplot(df_i8,aes(t,y))+geom_line(color="white",linewidth=.6)+
  geom_point(aes(color=fora),size=2.5)+
  scale_color_manual(values=c("FALSE"="#7ecff7","TRUE"="#f07050"),guide="none")+
  geom_hline(yintercept=c(LSC_I8,xbar8,LIC_I8),
             color=c("#f07050","#a8f77e","#f07050"),linetype=c("dashed","solid","dashed"))+
  labs(title="Gráfico I",x="",y="Viscosidade")+theme_minimal(base_size=11)
p2 <- ggplot(df_mr8,aes(t,y))+geom_line(color="white",linewidth=.6)+
  geom_point(aes(color=fora),size=2.5)+
  scale_color_manual(values=c("FALSE"="#a8f77e","TRUE"="#f07050"),guide="none")+
  geom_hline(yintercept=c(LSC_MR8,MRbar8),
             color=c("#f07050","#a8f77e"),linetype=c("dashed","solid"))+
  labs(title="Gráfico MR",x="Obs.",y="MR")+theme_minimal(base_size=11)
p1/p2

Conexão com o DMAMC

🎯
Definir

SIPOC
Ishikawa

📏
Medir

Pareto
Histograma
Folha Verif.

🔍
Analisar

Dispersão
Testes
ANOVA

⚙️
Melhorar

DOE
Poka-Yoke

🔒
Controlar

CEP · Fase I/II
WECO
Dashboard

O Capítulo 5 fornece o arsenal completo da fase Controlar do DMAMC.

Síntese: Escolha do Gráfico de Controle Adequado

Tipo de dado? Variável ou Atributo? Variável n = 1? Tamanho do subgrupo Sim I-MR Não n pequeno: X-R n grande: X-S Atributo Conforme/Não? Ou contagem de defeitos? Prop. n fixo: p ou np n variável: p Cont. area fixa: c area variável: u

Os gráficos de atributos (\(p\), \(np\), \(c\), \(u\)) serão detalhados no Capítulo 7 — aqui apenas mapeamos a decisão.

Rotina Prática — Síntese Final

Antes de implantar o CEP:

  1. ✅ Verificar normalidade dos dados da Fase I (Shapiro-Wilk + Q-Q plot)
  2. ✅ Confirmar independência das observações (ausência de autocorrelação)
  3. ✅ Garantir que subgrupos são racionais (Abordagem 1 sempre que possível)
  4. ✅ Remover causas atribuíveis identificadas na Fase I

Durante o monitoramento (Fase II):

  1. ✅ Aplicar as regras WECO com critério — não todas simultaneamente
  2. ✅ Documentar cada alarme e ação corretiva tomada
  3. ✅ Revisar os limites periodicamente após melhorias sistêmicas
  4. ✅ Monitorar tanto a média quanto a dispersão (\(\bar{X}\)-\(R\) ou \(I\)-\(MR\))

Conclusão

  • Causas aleatórias são inerentes ao processo — tentar eliminá-las gera ajuste excessivo
  • Causas atribuíveis desestabilizam o processo — o CEP detecta-as sistematicamente
  • Gráficos de controle com limites \(3\sigma\): \(\text{ARL}_0 \approx 370\), equilíbrio empírico entre \(\alpha\) e \(\beta\)
  • ARL e ATS traduzem o desempenho estatístico para a linguagem gerencial
  • Subgrupos racionais (Abordagem 1) são preferidos para detectar mudanças de nível
  • As Sete Ferramentas formam um sistema integrado — Pareto → Ishikawa → Dispersão → Gráfico de Controle
  • A eficácia do CEP depende de cultura, liderança e treinamento — não apenas da estatística

Próximos Passos

  • Capítulo 6: Gráficos \(\bar{X}\)-\(R\) e \(\bar{X}\)-\(S\) — estimação de parâmetros desconhecidos
  • Capítulo 7: Gráficos de Atributos\(p\), \(np\), \(c\), \(u\)

\[\bar{x}\text{-}R \qquad \bar{x}\text{-}S \qquad p \qquad np \qquad c \qquad u\]

  • Gráficos CUSUM e EWMA: maior poder para detectar pequenos deslocamentos (\(k < 1\sigma\)), com \(\text{ARL}_1\) significativamente menor que o Shewhart

Referências

  • Montgomery, D. C. Introduction to Statistical Quality Control. 7ª ed. Wiley, 2017. Cap. 5.
  • Shewhart, W. A. Economic Control of Quality of Manufactured Product. Van Nostrand, 1931.
  • Deming, W. E. Out of the Crisis. MIT Press, 1982.
  • Western Electric. Statistical Quality Control Handbook. Western Electric Co., 1956.
  • Ryan, T. P. Statistical Methods for Quality Improvement. 3ª ed. Wiley, 2011.

Obrigado!

Controle Estatístico de Processos · UFPB

Bacharelado em Estatística e Ciência de Dados

Prof. Marcelo R.P. Ferreira · DE-UFPB