3  Diagramas de Control para Atributos

Los diagramas de control para atributos juegan un papel fundamental en los procesos de producción en el aseguramiento de la calidad, tanto para vigilar como para mejorar la calidad de un producto.

En muchos procesos industriales la característica del producto es de tipo sensorial, color, sabor, olor, etc., y ésta se controla a través de diagramas de control para atributos.

El diseño de estos diagramas de control, por lo general, se basan en el modelo general de Shewhart discutido en la Sección 2.3.1, y suelen dividirse en dos grupos:

  1. Si cada producto pueden clasificarse como conforme o disconforme según posea o no ciertos atributos. En tales casos se utilizan los siguientes diagramas:
    1. Diagrama de control para el número de unidades disconformes (Diagrama \(np\)).
    2. Diagrama de control para la fracción o proporción de artículos disconformes (Diagrama \(p\)).
    Nota

    Los diagramas de control \(np\) y \(p\) son equivalentes, en el sentido de que ambos se usan para monitorear la fracción de artículos disconformes del proceso.

  2. Si se pueda contar el número de disconformidades (defectos) que aparezcan en una unidad del producto. En estos casos se utilizan los siguientes diagramas:
    1. Diagrama de control para el número de defectos (Diagrama \(c\)).
    2. Diagrama de control para el número de defectos por unidad de inspección (Diagrama \(u\)).

3.1 Diagrama \(np\)

Este diagrama se usa para monitorear la fracción de artículos disconforme en un proceso de producción. El estadístico que se grafica en este diagrama es el número de artículos defectuoso en la muestra \(D\).

Supóngase que un proceso de producción funciona de una manera estable, tal que, la probabilidad de producir un artículo disconforme es constante e igual a \(p\), además, suponga que la producción de un artículo sucesivamente es independiente. En consecuencia cada artículo producido es una variable aleatoria con distribución de Bernoulli de parámetro \(p\). Si se toman \(𝑚\) muestras de tamaño \(𝑛\) de este proceso de producción , entonces el número de artículos disconforme en la muestra \(𝑖\) (\(D_{i}\)), con \(𝑖 = 1, 2, \dots , 𝑚\); son variables aleatorias binomiales independientes con parámetros \(𝑛\) y \(𝑝\), es decir, \({D}_{i}\sim B\left(n, p\right)\). Bajo los supuestos anteriores , la media y la desviación estándar de los \({D}_{i}\) vienen dadas por:

Media y desviación estándar de \(D_i\)

\[ \begin{align*} \mu_{_{D_i}} &= E \left(D_i \right)=np\\ \sigma_{_{D_i}} &=\sqrt {V\left(D_i \right)}=\sqrt {np\left(1-p \right)} \end{align*}. \tag{3.1}\]

Bajo el supuesto que se conoce la verdadera fracción de artículos disconformes \(p\) del proceso o que es un valor estándar especificado por la administración. Entonces, según el modelo general de Shewhart descrito en la Sección 2.3.1, la línea central y los límites de control del diagrama \(np\) serían los que se definen a continuación.

Límites de control estándar del diagrama \(np\)

\[ \begin{align*} LCS &= \mu_{_{D_i}} + 3\sigma_{_{D_i}}=np + 3\sqrt {np\left(1-p \right)}\\ LC&= \mu_{_{D_i}}=np\\ LCI &= \mu_{_{D_i}} - 3\sigma_{_{D_i}}=np - 3\sqrt {np\left(1-p \right)} \end{align*} \tag{3.2}\]

Estos límites de control para el diagrama \(np\) se conocen como límites de control estándar del diagrama \(np\).

En la práctica, generalmente se desconoce la fracción de artículos disconforme del proceso \(p\), por lo que hay que estimarla con los datos observados (subgrupos racionales). El procedimiento para estimar \(p\) se conoce como fase I o fase inicial y los diagramas obtenidos en esta fase se llaman diagramas de control inicial. El procedimiento más usual consiste en tomar \(m\) muestras (subgrupos racionales) preliminares cuando se considera que el proceso está bajo control. En general, estas estimaciones deberían basarse en al menos 20 o 25 muestras (\(m \geq 20\)). Cada una de las cuales debe contener \(n\) artículos. Sea \(D_i\) el número de artículos disconformes en la muestra \(i\), con \(i=1, 2,\dots, m\). Entonces, la proporción o fracción de artículos disconformes en la muestra \(i\) viene dado por:

Fracción disconforme muestral

\[ \hat{P_{i}}=\frac{_{D_i}}{n}, \: i = 1, 2, \dots, m. \tag{3.3}\]

Si \(d_i\) es el número de artículos disconformes observados en la muestra \(i\) y \(\hat{p}_i\) las proporciones de artículos disconformes observadas en esa muestra \(i\). Es decir, \(\hat{p}_i\) es un valor observado de \(\hat{P}_i\), por lo tanto, una estimación de \(p\). Lo anteriormente dicho, se reduce a la siguiente ecuación

Fracción disconforme muestral estimada

\[ \hat{p_{i}}=\frac{d_{i}}{n}, \: i=1, 2, \dots, m. \tag{3.4}\]

Entonces, se toma como estimación de \(p\) la media de las proporciones de artículos defectuosos observados, es decir:

Estimacion de \(p\)

\[ \hat{p}=\bar{p}=\frac{\sum_{i=1}^{m}\hat{p}_{i}}{m}. \tag{3.5}\]

Luego, sustituyendo la ecuación 3.4 en la ecuación 3.5, se obtiene una estimación de \(p\) en base a los \(d_i\), como sigue

Estimación de \(p\) en función de los \(d_i\)

\[ \hat{p}=\bar{p}=\frac{\sum_{i=1}^{m}d_{i}}{nm}. \tag{3.6}\]

Ahora, sustituyendo \(p\) por su estimador, \(\bar{p}\), en la ecuación 3.2 se obtienen los límites de control y la línea central del diagrama \(np\) cuando \(p\) es desconocida. Estos se denominan límites de control inicial del diagrama \(np\).

Límites de control inicial del diagrama \(np\)

\[ \begin{align*} LCS & = n\bar{p} + 3\sqrt {n\bar{p}\left(1 - \bar{p} \right)}\\ LC & = n\bar{p}\\ LCI & =n\bar{p} - 3\sqrt {n\bar{p}\left(1 - \bar{p} \right)} \end{align*} \tag{3.7}\]

Los límites de control definidos en la ecuación 3.7 se conocen como límites de control inicial o límites de control de prueba del diagrama \(np\).

3.1.1 Pasos para la Aplicación del Diagrama \(np\) en la Fase I

  1. Seleccionar \(𝑚\) muestras preliminares cada una de tamaño \(𝑛\), se recomienda que \(𝑚\) sea mayor o igual a 20.

  2. Contar el número de artículos disconforme en cada muestra \(𝑑_𝑖\). Los resultados obtenidos se resumen en la Tabla 3.1.

Tabla 3.1: Resumen de las \(m\) muestras preliminares en el diagrama \(np\)
Muestra \(D_i\)
1 \(d_1\)
2 \(d_2\)
\(\vdots\) \(\vdots\)
\(i\) \(d_i\)
\(\vdots\) \(\vdots\)
\(m-1\) \(d_{m-1}\)
\(m\) \(d_m\)
  1. Estimar \(𝑝\) con \(\bar{p}\) usando la ecuación 3.6

  2. Con la estimación de \(p\) obtenida en el paso anterior calcular los límites de control de prueba o preliminares y la línea central del diagrama \(np\) por medio de la ecuación 3.7. Cuando \(LCI< 0\), entonces se toma como cero.

  3. Realizar la gráfica de los límites de control con el número de artículos disconformes obtenidas en cada muestra \(d_i\) , y analizar la representación resultante, de acuerdo a los siguientes criterios:

    1. Si todos los puntos muestrales \(𝑑_𝑖\) caen dentro de los límites de control y no manifiestan un comportamiento sistemático. Entonces podemos concluir que el proceso está bajo control, y podemos utilizar \(\bar{p}\) para controlar la producción actual y futura.
    2. Si uno o más puntos están fuera de control se busca una causa especial, si las hay se eliminan estos puntos y se repite el procedimiento desde el paso 3 con los puntos restantes. Este procedimiento continúa hasta que el diagrama no muestre estado fuera de control. En algunos casos es imposible determinar una causa especial para un punto que cae fuera de control, en este caso hay dos tipos de acción que se pueden tomar: la primera es eliminar el punto como si se hubiere encontrado la causa especial (no existe justificación analítica para tomarse esta acción), la segunda es conservar estos puntos y calcular los límites con estos.

Ejemplo 3.1 (Aplicación del Diagrama \(np\))
Considere los datos de la Tabla 3.2, los mismo corresponden a la fracción de carburadores disconformes en 20 Subgrupos de tamaño 100. Determine los límites de control del diagrama \(np\) para controlar la producción en el futuro, suponga que un punto fuera de los límites se le encuentra la causa atribuible.

Código
```{r}
#| label: tbl-datos-ejemplo1-dcnp
#| tbl-cap: "Número de carburadores defectuosos en cada muestra"
#| tbl-align: left

datos_np <- data.table::data.table(
  muestra = c(
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L,
    15L, 16L, 17L, 18L, 19L, 20L
  ),
  Di = c(
    4L, 4L, 3L, 3L, 2L, 4L, 3L, 2L, 3L, 4L, 3L, 2L, 4L, 4L, 3L,
    4L, 2L, 4L, 4L, 3L
  )
)

options(
  reactable.language = reactableLang(
    searchPlaceholder = "Search...",
    pageNext = "Siguiente",
    pagePrevious = "Anterior",
    noData = "No entries found",
    pageInfo = "{rowStart} de {rowEnd} de {rows} filas"
  )
)

reactable::reactable(
  datos_np,
  columns = list(
    muestra = colDef(header = "Muestra"),
    Di = colDef(
      header = "Número de carburadores defectuosos"
    )
  ),
  defaultColDef = colDef(
    # footer = function(values, name) {
    #   htmltools::div(name, style = list(fontWeight = 600))
    # },
    align = "center",
    minWidth = 100,
    # maxWidth = 200
  ),
  fullWidth = TRUE,
  # width = "100%",
  # style = list(width = "100%"),
  resizable = TRUE, 
  wrap = FALSE, 
  bordered = TRUE,
  defaultPageSize = 10,
  striped = TRUE,
  highlight = TRUE,
  filterable = TRUE
)
```
Tabla 3.2: Número de carburadores defectuosos en cada muestra

Los parámetros del Diagrama \(np\) se calculan en el siguiente bloque de código, usando la ecuación 3.7.

Código
```{r}
#| label: lci-dcnp

m <- nrow(datos_np)
n <- 100
p_est <- sum(datos_np$Di) / (n * m)
lic <- max(0, n * p_est - 3 * sqrt(n * p_est * (1 - p_est)))
lc <- n * p_est
lsc <- n * p_est + 3 * sqrt(n * p_est * (1 - p_est))
paste0("LCS = ", formato(lsc), "    LC = ", formato(lc), "    LCI = ", formato(lic))
```
#> [1] "LCS = 8,5697    LC = 3,25    LCI = 0"

Dado que los pasos 1 y 2 descritos en la sección 3.1.1 están cubiertos en este ejemplo, se continúa con el paso 3. Es decir, se procede a estimar \(p\) con la ecuación 3.6

\[ \bar{p}=\frac{ 4 + 4 + \cdots + 4 + 3}{20 * 100} = \frac{65}{2000} = 0,0325. \]

De la ecuación 3.7, los límites de control y la línea central del diagrama \(np\), como se describe en el paso 4 de la sección 3.1.1, son:

\[ \begin{align*} LCS & = 100 * 0,0325 + 3 \sqrt {100 * 0,0325 \left(1 - 0,0325 \right)} = 8,5697 \\ LC & = 100 * 0,0325 = 3,25 \\ LCI & = 100 * 0,0325 - 3 \sqrt {100 * 0,0325 \left(1 - 0,0325 \right)} = 0 \end{align*}. \]

En esta parte, como se indica en el paso 5 de la sección 3.1.1, la gráfica del diagrama \(np\) se muestra en la Figura 3.1, la cual se realizó con el paquete ggplot2.

Código
```{r}
#| label: fig-ejemplo-dcnp-ggplot
#| fig-cap: "Diagrama $np$ para el número de carburadores defectuosos"

# library(ggQC)
ggplot(data = datos_np, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = muestra, y = Di), color = "black"
  ) +
  geom_line(
    mapping = aes(x = muestra, y = Di), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = lic, ymax = p_est), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = p_est, ymax = lsc), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_np) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_np) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_np) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX(
      "Muestra ($n_{i}$)", bold = TRUE,italic = TRUE
    ),
    y = latex2exp::TeX(
      "Número de carburadores defectuosos ($d_{i}$)",
      bold = TRUE, italic = TRUE
    )
  ) +
  theme_bw()
```
Figura 3.1: Diagrama \(np\) para el número de carburadores defectuosos

De la gráfica del diagrama \(np\) que se muestra en la Figura 3.1 se puede notar que todos los puntos están dentro de los límites de control y estos no muestran ningún patrón, por lo tanto se concluye que el proceso está bajo control y se puede usar esta estimación de \(p \: (\bar{p} = 3,25)\) para controlar la producción futura.

El paquete qcc, también permite realizar la gráfica del diagrama \(np\). La Figura 3.2 muestra la gráfica del diagrama \(np\) para los datos de la tabla Tabla 3.2 con este paquete.

Código
```{r}
#| label: fig-ejemplo-dcnp-qcc
#| fig-cap: "Diagrama $np$ para el número de carburadores defectuosos con el paquete `qcc`"

obj <- with(
  data = datos_np, qcc(Di, type = "np", sizes = n, plot = FALSE)
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Número de carburadores defectuosos"
)
```
Figura 3.2: Diagrama \(np\) para el número de carburadores defectuosos con el paquete qcc

El siguiente bloque de código muestra la gráfica del diagrama \(np\) con el paquete highcharter.

Código
```{r}
#| label: fig-ejemplo-dcnp-highcharter
#| fig-cap: "Diagrama $np$ para el número de carburadores defectuosos con el paquete `highcharter`"

# library(highcharter)
highchart() |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "center", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 4)
  ) |>
  hc_add_series(
    data = datos_np, hcaes(x = muestra, low = lc, high = lsc),
    step = "center", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.3, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "center", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 0)
  ) |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "center", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = Di),
    useHTML = TRUE, color = "black", name = "<b><i>D<sub>i</sub></i></b>",
    dashStyle = "Dash",
    marker = list(
      symbol = "circle", fillColor = "white", radius = 3,
      lineWidth = 2, lineColor = "black"
    )
  ) |>
  hc_add_series(
    data = datos_np, hcaes(x = muestra, low = lic, high = lc),
    step = "center", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.3, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Número de carburadores defectuosos (d<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions( series = list(animation = FALSE) )
```
Figura 3.3: Diagrama \(np\) para el número de carburadores defectuosos con el paquete highcharter

En la siguiente figura se muestra la gráfica del diagrama \(np\) generada con el paquete plotly.

Código
```{r}
#| label: fig-ejemplo-dcnp-plotly
#| fig-cap: "Diagrama $np$ para el número de carburadores defectuosos con el paquete `plotly`"

# library(plotly)
datos_np |> 
  plotly::plot_ly(x = ~muestra) |> 
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.4f}</i></b><br><extra></extra>"),
  ) |> 
  plotly::add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = '#00FF00',
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) |> 
  plotly::add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = '#0000FF', 
    hovertemplate = paste(
      "<b><i>LCI = %{y:.0f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) |> 
  plotly::add_trace(
    y = ~Di,
    name = "<b><i>D<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "black"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>D<sub>i</sub><b><i> = %{y:.0f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) |> 
  plotly::layout(
    legend = list(orientation = "h", xanchor = "center", x = 0.5, y = -0.2),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Número de carburadores defectuosos (d<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) |> 
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.4: Diagrama \(np\) para el número de carburadores defectuosos con el paquete plotly

3.2 Diagrama \(p\)

El diagrama \(p\), al igual que el diagrama \(np\), se usa para vigilar la fracción de artículos disconforme de un proceso de producción y en este diagrama el estadístico usado para tal fin es la fracción o proporción de artículos disconforme muestral descrita en la ecuación 3.3.

Supóngase las misma condiciones establecidas para derivar los límites de control del diagrama \(np\), es decir, que se tiene un proceso de producción que funciona de una manera estable y que la probabilidad de producir un artículo disconforme es \(p\) (fracción de artículos disconformes del proceso), además, suponga que la producción de un artículo sucesivamente es independiente. En consecuencia cada artículo producido es una variable aleatoria con distribución de Bernoulli de parámetro \(p\); si se toman \(m\) muestras de tamaño \(n\) de este proceso de producción, entonces el número de artículos disconforme en la muestra \(i\) (\(D_i\)) con \(i= 1, 2, \cdots, m\), es una variable aleatoria con distribución binomial de parámetros \(n\) y \(p\) con media \(np\) y varianza \(np(1 - p)\), como se indica en la ecuación 3.1.

De lo anterior, la fracción de artículos disconformes muestral definida en la ecuación 3.5 tiene media:

\[ \mu_{\hat{P}_i} = E \left(\hat{P}_i \right) = E \left(\frac{D_i}{n} \right) = \frac{1}{n}E\left(D_i \right) = \frac{1}{n}np = p. \]

Mientas que su desviación estándar, se obtiene de la siguiente manera:

\[ \begin{align*} \sigma_{\hat{P}_i} & =\sqrt {V\left(\hat{P}_i \right)}=\sqrt {V \left(\frac{D_i}{n} \right)} = \sqrt { \frac{1}{n ^ 2} V \left(D_i \right)} \\ & = \sqrt { \frac{1}{n ^ 2} np(1 - p)} = \sqrt { \frac{p(1 - p)}{n}} \end{align*} \:. \]

En resumen, la media y la desviación estándar de \(\hat{P}_i\) se expresan en la siguiente ecuación

Media y desviación estándar de \(\hat{P}_i\)

\[ \begin{align*} \mu_{\hat{P}_i} & = p \\ \sigma_{\hat{P}_i} & = \sqrt { \frac{p(1 - p)}{n}} \end{align*} \:. \tag{3.8}\]

De acuerdo con el modelo general de Shewhart, los límites de control estándar del diagrama \(p\), dada la media y la desviación estándar de \(\hat{P}_i\) en la ecuación 3.8, vienen dados por

Límites de control estándar del diagrama \(p\)

\[ \begin{align*} LCS & = \mu_{\hat{P}_{i}} + 3\sigma_{\hat{P}_{i}} = p + 3\sqrt { \frac{p(1 - p)}{n}}\\ LC& = \mu_{\hat{P}_{i}} = p\\ LCI & = \mu_{\hat{P}_{i}} - 3\sigma_{\hat{P}_{i}} = p - 3\sqrt { \frac{p(1 - p)}{n}} \end{align*} \:. \tag{3.9}\]

Estos límites de control se conocen como límites de control estándar del diagrama \(p\).

Por lo general, el parámetro \(p\) es desconocido por lo que se debe estimar con datos del proceso cuando este se encuentra bajo control. Es práctica común estimar este parámetro tomando \(m\) muestras del proceso cuando este se encuentra bajo control. El procedimiento más usual consiste en tomar \(m\) muestras (subgrupos racionales) preliminares cuando se considera que el proceso está bajo control. En general, estas estimaciones deberían basarse en al menos 20 o 25 muestras (\(m \geq 20\)). Cada una de las cuales debe contener \(n\) artículos. Para cada una de las muestra de \(n\) artículos cada una, se debe determinar el número de artículos disconformes, donde \(D_i\) representa el número de artículos disconformes encontrados en la muestra \(i\), con \(i=1, 2,\dots, m\). Luego, la proporción o fracción de artículos disconformes en la muestra \(i\) es la indicada por la ecuación 3.3. Sucesivamente, se estima \(p\) con la ecuación 3.5 o la ecuación 3.6.

Por último, sustituyendo esta estimación de \(p\) (\(\bar{p}\)) en la ecuación 3.9 se obtienen los límites de control inicial del diagrama \(p\), como sigue:

Límites de control inicial del diagrama \(p\)

\[ \begin{align*} LCS & = \bar{p} + 3\sqrt { \frac{\bar{p}(1 - \bar{p})}{n}}\\ LC& = \bar{p}\\ LCI & = \bar{p} - 3\sqrt { \frac{\bar{p}(1 - \bar{p})}{n}} \end{align*} \tag{3.10}\]

3.2.1 Pasos para la Aplicación del Diagramas \(p\) en la Fase I

La aplicación del diagrama \(p\) para monitorear la fracción disconforme en un proceso de producción en la fase I puede esquematizarse en los siguientes pasos:

  1. Seleccionar \(m\) muestras preliminares de artículos producidos, cada una de tamaño \(n\), por lo general \(m\) mayor o igual a 20.

  2. Contar el número de artículos disconforme en cada muestra \(𝑑_𝑖\). Los resultados obtenidos se resumen en la tabla Tabla 3.1.

  3. Calcular la fracción disconforme en cada muestra \(\hat{p}_{i}\), usando la ecuación ecuación 3.3. Los pasos anteriores se pueden resumir en la siguiente tabla.

Tabla 3.3: Resumen de las \(m\) muestras preliminares en el diagrama \(p\)
Muestra \(D_i\) \(\hat{P}_{i}\)
1 \(d_1\) \(\hat{p}_{1}\)
2 \(d_2\) \(\hat{p}_{2}\)
\(\vdots\) \(\vdots\) \(\vdots\)
\(i\) \(d_i\) \(\hat{p}_{i}\)
\(\vdots\) \(\vdots\) \(\vdots\)
\(m-1\) \(d_{m-1}\) \(\hat{p}_{m-1}\)
\(m\) \(d_m\) \(\hat{p}_{m}\)
  1. Estimar la fracción de artículos disconforme que produce el proceso a través de la ecuación 3.6 o en su defecto con la ecuación 3.5.

  2. Con la estimación de \(p\) obtenida en el paso anterior calcular los límites de control de prueba o preliminares y la línea central del diagrama \(p\) por medio de la ecuación 3.10. Cuando \(𝐿𝐼𝐶 < 0\), entonces se toma como cero.

  3. Realizar la gráfica de los límites de control con la fracción de artículos disconforme obtenidas en cada muestra \(\hat{p}_i\), y analizar la representación resultante, de acuerdo a los siguientes criterios:

    1. Si todos los puntos muestrales \(\hat{p}_i\) caen dentro de los límites de control y no manifiestan un comportamiento sistemático. Entonces podemos concluir que el proceso está bajo control, y podemos utilizar \(\bar{p}\) para controlar la producción actual y futura.
    2. Si uno o más puntos están fuera de control se busca una causa especial, si las hay se eliminan estos puntos y se repite el procedimiento desde el paso 3 con los puntos restantes. Este procedimiento continúa hasta que el diagrama no muestre estado fuera de control. En algunos casos es imposible determinar una causa especial para un punto que cae fuera de control, en este caso hay dos tipos de acción que se pueden tomar: la primera es eliminar el punto como si se hubiere encontrado la causa especial (no existe justificación analítica para tomarse esta acción), la segunda es conservar estos puntos y calcular los límites con estos.

Ejemplo 3.2 (Aplicación del Diagrama \(p\))
Considere los datos de la tabla Tabla 3.2 y use el diagrama \(p\) para estimar la fracción de artículos disconformes del proceso.

El siguiente bloque de código muestra los límites de control preliminares del diagrama \(p\).

Código
```{r}
#| label: lci-dcp

