UNIVERSIDAD DE CIENCIAS APLICADAS Y AMBIENTALES - U.D.C.A
PARCIAL DOS - VALIDACIÓN DE PROCESOS 2
Laura Camila Flórez Riaño, Eliana Milena Montenegro Méndez, Johnny
Alexander López Salazar, Jose Jose Torralvo Martínez y William Hernando
Cortes Cardozo
Las librerías son conjuntos de funciones desarrolladas para realizar tareas específicas. En este caso:
readxl: importa archivos de Excel.
library(knitr)
datos <- read_excel("C:/Users/User/Downloads/PUNTO1.xlsx")
tabla_datos <- data.frame(
Dato = 1:nrow(datos),
`Resultado A` = datos$`Resultado A`,
`Resultado B` = datos$`Resultado B`
)
kable(
tabla_datos,
row.names = FALSE,
align = "ccc",
caption = "Tabla 1. Concentración del principio activo (mg/g) antes (Resultado A) y después (Resultado B) del estudio de estabilidad."
)
| Dato | Resultado.A | Resultado.B |
|---|---|---|
| 1 | 135.9 | 121.8 |
| 2 | 126.3 | 123.2 |
| 3 | 137.6 | 130.2 |
| 4 | 128.7 | 130.6 |
| 5 | 121.5 | 129.6 |
| 6 | 128.8 | 127.3 |
| 7 | 127.6 | 129.6 |
| 8 | 165.0 | 157.2 |
| 9 | 167.7 | 163.8 |
| 10 | 157.4 | 166.5 |
| 11 | 166.4 | 159.9 |
| 12 | 163.3 | 168.6 |
| 13 | 199.5 | 193.9 |
| 14 | 195.3 | 205.3 |
| 15 | 200.1 | 208.7 |
| 16 | 203.8 | 195.6 |
| 17 | 200.3 | 191.6 |
| 18 | 192.1 | 192.8 |
| 19 | 208.9 | 201.8 |
| 20 | 201.3 | 203.5 |
| 21 | 195.5 | 194.5 |
A <- datos$`Resultado A`
B <- datos$`Resultado B`
No genera una salida visible en el informe, ya que únicamente extrae las concentraciones iniciales (Resultado A) y finales (Resultado B) del estudio de estabilidad para preparar la información que será comparada mediante la prueba t pareada.
Este paso organiza los datos correspondientes a la concentración inicial y a la concentración final del principio activo evaluado después de las condiciones de humedad, temperatura y tiempo establecidas en el estudio de estabilidad. Estas dos variables constituyen las mediciones pareadas sobre las que se determinará si existe una diferencia estadísticamente significativa en la concentración del activo tras someterlo a dichas condiciones, mediante la aplicación de la prueba t para datos pareados.
diferencias <- A - B
tabla_diferencias <- data.frame(
Dato = 1:length(diferencias),
Diferencia = round(diferencias, 2)
)
library(knitr)
kable(
tabla_diferencias,
row.names = FALSE,
align = "cc",
caption = "Tabla 2. Diferencias de concentración (mg/g) entre el Resultado A y el Resultado B."
)
| Dato | Diferencia |
|---|---|
| 1 | 14.1 |
| 2 | 3.1 |
| 3 | 7.4 |
| 4 | -1.9 |
| 5 | -8.1 |
| 6 | 1.5 |
| 7 | -2.0 |
| 8 | 7.8 |
| 9 | 3.9 |
| 10 | -9.1 |
| 11 | 6.5 |
| 12 | -5.3 |
| 13 | 5.6 |
| 14 | -10.0 |
| 15 | -8.6 |
| 16 | 8.2 |
| 17 | 8.7 |
| 18 | -0.7 |
| 19 | 7.1 |
| 20 | -2.2 |
| 21 | 1.0 |
Entrega un vector con la diferencia entre la concentración inicial (Resultado A) y la concentración final (Resultado B) para cada una de las muestras evaluadas en el estudio de estabilidad.
Las diferencias calculadas representan el cambio en la concentración del principio activo después de ser sometido a las condiciones de humedad, temperatura y tiempo establecidas en el estudio. Estas diferencias constituyen la base para evaluar el supuesto de normalidad mediante la prueba de Shapiro-Wilk, requisito previo para la aplicación de la prueba t para datos pareados.
La prueba de Shapiro-Wilk se emplea para verificar si las diferencias entre la concentración inicial y la concentración final del principio activo presentan una distribución normal. Este es el principal supuesto para aplicar la prueba t para datos pareados.
Shapiro <- shapiro.test(diferencias)
print(Shapiro)
##
## Shapiro-Wilk normality test
##
## data: diferencias
## W = 0.95117, p-value = 0.3583
cat("p-valor =", Shapiro$p.value, "\n")
## p-valor = 0.3583121
if(Shapiro$p.value > 0.05){
cat("Las diferencias presentan distribución normal.\n")
}else{
cat("Las diferencias no presentan distribución normal.\n")
}
## Las diferencias presentan distribución normal.
La prueba entrega el estadístico W y el p-valor, además de una interpretación automática que indica si las diferencias entre las concentraciones iniciales y finales presentan una distribución normal.
La prueba de Shapiro-Wilk evalúa el supuesto de normalidad de las diferencias obtenidas entre las mediciones pareadas (Resultado A − Resultado B).
Hipótesis nula (H₀): Las diferencias presentan una distribución normal. Hipótesis alternativa (H₁): Las diferencias no presentan una distribución normal.
Con un nivel de significancia de α = 0.05:
Si p > 0.05, no se rechaza H₀ y se considera que las diferencias presentan distribución normal. Si p < 0.05, se rechaza H₀ y se concluye que las diferencias no presentan distribución normal.
Como el p-valor = 0.3583 es mayor que 0.05, no se rechaza la hipótesis nula (H₀). Por lo tanto, las diferencias entre la concentración inicial y la concentración final del principio activo presentan una distribución normal, cumpliéndose el supuesto de normalidad necesario para aplicar la prueba t para datos pareados.
La prueba t para datos pareados permite determinar si existe una diferencia estadísticamente significativa entre la concentración inicial (Resultado A) y la concentración final (Resultado B) del principio activo después de someter las muestras a las condiciones del estudio de estabilidad.
# 1.6. PRUEBA t PARA DATOS PAREADOS
Prueba_t <- t.test(A, B, paired = TRUE)
print(Prueba_t)
##
## Paired t-test
##
## data: A and B
## t = 0.86028, df = 20, p-value = 0.3998
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## -1.831830 4.403258
## sample estimates:
## mean difference
## 1.285714
cat("p-valor =", Prueba_t$p.value, "\n")
## p-valor = 0.3998315
if(Prueba_t$p.value > 0.05){
cat("No existe diferencia estadísticamente significativa entre la concentración inicial y final.\n")
}else{
cat("Existe diferencia estadísticamente significativa entre la concentración inicial y final.\n")
}
## No existe diferencia estadísticamente significativa entre la concentración inicial y final.
La prueba entrega el estadístico t, los grados de libertad (df), el intervalo de confianza del 95 %, la media de las diferencias y el p-valor, además de una interpretación automática que indica si existe o no una diferencia estadísticamente significativa entre la concentración inicial y la concentración final del principio activo.
La prueba t para datos pareados compara las concentraciones iniciales y finales de un mismo conjunto de muestras para establecer si las condiciones de humedad, temperatura y tiempo del estudio de estabilidad produjeron un cambio significativo en la concentración del principio activo.
Hipótesis nula (H₀): No existe diferencia estadísticamente significativa entre la concentración inicial y la concentración final del principio activo. Hipótesis alternativa (H₁): Existe diferencia estadísticamente significativa entre la concentración inicial y la concentración final del principio activo.
Con un nivel de significancia de α = 0.05:
Si p > 0.05, no se rechaza la hipótesis nula y se concluye que no existe diferencia estadísticamente significativa entre ambas concentraciones. Si p < 0.05, se rechaza la hipótesis nula y se concluye que existe diferencia estadísticamente significativa entre ambas concentraciones.
Como el p-valor = 0.3998 es mayor que 0.05, no se rechaza la hipótesis nula (H₀). Por lo tanto, no existe una diferencia estadísticamente significativa entre la concentración inicial (Resultado A) y la concentración final (Resultado B) del principio activo después de someter las muestras a las condiciones de humedad, temperatura y tiempo establecidas en el estudio de estabilidad.
Con un nivel de significancia de α = 0.05, se concluye que las condiciones del estudio de estabilidad no produjeron un cambio estadísticamente significativo en la concentración del principio activo. En consecuencia, los resultados obtenidos indican que la concentración del activo se mantuvo estable bajo las condiciones evaluadas.
#——————————————————————————————————-
library(readxl)
library(qcc)
library(SixSigma)
library(knitr)
datos <- read_excel("C:/Users/User/Downloads/PUNTO2Y3.xlsx")
tabla_datos <- data.frame(
Lote = datos$Lote,
datos[,-1]
)
kable(
tabla_datos,
row.names = FALSE,
align = "c",
caption = "Tabla 3. Datos utilizados para la construcción de las cartas de control."
)
| Lote | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 | X22 | X23 | X24 | X25 | X26 | X27 | X28 | X29 | X30 | X31 | X32 | X33 | X34 | X35 | X36 | X37 | X38 | X39 | X40 | X41 | X42 | X43 | X44 | X45 | X46 | X47 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Item1 | 98.7 | 93.3 | 93.8 | 107.6 | 102.2 | 111.6 | 117.5 | 85.6 | 113.9 | 77.9 | 101.5 | 86.2 | 101.6 | 99.4 | 78.3 | 98.0 | 93.4 | 95.0 | 82.1 | 115.9 | 104.5 | 106.1 | 78.2 | 117.5 | 86.4 | 75.9 | 124.1 | 93.1 | 97.3 | 110.3 | 107.8 | 101.3 | 97.4 | 103.2 | 75.3 | 92.0 | 91.3 | 81.5 | 79.9 | 87.6 | 119.1 | 105.2 | 102.7 | 88.5 | 103.2 | 107.5 | 118.3 |
| Item2 | 91.1 | 96.6 | 91.8 | 85.1 | 76.3 | 80.1 | 111.5 | 82.0 | 96.5 | 97.7 | 111.7 | 78.2 | 117.2 | 84.7 | 81.6 | 89.5 | 95.6 | 99.5 | 104.4 | 91.4 | 106.0 | 84.3 | 120.6 | 82.4 | 81.6 | 103.6 | 110.5 | 99.6 | 110.4 | 102.1 | 100.0 | 87.8 | 95.4 | 89.9 | 123.4 | 121.3 | 118.7 | 94.9 | 103.9 | 115.9 | 119.8 | 109.1 | 78.5 | 123.1 | 71.0 | 113.4 | 80.8 |
| Item3 | 104.8 | 106.4 | 119.9 | 112.8 | 75.7 | 90.8 | 99.1 | 100.9 | 84.9 | 106.9 | 90.6 | 89.4 | 117.7 | 100.6 | 121.7 | 83.8 | 107.9 | 118.2 | 111.0 | 98.1 | 102.9 | 76.9 | 89.3 | 121.2 | 84.6 | 86.0 | 82.2 | 83.1 | 94.1 | 115.2 | 87.6 | 120.9 | 83.4 | 110.0 | 81.9 | 106.7 | 96.1 | 102.4 | 93.8 | 86.6 | 114.7 | 91.0 | 75.8 | 110.1 | 83.9 | 106.6 | 112.5 |
| Item4 | 80.3 | 100.4 | 120.8 | 94.8 | 105.6 | 92.9 | 85.5 | 106.2 | 82.8 | 85.6 | 123.9 | 102.7 | 120.6 | 79.9 | 86.3 | 117.6 | 81.6 | 102.0 | 90.2 | 120.8 | 83.6 | 117.4 | 80.6 | 93.2 | 109.0 | 101.5 | 85.0 | 103.9 | 77.9 | 65.1 | 124.6 | 103.8 | 107.1 | 102.7 | 117.4 | 97.7 | 102.4 | 96.5 | 101.0 | 107.5 | 89.0 | 105.7 | 118.9 | 112.4 | 89.6 | 84.0 | 114.3 |
| Item5 | 83.7 | 76.2 | 95.1 | 78.4 | 88.4 | 94.7 | 121.1 | 121.4 | 95.8 | 97.2 | 88.1 | 75.2 | 99.6 | 120.1 | 102.7 | 116.5 | 90.4 | 107.0 | 76.1 | 101.3 | 115.9 | 104.3 | 107.1 | 99.4 | 81.2 | 114.6 | 105.1 | 122.6 | 75.9 | 108.9 | 86.2 | 96.3 | 108.7 | 116.5 | 80.6 | 115.4 | 120.1 | 105.7 | 120.2 | 121.2 | 84.4 | 122.3 | 92.4 | 109.0 | 83.5 | 89.9 | 86.8 |
| Item6 | 116.9 | 82.3 | 113.6 | 114.0 | 96.4 | 115.8 | 81.5 | 97.8 | 90.0 | 119.0 | 84.9 | 90.7 | 122.6 | 82.2 | 91.4 | 91.1 | 81.6 | 88.4 | 111.4 | 105.6 | 82.8 | 119.2 | 85.0 | 117.4 | 118.7 | 101.5 | 99.0 | 106.5 | 106.9 | 115.3 | 97.1 | 93.8 | 107.0 | 79.2 | 81.5 | 97.7 | 77.0 | 77.8 | 115.7 | 105.1 | 114.7 | 85.1 | 100.5 | 109.5 | 96.5 | 76.9 | 119.8 |
| Item7 | 90.5 | 92.5 | 103.4 | 116.5 | 82.4 | 99.4 | 93.6 | 122.7 | 99.6 | 104.7 | 85.8 | 114.3 | 77.1 | 105.0 | 115.1 | 101.6 | 81.6 | 78.0 | 108.7 | 95.3 | 92.7 | 103.8 | 110.1 | 92.3 | 119.2 | 93.0 | 118.7 | 94.2 | 105.3 | 82.3 | 117.4 | 122.4 | 75.7 | 104.6 | 104.8 | 87.0 | 103.9 | 81.9 | 111.3 | 80.7 | 83.8 | 110.8 | 82.3 | 113.8 | 123.1 | 80.4 | 112.1 |
| Item8 | 90.9 | 90.1 | 88.5 | 109.5 | 105.5 | 100.1 | 118.4 | 110.8 | 92.9 | 80.3 | 111.6 | 75.2 | 114.7 | 84.9 | 78.4 | 105.6 | 111.0 | 123.5 | 105.5 | 93.7 | 121.3 | 90.2 | 83.0 | 107.6 | 87.7 | 93.6 | 86.9 | 114.3 | 92.1 | 86.0 | 103.6 | 103.9 | 80.4 | 95.6 | 82.2 | 119.3 | 82.1 | 87.8 | 75.1 | 124.3 | 117.2 | 113.0 | 106.4 | 103.0 | 83.2 | 121.5 | 92.6 |
Para construir las cartas de control por subgrupos, es necesario organizar la base de datos en el formato requerido por la librería qcc. Para ello, se elimina la columna correspondiente a la identificación de los lotes, se convierte la información en una matriz y posteriormente se transpone, de manera que cada fila represente un subgrupo (lote) y cada columna corresponda a una de las ocho mediciones realizadas.
datos_control <- datos[,-1]
# Convertir a matriz
datos_control <- as.matrix(datos_control)
# Transponer la matriz para que cada fila sea un lote
datos_control <- t(datos_control)
La carta de control X̄ permite evaluar la estabilidad del promedio del contenido del principio activo entre los diferentes lotes de producción. Adicionalmente, se incluyen los límites de especificación establecidos para el producto (LI = 80, Contenido esperado = 100 y LS = 120), con el fin de comparar el comportamiento del proceso frente a los requisitos de calidad.
Carta_X <- qcc(
datos_control,
type = "xbar",
std.dev = "R",
plot = FALSE
)
medias <- Carta_X$statistics
plot(
medias,
type = "b",
pch = 16,
ylim = c(75,125),
xlab = "Lote",
ylab = "Contenido del principio activo",
main = "Carta de Control X̄ para el Contenido del Principio Activo"
)
# Línea central y límites de control
abline(h = Carta_X$center, col = "black", lwd = 2)
abline(h = Carta_X$limits[1], col = "black", lty = 2, lwd = 2)
abline(h = Carta_X$limits[2], col = "black", lty = 2, lwd = 2)
# Límites de especificación
abline(h = 80, col = "blue", lty = 3, lwd = 2)
abline(h = 100, col = "red", lty = 3, lwd = 2)
abline(h = 120, col = "blue", lty = 3, lwd = 2)
legend(
"topright",
legend = c(
"LCL",
"CL",
"UCL",
"LI = 80",
"Contenido esperado = 100",
"LS = 120"
),
col = c("black","black","black","blue","red","blue"),
lty = c(2,1,2,3,3,3),
lwd = 2,
bty = "n",
cex = 0.8
)
La carta de control X̄ muestra que las medias de los 47 lotes permanecen dentro de los límites de control (LCL = 83.98 y UCL = 114.00), sin observarse puntos fuera de dichos límites ni patrones evidentes de causas especiales de variación, como rachas, tendencias o ciclos. Esto indica que el promedio del contenido del principio activo se mantiene estable y que el proceso se encuentra bajo control estadístico respecto a su tendencia central.
Adicionalmente, al comparar las medias de los subgrupos con los límites de especificación (LI = 80, Contenido esperado = 100 y LS = 120), se observa que todas las medias permanecen dentro del intervalo especificado y próximas al valor objetivo, lo que evidencia que el proceso produce lotes cuyo contenido promedio del principio activo cumple con las especificaciones establecidas.
En consecuencia, no se identifican evidencias de causas especiales de variación, por lo que el proceso presenta un comportamiento estable y consistente. No obstante, la capacidad del proceso deberá confirmarse mediante el cálculo de los índices Cp, Cpk, Pp, Ppk y Cpm, los cuales permitirán determinar si, además de ser estable, el proceso es capaz de cumplir de forma consistente con las especificaciones del producto.
La carta de control R permite evaluar la variabilidad existente dentro de cada subgrupo (lote) durante el proceso de fabricación. Esta carta complementa la carta X̄, ya que mientras la carta de promedios analiza la estabilidad de la tendencia central del proceso, la carta R verifica si la dispersión de las mediciones permanece constante a lo largo del tiempo.
Carta_R <- qcc(
datos_control,
type = "R",
title = "Carta de Control R para la Variabilidad del Proceso"
)
La carta de control R evidencia que los rangos correspondientes a los 47 subgrupos permanecen dentro de los límites de control (LCL = 5.25 y UCL = 71.89). Esto indica que la variabilidad observada entre las ocho mediciones realizadas en cada lote se mantiene estable durante todo el proceso, sin presentarse incrementos o disminuciones anormales en la dispersión de los datos.
Adicionalmente, no se observan puntos fuera de los límites de control ni secuencias o patrones que sugieran la presencia de causas especiales de variación, como cambios bruscos o comportamientos inusuales de la variabilidad entre los subgrupos. Por lo tanto, la dispersión observada corresponde únicamente a la variación natural (causas comunes) propia del proceso.
En consecuencia, la variabilidad del proceso se encuentra bajo control estadístico, lo que significa que las diferencias entre las mediciones de cada lote son consistentes y se mantienen estables a lo largo de la producción. Al cumplirse esta condición, la carta X̄ puede interpretarse con confianza para evaluar la estabilidad del promedio del contenido del principio activo y posteriormente realizar el análisis de capacidad del proceso.
Aunque la carta de control X̄ no presenta puntos fuera de los límites de control, se identificaron tres subgrupos que, por su cercanía a los límites de control, constituyen puntos que deben mantenerse bajo vigilancia:
Lote 13: presenta una media cercana al límite inferior de control (LCL), lo que podría estar asociado con variaciones en la dosificación del principio activo, diferencias en la mezcla o errores de pesaje.
Lote 38: muestra una media inferior al promedio del proceso, situación que podría relacionarse con variaciones en la materia prima, cambios en las condiciones de operación o ajustes del proceso.
Lote 44: presenta una media próxima al límite superior de control (UCL), lo que podría deberse a una ligera sobredosificación, descalibración del sistema de dosificación o diferencias en la homogeneización del lote.
En todos los casos, los puntos permanecen dentro de los límites de control, por lo que no constituyen evidencia de pérdida de control estadístico; sin embargo, representan observaciones que deben mantenerse bajo seguimiento como parte del control continuo del proceso.
El análisis de capacidad del proceso permite evaluar si la variabilidad natural del proceso es suficientemente pequeña para cumplir con las especificaciones establecidas (LI = 80 mg/g, Objetivo = 100 mg/g y LS = 120 mg/g). Para ello se calculan los índices de capacidad del proceso y se genera la gráfica correspondiente.
LI <- 80
LS <- 120
Objetivo <- 100
# Ajustes gráficos
par(
cex.main = 0.9, # Reduce el tamaño del título generado por qcc
mar = c(5,4,4,2) # Márgenes de la figura
)
Capacidad <- process.capability(
Carta_X,
spec.limits = c(LI, LS),
target = Objetivo
)
##
## Process Capability Analysis
##
## Call:
## process.capability(object = Carta_X, spec.limits = c(LI, LS), target = Objetivo)
##
## Number of obs = 376 Target = 100
## Center = 98.99 LSL = 80
## StdDev = 14.15 USL = 120
##
## Capability indices:
##
## Value 2.5% 97.5%
## Cp 0.4711 0.4374 0.5047
## Cp_l 0.4473 0.4083 0.4863
## Cp_u 0.4949 0.4538 0.5359
## Cp_k 0.4473 0.4008 0.4937
## Cpm 0.4699 0.4362 0.5035
##
## Exp<LSL 9% Obs<LSL 8.2%
## Exp>USL 6.9% Obs>USL 7.7%
datos_vector <- as.vector(datos_control)
media <- mean(datos_vector)
desv_global <- sd(datos_vector)
Pp <- (LS - LI)/(6*desv_global)
Ppk <- min(
(LS-media)/(3*desv_global),
(media-LI)/(3*desv_global)
)
cat("Pp =", round(Pp,3), "\n")
## Pp = 0.472
cat("Ppk =", round(Ppk,3), "\n")
## Ppk = 0.449
tabla_capacidad <- data.frame(
Indicador = c("Cp", "Cpk", "Pp", "Ppk", "Cpm"),
Valor = c(
0.471,
0.447,
round(Pp, 3),
round(Ppk, 3),
0.470
)
)
knitr::kable(
tabla_capacidad,
align = "cc",
caption = "Tabla 4. Indicadores de capacidad del proceso."
)
| Indicador | Valor |
|---|---|
| Cp | 0.471 |
| Cpk | 0.447 |
| Pp | 0.472 |
| Ppk | 0.449 |
| Cpm | 0.470 |
El índice Cpk evalúa la capacidad real del proceso considerando tanto la variabilidad como el centrado respecto a los límites de especificación. Como el valor obtenido (0.447) es menor que 1.00, se concluye que el proceso no es capaz de cumplir de manera consistente con las especificaciones establecidas (80–120 mg/g). Esto indica que existe una alta probabilidad de producir lotes con concentraciones fuera de los límites de aceptación, por lo que el proceso requiere acciones de mejora para reducir su variabilidad y optimizar su centrado.
El índice Pp mide el desempeño potencial del proceso utilizando la variabilidad global de todos los datos recopilados. El valor obtenido (0.472) es inferior a 1.00, lo que indica que la variación global del proceso es mayor que el intervalo permitido por las especificaciones. En consecuencia, el proceso no presenta la capacidad potencial suficiente para cumplir de forma consistente con los requisitos de calidad establecidos.
El índice Ppk representa el desempeño real del proceso considerando simultáneamente la variabilidad global y el desplazamiento de la media respecto al valor objetivo. Como el valor obtenido (0.449) es menor que 1.00, se concluye que el desempeño real del proceso es insuficiente, existiendo una probabilidad considerable de obtener productos fuera de especificación. Este resultado evidencia la necesidad de implementar acciones orientadas a disminuir la variabilidad y mejorar el control del proceso.
El índice Cpm evalúa la capacidad del proceso considerando tanto la variabilidad como la cercanía de la media al valor objetivo (100 mg/g). El valor obtenido (0.470) es inferior a 1.00, indicando que el proceso no es capaz de cumplir adecuadamente con las especificaciones cuando se tiene en cuenta el objetivo establecido. Esto significa que, aunque la media del proceso se encuentra próxima al valor nominal, la variabilidad existente es demasiado elevada para garantizar un cumplimiento consistente de las especificaciones.
Los índices Cp (0.471), Cpk (0.447), Pp (0.472), Ppk (0.449) y Cpm (0.470) son todos menores que 1.00, lo que demuestra que la variabilidad del proceso excede el rango permitido por las especificaciones (80–120 mg/g). Aunque las cartas X̄ y R indican que el proceso se encuentra bajo control estadístico (estable y sin evidencias de causas especiales de variación), el análisis de capacidad evidencia que el proceso no es apto para cumplir de forma consistente con las especificaciones del producto. Por tanto, es necesario implementar acciones de mejora enfocadas en reducir la variabilidad del proceso y aumentar su capacidad antes de considerar que el proceso es adecuado para una producción rutinaria.
#——————————————————————————————————-
library(readxl)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.5.3
library(outliers)
## Warning: package 'outliers' was built under R version 4.5.2
library(car)
## Warning: package 'car' was built under R version 4.5.3
## Cargando paquete requerido: carData
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
datos <- read_excel("C:/Users/User/Downloads/PUNTO4Y5.xlsx")
## New names:
## • `351.6` -> `351.6...16`
## • `351.6` -> `351.6...18`
# Asignar nombres a las columnas
nombres_columnas <- c(
"Proceso",
paste0("X", 1:24)
)
colnames(datos) <- nombres_columnas
# Crear tabla para el informe
tabla_datos <- datos
# Mostrar tabla
knitr::kable(
tabla_datos,
row.names = FALSE,
align = "c",
caption = "Tabla 5. Datos utilizados para la comparación de los diferentes procesos."
)
| Proceso | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 | X22 | X23 | X24 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Proceso 2 | 358.1 | 351.3 | 359.6 | 353.2 | 350.8 | 356.6 | 358.3 | 351.6 | 350.1 | 352.6 | 359.2 | 352.0 | 350.9 | 355.7 | 355.1 | 353.1 | 350.2 | 355.5 | 359.5 | 355.6 | 351.6 | 358.5 | 358.2 | 355.7 |
| Proceso 3 | 355.1 | 366.0 | 358.4 | 350.9 | 369.7 | 368.3 | 368.9 | 366.0 | 352.3 | 351.8 | 353.2 | 347.7 | 355.3 | 346.5 | 358.2 | 352.8 | 334.0 | 336.1 | 349.8 | 337.7 | 343.6 | 340.0 | 342.5 | 360.6 |
| Proceso 4 | 337.8 | 337.9 | 341.9 | 334.7 | 320.5 | 323.8 | 332.9 | 320.2 | 331.0 | 325.6 | 329.1 | 324.6 | 329.4 | 329.6 | 337.2 | 320.6 | 323.9 | 338.3 | 343.0 | 326.6 | 331.5 | 342.2 | 344.9 | 345.9 |
| Proceso 5 | 344.8 | 346.0 | 349.5 | 342.4 | 343.3 | 345.3 | 346.8 | 346.0 | 346.1 | 345.5 | 348.4 | 344.9 | 349.2 | 347.7 | 347.9 | 345.2 | 347.3 | 345.1 | 346.2 | 343.1 | 349.1 | 349.2 | 342.5 | 349.7 |
| Proceso 6 | 335.9 | 362.7 | 367.0 | 363.8 | 356.1 | 351.4 | 362.3 | 377.9 | 376.9 | 388.6 | 373.5 | 376.1 | 397.0 | 351.0 | 389.5 | 370.8 | 365.7 | 376.7 | 384.3 | 392.1 | 358.5 | 355.8 | 387.3 | 379.9 |
| Proceso 7 | 330.1 | 321.2 | 332.2 | 331.3 | 326.2 | 338.4 | 345.4 | 331.2 | 348.4 | 340.6 | 328.4 | 324.6 | 349.3 | 331.4 | 337.6 | 347.5 | 332.7 | 343.0 | 326.1 | 332.9 | 331.7 | 334.4 | 333.2 | 342.9 |
| Proceso 9 | 358.5 | 351.9 | 357.4 | 356.6 | 355.8 | 354.5 | 359.9 | 353.7 | 353.8 | 354.8 | 357.7 | 356.0 | 352.2 | 353.7 | 353.5 | 353.0 | 354.7 | 356.8 | 355.1 | 357.7 | 359.4 | 358.8 | 356.8 | 352.2 |
# Cambiar el nombre de la primera columna
colnames(datos)[1] <- "Proceso"
# Convertir todas las demás columnas a numéricas
datos[-1] <- lapply(datos[-1], as.numeric)
# Crear los datos en formato largo
datos_largo <- pivot_longer(
datos,
cols = -Proceso,
names_to = "Muestra",
values_to = "Resultado"
)
knitr::kable(
head(datos_largo, 15),
row.names = FALSE,
align = "c",
caption = "Tabla 6. Datos reorganizados en formato largo para el análisis estadístico (primeras 15 observaciones)."
)
| Proceso | Muestra | Resultado |
|---|---|---|
| Proceso 2 | X1 | 358.1 |
| Proceso 2 | X2 | 351.3 |
| Proceso 2 | X3 | 359.6 |
| Proceso 2 | X4 | 353.2 |
| Proceso 2 | X5 | 350.8 |
| Proceso 2 | X6 | 356.6 |
| Proceso 2 | X7 | 358.3 |
| Proceso 2 | X8 | 351.6 |
| Proceso 2 | X9 | 350.1 |
| Proceso 2 | X10 | 352.6 |
| Proceso 2 | X11 | 359.2 |
| Proceso 2 | X12 | 352.0 |
| Proceso 2 | X13 | 350.9 |
| Proceso 2 | X14 | 355.7 |
| Proceso 2 | X15 | 355.1 |
Los datos fueron transformados de formato ancho a formato largo, obteniendo las variables Proceso, Muestra y Resultado, estructura requerida para la aplicación del análisis de varianza (ANOVA) y las pruebas estadísticas posteriores.
# Extraer los datos del Proceso 1
Proceso1 <- as.numeric(datos[1, -1])
# Prueba de Grubbs
Grubbs <- outliers::grubbs.test(Proceso1)
Grubbs
##
## Grubbs test for one outlier
##
## data: Proceso1
## G = 1.5016, U = 0.8977, p-value = 1
## alternative hypothesis: highest value 359.6 is an outlier
La prueba de Grubbs se aplicó para identificar la presencia de un posible valor atípico en los resultados del Proceso 1. Se obtuvo un estadístico G = 1.5016 y un p-valor = 1.000. Debido a que el p-valor es mayor que 0.05, no se rechaza la hipótesis nula; por lo tanto, no existe evidencia estadísticamente significativa de valores atípicos en el Proceso 1.
boxplot(
Proceso1,
main = "Diagrama de Caja y Bigotes - Proceso 1",
ylab = "Resultado",
col = "lightblue"
)
El diagrama de caja y bigotes del Proceso 1 no presenta observaciones fuera de los límites de los bigotes, por lo que gráficamente no se evidencian valores atípicos (outliers). Este resultado coincide con la prueba estadística de Grubbs, la cual indicó que no existen valores atípicos estadísticamente significativos para este proceso.
Se realizó un análisis de varianza (ANOVA) de una vía con el fin de determinar si existen diferencias estadísticamente significativas entre las medias de los diferentes procesos evaluados.
ANOVA <- aov(Resultado ~ Proceso, data = datos_largo)
Resultado_ANOVA <- summary(ANOVA)
Resultado_ANOVA
## Df Sum Sq Mean Sq F value Pr(>F)
## Proceso 6 25193 4199 59.91 <2e-16 ***
## Residuals 161 11283 70
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El análisis de varianza (ANOVA) arrojó un valor de F = 59.91 y un p-valor < 2 × 10⁻¹⁶. Debido a que el p-valor es menor que 0.05, se rechaza la hipótesis nula, concluyendo que existen diferencias estadísticamente significativas entre las medias de los procesos evaluados. En consecuencia, es necesario realizar una prueba de comparaciones múltiples para identificar cuáles procesos presentan dichas diferencias.
Los residuos del modelo ANOVA fueron obtenidos con el fin de evaluar los supuestos de normalidad y homocedasticidad requeridos para este análisis.
# Extraer los residuos del modelo ANOVA
residuos <- residuals(ANOVA)
# Mostrar los primeros residuos obtenidos
tabla_residuos <- data.frame(
Residuo = head(residuos, 15)
)
knitr::kable(
tabla_residuos,
row.names = FALSE,
align = "c",
caption = "Tabla 7. Primeros residuos obtenidos del modelo ANOVA."
)
| Residuo |
|---|
| 3.3916667 |
| -3.4083333 |
| 4.8916667 |
| -1.5083333 |
| -3.9083333 |
| 1.8916667 |
| 3.5916667 |
| -3.1083333 |
| -4.6083333 |
| -2.1083333 |
| 4.4916667 |
| -2.7083333 |
| -3.8083333 |
| 0.9916667 |
| 0.3916667 |
Interpretación
Se obtuvieron los residuos del modelo ANOVA, los cuales representan la diferencia entre los valores observados y los valores estimados por el modelo. Estos residuos serán utilizados para verificar los supuestos de normalidad y homocedasticidad mediante pruebas estadísticas y métodos gráficos.
Se aplicó la prueba de Shapiro-Wilk para evaluar si los residuos del modelo ANOVA siguen una distribución normal.
Shapiro <- shapiro.test(residuos)
print(Shapiro)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.9622, p-value = 0.0001592
cat("\np-valor =", format(Shapiro$p.value, scientific = TRUE), "\n\n")
##
## p-valor = 1.59153e-04
if(Shapiro$p.value > 0.05){
cat("Conclusión: Los residuos presentan distribución normal.\n")
}else{
cat("Conclusión: Los residuos no presentan distribución normal.\n")
}
## Conclusión: Los residuos no presentan distribución normal.
La prueba de Shapiro-Wilk arrojó un estadístico W = 0.9622 y un p-valor = 0.0001592. Como el p-valor es menor que 0.05, se rechaza la hipótesis nula de normalidad, concluyéndose que los residuos del modelo no presentan una distribución normal.
Con el fin de complementar la evaluación de la normalidad de los residuos, se elaboró un gráfico de probabilidad normal (Q-Q Plot), el cual permite comparar visualmente la distribución de los residuos con una distribución normal teórica.
qqnorm(
residuos,
main = "Gráfico Q-Q de los Residuos",
pch = 19
)
qqline(
residuos,
col = "red",
lwd = 2
)
En el gráfico Q-Q se observa que varios residuos se desvían de la línea de referencia, especialmente en los extremos de la distribución. Este comportamiento indica que los residuos no siguen una distribución normal, resultado que coincide con la prueba de Shapiro-Wilk realizada previamente.
Con el propósito de complementar la evaluación de la normalidad de los residuos, se construyó un histograma que permite observar la forma de la distribución de los residuos del modelo ANOVA.
hist(
residuos,
main = "Histograma de los Residuos",
xlab = "Residuos",
ylab = "Frecuencia",
col = "lightgreen",
border = "black"
)
El histograma de los residuos presenta una distribución aproximadamente acampanada; sin embargo, se observan desviaciones respecto a la forma esperada de una distribución normal. Este comportamiento es consistente con los resultados obtenidos mediante la prueba de Shapiro-Wilk y el gráfico Q-Q, los cuales indican que los residuos del modelo no siguen una distribución normal.
Con el fin de verificar el supuesto de homocedasticidad del modelo ANOVA, se aplicó la prueba de Levene para evaluar la igualdad de varianzas entre los diferentes procesos.
Levene <- leveneTest(
Resultado ~ Proceso,
data = datos_largo
)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
print(Levene)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 6 15.718 3.636e-14 ***
## 161
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\np-valor =", format(Levene$`Pr(>F)`[1], scientific = TRUE), "\n\n")
##
## p-valor = 3.63626e-14
if(Levene$`Pr(>F)`[1] > 0.05){
cat("Conclusión: Los residuos presentan homogeneidad de varianzas.\n")
}else{
cat("Conclusión: Los residuos no presentan homogeneidad de varianzas.\n")
}
## Conclusión: Los residuos no presentan homogeneidad de varianzas.
La prueba de Levene presentó un F = 15.718 y un p-valor = 3.636 × 10⁻¹⁴. Debido a que el p-valor es menor que 0.05, se rechaza la hipótesis nula de igualdad de varianzas. Por lo tanto, los residuos no presentan homogeneidad de varianzas, indicando que el supuesto de homocedasticidad del modelo ANOVA no se cumple.
Debido a que el análisis de varianza (ANOVA) evidenció diferencias estadísticamente significativas entre los procesos, se aplicó la prueba de comparaciones múltiples de Tukey (HSD) para identificar cuáles pares de procesos presentan diferencias significativas.
p_anova <- summary(ANOVA)[[1]]$`Pr(>F)`[1]
if(p_anova < 0.05){
cat("El ANOVA fue significativo (p < 0.05).\n")
cat("Se realiza la prueba de comparaciones múltiples de Tukey.\n\n")
Tukey <- TukeyHSD(ANOVA)
print(Tukey)
plot(Tukey)
}else{
cat("El ANOVA no fue significativo (p ≥ 0.05).\n")
cat("No se realiza la prueba de Tukey.\n")
}
## El ANOVA fue significativo (p < 0.05).
## Se realiza la prueba de comparaciones múltiples de Tukey.
##
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Resultado ~ Proceso, data = datos_largo)
##
## $Proceso
## diff lwr upr p adj
## Proceso 3-Proceso 2 -1.9833333 -9.199266 5.2325995 0.9825298
## Proceso 4-Proceso 2 -22.4958333 -29.711766 -15.2799005 0.0000000
## Proceso 5-Proceso 2 -8.4083333 -15.624266 -1.1924005 0.0113084
## Proceso 6-Proceso 2 16.1583333 8.942401 23.3742662 0.0000000
## Proceso 7-Proceso 2 -19.6791667 -26.895099 -12.4632338 0.0000000
## Proceso 9-Proceso 2 0.8958333 -6.320099 8.1117662 0.9997903
## Proceso 4-Proceso 3 -20.5125000 -27.728433 -13.2965672 0.0000000
## Proceso 5-Proceso 3 -6.4250000 -13.640933 0.7909328 0.1158341
## Proceso 6-Proceso 3 18.1416667 10.925734 25.3575995 0.0000000
## Proceso 7-Proceso 3 -17.6958333 -24.911766 -10.4799005 0.0000000
## Proceso 9-Proceso 3 2.8791667 -4.336766 10.0950995 0.8965423
## Proceso 5-Proceso 4 14.0875000 6.871567 21.3034328 0.0000006
## Proceso 6-Proceso 4 38.6541667 31.438234 45.8700995 0.0000000
## Proceso 7-Proceso 4 2.8166667 -4.399266 10.0325995 0.9059471
## Proceso 9-Proceso 4 23.3916667 16.175734 30.6075995 0.0000000
## Proceso 6-Proceso 5 24.5666667 17.350734 31.7825995 0.0000000
## Proceso 7-Proceso 5 -11.2708333 -18.486766 -4.0549005 0.0001303
## Proceso 9-Proceso 5 9.3041667 2.088234 16.5200995 0.0031702
## Proceso 7-Proceso 6 -35.8375000 -43.053433 -28.6215672 0.0000000
## Proceso 9-Proceso 6 -15.2625000 -22.478433 -8.0465672 0.0000001
## Proceso 9-Proceso 7 20.5750000 13.359067 27.7909328 0.0000000
La prueba de Tukey permitió identificar los pares de procesos que presentan diferencias estadísticamente significativas y aquellos que no presentan diferencias significativas (α = 0.05).
tabla_tukey <- data.frame(
`Comparación` = c(
"Proceso 4 vs Proceso 2",
"Proceso 5 vs Proceso 2",
"Proceso 6 vs Proceso 2",
"Proceso 7 vs Proceso 2",
"Proceso 4 vs Proceso 3",
"Proceso 6 vs Proceso 3",
"Proceso 7 vs Proceso 3",
"Proceso 5 vs Proceso 4",
"Proceso 6 vs Proceso 4",
"Proceso 9 vs Proceso 4",
"Proceso 6 vs Proceso 5",
"Proceso 7 vs Proceso 5",
"Proceso 9 vs Proceso 5",
"Proceso 7 vs Proceso 6",
"Proceso 9 vs Proceso 6",
"Proceso 9 vs Proceso 7",
"Proceso 3 vs Proceso 2",
"Proceso 5 vs Proceso 3",
"Proceso 9 vs Proceso 2",
"Proceso 9 vs Proceso 3",
"Proceso 7 vs Proceso 4"
),
`Resultado` = c(
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Diferencia significativa",
"Sin diferencia significativa",
"Sin diferencia significativa",
"Sin diferencia significativa",
"Sin diferencia significativa",
"Sin diferencia significativa"
)
)
knitr::kable(
tabla_tukey,
row.names = FALSE,
align = "c",
caption = "Tabla 8. Resultados de la prueba de comparaciones múltiples de Tukey."
)
| Comparación | Resultado |
|---|---|
| Proceso 4 vs Proceso 2 | Diferencia significativa |
| Proceso 5 vs Proceso 2 | Diferencia significativa |
| Proceso 6 vs Proceso 2 | Diferencia significativa |
| Proceso 7 vs Proceso 2 | Diferencia significativa |
| Proceso 4 vs Proceso 3 | Diferencia significativa |
| Proceso 6 vs Proceso 3 | Diferencia significativa |
| Proceso 7 vs Proceso 3 | Diferencia significativa |
| Proceso 5 vs Proceso 4 | Diferencia significativa |
| Proceso 6 vs Proceso 4 | Diferencia significativa |
| Proceso 9 vs Proceso 4 | Diferencia significativa |
| Proceso 6 vs Proceso 5 | Diferencia significativa |
| Proceso 7 vs Proceso 5 | Diferencia significativa |
| Proceso 9 vs Proceso 5 | Diferencia significativa |
| Proceso 7 vs Proceso 6 | Diferencia significativa |
| Proceso 9 vs Proceso 6 | Diferencia significativa |
| Proceso 9 vs Proceso 7 | Diferencia significativa |
| Proceso 3 vs Proceso 2 | Sin diferencia significativa |
| Proceso 5 vs Proceso 3 | Sin diferencia significativa |
| Proceso 9 vs Proceso 2 | Sin diferencia significativa |
| Proceso 9 vs Proceso 3 | Sin diferencia significativa |
| Proceso 7 vs Proceso 4 | Sin diferencia significativa |
El análisis de varianza (ANOVA) evidenció diferencias estadísticamente significativas entre los procesos evaluados (p < 0.05). La prueba de comparaciones múltiples de Tukey permitió identificar los pares de procesos que presentan diferencias significativas en sus medias, confirmando que no todos los procesos generan resultados equivalentes.
La evaluación de valores atípicos realizada únicamente para el Proceso 1, mediante la prueba de Grubbs y el diagrama de caja y bigotes, indicó que no existen valores atípicos estadísticamente significativos, por lo que los datos de este proceso pueden considerarse consistentes para el análisis.
La verificación de los supuestos del modelo ANOVA mostró que los residuos no presentan distribución normal según la prueba de Shapiro-Wilk y los métodos gráficos (Q-Q Plot e histograma). Asimismo, la prueba de Levene evidenció que no existe homogeneidad de varianzas entre los procesos, indicando que los supuestos clásicos del ANOVA no se cumplen completamente para los datos analizados.