m <- nrow(datos_np)
n <- 100
p_est <- sum(datos_np$Di) / (n * m)
lic <- max(0, p_est - 3 * sqrt(p_est * (1 - p_est) / n))
lc <- p_est
lsc <- p_est + 3 * sqrt(p_est * (1 - p_est) / n)
paste0("LCI = ", formato(lic), "    LC = ", formato(lc), "    LCS = ", formato(lsc))
```
#> [1] "LCI = 0    LC = 0,0325    LCS = 0,0857"

Los limites de control inicial del diagrama \(p\), según la ecuación 3.10, viene dados por:

\[ \begin{align*} LCS & = 0,0325 + 3 \sqrt { \frac {0,0325 \left(1 - 0,0325 \right)}{100}} = 0,0857 \\ LC & = 0,0325 \\ LCI & = 0,0325 - 3 \sqrt { \frac {0,0325 \left(1 - 0,0325 \right)}{100}} = 0 \end{align*}. \]

En el siguiente bloque de código se muestra la gráfica del diagrama \(p\) por medio del paquete ggplot2.

Código
```{r}
#| label: fig-ejemplo-dcp-ggplot
#| fig-cap: "Diagrama $p$ para el número de carburadores defectuosos"

# library(ggQC)
ggplot(data = datos_np, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = muestra, y = Di / n), color = "black"
  ) +
  geom_line(
    mapping = aes(x = muestra, y = Di / n), color = "black"
  ) +
  geom_ribbon(aes(ymin = rep(lic, 20), ymax = lc), fill = "green", alpha = 0.2) +
  geom_ribbon(aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2) +
  annotate(
    "text",
    x = nrow(datos_np) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_np) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_np) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX(
       "Muestra ($n_i$)", bold = TRUE, italic = TRUE
    ),
    y = latex2exp::TeX(
      "Fracción de carburadores defectuosos ($\\hat{p}_i$)",
      bold = TRUE, italic = TRUE
    )
  ) +
  theme_bw()
```
Figura 3.5: Diagrama \(p\) para el número de carburadores defectuosos

Como se observa en la Figura 3.5, el proceso está bajo control ya que todos los puntos muestrales se encuentran dentro de los límites de control y no se observa un comportamiento sistemático de estos, por lo tanto esta estimación de \(p\) puede ser usada para controlar la producción futura.

La gráfica del diagrama \(p\) generada con el paquete qcc se muestra a continuación.

Código
```{r}
#| label: fig-ejemplo-dcp-qcc
#| fig-cap: "Diagrama $p$ para el número de carburadores defectuosos con el paquete `qcc`"

obj <- with(
  data = datos_np, qcc(Di, type = "p", sizes = n, plot = FALSE) #
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Fracción de carburadores defectuosos"
)
```
Figura 3.6: Diagrama \(p\) para el número de carburadores defectuosos con el paquete qcc

El siguiente bloque de código muestra la gráfica del diagrama \(p\) con el paquete highcharter.

Código
```{r}
#| label: fig-ejemplo-dcp-highcharter
#| fig-cap: "Diagrama p para el número de carburadores defectuosos"

# library(highcharter)
highchart() |>
  hc_chart(type = "line") |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "center", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>", step = "center",
    marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "center", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_np,
    type = "line", hcaes(x = muestra, y = Di / n),
    useHTML = TRUE, color = "black", name = "<b><i>p<sub>i</sub></i></b>",
    dashStyle = "Dash",
    marker = list(
      symbol = "circle", fillColor = "white", radius = 3,
      lineWidth = 2, lineColor = "black"
    )
  ) |>
  hc_add_series(
    data = datos_np, hcaes(x = muestra, low = lc, high = lsc),
    step = "center", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "green", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_np, hcaes(x = muestra, low = lic, high = lc),
    step = "center", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "blue", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Fracción de carburadores defectuosos</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE, valueDecimals = 4)
```
Figura 3.7: Diagrama p para el número de carburadores defectuosos

En la siguiente figura se muestra el diagrama \(p\) con el paquete plotly.

Código
```{r}
#| label: fig-ejemplo-dp-plotly
#| fig-cap: "Diagrama $p$ para el número de carburadores defectuosos"

# library(plotly)
datos_np %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = '#00FF00',
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = '#0000FF',
    hovertemplate = paste(
      "<b><i>LCI = %{y:.0f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    y = ~ Di / n,
    name = "<b><i>p<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "black"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>p<sub>i</sub><b><i> = %{y:.2f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(orientation = "h", xanchor = "center", x = 0.5, y = -0.2), # list(x = 100, y = 0.5)
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Fracción de carburadores defectuosos</i></b><br>",
      zeroline = F
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.8: Diagrama \(p\) para el número de carburadores defectuosos

Ejemplo 3.3 (Aplicación Diagrama \(p\) en las Fases I y II)
La data orangejuice del paquete qcc de contiene los datos de un experimento de control de calidad de latas de cartón para concentrado de jugo de naranja. 🍊

Los datos se recogieron como 30 muestras de 50 latas cada una a intervalos de media hora durante un período de tres turnos en los que la máquina estuvo en funcionamiento continuo. A partir de la muestra 15 se usó un nuevo lote de cartón. La muestra 23 se obtuvo cuando un operador inexperto fue asignado temporalmente a la máquina. Después de las primeras 30 muestras, se hizo un ajuste en la máquina. Luego se tomaron otras 24 muestras del proceso.

La data tiene las siguientes variables:

  • sample: el identificador de la muestra
  • D: el número de latas defectuosas en cada muestra
  • size: el tamaño de la muestra (50 en todas las muestras)
  • trial: un indicador lógico que indica si la muestra pertenece al primer o al segundo ensayo
Código
```{r}
#| label: tbl-datos-oranjuice
#| tbl-cap: "Número de carburadores defectuosos en cada muestra"
#| tbl-align: left

data(package = 'qcc', "orangejuice")

reactable::reactable(
  orangejuice,
  columns = list(
    sample = colDef(header = "Muestra", align = "right"),
    D = colDef(
      header = "Número de latas defectuosas", 
      align = "right"
    ),
    size = colDef(header = "Tamaño de la muestra", align = "right"),
    trial = colDef(header = "Primer ensayo", align = "left")
  ),
  defaultColDef = colDef(
    # footer = function(values, name) {
    #   htmltools::div(name, style = list(fontWeight = 600))
    # },
    minWidth = 100,
    # maxWidth = 200
  ),
  fullWidth = TRUE,
  # width = "100%",
  # style = list(width = "100%"),
  resizable = TRUE, 
  wrap = FALSE, 
  bordered = TRUE,
  defaultPageSize = 10,
  striped = TRUE,
  highlight = TRUE,
  filterable = TRUE
)
```
Tabla 3.4: Número de carburadores defectuosos en cada muestra

El siguiente bloque de código permite calcular los limites de control y la línea central del diagrama \(p\) en la fase inicial para estos datos.

Código
```{r}
#| label: lci-dcp2
data(orangejuice)
m <- nrow(subset(orangejuice, trial == TRUE))
n <- 50
p_est <- sum(subset(orangejuice, trial == TRUE)$D) / (n * m)
lic <- max(0, p_est - 3 * sqrt(p_est * (1 - p_est) / n))
lc <- p_est
lsc <- p_est + 3 * sqrt(p_est * (1 - p_est) / n)
paste0("LCS = ", formato(lsc), "    LC = ", formato(lc), "    LCI = ", formato(lic))
```
#> [1] "LCS = 0,4102    LC = 0,2313    LCI = 0,0524"

Los limites de control inicial del diagrama \(p\), según la ecuación 3.10, viene dados por:

\[ \begin{align*} LCS & = 0,2313 + 3 \sqrt { \frac {0,2313 \left(1 - 0,2313 \right)}{50}} = 0,4102 \\ LC & = 0,2313 \\ LCI & = 0,2313 - 3 \sqrt { \frac {0,2313 \left(1 - 0,2313 \right)}{50}} = 0,0524 \end{align*}. \]

En el siguiente bloque de código se muestra la gráfica del diagrama \(p\) por medio del paquete ggplot2 en la fase I.

Código
```{r}
#| label: fig-ejemplo2-dcp-ggplot
#| fig-cap: "Diagrama $p$ para el número de latas defectuosas"

# library(ggQC)
jugo <- subset(orangejuice, trial == TRUE)
jugo$p <- jugo$D / n
jugo$outlier <- ifelse(
  jugo$p < lic | jugo$p > lsc, "Si", "No"
)

ggplot(
  data = jugo, aes(x = sample, y = p), show.legend = FALSE
) +
  geom_step(
    mapping = aes(x = sample, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = sample, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = sample, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = sample, y = p, color = factor(outlier), shape = factor(outlier)),
    size = 2
  ) +
  scale_color_manual(
    values = c("No" = "black", "Si" = "red")
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    mapping = aes(x = sample, y = p), color = "black"
  ) +
  geom_ribbon(
    aes(ymin = lic, ymax = lc), fill = "green", alpha = 0.2
  ) +
  geom_ribbon(
    aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2
  ) +
  annotate(
    "text",
    x = nrow(jugo) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(jugo) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(jugo) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX(
      "Muestra ($n_i$)", bold = TRUE, italic = TRUE
    ),
    y = latex2exp::TeX(
      "Fracción de latas defectuosas ($\\hat{p}_i$)",
      bold = TRUE, italic = TRUE
    ),
    shape = "Fuera de control", color = "Fuera de control"
  ) +
  theme(legend.position = "bottom") +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  ) 
```
Figura 3.9: Diagrama \(p\) para el número de latas defectuosas

Como se observa en la Figura 3.9, el proceso se encuentra fuera de control ya que los puntos muestrales 15 y 23 se encuentran fuera de los límites de control y dado que estos tiene su causa atribuible (como se indica en la descripción de la data) se proceden a eliminarlos y se corrigen los límites de control.

La gráfica del diagrama \(p\) generada con el paquete qcc se muestra a continuación.

Código
```{r}
#| label: fig-ejemplo2-dcp-qcc
#| fig-cap: "Diagrama $p$ para el número de latas defectuosos con el paquete `qcc`"

obj <- with(
  data = orangejuice, qcc(D[trial], type = "p", sizes = n, plot = FALSE) # Se ha usado D en vez de D/n
)
plot(
  obj, add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Fracción de latas defectuosas"
)
```
Figura 3.10: Diagrama \(p\) para el número de latas defectuosos con el paquete qcc

La gráfica del diagrama de control \(p\) con el paquete highcharter se muestra a continuación.

Código
```{r}
#| label: fig-ejemplo2-dcp-highcharter
#| fig-cap: "Diagrama $p$ para el número de latas defectuosos con el paquete `highcharter`"

color <- ifelse(jugo$outlier == "Si", "#FF0000", "#000000")
symbol <- ifelse(jugo$outlier == "Si", "asterisk-open", "circle")
# library(highcharter)
highchart() |>
  hc_add_series(
    data = jugo, hcaes(x = sample, low = lc, high = lsc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = jugo, hcaes(x = sample, low = lic, high = lc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    jugo, type = "line", 
    hcaes(x = sample, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 4)
  ) |>
  hc_add_series(
    jugo,
    type = "line", hcaes(x = sample, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    jugo, type = "line", hcaes(x = sample, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list( valueDecimals = 0)
  ) |>
  hc_add_series(
    jugo, type = "line", color = "black",
    hcaes(
      x = sample, y = D / size, color = color, symbol = symbol
    ),
    marker = list(
      radius = 3
    ),
    useHTML = TRUE, name = "<b><i>p<sub>i</sub></i></b>",
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Fracción de latas defectuosas",
      max = 0.5,
      min = 0,
      startOnTick = FALSE
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions( series = list(animation = FALSE) )
```
Figura 3.11: Diagrama \(p\) para el número de latas defectuosos con el paquete highcharter

La gráfica del diagrama de control \(p\) con el paquete plotly se muestra a continuación.

Código
```{r}
#| label: fig-ejemplo2-dcp-plotly
#| fig-cap: "Diagrama $c$ para el número de defectos"

# library(plotly)
jugo |> 
  plot_ly(x = ~sample) %>%
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) |> 
  add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = 'green', 
    alpha = 0.3,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) |> 
  add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = 'blue', 
    alpha = 0.3,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) |> 
  add_trace(
    y = ~ D / size,
    name = "<b><i>P<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = color, symbol = symbol),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>p<sub>i</sub><b><i> = %{y:.2f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) |> 
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Fracción de latas defectuosas</i></b><br>",
      zeroline = FALSE
    )
  ) |> 
  plotly::config(locale = "es", mathjax = "cdn") |>  
  fillOpacity(alpha = 0.3)
```
Figura 3.12: Diagrama \(c\) para el número de defectos

El cálculo de los límites de control corregidos con se muestra con el siguiente bloque de código.

Código
```{r}
#| label: lcc-dcp2
m <- nrow(subset(jugo, outlier == "No"))
n <- 50
p_est <- sum(subset(jugo, outlier == "No")$D) / (n * m)
lic <- max(0, p_est - 3 * sqrt(p_est * (1 - p_est) / n))
lc <- p_est
lsc <- p_est + 3 * sqrt(p_est * (1 - p_est) / n)
paste0("LCS = ", formato(lsc), "    LC = ", formato(lc), "    LCI = ", formato(lic))
```
#> [1] "LCS = 0,3893    LC = 0,215    LCI = 0,0407"

Los limites de control corregidos , calculados de manera manual, según la ecuación 3.10, vienen dados por:

\[ \begin{align*} LCS & = 0,215 + 3 \sqrt { \frac {0,215 \left(1 - 0,215 \right)}{50}} = 0,3893 \\ LC & = 0,215 \\ LCI & = 0,215 - 3 \sqrt { \frac {0,215 \left(1 - 0,215 \right)}{50}} = 0,0407 \end{align*}. \]

En el siguiente bloque de código se muestra la gráfica del diagrama \(p\) por medio del paquete ggplot2con los límites de control corregidos agregando los datos de la fase II.

Código
```{r}
#| label: fig-ejemplo2c-dcp-ggplot
#| fig-cap: "Diagrama $p$ para el número de latas defectuosas corregido"

inc <- setdiff(which(orangejuice$trial), c(15, 23))
obj <- with(
  orangejuice,
  qcc(
    D[inc],
    sizes = size[inc], type = "p", plot = FALSE,
    newdata = D[!trial], newsizes = size[!trial]
  )
)
violation <- violating.runs(obj, run.length = qcc.options("run.length"))
latas <- orangejuice |> 
  dplyr::mutate(
    p = D / n,
    violation = ifelse(
      sample %in% (2 + violation) | (p < lic | p > lsc),
      "Si", "No"
    )
  )

ggplot(data = latas, aes(x = sample, y = p), show.legend = FALSE) +
  geom_step(
    mapping = aes(x = sample, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = sample, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = sample, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    data = dplyr::slice(latas, c(-15, -23)),
    mapping = aes(
      x = sample, y = p, color = factor(violation), shape = factor(violation)
    ),
    size = 2
  ) +
  geom_point(
    data = dplyr::slice(latas, c(15, 23)),
    mapping = aes(x = sample, y = p), color = "red", shape = 4,
    size = 2
  ) +
  scale_color_manual(
    values = c(
      "No" = "black", "Si" = "red", show.legend = FALSE
    )
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    data = dplyr::slice(latas, c(-15, -23)),
    mapping = aes(x = sample, y = p), color = "black"
  ) +
  geom_ribbon(
    aes(ymin = lic, ymax = lc), fill = "green", alpha = 0.2
  ) +
  geom_ribbon(
    aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2
  ) +
  geom_vline(
    xintercept = (30 + 31) / 2, linetype = 2, 
    color = "blue"
  ) + #linetype = "dashed"
  annotate(
    "text", x = nrow(latas) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  stat_ellipse(
  data = dplyr::slice(latas, 2 + obj$violations[[2]]), 
  mapping = aes(x = sample, y = p)
  ) +
  annotate(
    "text",
    x = nrow(latas) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(latas) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX(
      "Muestra ($n_i$)", bold = TRUE, italic = TRUE
    ),
    y = latex2exp::TeX(
      "Fracción de latas defectuosas ($\\hat{p}_i$)",
      bold = TRUE, italic = TRUE
    ),
    shape = "Violación", color = "Violación"
  ) +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  ) 
```
Figura 3.13: Diagrama \(p\) para el número de latas defectuosas corregido

La Figura 3.13 muestra una reducción en la fracción de latas de cartón defectuosas en las últimas 30 muestras tomadas después que se hizo el ajuste a la máquina.

La gráfica del diagrama \(p\) generada con el paquete qcc se muestra a continuación.

Código
```{r}
#| label: fig-ejemplo2c-dcp-qcc
#| fig-cap: "Diagrama $p$ para el número de latas defectuosos corregido con el paquete `qcc`"

inc <- setdiff(which(orangejuice$trial), c(15, 23))
obj <- with(
  orangejuice,
  qcc(
    D[inc], sizes = size[inc], type = "p", plot = FALSE,
    newdata = D[!trial], newsizes = size[!trial]
  )
)
warn.limits.1sigma <- limits.p(
  center = obj$center, std.dev = obj$std.dev, sizes = 50, conf = 1
)
warn.limits.2sigma <- limits.p(
  center = obj$center, std.dev = obj$std.dev, sizes = 50, conf = 2
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Fracción de latas defectuosas"
)
abline(h = warn.limits.1sigma, lty = 3, col = "chocolate")
abline(h = warn.limits.2sigma, lty = 3, col = "chocolate")
```
Figura 3.14: Diagrama \(p\) para el número de latas defectuosos corregido con el paquete qcc

3.2.2 Diagrama \(p\) con Tamaños de Muestra Variable

Los diagramas \(np\) y \(p\) vistos anteriormente fueron diseñados utilizando tamaños de muestras constante. En algunos procesos industriales la inspección es del 100% de la salida del proceso en cierto periodo de tiempo. Puesto que en cada periodo podrían producirse diferentes números de unidades, la carta de control tendría un tamaño de muestra variable. Hay tres enfoques para construir y operar una carta de control con tamaños de muestra variables:

  • límite de control de anchura variable,
  • límite de control basado en el tamaño de la muestra promedio y
  • carta de control estandarizada.

En esta carta de control el estadístico que se grafica es la proporción de artículos disconformes en la muestra de tamaño \(n_i\). Es decir,

Fracción de artículos disconformes con tamaño de muestra variable

\[ \hat{P}_i=\frac{D_i}{n_i}. \tag{3.11}\]

Donde \(D_i\) es el número de artículos disconformes en la muestra de tamaño \(n_i\)

Nota

Observe que el estadístico definido en la ecuación 3.11 es una adaptación del estadístico definido en la ecuación 3.3 al caso de muestra variable.

Bajo el supuesto que el proceso funcione de manera estable, tal que, la probabilidad de que cualquier artículo sea disconforme en la muestra de tamaño \(n_i\) es constante e igual a \(p\). Entonces, \(D_i\) se distribuye binomialmente con parámetros \(n_i\) y \(p\). Por lo que la media y la desviación estándar de los \(D_i\) vienen dadas por

Media y varianza de \(D_i\) con tamaño de meustra variable

\[ \begin{align*} \mu_{_{D_i}} & = E \left(D_i \right)=n_ip\\ \sigma_{_{D_i}} &=\sqrt {V\left(D_i \right)}=\sqrt {n_ip\left(1-p \right)} \end{align*}. \tag{3.12}\]

De la ecuación 3.12 se obtiene la media de la proporción de artículos disconformes muestral con tamaño de muestra variable, definida en la ecuación 3.11, como sigue,

\[ \mu_{\hat{P}_{i}} = E \left(\hat{P}_{i} \right) = E \left(\frac{D_i}{n_i} \right) = \frac{1}{n_i}E \left(D_i \right) = \frac{1}{n_i}n_ip=p \, . \]

Mientras que la desviación estándar de este estadístico se obtiene de la siguiente manera:

\[ \begin{align*} \sigma_{\hat{P}_{i}} & = \sqrt {V \left(\hat{P}_i \right)} = \sqrt {V \left(\frac{D_i}{n_i} \right)} = \sqrt {\frac{1}{n_i^2}V(D_i)} = \sqrt {\frac{1}{n_i^2}n_ip(1 - p)}\\ & =\sqrt {\frac{p(1 - p)}{n_i}} \end{align*}. \]

Lo anteriormente descrito se puede resumir en la siguiente ecuación.

Media y desviación estándar de \(P_i\) con tamaño de muestra variable

\[ \begin{align*} \mu_{\hat{P}_{i}} & = p\\ \sigma_{\hat{P}_{i}} & = \sqrt {\frac{p(1 - p)}{n_i}} \end{align*} . \tag{3.13}\]

De la ecuación anterior, los límites de control 3 sigma tipo Shewhart del diagrama \(p\) estándar con tamaño de muestra variable quedan definidos por:

Límites de control estándar del diagrama \(p\) con tamaño de muestra variable

\[ \begin{align*} LCS_i & = p + 3\sqrt {\frac{p(1 - p)}{n_i}}\\ LC_i & = p\\ LCI_i & = p - 3\sqrt {\frac{p(1 - p)}{n_i}}\\ \end{align*} . \tag{3.14}\]

Generalmente, el parámetro \(p\) es desconocido, por lo que este debe ser estimado con datos del proceso. Para ello se toman \(m\) muestras del proceso bajo control. Sean \(\hat{p}_1, \hat{p}_1, \dots, \hat{p}_m\) las proporciones de artículos disconformes muestrales encontradas en las \(m\) muestras. Se toma como estimación de \(p\) el promedio ponderado de los \(\hat{p}_i\), donde las ponderaciones viene dadas por los tamaños muestrales \(n_i\). Es decir,

Estimador ponderado de \(p\)

\[ \hat{p}=\bar{p}=\frac{\sum_{i=1}^{m}n_i \hat{p}_{i}}{\sum_{i=1}^{m}n_i}. \tag{3.15}\]

Una ecuación alternativa y más sencilla de evaluar para obtener una estimación de \(p\) se obtiene sustituyendo en la ecuación 3.15 la ecuación 3.11. La cual se presenta a continuación,

Estimador ponderado de \(p\) en función de los \(d_i\)

\[ \hat{p}=\bar{p}=\frac{\sum_{i=1}^{m}d_i }{\sum_{i=1}^{m}n_i}. \tag{3.16}\]

Ahora, sustituyendo esta estimación ponderada de \(p\) en la ecuación 3.14, se obtiene que los límites de control y línea central del diagrama \(p\) inicial cuando el tamaño de muestra es variable, los siguientes:

Límites de control inicial del diagrama \(p\) con tamaño de muestras variables

\[ \begin{align*} LCS_i & = \bar{p} + 3\sqrt { \frac{\bar{p}(1 - \bar{p})}{n_i}}\\ LC_i & = \bar{p}\\ LCI_i & = \bar{p} - 3\sqrt { \frac{\bar{p}(1 - \bar{p})}{n_i}} \end{align*}. \tag{3.17}\]

Nota

Como puede notar en la ecuación 3.17, estos límites de control son variables ya que dependen de los \(n_i\), lo que constituye una desventaja ya que en este caso se hace muy engorroso el análisis de patrones en los puntos graficados en el diagrama, por no decir imposible.

El segundo enfoque consiste en basar la carta de control en un tamaño de muestra promedio, es decir

Tamaño de muestra promedio

\[ \begin{equation} n = \bar{n}= \frac{\sum_{i=1}^{m}n_i}{m} \end{equation}. \tag{3.18}\]

Luego, sustituyendo \(n_i\) por \(\bar{n}\) en la ecuación 3.17 se obtienen los siguientes límites de control 3 sigmas tipo Shewhart del diagrama \(p\) con tamaño de muestra variable usando el enfoque del tamaño de muestra promedio.

Límites de control inicial del diagrama \(p\) con tamaño de muestra promedio

\[ \begin{align*} LCS & = \bar{p} + 3\sqrt { \frac{\bar{p}(1 - \bar{p})}{\bar{n}}}\\ LC & = \bar{p}\\ LCI & = \bar{p} - 3\sqrt { \frac{\bar{p}(1 - \bar{p})}{\bar{n}}} \end{align*}. \tag{3.19}\]

Estos límites de control son aproximaciones de los límites reales. Y son particularmente útiles cuando los tamaños muestrales son muy similares, ya que, si los tamaños muestrales son muy variables se puede dar el caso de que puntos muestrales que estén dentro de los límites de control exactos (variables), se muestren fuera de control es este diagrama, o viceversa, puntos que se ubiquen dentro de los límites de control en este diagrama se ubiquen fuera de control con los límites de control exactos. Si se usa este enfoque, los límites de control serán constantes, y la carta de control resultante no le parecerá tan impresionante al personal de operación como la carta de control con límites de control variables. Sin embargo, si hay variación excesivamente en el tamaño de una muestra particular o si un punto se localiza cerca de los límites de control aproximados, entonces será necesario determinar los límites de control exactos para ese punto y el punto deberá examinarse con respecto a esos valores.

Una alternativa al enfoque del tamaño de muestra promedio es usar la moda de los tamaños muestrales. Esta opción es útil cundo se tiene un tamaño muestral que se repite mucho.

El tercer enfoque para tratar un tamaño de muestra variable consiste en usar una cartas de control estandarizadas, donde los \(\hat{p}_i\) se grafican en unidades de desviación estándar. Esta carta de control tiene la línea central en cero, y los límites de control superior e inferior en +3 y -3, respectivamente. La variable graficada en la carta o diagrama es

\(\hat{P}_i\) estandarizada con \(p\) conocido

\[ \begin{equation} Z_i =\frac{\hat{P}_i - p} {\sqrt { \frac{p(1 - p)}{n_i}}} \end{equation}. \tag{3.20}\]

Cuando el parámetro \(p\) es conocido, de lo contrario

\(\hat{P}_i\) estandarizada con \(p\) desconocido

\[ \begin{equation} Z_i =\frac{\hat{P}_i - \bar{p}} {\sqrt { \frac{ \bar{p}(1 - \bar{p})}{n_i}}} \end{equation}. \tag{3.21}\]

Este tipo de carta de control resulta más difícil de interpretar para el personal de operación, ya que se pierde la referencia a la fracción defectuosa real del proceso. Sin embargo, si la variación en el tamaño de la muestra es grande, entonces sólo es seguro aplicar la carta de control estandarizada para identificar corridas y patrones.

Ejemplo 3.4 (Aplicación del Diagrama \(p\) con Tamaño de Muestra Variable)
Trace un diagrama de control \(p\) para los datos en la Tabla 3.5, en la cual se muestra el número de unidades disconforme producidos en los últimos 25 días en una línea de producción. Los datos fueron tomados de Montgomery (2005, 299).

Código
```{r}
#| label: tbl-datos-dcp-tmv
#| tbl-cap:  "Datos para el diagrama $p$ con tamaño de muestra variables"
#| tbl-align: left

datos_dpv <- data.table::data.table(
  muestra = c(
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L,
    16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L
  ),
  ni = c(
    100L, 80L, 80L, 100L, 110L, 110L, 100L, 100L, 90L, 90L, 110L, 120L,
    120L, 120L, 110L, 80L, 80L, 80L, 90L, 100L, 100L, 100L, 100L, 90L, 90L
  ),
  di = c(
    12L, 8L, 6L, 9L, 10L, 12L, 11L, 16L, 10L, 6L, 20L, 15L, 9L, 8L, 6L,
    8L, 10L, 7L, 5L, 8L, 5L, 8L, 10L, 6L, 9L
  )
)

p_est <- sum(datos_dpv$di) / sum(datos_dpv$ni)

datos_dpv <- datos_dpv |> 
  dplyr::mutate(
    pi = di / ni,
    desviacion = sqrt(p_est * (1 - p_est) / ni),
    lic = ifelse(p_est - 3 * desviacion >= 0, p_est - 3 * desviacion, 0),
    lsc = p_est + 3 * desviacion,
    zi = (pi - p_est) / desviacion
  )
knitr::kable(
  datos_dpv,
  table.attr = 'data-quarto-disable-processing="true"',
  booktabs = TRUE,
  format = "markdown",
  digits = 4,
  format.args = list(decimal.mark = ",", big.mark = "."),
  col.names = c(
    "Número de muestra $i$",
    "Tamaño de la muestra",
    "Número de unidades disconformes $D_i$",
    "Fracción disconforme muestral $\\hat{p}_i$",
    "Desviación estándar $\\sqrt { \\frac{\\bar{p}(1 - \\bar{p})}{n_i}}$",
    "Límite inferior de control $LCI_i$",
    "Límite superior de control $LCS_i$",
    "$Z_i$"
  ),
  align = "ccccccc",
  escape = FALSE
)
```
Tabla 3.5: Datos para el diagrama \(p\) con tamaño de muestra variables
Número de muestra \(i\) Tamaño de la muestra Número de unidades disconformes \(D_i\) Fracción disconforme muestral \(\hat{p}_i\) Desviación estándar \(\sqrt { \frac{\bar{p}(1 - \bar{p})}{n_i}}\) Límite inferior de control \(LCI_i\) Límite superior de control \(LCS_i\) \(Z_i\)
1 100 12 0,1200 0,0294 0,0073 0,1837 0,8332
2 80 8 0,1000 0,0329 0,0000 0,1941 0,1366
3 80 6 0,0750 0,0329 0,0000 0,1941 -0,6241
4 100 9 0,0900 0,0294 0,0073 0,1837 -0,1875
5 110 10 0,0909 0,0280 0,0114 0,1796 -0,1642
6 110 12 0,1091 0,0280 0,0114 0,1796 0,4846
7 100 11 0,1100 0,0294 0,0073 0,1837 0,4930
8 100 16 0,1600 0,0294 0,0073 0,1837 2,1941
9 90 10 0,1111 0,0310 0,0026 0,1885 0,5036
10 90 6 0,0667 0,0310 0,0026 0,1885 -0,9310
11 110 20 0,1818 0,0280 0,0114 0,1796 3,0798
12 120 15 0,1250 0,0268 0,0150 0,1760 1,0991
13 120 9 0,0750 0,0268 0,0150 0,1760 -0,7644
14 120 8 0,0667 0,0268 0,0150 0,1760 -1,0750
15 110 6 0,0545 0,0280 0,0114 0,1796 -1,4618
16 80 8 0,1000 0,0329 0,0000 0,1941 0,1366
17 80 10 0,1250 0,0329 0,0000 0,1941 0,8974
18 80 7 0,0875 0,0329 0,0000 0,1941 -0,2438
19 90 5 0,0556 0,0310 0,0026 0,1885 -1,2896
20 100 8 0,0800 0,0294 0,0073 0,1837 -0,5277
21 100 5 0,0500 0,0294 0,0073 0,1837 -1,5484
22 100 8 0,0800 0,0294 0,0073 0,1837 -0,5277
23 100 10 0,1000 0,0294 0,0073 0,1837 0,1528
24 90 6 0,0667 0,0310 0,0026 0,1885 -0,9310
25 90 9 0,1000 0,0310 0,0026 0,1885 0,1449

La estimación de \(p\) se obtiene con la ecuación 3.16, como sigue

\[ \bar{p}=\frac{\sum_{i=1}^{m}d_i }{\sum_{i=1}^{m}n_i}=\frac{234}{2.450}=0,0955. \]

Por otro lado, los límites de control y la línea central en este caso vienen dados por

\[ \begin{align*} LCS_i & = 0,0955 + 3\sqrt { \frac{0,0955(1 - 0,0955)}{n_i}}\\ LC & = 0,0955\\ LCI_i & = 0,0955 - 3\sqrt { \frac{0,0955(1 - 0,0955)}{n_i}} \end{align*}. \]

En la Tabla 3.5 se muestran los límites de control para cada muestra.

El siguiente bloque de código muestra la gráfica del diagrama \(p\) para tamaño de muestra variable, usando el paquete ggplot2.

Código
```{r}
#| label: fig-dcp-tmv-ggplot
#| fig-cap: "Diagrama $p$ con límites de control variables con el paquete `ggplot2`"

datos_dpv$outlier <- ifelse(
  datos_dpv$pi < datos_dpv$lic | datos_dpv$pi > datos_dpv$lsc, "Si", "No"
)

ggplot(data = datos_dpv, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = p_est),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(
      x = muestra, y = pi, color = factor(outlier), 
      shape = factor(outlier)
    ), 
    color = "black"
  ) +
  scale_color_manual(
    values = c("No" = "black", "Si" = "red")
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    mapping = aes(x = muestra, y = pi), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = lic, ymax = p_est), fill = "green", 
    alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = p_est, ymax = lsc), fill = "green", 
    alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = last(datos_dpv$lic), 
    label = "LCI", color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = last(datos_dpv$lsc), 
    label = "LCS", color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = p_est, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX("Muestra ($n_i$)"),
    y = latex2exp::TeX(
      "Fraccion de unidades disconformes ($\\hat{p}_i$)"
    ),
    shape = "Fuera de control", color = "Fuera de control"
  ) +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  ) 
```
Figura 3.15: Diagrama \(p\) con límites de control variables con el paquete ggplot2

Como se observa en la Figura 3.15, el subgrupo muestral 11 está fuera de los límites de control, lo cual sería una indicación del estado fuera de control, suponiendo que este punto tiene su causa atribuible.

La gráfica del diagrama \(p\) con tamaño de muestra variable generada con el paquete qcc se muestra a continuación.

Código
```{r}
#| label: fig-dcp-tmv-qcc
#| fig-cap: "Diagrama $p$ para con límites de control variables con el paquete `qcc`"

obj <- with(
  data = datos_dpv, qcc(di, type = "p", sizes = ni, plot = FALSE) #
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Fracción de unidades disconformes"
)
```
Figura 3.16: Diagrama \(p\) para con límites de control variables con el paquete qcc

A continuación se muestra el diagrama \(p\) con tamaño de muestra variable con el paquete highcharter.

Código
```{r}
#| label: fig-dcp-tmv-highcharter
#| fig-cap: "Diagrama p para el número de carburadores defectuosos"


color <- ifelse(
  datos_dpv$outlier == "No", "#0000FF", "#FF0000" 
)
symbol <- ifelse(
  datos_dpv$outlier == "No", "triangle-up", "triangle-down"
)

# library(highcharter)
highchart() |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = p_est), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>", step = "hv",
    marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", name = "<b><i>LCS</b></i>", dashStyle = "Dash",
    step = "hv", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = pi, color = color, symbol = symbol),
    useHTML = TRUE, color = "black", 
    name = "<b><i>p<sub>i</sub></i></b>",
    dashStyle = "Dash",
    marker = list(radius = 3)
  ) |>
  hc_add_series(
    data = datos_dpv, hcaes(x = muestra, low = lsc, high = p_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "green", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_dpv, hcaes(x = muestra, low = lic, high = p_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "blue", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", name = "<b><i>LCI</b></i>", dashStyle = "Dash",
    step = "hv", marker = list(enabled = FALSE)
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Fracción de unidades defectuosas (p<sub>i</sub>)</i></b><br>"
    ),
    min = 0,
    max = 0.2
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE, valueDecimals = 4)
```
Figura 3.17: Diagrama p para el número de carburadores defectuosos

El siguiente bloque de código, muestra la gráfica del diagrama \(p\) con tamaño de muestra variable con el paquete plotly.

Código
```{r}
#| label: fig-dcp-tmv-plotly
#| fig-cap: "Diagrama $p$ para tamaño de muestra variable con `plotly`"

color <- ifelse(
  datos_dpv$outlier == "No", "#0000FF", "#FF0000" 
)
symbol <- ifelse(
  datos_dpv$outlier == "No", "circle", "asterisk-open"
)

# library(plotly)
datos_dpv |> 
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = ~lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hv", color = "red"
    ),
    hovertemplate = paste(
      "<b><i>LCS = %{y:.4f}</i></b><br><extra></extra>"
    )
  ) |> 
  add_lines(
    y = p_est, name = "<b><i>LC</i></b>", fill = "tonexty", 
    fillcolor = 'green',
    hovertemplate = paste(
      "<b><i>LC = %{y:.4f}</i></b><br><extra></extra>"
    ),
    line = list(shape = "hv", color = "blue")
  ) |> 
  add_lines(
    y = ~lic, name = "<b><i>LCI</i></b>", fill = "tonexty", 
    fillcolor = 'blue',
    hovertemplate = paste(
      "<b><i>LCI = %{y:.4f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hv", color = "red"
    )
  ) |> 
  add_trace(
    y = ~pi,
    name = "<b><i>p<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = color, symbol = symbol),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>p<sub>i</sub><b><i> = %{y:.4f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) |> 
  layout(
    legend = list(x = 100, y = 0.5),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Fracción de unidades disconformes (p<sub>i</sub>)</i></b><br>",
      zeroline = F
    )
  ) |> 
  plotly::config(locale = "es", mathjax = "cdn") |>  
  fillOpacity(alpha = 0.3)
```
Figura 3.18: Diagrama \(p\) para tamaño de muestra variable con plotly

El tamaño de muestra promedio \(\bar{n}\), usando la ecuación 3.18, viene dado por

\[ \begin{equation} \bar{n}= \frac{\sum_{i=1}^{m}n_i}{m}=\frac{2.450}{25}=98 \end{equation}. \] Mientras que los límites de control y la línea central, usando el enfoque de el tamaño de muestra promedio serán, según la ecuación 3.19

\[ \begin{align*} LCS & = 0,0955 + 3\sqrt { \frac{0,0955(1 - 0,0955)}{98}} = 0,1846 \\ LC & = 0,0955 \\ LCI & = 0,0955 - 3\sqrt { \frac{0,0955(1 - 0,1846)}{98}} = 0,0064 \end{align*}. \]

El tamaño de muestra promedio \(\bar{n}\), usando la ecuación 3.18, viene dado por

\[ \begin{equation} \bar{n}= \frac{\sum_{i=1}^{m}n_i}{m}=\frac{2.450}{25}=98 \end{equation}. \]

Mientras que los límites de control y la línea central, usando el enfoque de el tamaño de muestra promedio serán, según la ecuación 3.19

\[ \begin{align*} LCS & = 0,0955 + 3\sqrt { \frac{0,0955(1 - 0,0955)}{98}} = 0,1846 \\ LC & = 0,0955 \\ LCI & = 0,0955 - 3\sqrt { \frac{0,0955(1 - 0,1846)}{98}} = 0,0064 \end{align*}. \]

El siguiente bloque de código muestra la gráfica del diagrama \(p\) usando el enfoque del tamaño de muestra promedio con el paquete ggplot2.

Código
```{r}
#| label: fig-dcp-tmp-ggplot
#| fig-cap: "Diagrama $p$ con tamaño de muestra promedio con el paquete `ggplot2`"

outlier_tmp <- ifelse(
  datos_dpv$pi < lic_tmp | datos_dpv$pi > lsc_tmp, 
  "Si", "No"
)

ggplot(data = datos_dpv, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = lic_tmp),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = p_est),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc_tmp),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(
      x = muestra, y = pi, color = factor(outlier_tmp),
      shape = factor(outlier_tmp)
    )
  ) +
  scale_color_manual(
    values = c("No" = "black", "Si" = "red")
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    mapping = aes(x = muestra, y = pi), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = lic_tmp, ymax = p_est), fill = "green",
    alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = p_est, ymax = lsc_tmp), fill = "green",
    alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = lic_tmp, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = lsc_tmp, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = p_est, label = "LC",
    color = "blue"
  ) +
  labs(
    x = "Muestra",
    y = latex2exp::TeX("Fraccion de unidades disconformes $\\left(\\hat{p}_i \\right)$"),
    shape = "Fuera de control", color = "Fuera de control"
  ) +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  ) 
```
Figura 3.19: Diagrama \(p\) con tamaño de muestra promedio con el paquete ggplot2

La gráfica del diagrama \(p\) con tamaño de muestra promedio generada con el paquete qcc se muestra a continuación.

Código
```{r}
#| label: fig-dcp-tmp-qcc
#| fig-cap: "Diagrama $p$ con tamaño de muestra promedio con el paquete `qcc`"

obj <- with(
  data = datos_dpv, qcc(
    di, type = "p", sizes = ni, center = p_est, limits = c(lic_tmp, lsc_tmp),
plot = FALSE
  ) 
)
plot(
  obj, add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Fracción de unidades disconformes"
)
```
Figura 3.20: Diagrama \(p\) con tamaño de muestra promedio con el paquete qcc

La gráfica del diagrama \(p\) con tamaño de muestra promedio generada con el paquete hghcharter se muestra a continuación.

Código
```{r}
#| label: fig-dcp-tmp-highcharter
#| fig-cap: "Diagrama $p$ contamaño de muestra promedio con el paquete `hghcharter`"

# library(highcharter)
highchart() |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = lic_tmp), useHTML = TRUE,
    color = "red", name = "<b><i>LCI</b></i>", dashStyle = "Dash",
    step = "hv", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = p_est), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>", step = "hv",
    marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = lsc_tmp), useHTML = TRUE,
    color = "red", name = "<b><i>LCS</b></i>", dashStyle = "Dash",
    step = "hv", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = pi),
    useHTML = TRUE, color = "black", name = "<b><i>p<sub>i</sub></i></b>",
    dashStyle = "Dash",
    marker = list(
      symbol = "circle", fillColor = "white", radius = 3,
      lineWidth = 2, lineColor = "black"
    )
  ) |>
  hc_add_series(
    data = datos_dpv, hcaes(x = muestra, low = lsc_tmp, high = p_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "green", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_dpv, hcaes(x = muestra, low = lic_tmp, high = p_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "blue", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Fracción de unidades defectuosas (p<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE, valueDecimals = 4)
```
Figura 3.21: Diagrama \(p\) contamaño de muestra promedio con el paquete hghcharter

La gráfica del diagrama \(p\) con tamaño de muestra promedio generada con el paquete plotly se muestra a continuación.

Código
```{r}
#| label: fig-dcp-tmp-plotly
#| fig-cap: "Diagrama $p$ contamaño de muestra promedio con el paquete `plotly`"

# library(plotly)
datos_dpv |> 
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc_tmp, name = "<b><i>LCS</i></b>", line = list(
      shape = "hv", color = "red"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.4f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = p_est, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = 'green',
    hovertemplate = paste("<b><i>LC = %{y:.4f}</i></b><br><extra></extra>"),
    line = list(shape = "hv", color = "blue")
  ) %>%
  add_lines(
    y = lic_tmp, name = "<b><i>LCI</i></b>", 
    fill = "tonexty", fillcolor = 'blue',
    hovertemplate = paste(
      "<b><i>LCI = %{y:.4f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hv", color = "red"
    )
  ) %>%
  add_trace(
    y = ~pi,
    name = "<b><i>p<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "black"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>p<sub>i</sub><b><i> = %{y:.4f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(x = 100, y = 0.5),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Fracción de unidades disconformes (p<sub>i</sub>)</i></b><br>",
      zeroline = F
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |>  
  fillOpacity(alpha = 0.3) 
```
Figura 3.22: Diagrama \(p\) contamaño de muestra promedio con el paquete plotly

Para el diagrama \(p\) estandarizado, los \(z_i\) se obtienen, según la ecuación 3.21, evaluando la siguiente expresión para cada par de \(\hat{p}_i\) y \(n_i\)

\[ \begin{equation} z_i =\frac{\hat{p}_i - 0,0955} {\sqrt { \frac{ 0,0955(1 - 0,0955)}{n_i}}}, \, para \: i = 1, 2, \dots ,25 \end{equation}. \]

Los valores de estos \(z_i\) se observan en la Tabla 3.5.

El siguiente bloque de código muestra la gráfica del diagrama \(p\) estandarizado con el paquete ggplot2.

Código
```{r}
#| label: fig-dcp-est-ggplot
#| fig-cap: "Diagrama $p$ estandarizado para el número de carburadores defectuosos con el paqute `ggplot`"

datos_dpv$outlier <- ifelse(
  datos_dpv$pi < datos_dpv$lic | datos_dpv$pi > datos_dpv$lsc, "Si", "No"
)

# library(ggplot2)
ggplot(data = datos_dpv, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = -3),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = 0),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = 3),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(
      x = muestra, y = zi, color = factor(outlier), shape = factor(outlier)
    )
  ) +
  scale_color_manual(values = c("No" = "black", "Si" = "red")) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    mapping = aes(x = muestra, y = zi), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = -3, ymax = 0), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = 0, ymax = 3), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = -3, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = 3, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dpv) + 1, y = 0, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX("Muestra $\\left(n_i \\right)$"),
    y = latex2exp::TeX(
      "Fraccion de unidades disconformes estandarizada $\\left(z_i \\right)$"
    ),
    shape = "Fuera de control", color = "Fuera de control"
  ) +
  scale_y_continuous(
    breaks = seq(from = -3, to = 3, by = 1),
  ) +
  theme_bw()
```
Figura 3.23: Diagrama \(p\) estandarizado para el número de carburadores defectuosos con el paqute ggplot

El siguiente bloque de código muestra el diagrama \(p\) estandarizado usando el paquete highcharter

Código
```{r}
#| label: fig-dcp-est-highcharter
#| fig-cap: "Diagrama $p$ estandarizado con `highcharter`"

color <- ifelse(
  datos_dpv$outlier == "No", "#0000FF", "#FF0000" 
)
symbol <- ifelse(
  datos_dpv$outlier == "No", "triangle-up", "triangle-down"
)

# library(highcharter)
highchart() |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = -3), useHTML = TRUE,
    color = "red", name = "<b><i>LCI</b></i>", dashStyle = "Dash",
    step = "hv", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = 0), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>", step = "hv",
    marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = 3), useHTML = TRUE,
    color = "blue", name = "<b><i>LCS</b></i>", dashStyle = "Dash",
    step = "hv", marker = list(enabled = FALSE)
  ) |>
  hc_add_series(
    datos_dpv,
    type = "line", hcaes(x = muestra, y = zi, color = color, symbol = symbol),
    useHTML = TRUE, color = "black", name = "<b><i>p<sub>i</sub></i></b>",
    dashStyle = "Dash",
    marker = list(
      color = color, symbol = symbol, radius = 3
    )
  ) |>
  hc_add_series(
    data = datos_dpv, hcaes(x = muestra, low = 0, high = 3),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, color = "green", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_dpv, hcaes(x = muestra, low = -3, high = 0),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2,  color = "blue", name = "",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Fracción de unidades defectuosas (p<sub>i</sub>)</i></b><br>"
    ),
    min = -3,
    maxPadding = 0.5,
    max = 3.5
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE, valueDecimals = 2)
```
Figura 3.24: Diagrama \(p\) estandarizado con highcharter

A continuación, se muestra el diagrama \(p\) estandarizado con el paquete plotly.

Código
```{r}
#| label: fig-dcp-est-plotly
#| fig-cap: "Diagrama $p$ estandarizado con `plotly`"

color <- ifelse(
  datos_dpv$outlier == "No", "#0000FF", "#FF0000" 
)
symbol <- ifelse(
  datos_dpv$outlier == "No", "circle", "asterisk-open"
)

# library(plotly)
datos_dpv |> 
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = 3, name = "<b><i>LCS</i></b>", line = list(
      shape = "hv", color = "red"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.4f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = 0, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = 'green',
    hovertemplate = paste("<b><i>LC = %{y:.4f}</i></b><br><extra></extra>"),
    line = list(shape = "hv", color = "blue")
  ) %>%
  add_lines(
    y = -3, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = 'blue',
    hovertemplate = paste(
      "<b><i>LCI = %{y:.4f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hv", color = "red"
    )
  ) %>%
  add_trace(
    y = ~zi,
    name = "<b><i>z<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = color, symbol = symbol),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>z<sub>i</sub><b><i> = %{y:.4f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(x = 100, y = 0.5),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Fracción de unidades disconformes estandarizada (z<sub>i</sub>)</i></b><br>",
      zeroline = F
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.25: Diagrama \(p\) estandarizado con plotly
Advertencia

Hay que tener cuidado cuando se trabaja con el diagrama \(p\) con tamaño de muestra promedio. Fíjese que el punto muestral 11 aparece bajo control en este diagrama (ver Figura 3.19), cuando en realidad está fuera de control, tal cual como se muestra en el diagrama \(p\) con tamaño de muestra variable (ver Figura 3.15) y el diagrama \(p\) estandarizado (ver Figura 3.23)

3.3 Recomendaciones para el Uso de los Diagramas \(np\) y \(p\)

Como ya se mencionó antes, los diagramas \(np\) y \(p\) tiene el mismo fin, monitorear la proporción de artículos disconforme que produce un proceso de producción \(p\). Por lo que muchos autores recomiendan utilizarlos de la siguiente manera: 1. Para tamaño de muestra variables se recomienda utilizar el diagrama \(p\). 2. Para tamaño de muestra menores que 50 (\(n<50\)) usar el diagrama \(np\). 3. Para tamaño de muestra mayores o iguales que 50 (\(n≥50\)) usar el diagrama \(p\).

3.4 Diagrama \(c\)

Un artículo disconforme es un producto que tiene uno o más defectos, sin embargo, hay artículos que pueden tener uno o más defectos y de todos modos no son clasificados como disconformes; entre estos podemos tener los siguientes ejemplos: 1. Una computadora personal puede tener uno o más defectos menores en el acabado de la caja, y debido que no afecta seriamente su funcionamiento puede clasificarse como conforme. 2. El número de remaches rotos en las partes internas de un avión, no afecta su funcionamiento.

Artículos con demasiados defectos de acabados afectaría la apariencia del mismo y por consiguiente su venta y por este motivo debería ser declarado como disconforme. Para evitar la gran cantidad de defectos en los artículos las empresas deben implementar diagramas de control de defectos. En estas cartas de control por lo general se supone que la distribución de Poisson es un modelo apropiado de la ocurrencia de disconformidades en muestra de tamaño constante. En esencia esto requiere que el número de oportunidades o lugares potenciales para las disconformidades sea infinitamente grande y que la probabilidad de ocurrencia de una disconformidad en particular en cualquier lugar sea pequeña y constante. Además, la unidad de inspección debe ser la misma para cada muestra. Es decir cada unidad de inspección debe representar un “área de oportunidad” idéntica para la ocurrencia de disconformidades. Además podrá contarse varios tipos diferentes de disconformidades en una unidad, en tanto se satisfagan las condiciones anteriores para cada clase de disconformidad. En la mayoría de las situaciones prácticas, estas condiciones no se satisfarán exactamente. El número de oportunidades para la ocurrencia de disconformidades quizás no sea infinita, o la probabilidad de ocurrencia de disconformidades quizás no sea constante. En tanto estas desviaciones de los supuestos no sean graves, el modelo de Poisson por lo general funcionará razonablemente bien.

Supóngase que se tiene un proceso de producción en el cual se seleccionan \(m\) unidades de inspección, si se define la variable aleatoria \(C_i\) como el número de defectos en una muestra cualquiera \(i\); para \(i = 1,2, \dots, m\); suponiendo que las condiciones anteriores son satisfechas, se puede concluir que \(C_i\) tiene una distribución de Poisson con una tasa de ocurrencia de disconformidades por unidad de inspección \(c\). En consecuencia, la media y la desviación estándar de \(C_i\) es

Media y desviación estándar de \(C_i\)

\[ \begin{align*} \mu_{_{C_i}} &= E \left(C_i \right)=c\\ \sigma_{_{C_i}} &=\sqrt {V\left(C_i \right)}=\sqrt {c} \end{align*} \:. \tag{3.22}\]

Los límites de control de este diagrama se determinan dependiendo de si se conoce el parámetro \(c\). Si este parámetro es conocido el diagrama se llama diagrama de control \(c\) estándar y los límites de control obtenido se llaman límites de control estándar, mientras que si es desconocido el diagrama se conoce como diagrama de control \(c\) inicial, y los límites que se obtienen se llaman límites de control inicial.

3.4.1 Diagrama \(c\) Estándar

Visto que la media y la desviación estándar de \(C_i\) están dadas en la ecuación 3.22 (bajo los supuestos para \(C_i\) dados en la Sección 3.4), aplicando el modelo de Shewhart con límite 3 sigmas, la línea central y los límites de control del diagrama \(c\) estándar vienen dados por:

Límites de control estándar del diagrama \(c\)

\[ \begin{align*} LCS & = \mu_{_{C_i}} + 3\sigma_{_{C_i}} = c + 3\sqrt {c}\\ LC& = \mu_{_{C_i}}= c\\ LCI & = \mu_{_{C_i}} - 3\sigma_{_{C_i}} = c - 3\sqrt {c} \end{align*} \tag{3.23}\]

Dado que \(C_i\) es el número de defectos por unidad de inspección, \(C_{i}\ge 0\). Por lo que el \(LCI\) debe ser mayor o igual que cero \(\left(LIC \ge 0\right)\). Es decir, \(c - 3\sqrt {c} \ge 0\). Lo cual es cierto si \(c \ge 9\). Por tal motivo, si \(c < 9\) entonces \(LCI < 0\), cuando esto ocurre se toma \(LCI = 0\).

3.4.2 Diagrama \(c\) inicial

En la práctica generalmente se desconoce la tasa de ocurrencia de defectos por unidad de inspección \(c\), por lo que hay que estimarla con datos observados (muestras). El procedimiento para estimar \(c\) se conoce como fase I o fase inicial y los diagramas obtenidos en esta fase se llaman diagramas de control inicial. El procedimiento se describe a continuación. Se toman \(m\) unidades de inspección cuando se considera que el proceso está bajo control. En general, estas estimaciones deberían basarse en al menos 20 o 25 muestras (\(m \geq 20\)). Sea \(c_i\) el número de defectos observados en la unidad de inspección \(i\), con \(i=1,2, \dots,m\). Entonces \(c\) se estima con el promedio de los \(c_i\), es decir

Estimación de \(c\)

\[ \begin{equation} \hat{c} = \bar{c} = \frac{\sum_{i=1}^{m} c_i}{m} \end{equation} \tag{3.24}\]

Sustituyendo esta estimación de \(c\) en la ecuación ecuación 3.23 se obtienen los límites de control y la línea central del diagrama \(c\) inicial como sigue.

Límites de control inicial del diagrama \(c\)

\[ \begin{align*} LCS & = \bar{c} + 3\sqrt {\bar{c}}\\ LC& = \bar{c}\\ LCI & = \bar{c} - 3\sqrt {\bar{c}} \end{align*} \tag{3.25}\]

3.4.2.1 Pasos para la Aplicación de los Diagramas \(c\) en la Fase I

  1. Seleccionar \(m\) unidades de inspección del proceso, por lo general \(m\) mayor o igual a 20.

  2. Contar el número de defectos en cada unidad de inspección \(c_i\). Esto se resume en la siguiente Tabla 3.6.

Tabla 3.6: Resumen de las \(m\) muestras preliminares en el diagrama \(c\)
Muestra \(C_i\)
1 \(c_1\)
2 \(c_2\)
\(\vdots\) \(\vdots\)
\(i\) \(c_i\)
\(\vdots\) \(\vdots\)
\(m-1\) \(c_{m-1}\)
\(m\) \(c_m\)
  1. Estimar \(c\) con la ecuación 3.24.

  2. Con la estimación de \(c\) obtenida en el paso anterior calcular los límites de control y la línea central del diagrama por medio de la ecuación ecuación 3.25. Estos límites son considerados de prueba o preliminares. Cuando \(LCI < 0\), entonces el \(LCI\) se toma como cero.

  3. Realizar la gráfica de los límites de control con el número de defectos encontrados en cada unidad de inspección \(c_i\), y analizar la representación resultante, de acuerdo a los siguientes criterios:

    1. Si todos los puntos muestrales \(c_i\) caen dentro de los límites de control y no manifiestan un comportamiento sistemático. Entonces podemos concluir que el proceso está bajo control, y podemos utilizar \(\bar{c}\) para controlar la producción actual y futura.
    2. Si uno o más puntos están fuera de control se busca su causa atribuible, si las hay se eliminan estos puntos y se repite el procedimiento desde el paso 3 con los puntos restantes. Este procedimiento continúa hasta que el diagrama no muestre estado fuera de control. En algunos casos es imposible determinar una causa especial para un punto que cae fuera de control, en este caso hay dos tipos de acción que se pueden tomar: la primera es eliminar el punto como si se hubiere encontrado la causa especial (no existe justificación analítica para tomarse esta acción), la segunda es conservar estos puntos y calcular los límites con estos.

Unidad de inspección: una unidad de inspección puede ser un grupo de artículos, metros cuadrados de tela o papel, entre otros. Por ejemplo: cuando se está controlando el número de defectos en computadoras, la unidad de inspección podría ser 10, 20 o más computadoras, si se está analizando defectos en rollos de telas, la unidad de inspección puede ser 100 metros cuadrados de tela.

Ejemplo 3.5 (Aplicación del Diagrama \(c\))
La tabla Tabla 3.7 corresponde al número total de defectos encontrados en 21 muestras de toma corrientes; cada unidad de inspección consta de 3.000 toma corrientes. Utilizar estos datos para estimar los límites que permitan controlar los toma corrientes en el futuro. Suponga que puntos fuera de los límites tienen su causa atribuible.

Código
```{r}
#| label: tbl-datos-ejemplo-dcc
#| tbl-cap: "Número total de defectos en cada unidad de inspección"
#| tbl-align: left

datos_c <- tibble(
  muestra = c(
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L,
    18L, 19L, 20L, 21L
  ),
  Ci = c(
    34L, 56L, 50L, 86L, 44L, 23L, 35L, 64L, 80L, 54L, 70L, 60L, 65L, 65L, 53L,
    58L, 33L, 91L, 90L, 36L, 57L
  )
)

reactable::reactable(
  datos_c,
  columns = list(
    muestra = colDef(header = "Muestra", align = "right"),
    Ci = colDef(
      header = "Número de defectuos", align = "right"
    )
  ),
  defaultColDef = colDef(
    # footer = function(values, name) {
    #   htmltools::div(name, style = list(fontWeight = 600))
    # },
    minWidth = 100,
    # maxWidth = 200
  ),
  fullWidth = TRUE,
  # width = "100%",
  # style = list(width = "100%"),
  resizable = TRUE, 
  wrap = FALSE, 
  bordered = TRUE,
  defaultPageSize = 10,
  striped = TRUE,
  highlight = TRUE,
  filterable = TRUE
)
```
Tabla 3.7: Número total de defectos en cada unidad de inspección

Los parámetros del Diagrama \(c\) se calculan en el siguiente bloque de código, usando la ecuación 3.25.

Código
```{r}
#| label: lci-dcc
m <- nrow(datos_c)
c_est <- mean(datos_c$Ci)
lic <- max(0, c_est - 3 * sqrt(c_est))
lc <- c_est
lsc <- c_est + 3 * sqrt(c_est)
paste0("LCI = ", formato(lic), "    LC = ", formato(lc), "    LCS = ", formato(lsc))
```
#> [1] "LCI = 34,6177    LC = 57,3333    LCS = 80,049"

Dado que los pasos 1 y 2 descritos en la sección 3.4.2.1 están cubiertos en este ejemplo, se continúa con el paso 3. Es decir, se procede a estimar \(c\) con la ecuación 3.24

\[ \bar{c}=\frac{ 34 + 56 + \cdots + 36 + 57}{21} = \frac{1.204}{21} = 57,3333. \]

De la ecuación 3.25, el límite superior de control, la línea central y el límite inferior de control del diagrama \(c\), como se describe en el paso 4 de la sección 3.4.2.1, son:

\[ \begin{align*} LCS & = 57,3333 + 3 \sqrt {57,3333} = 80,049 \\ LC & = 57,3333 \\ LCI & = 57,3333 - 3 \sqrt {57,3333} = 34,6177 \end{align*}. \]

La gráfica del diagrama \(c\) inicial para los datos de la tabla Tabla 3.2, como se indica en el paso 5 de la sección 3.4.2.1, se muestra en la Figura 3.26. Esta gráfica se realizó con el paquete ggplot2.

Código
```{r}
#| label: fig-ejemplo-dcc-ggplot
#| fig-cap: "Diagrama $c$ para el número de defectos"

# library(ggQC)
datos_c$fc <- ifelse(datos_c$Ci < lic | datos_c$Ci > lsc, "Si", "No")
ggplot(data = datos_c, aes(x = muestra, y = Ci), show.legend = FALSE) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(
      x = muestra, y = Ci, color = factor(fc), 
      shape = factor(fc)
    ),
    size = 2
  ) +
  scale_color_manual(
    values = c("No" = "black", "Si" = "red")
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    mapping = aes(x = muestra, y = Ci), color = "black"
  ) +
  geom_ribbon(
    aes(ymin = lic, ymax = lc), fill = "green", alpha = 0.2
  ) +
  geom_ribbon(
    aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  labs(
    x = "Muestra",
    y = latex2exp::TeX("Numero de defectos ($C_i$)"),
    shape = "Fuera de control", color = "Fuera de control"
  ) +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  ) 
```
Figura 3.26: Diagrama \(c\) para el número de defectos

La Figura 3.27 muestra la gráfica del diagrama \(c\) hecha con el paquete qcc.

Código
```{r}
#| label: fig-ejemplo-dcc-qcc
#| fig-cap: "Diagrama $c$ para el número de defectos"

obj <- with(
  data = datos_c, qcc(Ci, type = "c", plot = FALSE)
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Número de defectos"
)
```
Figura 3.27: Diagrama \(c\) para el número de defectos
Código
```{r}
#| label: fig-ejemplo-dcc-highcharter
#| fig-cap: "Diagrama $c$ para el número dedefectos"


# library(highcharter)
color <- ifelse(datos_c$fc == "Si", "#FF0000", "#0000FF")
symbol <- ifelse(datos_c$fc == "Si", "asterisk-open", "circle")
highchart() |>
  
  hc_add_series(
    data = datos_c, hcaes(x = muestra, low = lc, high = lsc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_c, hcaes(x = muestra, low = lic, high = lc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_c, type = "line", 
    hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 4)
  ) |>
  hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_c, type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list( valueDecimals = 0)
  ) |>
  hc_add_series(
    datos_c,
    type = "line", color = "black",
    hcaes(
      x = muestra, y = Ci, color = color, symbol = symbol
    ),
    marker = list(
      radius = 3
    ),
    useHTML = TRUE, name = "<b><i>C<sub>i</sub></i></b>",
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Número de defectos (C<sub>i</sub>)</i></b><br>"
    ),
    min = 20,
    maxPadding = 5,
    max = 95
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions( series = list(animation = FALSE) )
```
Figura 3.28: Diagrama \(c\) para el número dedefectos
Código
```{r}
#| label: fig-ejemplo-dcc-plotly
#| fig-cap: "Diagrama $c$ para el número de defectos"

# library(plotly)
datos_c %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", 
    fillcolor = 'green', alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", 
    fillcolor = 'blue', alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    y = ~Ci,
    name = "<b><i>D<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = color, symbol = symbol),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>C<sub>i</sub><b><i> = %{y:.0f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Número de defectos (C<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |>
  fillOpacity(alpha = 0.3)
```
Figura 3.29: Diagrama \(c\) para el número de defectos

En la figura Figura 3.26 se observa que los subgrupos 1, 4, 6, 17, 18, 19 están fuera de los límites de control, y dado que tienen su causa atribuible se eliminan y se vuelve a estimar \(c\) con la ecuación 3.24, usando los puntos muestrales restantes, como sigue:

\[ \bar{c}=\frac{ 56 + 50 + \cdots + 36 + 57}{15} = \frac{847}{15} = 57,3333. \]

Los límites de control corregidos del diagrama \(c\) se calculan en el siguiente bloque de código, usando la ecuación 3.25, excluyendo los subgrupos muestrales fuera de control.

Código
```{r}
#| label: lcic-dcc

c_est <- mean(datos_c$Ci[-pfc])
lic <- max(0, c_est - 3 * sqrt(c_est))
lc <- c_est
lsc <- c_est + 3 * sqrt(c_est)
paste0("LCS = ", formato(lsc), "    LC = ", formato(lc), "    LCI = ", formato(lic))
```
#> [1] "LCS = 79,01    LC = 56,4667    LCI = 33,9234"

El cálculo manual de estos límites de control corregidos, como se describe en el paso 4 de la sección 3.4.2.1, se muestra a continuación:

\[ \begin{align*} LCS & = 56,4667 + 3 \sqrt {56,4667} = 79,01 \\ LC & = 56,4667 \\ LCI & = 56,4667 - 3 \sqrt {56,4667} = 33,9234 \end{align*}. \]

La gráfica del diagrama \(c\) corregido realizada con el paquete ggplot2 se muestra en la Figura 3.26.

Código
```{r}
#| label: fig-ejemplo-dccc-ggplot
#| fig-cap: "Diagrama $c$ corregido para el número de defectos"

datos_c <- datos_c |> 
  dplyr::mutate(
    violation = ifelse(
      (Ci < lic & fc == "No") | (Ci > lsc & fc == "No"),
      "Si", "No"
    )
  )
ggplot(data = datos_c, aes(x = muestra, y = Ci), show.legend = FALSE) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    data = dplyr::filter(datos_c, fc == "No"),
    mapping = aes(
      x = muestra, y = Ci, color = factor(violation), 
      shape = factor(violation)
    ),
    size = 2
  ) +
  scale_color_manual(
    values = c(
      "No" = "blue", "Si" = "red", show.legend = FALSE
    )
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    data = dplyr::filter(datos_c, fc == "No"),
    mapping = aes(x = muestra, y = Ci), color = "black"
  ) +
  geom_point(
    data = dplyr::filter(datos_c, fc == "Si"),
    mapping = aes(x = muestra, y = Ci), color = "red",
    shape = 4, size = 2
  ) +
  geom_ribbon(
    aes(ymin = lic, ymax = lc), fill = "green", alpha = 0.2
  ) +
  geom_ribbon(
    aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  labs(
    x = "Muestra",
    y = latex2exp::TeX("Número de defectos $\\left(C_i \\right)$"),
    shape = "Violación", color = "Violación"
  ) +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  )
```
Figura 3.30: Diagrama \(c\) corregido para el número de defectos

El siguiente bloque de código muestra el diagrama \(c\) corregido con el paquete qcc.

Código
```{r}
#| label: fig-ejemplo-dccc-qcc
#| fig-cap: "Diagrama $c$ corregido para el número de defectos"

obj <- with(
  data = dplyr::slice(datos_c, -pfc), 
  qcc(Ci, type = "c", plot = FALSE)
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Número de defectos"
)
```
Figura 3.31: Diagrama \(c\) corregido para el número de defectos
Código
```{r}
#| label: fig-ejemplo-dccc-highcharter
#| fig-cap: "Diagrama $c$ corregido para el número dedefectos"

# library(highcharter)
color <- ifelse(
  abs(datos_c$Ci - lc) <= 3 * sqrt(c_est) & datos_c$fc == "No", 
  "#0000FF", "#FF0000" 
)
symbol <- ifelse(
  abs(datos_c$Ci - lc) <= 3 * sqrt(c_est) & datos_c$fc == "No", 
  "triangle", "triangle-down"
)
highchart() |>
  hc_add_series(
    data = datos_c, hcaes(x = muestra, low = lc, high = lsc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
   hc_add_series(
    data = datos_c, 
    hcaes(x = muestra, low = lic, high = lc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
   hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
   hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list( valueDecimals = 2)
  ) |>
  hc_add_series(
    data = datos_c |> dplyr::filter(fc == "No"),
    type = "line", dashStyle = "Dash", lineWidth = 2, color = "black",
    hcaes(
      x = muestra, y = Ci, color = color[datos_c$fc == "No"],
      symbol = symbol[datos_c$fc == "No"]
    ),
    marker = list(
      radius = 3, color = color[datos_c$fc == "No"],
      symbol = symbol[datos_c$fc == "No"]
    ),
    useHTML = TRUE, name = "<b><i>C<sub>i</sub></i></b>",
  ) |>
   hc_add_series(
    data = datos_c |> dplyr::filter(fc == "Si"),
    type = "scatter",
    hcaes(
      x = muestra, y = Ci
    ),
    marker = list(
      radius = 3, symbol = "triangle-down", fillColor = "red"
    ),
    useHTML = TRUE, name = "<b><i>Punto eliminado</i></b>",
    tooltip = list(
      pointFormat = "<b><i>n<sub>i:</sub></i></b> {point.x}<br><b><i>C<sub>i:</sub></i></b> {point.y}"
    ), 
    
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Número de defectos (C<sub>i</sub>)</i></b><br>"
    ),
    min = 20,
    maxPadding = 5,
    max = 95,
    minRange = 5
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions( series = list(animation = FALSE) )
```
Figura 3.32: Diagrama \(c\) corregido para el número dedefectos
Código
```{r}
#| label: fig-ejemplo-dccc-plotly
#| fig-cap: "Diagrama $c$ corregido para el número de defectos"

# library(plotly)
datos_c %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", 
    fillcolor = 'green', alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", 
    fillcolor = 'blue', alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    data = datos_c |> dplyr::filter(fc == "No"),
    y = ~Ci,
    name = "<b><i>C<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(
      color = color[datos_c$fc == "No"], symbol = symbol[datos_c$fc == "No"]
    ),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>C<sub>i</sub><b><i> = %{y:.0f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  add_trace(
    data = datos_c |> dplyr::filter(fc == "Si"),
    y = ~Ci,
    name = "<b><i>Punto eliminado<b><i>", type = "scatter",
    mode =  "markers",
    showlegend = TRUE,
    marker = list(
      color = color[datos_c$fc == "Si"], symbol = symbol[datos_c$fc == "Si"]
    ),
    hovertemplate = paste(
      "<b><i>Punto eliminado<b><i>", "<br>",
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>C<sub>i</sub><b><i> = %{y:.0f}<br><extra></extra>"
    )
  ) %>%
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Número de defectos (C<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.33: Diagrama \(c\) corregido para el número de defectos

Note que en la Figura 3.30 el subgrupo muestral 9 se encuentra fuera de control, por lo que se procede a eliminar del análisis dado que este tiene su causa atribuible. Luego se procede a corregir, nuevamente, los límites de control, previo a la estimación de \(c\) con \(\bar{c}\) corregido.

El cálculo de \(\bar{c}\) se muestra a continuación,

\[ \bar{c}=\frac{ 56 + 50 + \cdots + 36 + 57}{14} = \frac{767}{14} = 54,7857. \]

Los límites de control corregidos del diagrama \(c\) se calculan en el siguiente bloque de código, usando la ecuación 3.25, excluyendo los subgrupos muestrales fuera de control.

Código
```{r}
#| label: lcic2-dcc

c_est <- mean(datos_c$Ci[-pfc])
lic <- max(0, c_est - 3 * sqrt(c_est))
lc <- c_est
lsc <- c_est + 3 * sqrt(c_est)
paste0("LCI = ", formato(lic), "    LC = ", formato(lc), "    LCS = ", formato(lsc))
```
#> [1] "LCI = 32,5805    LC = 54,7857    LCS = 76,9909"

El cálculo manual de estos límites de control corregidos, como se describe en el paso 4 de la sección 3.4.2.1, se muestra a continuación:

\[ \begin{align*} LCS & = 54,7857 + 3 \sqrt {54,7857} = 76,9909 \\ LC & = 54,7857 \\ LCI & = 54,7857 - 3 \sqrt {54,7857} = 32,5805 \end{align*}. \]

La gráfica del diagrama \(c\) con la segunda corrección se muestra en la Figura 3.34. Esta gráfica se generó con el paquete ggplot2

Código
```{r}
#| label: fig-ejemplo-dccc2-ggplot
#| fig-cap: "Diagrama $c$ corregido para el número de defectos"

datos_c <- datos_c |> 
  dplyr::mutate(
    violation = ifelse(
      (Ci < lic & fc == "No") | (Ci > lsc & fc == "No"),
      "Si", "No"
    )
  )
ggplot(data = datos_c, aes(x = muestra, y = Ci), show.legend = FALSE) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    data = dplyr::filter(datos_c, fc == "No"),
    mapping = aes(
      x = muestra, y = Ci, color = factor(violation), 
      shape = factor(violation)
    ),
    size = 2
  ) +
  scale_color_manual(
    values = c(
      "No" = "blue", "Si" = "red", show.legend = FALSE
    )
  ) +
  scale_shape_manual(values = c(16, 8)) + 
  geom_line(
    data = dplyr::filter(datos_c, fc == "No"),
    mapping = aes(x = muestra, y = Ci), color = "black"
  ) +
  geom_point(
    data = dplyr::filter(datos_c, fc == "Si"),
    mapping = aes(x = muestra, y = Ci), color = "red",
    shape = 4, size = 2
  ) +
  geom_ribbon(
    aes(ymin = lic, ymax = lc), fill = "green", alpha = 0.2
  ) +
  geom_ribbon(
    aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  annotate(
    "text",
    x = nrow(datos_c) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  labs(
    x = "Muestra",
    y = TeX("Numero de defectos ($\\hat{C}_i$)"),
    shape = "Violación", color = "Violación"
  ) +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(face = "bold"),
    legend.title = element_text(face = "bold"),
    legend.title.position = "top"
  )
```
Figura 3.34: Diagrama \(c\) corregido para el número de defectos

El siguiente bloque de código muestra el diagrama \(c\) con la segunda corrección con el paquete qcc.

Código
```{r}
#| label: fig-ejemplo-dccc2-qcc
#| fig-cap: "Diagrama $c$ corregido para el número de defectos"

obj <- with(
  data = dplyr::slice(datos_c, -pfc), 
  qcc(Ci, type = "c", plot = FALSE)
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Número de defectos"
)
```
Figura 3.35: Diagrama \(c\) corregido para el número de defectos
Código
```{r}
#| label: fig-ejemplo-dccc2-highcharter
#| fig-cap: "Diagrama $c$ corregido para el número dedefectos"

# library(highcharter)
color <- ifelse(
  abs(datos_c$Ci - lc) <= 3 * sqrt(c_est) & datos_c$fc == "No", "blue", "red"
)
symbol <- ifelse(
  abs(datos_c$Ci - lc) <= 3 * sqrt(c_est) & datos_c$fc == "No", "triangle-up", "triangle-down"
)
highchart() |>
  hc_add_series(
    data = datos_c, hcaes(x = muestra, low = lc, high = lsc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
   hc_add_series(
    data = datos_c, 
    hcaes(x = muestra, low = lic, high = lc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 4)
  ) |>
   hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
   hc_add_series(
    datos_c,
    type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list( valueDecimals = 0)
  ) |>
  hc_add_series(
    data = datos_c |> dplyr::filter(fc == "No"),
    type = "line", dashStyle = "Dash", lineWidth = 2, color = "black",
    hcaes(
      x = muestra, y = Ci, color = color[datos_c$fc == "No"],
      symbol = symbol[datos_c$fc == "No"]
    ),
    marker = list(
      radius = 3, symbol = "triangle-up"
    ),
    useHTML = TRUE, name = "<b><i>C<sub>i</sub></i></b>",
  ) |>
   hc_add_series(
    data = datos_c |> dplyr::filter(fc == "Si"),
    type = "scatter",
    hcaes(
      x = muestra, y = Ci
    ),
    marker = list(
      radius = 3, symbol = "triangle-down", fillColor = "red"
    ),
    useHTML = TRUE, name = "<b><i>Punto eliminado</i></b>",
    tooltip = list(
      pointFormat = "<b><i>n<sub>i:</sub></i></b> {point.x}<br><b><i>C<sub>i:</sub></i></b> {point.y}"
    ), 
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Número de defectos (C<sub>i</sub>)</i></b><br>"
    ),
    min = 20,
    max = 95
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions( series = list(animation = FALSE) )
  
```
Figura 3.36: Diagrama \(c\) corregido para el número dedefectos
Código
```{r}
#| label: fig-ejemplo-dccc2-plotly
#| fig-cap: "Diagrama $c$ corregido para el número de defectos"

# library(plotly)
datos_c %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", 
    fillcolor = 'green', alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", 
    fillcolor = 'blue', alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    data = datos_c |> dplyr::filter(fc == "No"),
    y = ~Ci,
    name = "<b><i>C<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(
      color = color[datos_c$fc == "No"], symbol = symbol[datos_c$fc == "No"]
    ),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>C<sub>i</sub><b><i> = %{y:.0f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  add_trace(
    data = datos_c |> dplyr::filter(fc == "Si"),
    y = ~Ci,
    name = "<b><i>C<sub>i</sub><b><i>", type = "scatter",
    mode =  "markers",
    showlegend = FALSE,
    marker = list(
      color = color[datos_c$fc == "Si"], symbol = symbol[datos_c$fc == "Si"]
    ),
    hovertemplate = paste(
      "<b><i>Punto eliminado<b><i>", "<br>",
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>C<sub>i</sub><b><i> = %{y:.0f}<br><extra></extra>"
    )
  ) %>%
  layout(
    legend = list(x = 100, y = 0.5),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Número de defectos (D<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.37: Diagrama \(c\) corregido para el número de defectos

3.5 Diagrama \(u\)

El diagrama \(u\) se utiliza cuando la muestra está compuesta por más de una unidad de inspección (\(n > 1\)). Por ejemplo, cuando se está controlando el número de defectos en computadoras, la unidad de inspección podría ser 10, 20 o más computadoras. En este diagrama el parámetro que se monitorea es la tasa de defectos por unidad de inspección \(u\) y el estadístico usado para estimar este parámetro es la fracción de defectos por unidad de inspección en una muestra de \(n\) unidades de inspección, es decir:

\[ U=\frac{C}{n}. \]

Donde \(C\) es el “total de defecto en la muestra o en las \(n\) unidades de inspección”. El tamaño de la muestra \(n\) no necesariamente tiene que ser entero. Por ejemplo, si la muestra es un rollo de tela de 550 metros cuadrados y la unidad de inspección son 100 metros cuadrados, entonces:

\[ n=\frac{550}{100}=5,5. \]

Supóngase que se toman \(m\) muestras en un proceso de producción y que cada muestra está conformada por \(n\) unidades de inspección. Entonces, la fracción o tasa de defectos por unidad de inspección en la muestra \(i\) viene dada por:

Fracción de defectos por unidad de inspección muestral

\[ U_i=\frac{C_i}{n},\,i = 1, \, 2,\, \dots , m . \tag{3.26}\]

Donde \(C_i\): “es el número de defectos en las \(n\) unidades de inspección en la muestra \(i\)”. Suponiendo que el proceso funciona de manera estable, tal que la tasa de defectos por cada muestra se mantiene constante e igual a \(c\), como consecuencia de los supuestos descritos para el diagrama \(c\) en la Sección 3.4 se estableció que los \(C_i\) siguen una distribución de Poisson, es decir, \(C_i\sim P( \lambda = c)\) cuya media y desviación estándar están dadas en la ecuación 3.22.

De donde se obtiene que la media de \(U_i\) es:

\[ \mu_{_{U_i}} = E \left(\frac{C_i}{n} \right)=\frac{1}{n} E \left(C_i \right) = \frac{c}{n} = u. \]

En la ecuación anterior, y en lo sucesivo, se ha reemplazado \(u\) por el cociente de la tasa de defectos en la muestra y el tamaño de la muestra \(\left(u =\, ^c/_n \right)\). Es decir, \(u\) representa la tasa de defectos por unidad de inspección, dado que cada muestra está conformada por \(n\) unidades de inspección.

Por otro lado, la desviación estándar de \(U_i\) se obtiene de la siguiente manera:

\[ \sigma_{_{U_i}} = \sqrt {V \left(\frac{C_i}{n} \right)}=\sqrt {\frac{1}{n^2} V \left(C_i \right) } = \sqrt {\frac{c}{n^2}} = \sqrt {\frac{u}{n}}. \]

En resumen, la media y la desviación estándar de \(U_i\) se presentan en la siguiente ecuación,

Media y desviación estándar de \(U_i\)

\[ \begin{align*} \mu_{_{U_i}} & = u\\ \sigma_{_{U_i}} & = \sqrt {\frac{u}{n}} \end{align*} \:. \tag{3.27}\]

3.5.1 Diagrama \(u\) Estándar

Aplicando el modelo general de Shewhart con límite 3 sigmas, los límites de control y la línea central de este diagrama, dado que la media y la desviación estándar de \(U_i\) están dadas en la ecuación 3.27, vienen dados por:

Límtes de control estándar del diagrama \(u\)

\[ \begin{align*} LCS & = \mu_{_{U_i}} + 3\sigma_{_{U_i}} = u + 3\sqrt {\frac{u}{n}}\\ LC & = \mu_{_{U_i}} = u\\ LCI &= \mu_{_{U_i}} - 3\sigma_{_{U_i}} = u - 3\sqrt {\frac{u}{n}} \end{align*} \:. \tag{3.28}\]

3.5.2 Diagrama \(u\) Inicial

En la práctica generalmente se desconoce la tasa de defectos por unidad de inspección \(u\), por lo que hay que estimarla con los datos observados (muestras) del proceso bajo control.

El procedimiento para estimar \(u\) se conoce como fase I o fase inicial y los diagramas obtenidos en esta fase se llaman diagramas de control inicial. El procedimiento consiste en tomar \(m\) muestras o subgrupos preliminares de tamaño \(n\) cuando se considera que el proceso está bajo control. En general, estas estimaciones deberían basarse en al menos 20 o 25 muestras (\(m \geq 20\)). Sea \(c_i\) el número de defectos encontrados en la muestra \(i\), con \(i=1, 2, \dots, m\); y \(u_i\) la fracción de defectos por unidad de inspección en esta muestra \(i\). Es decir:

\[ u_i = \frac{c_i}{n} \]

Entonces se usa como estimación de \(u\) el promedio de las \(m\) fracciones de defectos por unidad de inspección muestrales, es decir:

Tasa de defectos por unidad de inspección estimada \(\hat{u}\)

\[ \hat{u} = \bar{u} = \frac{\sum_{i = 1}^{m}u_i}{m} = \frac{\sum_{i = 1}^{m}\frac{c_i}{n}}{m} = \frac{\sum_{i = 1}^{m}c_i}{nm},\,i = 1, \, 2,\, \dots , m . \tag{3.29}\]

Luego, sustituyendo \(u_i\) en la ecuación anterior se obtiene una ecuación alternativa para estima \(u\). La cual se muestra a continuación,

Tasa de defectos por unidad de inspección estimada \(\hat{u}\) en base a los \(c_i\)

\[ \hat{u} = \bar{u} = \frac{\sum_{i = 1}^{m}c_i}{nm},\,i = 1, \, 2,\, \dots , m . \tag{3.30}\]

Ahora, sustituyendo esta estimación de \(u\) en la ecuación 3.28 se obtienen los límites de control y la línea central del diagrama \(u\) inicial, como sigue

Límtes de control inicial del diagrama \(u\)

\[ \begin{align*} LCS & = \bar{u} + 3\sqrt {\frac{\bar{u}}{n}}\\ LC & = \bar{u} \\ LCI & = \bar{u} - 3\sqrt {\frac{\bar{u}}{n}} \end{align*} \:. \tag{3.31}\]

3.5.3 Pasos para la Aplicación de los Diagramas \(u\) en la Fase I

  1. Seleccionar \(m\) muestras preliminares de tamaño \(n\) del proceso de producción, \(m\) por lo general mayor igual a 20.

  2. Contar el número de defectos en cada muestra \(c_i\).

  3. Determinar la fracción de defectos por unidad de inspección para cada muestra \(u_i\), a través de la ecuación 3.29. Los pasos 1), 2) y 3) se puede resumir en la siguiente tabla:

Tabla 3.8: Resumen de las \(m\) muestras preliminares en el diagrama \(u\)
Muestra \(C_i\) \(U_{i}\)
1 \(c_1\) \(u_{1}\)
2 \(c_2\) \(u_{2}\)
\(\vdots\) \(\vdots\) \(\vdots\)
\(i\) \(c_i\) \(u_{i}\)
\(\vdots\) \(\vdots\) \(\vdots\)
\(m-1\) \(c_{m-1}\) \(u_{m-1}\)
\(m\) \(c_m\) \(u_{m}\)
  1. Calcular la media de las fracciones de defectos por unidad de inspección muestrales \(\bar{u}\), usando la ecuación 3.29.

  2. Estimar \(u\) con \(\bar{u}\) y obtener los límites de control y la línea central del diagrama, usando la ecuación 3.31.

  3. Realizar la gráfica de los límites de control con el número de defectos por unidad de inspección (\(u_i\)) y analizar la representación resultante de acuerdo a los siguientes criterios:

    1. Si todos los puntos muestrales \(u_i\) caen dentro de los límites de control y no manifiestan un comportamiento sistemático. Entonces, podemos concluir que el proceso está bajo control, y podemos utilizar esta estimación de \(u\) (\(\bar{u}\)) para controlar la producción actual y futura.
    2. Si uno o más puntos están fuera de control se busca su causa atribuible, si las hay se eliminan estos puntos y se repite el procedimiento desde el paso 4 con los puntos restantes. Este procedimiento continúa hasta que el diagrama no muestre estado fuera de control. En algunos casos es imposible determinar una causa especial para un punto que cae fuera de control, en este caso hay dos tipos de acción que se pueden tomar: la primera es eliminar el punto como si se hubiere encontrado la causa especial (no existe justificación analítica para tomarse esta acción), la segunda es conservar estos puntos y calcular los límites con estos.

Ejemplo 3.6 (Aplicación del Diagrama \(u\))
Un fabricante de computadoras personales desea establecer un diagrama de control de disconformidades por unidad de inspección en la línea de montaje final. Se seleccionan como tamaño muestral cinco computadoras y se tomaron 20 muestras, los datos obtenidos fueron los siguientes:

Código
```{r}
#| label: tbl-datos-ejemplo-dcu
#| tbl-cap: "Número promedio de disconformidades"
#| tbl-cap-align: left
#| tbl-align: left

datos_u <- tibble(
  muestra = c(
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L,
    17L, 18L, 19L, 20L
  ),
  Ui = c(
    2, 2.4, 1.6, 2.8, 2, 3.2, 2.2, 1.4, 2, 3, 1.8, 1, 1.4, 2.2, 1.2, 1.6, 2,
    1.4, 1, 2.4
  )
)

reactable::reactable(
  datos_u,
  columns = list(
    muestra = colDef(header = "Muestra", align = "right"),
    Ui = colDef(
      header = "Fracción de disconformidades", 
      align = "right"
    )
  ),
  defaultColDef = colDef(
    # footer = function(values, name) {
    #   htmltools::div(name, style = list(fontWeight = 600))
    # },
    minWidth = 100,
    # maxWidth = 200
  ),
  fullWidth = TRUE,
  # width = "100%",
  # style = list(width = "100%"),
  resizable = TRUE, 
  wrap = FALSE, 
  bordered = TRUE,
  defaultPageSize = 10,
  striped = TRUE,
  highlight = TRUE,
  filterable = TRUE
)
```
Tabla 3.9: Número promedio de disconformidades


Los parámetros del Diagrama \(u\) se calculan en el siguiente bloque de código, usando la ecuación 3.31.

Código
```{r}
#| label: lci-dcu
m <- nrow(datos_u)
n <- 5
u_est <- mean(datos_u$Ui)
lic <- max(0, u_est - 3 * sqrt(u_est / n))
lc <- u_est
lsc <- u_est + 3 * sqrt(u_est / n)
paste0("LCI = ", formato(lic), "    LC = ", formato(lc), "    LCS = ", formato(lsc))
```
#> [1] "LCI = 0,0661    LC = 1,93    LCS = 3,7939"

Dado que los pasos 1 y 2 descritos en la sección 3.5.3 están cubiertos en este ejemplo, se continúa con el paso 3. Es decir, se procede a estimar \(u\) con la ecuación 3.29

\[ \bar{u} = \frac{\sum_{i = 1}^{20} u_i}{20} = \frac{ 2 + 2,4 + \cdots + 1 + 2,4}{20} = \frac{38,6}{20} = 1,93. \]

De la ecuación 3.31, el límite superior de control, la línea central y el límite inferior de control del diagrama \(u\), como se describe en el paso 4 de la sección 3.5.3, son:

\[ \begin{align*} LCS & = 1,93 + 3 \sqrt {\frac{1,93}{5}} = 3,7939 \\ LC & = 1,93 \\ LCI & = 1,93 - 3 \sqrt {\frac{1,93}{5}} = 0,0661 \end{align*}. \]

La gráfica del diagrama \(u\) inicial para los datos de la Tabla 3.9, como se indica en el paso 5 de la sección 3.5.3, se muestra en la Figura 3.38. Esta gráfica se realizó con el paquete ggplot2. En esta se puede notar que el proceso está bajo control, dado que todos los puntos se encuentran bajo control y no se observan violaciones a las reglas de corridas. Por lo que, esta estimación de \(u\) (\(\bar{u} = 1,93\)) puede ser usada para controlar la producción futura.

Código
```{r}
#| label: fig-ejemplo-dcu-ggplot
#| fig-cap: "Diagrama $u$ para la fracción de disconformidades con el paquete `ggplot2`"

# library(ggQC)
ggplot(data = datos_u, aes(x = muestra, y = Ui), show.legend = FALSE) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lc),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = muestra, y = Ui),
    size = 2
  ) +
  geom_line(
    mapping = aes(x = muestra, y = Ui), color = "black"
  ) +
  geom_ribbon(aes(ymin = lic, ymax = lc), fill = "green", alpha = 0.2) +
  geom_ribbon(aes(ymin = lc, ymax = lsc), fill = "green", alpha = 0.2) +
  annotate(
    "text",
    x = nrow(datos_u) + 1, y = lic, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_u) + 1, y = lsc, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_u) + 1, y = lc, label = "LC",
    color = "blue"
  ) +
  labs(
    x = "Muestra",
    y = TeX("Fracción de disconformidades ($U_i$)")
  ) +
  theme_bw()
```
Figura 3.38: Diagrama \(u\) para la fracción de disconformidades con el paquete ggplot2

La Figura 3.39 muestra la gráfica del diagrama \(u\) realizada con el paquete qcc.

Código
```{r}
#| label: fig-ejemplo-dcu-qcc
#| fig-cap: "Diagrama $u$ para la fracción de diconformidades con el paquete `qcc`"

obj <- with(
  data = datos_u, qcc(Ui * 5, type = "u", sizes = 5, plot = FALSE)
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Fracción de disconformidades"
)
```
Figura 3.39: Diagrama \(u\) para la fracción de diconformidades con el paquete qcc
Código
```{r}
#| label: fig-ejemplo-dcu-highcharter
#| fig-cap: "Diagrama $u$ para la fracción de disconformidades con el paquete `highcharter`"

# library(highcharter)
highchart() |>
  hc_add_series(
    data = datos_u, hcaes(x = muestra, low = lc, high = lsc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_u, hcaes(x = muestra, low = lic, high = lc),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_u, type = "line", 
    hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_u,
    type = "line", hcaes(x = muestra, y = lc), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_u, type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list( valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_u,
    type = "line", color = "black",
    hcaes(
      x = muestra, y = Ui
    ),
    marker = list(
      radius = 3
    ),
    useHTML = TRUE, name = "<b><i>U<sub>i</sub></i></b>",
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Tasa de defectos (U<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions( series = list(animation = FALSE) )
```
Figura 3.40: Diagrama \(u\) para la fracción de disconformidades con el paquete highcharter
Código
```{r}
#| label: fig-ejemplo-dcu-plotly
#| fig-cap: "Diagrama $u$ para la fracción de disconformidades con el paquete `plotly`"

# library(plotly)
datos_u %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = lc, name = "<b><i>LC</i></b>", fill = "tonexty", 
    fillcolor = 'green', alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = lic, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = 'blue', 
    alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    y = ~Ui,
    name = "<b><i>D<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "#0000FF", symbol = "triangle-up"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>U<sub>i</sub><b><i> = %{y:.1f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Tasa de defectos (U<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.41: Diagrama \(u\) para la fracción de disconformidades con el paquete plotly

3.5.4 Diagrama \(u\) con Tamaño de Muestra variable

En el diagrama \(u\) con tamaño de muestra variable el estadístico que se grafica es es tasa de defectos en la muestra \(i\) de tamaño \(n_i\). Es decir,

Tasa de defectos por unidad de inspección muestral con tamaño de muestra variable

\[ \hat{U}_i=\frac{U_i}{n_i}, \: i = 1, 2, \dots, m. \tag{3.32}\]

Donde \(C_i\) es el número de defectos en la muestra de tamaño \(n_i\).

Nota

Observe que el estadístico definido en la ecuación 3.32 es una adaptación del estadístico definido en la ecuación 3.26 al caso de muestra variables.

Bajo el supuesto de que el proceso funcione de manera estable, tal que, la tasa de defectos por unidad de inspección \(u\) se mantiene constante para cada muestra de tamaño \(n_i\). Sea \(C_{ij}\) el número de defectos en la unidad de inspección \(j\) de la muestra \(i\), se define \(C_i\) como el número de de defectos en la muestra \(i\) (\(n_i\)). Dado que \(n_i\) podría ser un número decimal, es decir la muestra puede estar compuesta por un número entero de unidades de inspección y una fracción de una unidad de inspección. Es decir, \(n_i = \left\lfloor n_i \right\rfloor + f\), donde \(\left\lfloor n_i \right\rfloor\) es la parte entera de la muestra, por lo que \(f = n_i - \left\lfloor n_i \right\rfloor\), es la fracción de la unida de inspección. En base a lo anterior se define el número de defectos en la muestras de la siguiente manera

\[ C_i = \sum_{j=1}^{\left\lfloor n_i \right\rfloor}C_{íj} + C_f \tag{3.33}\]

Dado que los \(C_{ij}\) son variables aleatorias independientes con tasa de defectos \(\lambda = u\), y que la suma de variables Poisson independientes tiene distribución de Poisson con parámetro igual a la suma de los parámetros de cada variable, ver Hogg, McKean, y Craig (2019, 185). Además,

\[ E\left( C_f \right) = \left( n_i - \left\lfloor n_i \right\rfloor \right)u = n_i u - \left\lfloor n_i \right\rfloor u \,. \]

De lo anterior se obtiene que, la esperanza de \(C_i\) es

\[ \begin{align*} E\left( C_i \right) &= E\left( \sum_{j = 1}^{\left\lfloor n_i \right\rfloor} C_{ij} \right) + E\left( C_f \right)\\ &= \sum_{j=1}^{\left\lfloor n_i \right\rfloor}E\left( C_{ij} \right) + E\left( C_f \right)\\ &= \sum_{j=1}^{\left\lfloor n_i \right\rfloor}u + n_i u - \left\lfloor n_i \right\rfloor u \\ &= \left\lfloor n_i \right\rfloor u + n_i u - \left\lfloor n_i \right\rfloor u \\ &= n_{i} u \end{align*}. \] Dado que la distribución de Poisson tiene la misma media y varianza, la media y la desviación estándar de los \(C_i\) viene determinadas por,

Media y varianza de \(C_i\) con tamaño de meustra variable

\[ \begin{align*} \mu_{_{C_i}} & = E \left(C_i \right)=n_iu\\ \sigma_{_{C_i}} &=\sqrt {V\left(C_i \right)}=\sqrt {n_iu} \end{align*} \:. \tag{3.34}\]

De lo anterior, se deduce que la media la la tasa de defectos por unidad de inspección muestral \(U_i\) es,

\[ \mu_{_{U_i}}=E\left( \frac{C_i}{n_i} \right) = \frac{1}{n_i}E\left( C_i \right) = \frac{1}{n_i}n_{i}u = u \:. \]

Mientras que la desviación estándar de los \(U_i\), se obtiene de la siguiente manera,

\[ \sigma_{_{U_i}} = \sqrt{V\left( U_i \right)} = \sqrt{V\left( \frac{C_i}{n_i} \right)} =\sqrt{\frac{1}{{n_i}^2}V\left( C_i \right)} = \sqrt{\frac{1}{{n_i}^2}n_{i}u} = \sqrt{\frac{u}{n_i}} \:. \]

Lo anterior se resume en la siguiente ecuación,

Media y desviación estándar de los \(U_i\) con tamaño de muestra variables

\[ \begin{align*} \mu_{_{U_i}} & = u \\ \sigma_{_{U_i}} & = \sqrt{\frac{u}{n_i}}\\ \end{align*}. \tag{3.35}\]

Hay tres enfoques para construir y operar una carta de control con tamaños de muestra variables:

  • límite de control de anchura variable,
  • límite de control basado en el tamaño de la muestra promedio y
  • la carta de control estandarizada.

Los límites de control estándar del diagrama \(u\) con límite de control de anchura variable según el modelo general de Shewhart, dadas la media y la desviación estándar de \(U_i\) en la ecuación 3.35, se presenta a continuación:

Límites de control estándar del diagrama \(u\) con anchura varia

\[ \begin{align*} LCS & = u + 3\sqrt{\frac{u}{n_i}}\\ LC & = u\\ LCI & = u - 3\sqrt{\frac{u}{n_i}}\\ \end{align*}. \tag{3.36}\]

Generalmente \(u\) es desconocida y esta debe estimarse con \(m\) muestras de tamaño \(n_i\). Sea \(c_i\) el número de defectos observados en la muestra \(i\) y \(u_i\) el número de defectos por unidad de inspección observado en la muestra \(i\), se usa como estimador de \(u\) el promedio ponderado de los \(u_i\). Es decir,

Tasa de defectos por unidad de inspección estimada ponderada \(\hat{u}\)

\[ \hat{u} = \bar{u} = \frac{\sum_{i = 1}^{m}n_i u_i}{\sum_{i = 1}^{m}n_i} = \frac{\sum_{i = 1}^{m}c_i}{\sum_{i = 1}^{m}n_i},\:i = 1, \, 2,\, \dots , m \:. \tag{3.37}\]

Sustituyendo el resultado anterior en la actuación ecuación 3.36, se obtiene los límites de control inicial con anchura variables del diagrama \(u\) como se muestra en la siguiente ecuación

Límtes de control inicial del diagrama \(u\) con tamaño de muestra variables

\[ \begin{align*} LCS & = \bar{u} + 3\sqrt {\frac{\bar{u}}{n_i}}\\ LC & = \bar{u} \\ LCI & = \bar{u} - 3\sqrt {\frac{\bar{u}}{n_i}} \end{align*} \:. \tag{3.38}\]

Nota

Como se puede notar de las ecuaciones 3.36 y 3.38, los límites de control de este diagrama son variables ya que dependen de los \(n_i\), lo que constituye una desventaja debido a que en este caso no se pueden analizar patrones.

El segundo enfoque consiste en basar la carta de control en un tamaño de muestra promedio, de manera análoga a como se construyeron los límites de control del diagrama \(p\) con tamaño de muestra promedio. Acá se sustituye \(\bar{n}\), dado en la ecuación 3.18, por \(n_i\) en la ecuación 3.38. De donde se obtienen los siguientes límites de control:

Límtes de control inicial del diagrama \(u\) con tamaño de muestra promedio

\[ \begin{align*} LCS & = \bar{u} + 3\sqrt {\frac{\bar{u}}{\bar{n}}}\\ LC & = \bar{u} \\ LCI & = \bar{u} - 3\sqrt {\frac{\bar{u}}{\bar{n}}} \end{align*} \:. \tag{3.39}\]

Estos límites de control son aproximaciones de los límites reales. Y son particularmente útiles cuando los tamaños muestrales son muy similares, ya que, si los tamaños muestrales son muy variables se puede dar el caso de que puntos muestrales que estén dentro de los límites de control exactos (variables), se muestren fuera de control es este diagrama, o viceversa, puntos que se ubiquen dentro de los límites de control en este diagrama se ubiquen fuera de control con los límites de control exactos. Si se usa este enfoque, los límites de control serán constantes, y la carta de control resultante no le parecerá tan impresionante al personal de operación como la carta de control con límites de control variables. Sin embargo, si ocurre una variación excesivamente en el tamaño de una muestra particular o si un punto se localiza cerca de los límites de control aproximados, entonces será necesario determinar los límites de control exactos para ese punto y el punto deberá examinarse con respecto a esos valores. También se puede usar como tamaño de muestra la moda de los tamaños muestrales, esto es particularmente útil cuando existe un tamaño de muestra que se repite mucho.

El tercer enfoque para tratar un tamaño de muestra variable consiste en usar una carta de control estandarizadas, donde los \(u_i\) se grafican en unidades de desviación estándar. Esta carta de control tiene la línea central en cero, y los límites de control superior e inferior en +3 y -3, respectivamente. La variable graficada en la carta es

\(U_i\) estandarizaado con \(u\) conocida

\[ Z_{_{U_i}} = \frac{U_i - u}{\sqrt{\frac{\bar{u}}{n_i}}},\:i = 1, \, 2,\, \dots , m ; \tag{3.40}\]

cuando el parámetro \(u\) es conocido, de lo contrario

\(U_i\) estandarizaado con \(u\) desconocida

\[ Z_{_{U_i}} = \frac{U_i - \bar{u}}{\sqrt{\frac{\bar{u}}{n_i}}},\:i = 1, \, 2,\, \dots , m \:. \tag{3.41}\]

Esta carta es apropiada si se van a usar pruebas para corridas y otros métodos de identificación de patrones en conjunción con la carta.

Ejemplo 3.7 (Aplicación del Diagrama \(u\) con tamaño de Muestra Variable)
En una planta de acabados textiles se inspecciona la tela teñida para la corrección de defectos en cada 50 metros cuadrados. En la Tabla 3.10 se muestran los datos de 10 rollos de tela. Se usarán estos datos para establecer una carta de control para las disconformidades por unidad. Los datos fueron tomados de Montgomery (2005, 320).

Código
```{r}
#| label: tbl-datos-ejemplo2-dcu
#| tbl-cap: "Número de de defectos por cada 50 metros cuadrados de tela"
#| tbl-align: left

datos_dutmv <- tibble(
  muestra = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L),
  metros_cuadrados = c(
    500L, 400L, 650L, 500L, 475L, 500L, 600L, 525L, 600L, 625L
  ),
  Ci = c(
    14L, 12L, 20L, 11L, 7L, 10L, 21L, 16L, 19L, 23L
  ),
  ni = metros_cuadrados / 50,
  Ui = Ci / ni
)

reactable::reactable(
  datos_dutmv,
  columns = list(
    muestra = colDef(
      header = "Númerde rollos", align = "right"
    ),
    metros_cuadrados = colDef(
      header = "Número de metros cuadrados", 
      align = "right"
    ),
    Ci = colDef(
      header = "Número total de defectos", align = "right"
    ),
    ni = colDef(
      header = "Número de unidades de inspección en el rollo", align = "right",
      format = colFormat(
        separators = TRUE, digits = 1, locales = "es-ES"
      )
    ),
    Ui = colDef(
      header = "Número de defectos por unidada de inspcción", 
      align = "right",
      format = colFormat(
        separators = TRUE, digits = 4, locales = "es-ES"
      )
    )
  ),
  defaultColDef = colDef(
    # footer = function(values, name) {
    #   htmltools::div(name, style = list(fontWeight = 600))
    # },
    minWidth = 100,
    # maxWidth = 200
  ),
  fullWidth = TRUE,
  # width = "100%",
  # style = list(width = "100%"),
  resizable = TRUE, 
  wrap = FALSE, 
  bordered = TRUE,
  defaultPageSize = 10,
  striped = TRUE,
  highlight = TRUE,
  filterable = TRUE
)
```
Tabla 3.10: Número de de defectos por cada 50 metros cuadrados de tela

Los parámetros del Diagrama \(u\) se calculan en el siguiente bloque de código, usando la ecuación 3.31.

La estimación de \(u\) según la ecuación 3.37 es

\[ \bar{u} = \frac{\sum_{i = 1}^{10} c_i}{ \sum_{i = 1}^{10} n_i} = \frac{ 14 + 12 + \cdots + 19 + 23}{ 10 + 8 + \cdots + 12 + 12,5} = \frac{153}{107,5} = 1,4233. \]

Mientras que, los límites de control variables y la línea central en este caso, según la ecuación 3.38, vienen dados por

\[ \begin{align*} LCS_i & = 1,4233 + 3\sqrt {\frac{1,4233}{n_i}}\\ LC & = 1,4233 \\ LCI_i & = 1,4233 - 3\sqrt {\frac{1,4233}{n_i}} \end{align*} \:. \]

En la Tabla 3.11 se muestran los límites de control para cada muestra.

La gráfica del diagrama \(u\) con límites de control variable se muestra en la Figura 3.42. Esta gráfica se hizo con el paquete ggplot2.

Código
```{r}
#| label: fig-du-tmv-ggplot
#| fig-cap: "Diagrama $u$ para el número de defectos por cada 50 metros cuadrados de tela con el paquete `ggplot2`"

# library(ggQC)
ggplot(data = datos_dutmv, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = lic),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = u_est),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = muestra, y = Ui), color = "black"
  ) +
  geom_line(
    mapping = aes(x = muestra, y = Ui), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = lic, ymax = u_est), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = u_est, ymax = lsc), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = last(datos_dutmv$lic), label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = last(datos_dutmv$lsc), label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = u_est, label = "LC",
    color = "blue"
  ) +
  labs(
    x = "Muestra",
    y = latex2exp::TeX("Tasa de de defectos $\\left(U_i \\right)$")
  ) +
  theme_bw()
```
Figura 3.42: Diagrama \(u\) para el número de defectos por cada 50 metros cuadrados de tela con el paquete ggplot2

Note de la Figura 3.42 que todos los puntos están bajo control, y además, no se observa un comportamiento sistemático de estos, por lo que se concluye que el proceso está bajo control y esta estimación de \(u\) (\(\bar{u} = 1,4233\)) puede ser usada para controlar la producción futura.

La Figura 3.43 muestra la gráfica del diagrama \(u\) con límites de control constante con el paquete qcc.

Código
```{r}
#| label: fig-du-tmv-qcc 
#| fig-cap: "Diagrama $u$ para el número de defectos por cada 50 metros cuadrados de tela con el paquete `qcc`"

obj <- with(
  data = datos_dutmv, qcc(Ci, type = "u", sizes = ni, plot = FALSE) 
)
plot(
  obj, add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = ("Tasa de defectos")
)
```
Figura 3.43: Diagrama \(u\) para el número de defectos por cada 50 metros cuadrados de tela con el paquete qcc

La Figura 3.44 muestra la gráfica del diagrama \(u\) con límites de control variables con el paquete highcharter.

Código
```{r}
#| label: fig-ejemplo-dutmv-highcharter
#| fig-cap: "Diagrama $u$ para el número de defectos por cada 50 metros cuadrados de tela con el paquete `highcharter`"

# library(highcharter)
highchart() |>
  hc_add_series(
    data = datos_dutmv, hcaes(x = muestra, low = lsc, high = u_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_dutmv, hcaes(x = muestra, low = lic, high = u_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_dutmv, type = "line", 
    hcaes(x = muestra, y = lsc), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv,
    type = "line", hcaes(x = muestra, y = u_est), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv, type = "line", hcaes(x = muestra, y = lic), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv,
    type = "line", color = "black",
    hcaes(x = muestra, y = Ui),
    tooltip = list(valueDecimals = 2),
    marker = list(radius = 3),
    useHTML = TRUE, name = "<b><i>U<sub>i</sub></i></b>",
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Tasa de defectos (U<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE) |> 
  hc_plotOptions(series = list(animation = FALSE))
```
Figura 3.44: Diagrama \(u\) para el número de defectos por cada 50 metros cuadrados de tela con el paquete highcharter

La Figura 3.45 muestra la gráfica del diagrama \(u\) con límites de control variables con el paquete plotly.

Código
```{r}
#| label: fig-ejemplo-dcutmv-plotly
#| fig-cap: Diagrama $u$ para el número de defectos por cada 50 metros cuadrados de tela con el paquete `plotly`"

# library(plotly)
datos_dutmv %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = ~lsc, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = u_est, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = 'green', 
    alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = ~lic, name = "<b><i>LCI</i></b>", fill = "tonexty", 
    fillcolor = 'blue', alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    y = ~Ui,
    name = "<b><i>U<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "black"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>U<sub>i</sub><b><i> = %{y:.2f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Tasa de defectos (U<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.45: Diagrama \(u\) para el número de defectos por cada 50 metros cuadrados de tela con el paquete plotly

El cálculo del tamaño de muestra promedio, usando la ecuación 3.18, para diseñar el diagrama \(u\) bajo este enfoque se muestra a continuación

\[ \bar{n} = \frac{107,5}{10} = 10,75 \:. \]

Ahora, sustituyendo el resultado anterior en la ecuación 3.39, se obtienen los límites de control del diagrama \(u\) con límites de control constantes, como sigue

\[ \begin{align*} LCS & = 1,4233 + 3\sqrt {\frac{1,4233}{10,75}} = 2,5148\\ LC & = 1,4233 \\ LCI & = 1,4233 - 3\sqrt {\frac{1,4233}{10,75}} = 0,3317 \end{align*} \:. \]

En la figura Figura 3.46 se muestra el diagrama \(u\) con límites de control basados en el tamaño de muestra promedio para los datos de la tabla Tabla 3.10, con el paquete ggplot2.

Código
```{r}
#| label: fig-du-tmp-ggplot
#| fig-cap: "Diagrama $u$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `ggplot2`"

# library(ggQC)
ggplot(data = datos_dutmv, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = lic_tmp),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = u_est),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = lsc_tmp),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = muestra, y = Ui), color = "black"
  ) +
  geom_line(
    mapping = aes(x = muestra, y = Ui), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = lic_tmp, ymax = u_est), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = u_est, ymax = lsc_tmp), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = last(datos_dutmv$lic), label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = last(datos_dutmv$lsc), label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = u_est, label = "LC",
    color = "blue"
  ) +
  labs(
    x = "Muestra",
    y = latex2exp::TeX("Tasa de de defectos $\\left(U_i \\right)$")
  ) +
  theme_bw()
```
Figura 3.46: Diagrama \(u\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete ggplot2


La Figura 3.47 muestra la gráfica del diagrama \(u\) con límites de control constante por medio del paquete qcc.

Código
```{r}
#| label: fig-du-tmp-qcc
#| fig-cap: "Diagrama $p$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `qcc`"

obj <- with(
  data = datos_dutmv, qcc(
    Ci, type = "u", sizes = ni, center = u_est, limits = c(lic_tmp, lsc_tmp), 
    plot = FALSE
  ) 
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Tasa de defectuosos"
)
```
Figura 3.47: Diagrama \(p\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete qcc

La Figura 3.48 muestra la gráfica del diagrama \(u\) con límites de control constante, usando el enfoque del tamaño de muestra promedio, por medio del paquete highcharter.

Código
```{r}
#| label: fig-ejemplo-dutmp-highcharter
#| fig-cap: "Diagrama $u$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `highcharter`"

# library(highcharter)
highchart() |>
  hc_add_series(
    data = datos_dutmv, hcaes(x = muestra, low = lsc_tmp, high = u_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_dutmv, hcaes(x = muestra, low = lic_tmp, high = u_est),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.2, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_dutmv, type = "line", 
    hcaes(x = muestra, y = lsc_tmp), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv,
    type = "line", hcaes(x = muestra, y = u_est), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv, type = "line", hcaes(x = muestra, y = lic_tmp), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv,
    type = "line", color = "black",
    hcaes(
      x = muestra, y = Ui,
    tooltip = list(valueDecimals = 2)
    ),
    marker = list(
      radius = 3
    ),
    useHTML = TRUE, name = "<b><i>U<sub>i</sub></i></b>",
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Tasa de defectos (U<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE, valueDecimals = 2) |> 
  hc_plotOptions(series = list(animation = FALSE))
```
Figura 3.48: Diagrama \(u\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete highcharter

La Figura 3.49 muestra la gráfica del diagrama \(u\) con límites de control constante, usando el enfoque del tamaño de muestra promedio, con el paquete plotly.

Código
```{r}
#| label: fig-ejemplo-dcutmp-plotly
#| fig-cap: Diagrama $u$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `plotly`"

# library(plotly)
datos_dutmv %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = lsc_tmp, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.2f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = u_est, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = 'green', 
    alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.2f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = lic_tmp, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = 'blue', 
    alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.2f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    y = ~Ui,
    name = "<b><i>D<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "black"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>U<sub>i</sub><b><i> = %{y:.2f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Tasa de defectos (U<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.49: Diagrama \(u\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete plotly

A continuación, se muestra el cálculo de la tasa de defecto estandarizada para la primera muestra, en base a la ecuación 3.41, como sigue

\[ z_1 = \frac{1,4 - 1,4233}{\sqrt{\frac{1,4233}{10}}} = -0,0616. \]

Las tasas de defectos estandarizadas para el resto de las muestras se presentan en la Tabla 3.11.

El diagrama \(u\) con límites de control estandarizados, generada con el paquete ggplot2, se muestra en la siguiente figura.

Código
```{r}
#| label: fig-due-ggplot
#| fig-cap: "Diagrama $u$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `ggplot2`"

# library(ggQC)
ggplot(data = datos_dutmv, aes(x = muestra)) +
  geom_step(
    mapping = aes(x = muestra, y = -3),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = 0),
    direction = "hv", color = "blue"
  ) +
  geom_step(
    mapping = aes(x = muestra, y = 3),
    direction = "hv", color = "red", lty = "dashed"
  ) +
  geom_point(
    mapping = aes(x = muestra, y = Zi), color = "black"
  ) +
  geom_line(
    mapping = aes(x = muestra, y = Zi), color = "black"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = -3, ymax = 0), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  pammtools::geom_stepribbon(
    aes(ymin = 0, ymax = 3), fill = "green", alpha = 0.2, direction = "hv"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = -3, label = "LCI",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = 3, label = "LCS",
    color = "red"
  ) +
  annotate(
    "text",
    x = nrow(datos_dutmv) + 1, y = 0, label = "LC",
    color = "blue"
  ) +
  labs(
    x = latex2exp::TeX("Muestra $\\left(n_i \\right)$"),
    y = latex2exp::TeX("Tasa de de defectos estandarizada $\\left(Z_i \\right)$")
  ) +
  scale_y_continuous(
    breaks = seq(from = -3, to = 3, by = 1),
  ) +
  theme_bw()
```
Figura 3.50: Diagrama \(u\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete ggplot2

La Figura 3.51 muestra la gráfica del diagrama \(u\) con límites de control estandarizados por medio del paquete qcc.

Código
```{r}
#| label: fig-due-qcc
#| fig-cap: "Diagrama $u$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `qcc`"

obj <- with(
  data = datos_dutmv, qcc(
    Zi * ni, type = "u", sizes = ni, center = 0, limits = c(-3, 3), plot = FALSE
  ) 
)
plot(
  obj,
  add.stats = FALSE, label.limits = c("LCI", "LCS"), title = "",
  xlab = "Muestra", ylab = "Tasa dedefectos estandarizada"
)
```
Figura 3.51: Diagrama \(u\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete qcc
Código
```{r}
#| label: tbl-datos-dutmv
#| tbl-cap: "Limites de control del diagrama $u$ para muestra variable"
#| tbl-align: left

knitr::kable(
  datos_dutmv |> dplyr::select(
    c(muestra, ni, Ui, lsc, lic, Zi)
  ),
  table.attr = 'data-quarto-disable-processing="true"',
  booktabs = TRUE,
  format = "markdown",
  digits = 4,
  format.args = list(decimal.mark = ",", big.mark = "."),
  col.names = c(
    "Número de rollo", 
    "$n_i$",
    "$U_i$",
    "$LCS = \\bar{u} + 3 \\sqrt{\\frac{\\bar{u}}{n_i}}$",
    "$LCI = \\bar{u} - 3 \\sqrt{\\frac{\\bar{u}}{n_i}}$",
    "$Z_i = \\frac{U_i - \\bar{u}}{\\sqrt{\\frac{\\bar{u}}{n_i}}}$"
  ),
  align = "ccccc",
  escape = FALSE,
)
```
Tabla 3.11: Limites de control del diagrama \(u\) para muestra variable
Número de rollo \(n_i\) \(U_i\) \(LCS = \bar{u} + 3 \sqrt{\frac{\bar{u}}{n_i}}\) \(LCI = \bar{u} - 3 \sqrt{\frac{\bar{u}}{n_i}}\) \(Z_i = \frac{U_i - \bar{u}}{\sqrt{\frac{\bar{u}}{n_i}}}\)
1 10,0 1,4000 2,5550 0,2915 -0,0616
2 8,0 1,5000 2,6886 0,1579 0,1819
3 13,0 1,5385 2,4159 0,4306 0,3482
4 10,0 1,1000 2,5550 0,2915 -0,8569
5 9,5 0,7368 2,5844 0,2621 -1,7734
6 10,0 1,0000 2,5550 0,2915 -1,1219
7 12,0 1,7500 2,4564 0,3901 0,9488
8 10,5 1,5238 2,5278 0,3187 0,2731
9 12,0 1,5833 2,4564 0,3901 0,4648
10 12,5 1,8400 2,4356 0,4110 1,2350


La Figura 3.52 muestra la gráfica del diagrama \(u\) con límites de control estandarizados por medio del paquete highcharter.

Código
```{r}
#| label: fig-due-highcharter
#| fig-cap: "Diagrama $u$ estandarizado para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `highcharter`"

# library(highcharter)
highchart() |>
  hc_add_series(
    data = datos_dutmv, hcaes(x = muestra, low = 0, high = 3),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.3, name = "", color = "green",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    data = datos_dutmv, hcaes(x = muestra, low = -3, high = 0),
    step = "hv", marker = list(enabled = FALSE, visible = FALSE),
    type = "arearange", fillOpacity = 0.3, name = "", color = "blue",
    showInLegend = FALSE, tooltip = list(pointFormat = "{NULL}")
  ) |>
  hc_add_series(
    datos_dutmv, type = "line", 
    hcaes(x = muestra, y = 3), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCS</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv,
    type = "line", hcaes(x = muestra, y = 0), useHTML = TRUE,
    color = "blue", name = "<b><i>LC</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv, type = "line", hcaes(x = muestra, y = -3), useHTML = TRUE,
    color = "red", dashStyle = "Dash", name = "<b><i>LCI</b></i>",
    step = "hv", marker = list(enabled = FALSE),
    tooltip = list(valueDecimals = 2)
  ) |>
  hc_add_series(
    datos_dutmv,
    type = "line", color = "black",
    hcaes(
      x = muestra, y = Zi,
    tooltip = list(valueDecimals = 2)
    ),
    marker = list(
      radius = 3
    ),
    useHTML = TRUE, name = "<b><i>U<sub>i</sub></i></b>",
    dashStyle = "Dash"
  ) |>
  hc_xAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_yAxis(
    title = list(
      useHTML = TRUE,
      text = "<b><i>Tasa de defectos estandarizada (Z<sub>i</sub>)</i></b><br>"
    )
  ) |>
  hc_tooltip(crosshairs = TRUE, shared = TRUE, valueDecimals = 2) |> 
  hc_plotOptions(series = list(animation = FALSE))
```
Figura 3.52: Diagrama \(u\) estandarizado para el número de de defectos por cada 50 metros cuadrados de tela con el paquete highcharter


La Figura 3.53 muestra la gráfica del diagrama \(u\) con límites de control estandarizados por medio del paquete plotly.

Código
```{r}
#| label: fig-due-plotly
#| fig-cap: Diagrama $u$ para el número de de defectos por cada 50 metros cuadrados de tela con el paquete `plotly`"

# library(plotly)
datos_dutmv %>%
  plot_ly(x = ~muestra) %>%
  add_lines(
    y = 3, name = "<b><i>LCS</i></b>", line = list(
      shape = "hvh", color = "red", dash = "dash"
    ),
    hovertemplate = paste("<b><i>LCS = %{y:.0f}</i></b><br><extra></extra>"),
  ) %>%
  add_lines(
    y = 0, name = "<b><i>LC</i></b>", fill = "tonexty", fillcolor = 'green', 
    alpha = 0.2,
    hovertemplate = paste("<b><i>LC = %{y:.0f}</i></b><br><extra></extra>"),
    line = list(
      shape = "linear", color = "blue"
    )
  ) %>%
  add_lines(
    y = -3, name = "<b><i>LCI</i></b>", fill = "tonexty", fillcolor = 'blue', 
    alpha = 0.2,
    hovertemplate = paste(
      "<b><i>LCI = %{y:.0f}</i></b><br><extra></extra>"
    ),
    line = list(
      shape = "hvh", color = "red", dash = "dash"
    )
  ) %>%
  add_trace(
    y = ~Zi,
    name = "<b><i>D<sub>i</sub><b><i>", type = "scatter",
    mode = "lines+markers",
    marker = list(color = "black"),
    hovertemplate = paste(
      "<b><i>n<sub>i</sub> = %{x}</i></b>",
      "<br><b><i>U<sub>i</sub><b><i> = %{y:.2f}<br><extra></extra>"
    ),
    line = list(color = "black", dash = "dash")
  ) %>%
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(
      title = "<b><i>Muestra (n<sub>i</sub>)</i></b><br>",
      zeroline = F
    ),
    yaxis = list(
      title = "<b><i>Tasa de defecto estandarizada (Z<sub>i</sub>)</i></b><br>",
      zeroline = FALSE
    )
  ) %>%
  plotly::config(locale = "es", mathjax = "cdn") |> 
  fillOpacity(alpha = 0.3)
```
Figura 3.53: Diagrama \(u\) para el número de de defectos por cada 50 metros cuadrados de tela con el paquete plotly

3.6 Diagrama de Pareto

Kume (1992, 31) establece que los problemas de calidad se presentan como pérdidas (productos defectuosos y sus costos). Es muy importante aclarar el patrón de la distribución de la pérdida. La mayoría de las pérdidas se deberán a unos pocos tipos de defectos, y estos defectos pueden atribuirse a un número muy pequeño de causas. Si se identifica las causas de estos pocos defectos vitales, podemos eliminar casi todas las pérdidas, concentrándonos en esas causas particulares y dejando de lado por el momento otros muchos defectos triviales. El uso del diagrama de Pareto permite solucionar este tipo de problema con eficiencia.

3.6.1 Pasos para Elaborar el Diagrama de Pareto

Kume (1992, 32-35) indica 9 pasos a seguir en la elaboración del diagrama de Pareto:

  1. Se decide qué problema se van a investigar, como objetos defectuosos, pérdidas en términos monetarios, ocurrencia de accidentes, entre otros; los datos que se necesitarán y su clasificación, por tipo de defecto, localización, proceso, máquina, ocurrencia de accidentes; y cómo recoger los datos y el período de duración de la recolección.

  2. Se diseña una tabla para conteo de datos, con espacio suficiente para registrar los totales como se muestra en el ejemplo de la Tabla 3.12.

Código
```{r}
#| label: tbl-pareto-conteo
#| tbl-cap: "Conteo de defectos"
#| tbl-align: left

pareto <- data.frame(
 tipo_defecto = c(
   "Fractura", "Rayado", "Mancha", "Tensión", "Rajadura", "Burbuja", "Otros", "Total"
 ),
  conteo = c(
    "$\\displaystyle \\bcancel{////} \\ \\bcancel{////} \\\\$",
    "$\\displaystyle \\bcancel{////} \\ \\bcancel{////} \\ \\bcancel{////} \\ \\bcancel{////} \\ ......... \\ \\bcancel{////} \\ //$", 
    "$\\displaystyle \\bcancel{////} \\ /$",
    "$\\displaystyle \\bcancel{////} \\ \\bcancel{////} \\ \\bcancel{////} \\ \\bcancel{////} \\ ..........................\\ \\bcancel{////} \\ ////$",
    "$\\displaystyle ///$",
    "$\\displaystyle  \\bcancel{////} \\ \\bcancel{////} \\ \\bcancel{////} \\ \\bcancel{////}$",
    "$\\displaystyle  \\bcancel{////} \\ \\bcancel{////} \\ ////$",
    ""
  ),
  total = c(10L, 42L, 6L, 104L, 4L, 20L, 14L, 200L)
)

knitr::kable(
  pareto,
  table.attr = 'data-quarto-disable-processing="true"',
  format = "markdown",
  digits = 4,
  col.names = c(
    "Tipo de defecto", 
    "Conteo", 
    "Total"
  ),
  align = "llr",
  escape = FALSE,
)
```
Tabla 3.12: Conteo de defectos
Tipo de defecto Conteo Total
Fractura \(\displaystyle \bcancel{////} \ \bcancel{////} \\\) 10
Rayado \(\displaystyle \bcancel{////} \ \bcancel{////} \ \bcancel{////} \ \bcancel{////} \ ......... \ \bcancel{////} \ //\) 42
Mancha \(\displaystyle \bcancel{////} \ /\) 6
Tensión \(\displaystyle \bcancel{////} \ \bcancel{////} \ \bcancel{////} \ \bcancel{////} \ ..........................\ \bcancel{////} \ ////\) 104
Rajadura \(\displaystyle ///\) 4
Burbuja \(\displaystyle \bcancel{////} \ \bcancel{////} \ \bcancel{////} \ \bcancel{////}\) 20
Otros \(\displaystyle \bcancel{////} \ \bcancel{////} \ ////\) 14
Total 200
  1. Se diligencia la tabla de conteo y se calculan los totales.

  2. Se elabora una tabla de datos para el diagrama de Pareto con la lista de ítems, los totales individuales, los totales acumulados, la composición porcentual y los porcentajes acumulados, como se muestra en la Tabla 3.13.

  3. Se organizan los ítems por orden de cantidad, y se llena la tabla de datos, dejando el ítems otros en el último renglón independientemente de su magnitud.

Código
```{r}
#| label: tbl-pareto
#| tbl-cap: "Tabla de datos para un diagrama de Pareto"
#| tbl-align: left


pareto <- pareto |>
  dplyr::select(c(tipo_defecto, total)) |>
  dplyr::arrange(desc(total)) |>
  dplyr::mutate(
    tipo_defecto = fct_relevel(
      fct_inorder(tipo_defecto), c("Otros", "Total"),
      after = Inf
    )
  ) |>
  dplyr::arrange(tipo_defecto) |>
  dplyr::mutate(
    porcentaje = if_else(
      tipo_defecto != "Total", total / sum(total[1:7]) * 100, NA
    ),
    total_acumulado = cumsum(total),
    porcentaje_acumulado = if_else(
      tipo_defecto != "Total", total_acumulado / sum(total[1:7]) * 100, NA
    )
  )

options(knitr.kable.NA = "-")

knitr::kable(
  pareto,
  booktabs = TRUE,
  format = "html",
  digits = 4,
  format.args = list(decimal.mark = ",", big.mark = "."),
  col.names = c(
    "Tipo de defecto",
    "Total de defectos",
    "Porcentaje de defectos",
    "Total de defectos acumulados",
    "Porcentaje de defectos acumulados"
  ),
  align = "lrrrr",
  escape = FALSE,
) |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = NULL,
    fixed_thead = FALSE,
    position = "left"
  ) |>
  kableExtra::kable_classic()
```
Tabla 3.13: Tabla de datos para un diagrama de Pareto
Tipo de defecto Total de defectos Porcentaje de defectos Total de defectos acumulados Porcentaje de defectos acumulados
Tensión 104 52 104 52
Rayado 42 21 146 73
Burbuja 20 10 166 83
Fractura 10 5 176 88
Mancha 6 3 182 91
Rajadura 4 2 186 93
Otros 14 7 200 100
Total 200 - 400 -
  1. Se dibujan dos ejes verticales y un eje horizontal. En los ejes verticales, en el eje izquierdo se distribuye una escala que va desde 0 hasta el total en general y en el eje derecho se distribuye en una escala del 0% al 100%. El eje horizontal se divide en un número de intervalos igual al número de ítems clasificados.

  2. Se construye un diagrama de barras.

  3. Se dibuja la curva acumulada (curva de Pareto). Se marcan los valores acumulados, total o porcentaje, en la parte superior, al lado derecho de los intervalos de cada ítems, y se conectan los puntos con una línea continua.

Código
```{r}
#| label: fig-pareto-ggplot2
#| fig-cap: "Diagrama de Pareto por ítems defectuosos con el paquete `ggplot2`"

ggplot(
  dplyr::filter(pareto, tipo_defecto != "Total"),
  aes(x = tipo_defecto, y = total_acumulado)
) +
  geom_col(aes(y = total, fill = tipo_defecto)) +
  # scale_fill_brewer(palette = "Dark2", direction = 1) +
  scale_fill_manual(
    values = c(
      "#ff0000", "#ff4908", "#ff6b14", "#ff871f", "#ffa02a", "#ffb836", "#ffcf41"
    )
  ) +
  geom_text(aes(y = total, label = total), vjust = -1) +
  geom_point(
    mapping = aes(y = total_acumulado, color = tipo_defecto),
    size = 2
  ) +
  scale_colour_manual(
    values = c(
      "#ff0000", "#ff4908", "#ff6b14", "#ff871f", "#ffa02a", "#ffb836", "#ffcf41"
    )
  ) +
  # scale_fill_brewer(palette = "Dark2", direction = 1, aesthetics = "colour") +
  geom_line(
    mapping = aes(x = seq_along(tipo_defecto), y = total_acumulado),
    color = "blue"
  ) +
  geom_text(aes(y = total_acumulado, label = porcentaje_acumulado), vjust = 2) +
  scale_y_continuous(
    sec.axis = sec_axis(
      ~ . * (100 / sum(pareto$total[1:7])),
      name = "Porcentaje acumulado"
    )
  ) +
  geom_line(
    aes(x = seq.int(from = 0, to = 3.5, length.out = 7), y = rep((166 + 176) / 2, 7)),
    color = "red", lty = "dashed"
  ) +
  geom_line(
    aes(
      x = rep((3 + 4) / 2, 7),
      y = seq.int(from = 0, to = (166 + 176) / 2, length.out = 7)
    ),
    color = "red", lty = "dashed"
  ) +
  geom_area(
    aes(
      x = seq.int(from = 0, to = 3.5, length.out = 7),
      y = rep((166 + 176) / 2, 7)
    ),
    fill = "green", alpha = 0.2
  ) +
  labs(x = "Tipo de defecto", y = "Número de defectos") +
  theme_bw() +
  theme(legend.position = "none") 
```
Figura 3.54: Diagrama de Pareto por ítems defectuosos con el paquete ggplot2
  1. Se escribe en el diagrama cualquier información necesaria, como por ejemplo, información sobre el diagrama, título, cifras significativas, unidades, nombre del dibujante, información sobre los datos, período de tiempo, tema y lugar de la investigación, número total de datos.
Nota

Las funciones stat_pareto y pareto.chart de los paquetes ggQC y qcc realizan la gráfica de Pareto ordenando los ítems, en este caso defectos, de acuerdo a la frecuencia de ocurrencia. El diagrama de Pareto generada con la función stat_pareto se muestra en la Figura 3.55, mientras que el generada con la función stat_pareto se muestra en la Figura 3.56.

Código
```{r}
#| label: fig-pareto-ggQC
#| fig-cap: "Diagrama de Pareto por ítems defectuosos con el paquete `ggQC`"

ggplot(
  dplyr::filter(pareto, tipo_defecto != "Total"), 
  aes(x = tipo_defecto, y = total)
) +
  ggQC::stat_pareto(
    aes(x = tipo_defecto),
    point.color = "red",
    point.size = 2,
    line.color = "black",
    bars.fill = c("red", "orange")
  ) +
  labs(x = "Tipo de defecto", y = "Número de defectos") +
  scale_y_continuous(
    sec.axis = sec_axis(
      ~ . * (100 / sum(pareto$total[1:7])),
      name = "Porcentaje acumulado"
    )
  ) +
  theme_bw()
```
Figura 3.55: Diagrama de Pareto por ítems defectuosos con el paquete ggQC
Código
```{r}
#| label: fig-pareto-qcc
#| fig-cap: "Diagrama de Pareto por ítems defectuosos con el paquete `qcc`"

defectos <- pareto$total[-8]
names(defectos) <- pareto$tipo_defecto[-8]
obj <- pareto.chart(
  defectos, plot = FALSE
)
plot(
  obj, main = "", ylab = "Total de defectos", xlab = "Tipo de defecto", 
  las = 1, ylab2 = "Porcetaje acumulado",
  col = heat.colors(length(defectos))
)
```
Figura 3.56: Diagrama de Pareto por ítems defectuosos con el paquete qcc

En la Figura 3.57 se muestra el diagrama de Pareto para los defectos con el paquete highchter.

Código
```{r}
#| label: fig-pareto-highchter
#| fig-cap: "Diagrama de Pareto por ítems defectuosos con el paquete `highchter`"
# output: asis
# echo: false
# eval: false

color <- c(
  "#ff0000", "#ff4908", "#ff6b14", "#ff871f", "#ffa02a", "#ffb836", "#ffcf41"
)

hchart(
  dplyr::filter(pareto, tipo_defecto != "Total"),
  type = "column", 
  hcaes(x = tipo_defecto, y = total, color = color),
  column = list(colorByPoint = TRUE),
  name = "<b>Defecto</b>",
  tooltip = list(valueDecimals = 0),
  dataLabels = list(enabled = TRUE),
  showInLegend = TRUE
) |>
  hc_xAxis(
    title = list(
      type = "category",
      useHTML = TRUE,
      text = "<b>Defecto</b><br>"
    )
  ) |>
  hc_yAxis_multiples(
    list(
      title = list(text = "<b>Conteo</b><br>"),
      style = list(fontWeight = "bold", fontSize = "auto"),
      min = 0,
      max = 200
    ),
    list(
      title = list(text = "<b>Porcentaje acumulado</b><br>"),
      style = list(fontWeight = "bold", fontSize = "auto"),
      labels = list(
        format = "{value}%",
        style = list(fontSize = "auto", color = "black")
      ),
      min = 0,
      max = 100,
      opposite = TRUE
    )
  ) %>%
  hc_add_series(
    dplyr::filter(pareto, tipo_defecto != "Total"),
    type = "line", lineWidth = 2, color = "blue",
    hcaes(
      x = tipo_defecto, y = porcentaje_acumulado, color = color
    ),
    marker = list(radius = 3),
    useHTML = TRUE, name = "<b>Acumulado</b>",
    tooltip = list(valueDecimals = 0, valueSuffix = "%"),
    dataLabeles = list(enable = TRUE, style = list(fontsize = "auto")),
    showInLegend = TRUE,
    yAxis = 1
  ) |>
  hc_tooltip(split = TRUE)
```
Figura 3.57: Diagrama de Pareto por ítems defectuosos con el paquete highchter

La Figura 3.58 muestra el diagrama de Pareto para los defectos con el paquete plotly.

Código
```{r}
#| label: fig-pareto-ploty
#| fig-cap: "Diagrama de Pareto por ítems defectuosos con el paquete `plotly`"

plot_ly(
    dplyr::filter(pareto, tipo_defecto != "Total")
) |> 
  add_trace(
    x = ~tipo_defecto, y = ~total_acumulado, yaxis = "y",
    type = "scatter", mode = "lines+markers+text",
    text = ~scales::comma(porcentaje_acumulado), textposition = "top center",
    marker = list(color = color),
    line = list(color = "blue", dash = "dash"),
    name = "Acumulado",
    hovertemplate = paste(
      "<b><i>%{x}<b><i>", "<br>",
      "<b><i>Acumulado</sub>: %{y}</i></b>", "<br>",
      "<b><i>Porcentaje<b><i>: %{text:.0f}%<br><extra></extra>"
    )
  ) |>
  add_bars(
    x = ~tipo_defecto, y = ~total, yaxis = "y",
    marker = list(color = color),
    text = ~total, textposition = 'auto',
    name = "Conteo",
    hovertemplate = paste(
      "<b><i>%{x}<b><i>", "<br>",
      "<b><i>Total<b><i>: %{text:.0f}<br><extra></extra>"
    )
  ) |>
  layout(
    legend = list(
      x = 0.5, y = -0.23, xref = 'paper', yref = 'paper',
      orientation = "h", xanchor = 'center', showarrow = F
    ),
    xaxis = list(title = '<b>Defecto<b>'),
    yaxis = list(title = '<b>Conteo<b>')
  ) |> 
  plotly::config(locale = "es", mathjax = "cdn")
```
Figura 3.58: Diagrama de Pareto por ítems defectuosos con el paquete plotly

3.7 Diagrama de Causa-Efecto (Diagrama de Ishikawa o Diagrama Espina de Pescado)

El diagrama de Causa-Efecto fue propuesto por el Dr. Kaoru Ishikawa (1915-1989), profesor japonés reconocido por sus aportes a la teoría de la gestión de la calidad. Por tal razón, el diagrama de Causa-Efecto es comúnmente referido como diagrama de Ishikawa. Por otro lado, el nombre de espina de pescado se debe a que una vez que se construye este diagrama se asemeja a un esqueleto de pescado.

El diagrama de Causa-Efecto es una gráfica que permite visualizar las posibles causas de un problema o efecto específico.

El diagrama de Causa-Efecto, al igual que el diagrama de Pareto hace parte de un conjunto de herramientas dentro del Control Estadístico de Procesos denominadas las Sietes Magníficas. Para profundizar en estas herramientas ver Montgomery (2013, 207-13).

Un ejemplo del diagrama Causa-Efecto se muestra en la Figura 3.59. El cual fue generado con la función ss.ceDiag del paquete SixSigma de .

Código
```{r}
#| label: fig-causa-efecto-SixSigma
#| fig-cap: "Diagrama de Causa-Efecto con el paquete `SixSigma`"

effect <- "Flight Time"
causes.gr <- c(
  "Operator", "Environment", "Tools", "Design", 
  "Raw.Material", "Measure.Tool"
)
causes <- vector(mode = "list", length = length(causes.gr))
causes[1] <- list(
  c("operator #1", "operator #2", "operator #3")
)
causes[2] <- list(c("height", "cleaning"))
causes[3] <- list(c("scissors", "tape"))
causes[4] <- list(
  c("rotor.length", "rotor.width2", "paperclip")
)
causes[5] <- list(c("thickness", "marks"))
causes[6] <- list(c("calibrate", "model"))
SixSigma::ss.ceDiag(
  effect, causes.gr, causes, main = "", sub = "Paper Helicopter Project"
)
```
Figura 3.59: Diagrama de Causa-Efecto con el paquete SixSigma

Otro paquete de que permite realizar el diagrama de Causa-Efecto es qcc por medio de la función cause.and.effect. La Figura 3.60 muestra un ejemplo.

Código
```{r}
#| label: fig-causa-efecto-qcc
#| fig-cap: "Diagrama de Causa-Efecto con el paquete `qcc`"

qcc::cause.and.effect(
  cause = list(
    Measurements = c("Micrometers", "Microscopes", "Inspectors"),
    Materials = c("Alloys", "Lubricants", "Suppliers"),
    Personnel = c("Shifts", "Supervisors", "Training", "Operators"),
    Environment = c("Condensation", "Moisture"),
    Methods = c("Brake", "Engager", "Angle"),
    Machines = c("Speed", "Lathes", "Bits", "Sockets")
  ),
  effect = "Surface Flaws",
  title = ""
)
```
Figura 3.60: Diagrama de Causa-Efecto con el paquete qcc

3.7.1 Pasos para Construir un Diagrama de Causa-Efecto

Para construir un diagrama de Causa -Efecto se recomienda seguir los siguientes pasos:

  1. Definir el Problema o Efecto a Analizar:
    • En este paso, debes identificar claramente el problema o efecto que deseas analizar. ¿Cuál es el desafío específico que enfrentas? Por ejemplo, podría ser una disminución en la satisfacción del cliente o un aumento en los defectos de producción.
  2. Formar el Equipo para Realizar el Análisis:
    • Reúne un equipo de personas con conocimientos relevantes. La diversidad de perspectivas es valiosa en esta etapa. El equipo puede incluir expertos en el área afectada, líderes de proyecto y otros interesados.
  3. Dibujar la Caja del Efecto y la Línea Central:
    • Visualmente, crea una “caja del efecto” que represente el problema o efecto. Luego, dibuja una línea central que conecte esta caja con las posibles causas. Esto ayuda a visualizar la relación entre el problema y sus factores contribuyentes.
  4. Especificar las Categorías Principales de Posibles Causas:
    • Identifica categorías amplias de posibles causas. Por ejemplo, si estás analizando defectos de producción, las categorías podrían ser “materiales”, “proceso de fabricación” y “mano de obra”. Crea cajas separadas para cada categoría y conéctalas a la línea central.
  5. Identificar y Clasificar las Posibles Causas:
    • Dentro de cada categoría, enumera causas específicas posibles. Por ejemplo, bajo la categoría “materiales”, podrías incluir “materia prima defectuosa” o “almacenamiento inadecuado”. Clasifica estas causas según su relevancia para el problema.
  6. Ordenar las Causas por Prioridad:
    • Evalúa cada causa y ordénalas según su probabilidad de afectar el problema. Algunas causas pueden ser más significativas que otras. Esto te ayudará a enfocarte en las áreas clave.
  7. Tomar Acciones Correctivas:
    • Basándote en el análisis, desarrolla acciones correctivas específicas para abordar las causas identificadas. Implementa estas acciones para mitigar el problema y monitorea los resultados.

3.7.2 Ventajas de la Aplicación del Diagrama de Causa-Efecto

El diagrama de de Causa-Efecto presenta múltiples ventajas, puesto que permite:

  • clasificar todas las causas relacionadas con el problema planteado;
  • esclarecer un problema relativamente consecuente;
  • hacer participar a todos los miembros del equipo en el análisis y crear así una dinámica de gestión de proyectos;
  • limitar el olvido de algunas causas gracias al trabajo en grupo;
  • identificar los dominios en los que hay que profundizar, donde a veces falta información;
  • analizar un problema, sea cual sea el sector o el ámbito de actividades del que provenga;
  • proporcionar elementos para la elaboración de una solución adaptada al problema planteado;
  • dar una visión sintética de las relaciones de causa-efecto.