En la operación “envasar queso untable en unidades de 250 gramos” se ha tomado una muestra aleatoria de un lote de quesos, tomando muestras de 4 unidades, cuyos valores se presentan a continuación:
Según lo estipulado, lo que se tiene es 20 muestras de 4 unidades por lote muestreado, lo cual se presenta de la siguiente manera:
datos <- c(250, 253, 235, 228, 261, 233, 255, 268, 263, 235, 252, 264, 250, 253, 235, 228, 263, 235, 237, 246, 248, 244, 250, 249, 248, 263, 250, 246, 257, 260, 237, 246, 248, 244, 250, 246, 225, 227, 257, 252, 257, 243, 263, 258, 237, 260, 247, 250, 230, 262, 245, 251, 257, 243, 263, 258, 230, 262, 251, 252, 253, 247, 236, 245, 240, 253, 238, 250, 237, 228, 251, 252, 253, 247, 238, 250, 268, 261, 238, 227)
dfdatos <- data.frame(matrix(datos, ncol=4, byrow = TRUE))
La especificación que debe cumplir el fabricante como estándar interno de producción es: peso de las unidades envasadas = 250 ± 5 gramos. Consideramos que μ y σ son conocidas (ya que se obtienen de las condiciones de trabajo de la dosificadora): μ=250 g, σ=5g.
Previo a la realización de los gráficos de control, se debe instalar la librería qcc, la cual nos permite realizar este tipo de representación, y se debe transformar la data al tipo data frame.
# install.packages("qcc")
library(qcc)
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
Gráfico de Control para la media (X)
n <- 20
a <- 3/sqrt(n)
XLCI <- 250-(a*5)
XLCS <- 250+(a*5)
qX <- qcc(dfdatos, type = c("xbar"), center = 250, limits = c(XLCI, XLCS), nsigmas = 3, title="Gráfico de control para la media (X)", xlab="Muestra", ylab="Peso medio de la muestra (g)")
print(qX)
## List of 11
## $ call : language qcc(data = dfdatos, type = c("xbar"), center = 250, limits = c(XLCI, XLCS), nsigmas = 3, title = "Gráfico de| __truncated__ ...
## $ type : chr "xbar"
## $ data.name : chr "dfdatos"
## $ data : num [1:20, 1:4] 250 261 263 250 263 248 248 257 248 225 ...
## ..- attr(*, "dimnames")=List of 2
## $ statistics: Named num [1:20] 242 254 254 242 245 ...
## ..- attr(*, "names")= chr [1:20] "1" "2" "3" "4" ...
## $ sizes : int [1:20] 4 4 4 4 4 4 4 4 4 4 ...
## $ center : num 250
## $ std.dev : num 11.3
## $ nsigmas : num 3
## $ limits : num [1, 1:2] 247 253
## ..- attr(*, "dimnames")=List of 2
## $ violations:List of 2
## - attr(*, "class")= chr "qcc"
Gráfico de Control para la desviación típica (S)
# Para una muestra de n = 20
b1 <- 0.491
b2 <- 1.433
c2 <- 0.9619
SLCI <- b1*5
SLC <- c2*5
SLCS <- b2*5
qS <- qcc(dfdatos, type="S", center = SLC, limits = c(SLCI, SLCS), nsigmas = 3, title="Gráfico de control para las desviaciones típicas (S)", xlab="Muestra", ylab="Desviación respecto a la media (g)")
print(qS)
## List of 11
## $ call : language qcc(data = dfdatos, type = "S", center = SLC, limits = c(SLCI, SLCS), nsigmas = 3, title = "Gráfico de contr| __truncated__ ...
## $ type : chr "S"
## $ data.name : chr "dfdatos"
## $ data : num [1:20, 1:4] 250 261 263 250 263 248 248 257 248 225 ...
## ..- attr(*, "dimnames")=List of 2
## $ statistics: Named num [1:20] 12 15.1 13.5 12 12.8 ...
## ..- attr(*, "names")= chr [1:20] "1" "2" "3" "4" ...
## $ sizes : int [1:20] 4 4 4 4 4 4 4 4 4 4 ...
## $ center : num 4.81
## $ std.dev : num 11.4
## $ nsigmas : num 3
## $ limits : num [1, 1:2] 2.46 7.17
## ..- attr(*, "dimnames")=List of 2
## $ violations:List of 2
## - attr(*, "class")= chr "qcc"
En función de los gráficos presentados, se puede considerar que este proceso no se encuentra bajo control estadístico, ya que la forma de la distribución es muy variable, al igual que los puntos de la desviación con respecto a la media. Esto indica una variabilidad e inestabilidad en el tiempo que dificulta mucho la predicción de los fenómenos que se puedan dar.
media <- mean(datos)
desvstd <- sd(datos)
El promedio es del proceso de producción es 247.78 gramos y la desviación estándar es 10.84 gramos.
A partir de estos se calcula el índice de capacidad del proceso:
process.capability(qX, spec.limits=c(XLCI,XLCS), target = 250)
##
## Process Capability Analysis
##
## Call:
## process.capability(object = qX, spec.limits = c(XLCI, XLCS), target = 250)
##
## Number of obs = 80 Target = 250
## Center = 250 LSL = 246.6
## StdDev = 11.29 USL = 253.4
##
## Capability indices:
##
## Value 2.5% 97.5%
## Cp 0.09901 0.08359 0.1144
## Cp_l 0.09901 0.03636 0.1617
## Cp_u 0.09901 0.03636 0.1617
## Cp_k 0.09901 0.02435 0.1737
## Cpm 0.09901 0.08369 0.1143
##
## Exp<LSL 38% Obs<LSL 40%
## Exp>USL 38% Obs>USL 26%
Tal como se puede observar en el gráfico, la desviación de los datos va considerablemente más allá de los límites establecidos con el LSL y USL, lo que indica un porcentaje de elevado de muestras que tendrían que ser descartadas por no cumplir con las especificaciones. Asimismo, se puede observar un Cp menor a 1 (0.224), lo que indica que el proceso es claramente no capaz.
Para calcular la probabilidad de encontrar unidades con pesos distintos a las variaciones aceptadas, se debe hallar el valor Z, que se obtiene de la siguiente manera:
# Cálculo de Z y probabilidad según límite inferior (i.e. encontrar uno con peso menor o igual al LCI)
ZLCI <- (245-250)/5
pLCI <- pnorm(ZLCI)
# Cálculo de Z y probabilidad según límite superior
ZLCS <- (255-250)/5
pLCS <- pnorm(ZLCS)
#Cálculo de probabilidad de encontrar un peso en el rango, ergo, de encontrar uno fuera del mismo
pinR <- pLCS - pLCI
pnotinR <- 1-pinR
La probabilidad de encontrar unidades de quesos envasados con pesos inferiores o iguales al límite inferior de especificación es de 15.87%.
PsupLS <- 0
i <- 1
for (i in datos){
if (i > 255) {
PsupLS <- PsupLS+1
}}
udtotales <- length(datos)
pcntjsupLS <- PsupLS/udtotales
Tomando como referencia las muestras representativas expuestas anteriormente, un 25% del lote de producción debería tener un peso mayor al límite superior de especificación (255 gramos).
Prango <- 0
i <- 1
for (i in datos){
if (i <= 255 & i >= 245) {
Prango <- Prango+1
}}
udtotales <- length(datos)
pcntjrango <- Prango/udtotales
Tomando como referencia las muestras representativas expuestas anteriormente, un 42.5% del lote de producción debería tener un peso dentro del rango establecido.
Para obtener el intervalo centrado en la media, se deben calcular los valores correspondientes a los percentiles 2.5% y 97.5%, lo cual se realiza de la siguiente manera:
#Se toman los datos de la media y desviación estándar como los obtenidos en el apartado 2.
prcntilinf <- qnorm(0.025, mean = media, sd = desvstd)
prcntilsup <- qnorm(0.975, mean = media, sd = desvstd)
El intervalo que deja fuera del mismo un 5% de la producción es 226.52-269.03.
Prango2 <- 0
i <- 1
condicion <- ""
for (i in datos){
if (i <= 275 & i >= 225) {
Prango2 <- Prango2+1
}}
udtotales <- length(datos)
pcntjrango2 <- Prango2/udtotales
if (pcntjrango2 >= 0.95){
condicion <- "sí"
} else {
condicion <- "no"
}
Tomando como referencia las muestras representativas expuestas anteriormente, un 100% del lote de producción debería tener un peso dentro del nuevo rango establecido, de modo que el lote sí sería aceptable.
Los siguientes datos son valores de pH de una muestra aleatoria de un lote de producción de yogures que sigue una distribución normal. Los estadísticos de la producción son: μ = 4.53 y σ = 0.14.
datospH <- c(4.25, 4.47, 4.41, 4.33, 4.31, 4.54, 4.43, 4.47, 4.35, 4.65, 4.60, 4.67, 4.42, 4.46, 4.27, 4.38, 4.42, 4.44, 4.63, 4.54, 4.56, 4.53, 4.54, 4.53, 4.55, 4.53, 4.53, 4.55, 4.61, 4.45, 4.40, 4.52, 4.55, 4.55, 4.53, 4.48, 4.63, 4.52, 4.37, 4.53)
hist(datospH, plot = TRUE, main = "Histrograma de muestreo del pH del yogur", ylab ="Frecuencia", xlab = "pH")
#Método gráfico
qqnorm(datospH)
qqline(datospH, col="red")
#Método analítico
shapiro.test(datospH)
##
## Shapiro-Wilk normality test
##
## data: datospH
## W = 0.96063, p-value = 0.176
Los datos no se podrían considerar como normales ni aproximadamente normales. A pesar de que la qqline tiene una angulación cercana a 45º, el test de normalidad de Shapiro-Wilk presenta un p valor mayor a 0.05, de modo que la hipótesis que indica que la data sigue una distribución normal es rechazada.
mu <- 4.53
dstd <- 0.14
muestrainrango <- 0
for (i in datospH) {
if (i <= mu+dstd & i >= mu-dstd){
muestrainrango <- muestrainrango+1
}
}
pcntjinrango <- muestrainrango/length(datospH)
Los datos que están dentro del rango de 1σ de la media es 82.5%.
ZpHinf <- (4.33-mu)/dstd
ppHinf <- pnorm(ZpHinf)
La probabilidad de encontrar yogures con pH inferior o igual a 4.33 es de 7.66%.
pHsup <- 0
for (i in datospH) {
if (i > 4.68){
pHsup <- pHsup+1
}
}
pcntjsuppH <- pHsup/length(datospH)
Un 0% del lote completo tendrá un pH superior a 4.68.
loteinrango <- 0
for (i in datospH) {
if (i <= 4.6 & i >= 4.4){
loteinrango <- loteinrango+1
}
}
porcentajeinrango <- loteinrango/length(datospH)
Un 70% del lote tendrá un pH entre 4.4 y 4.6.
Para obtener el intervalo que deje fuera del mismo al 3 por mil de la producción (o 0.3%), se deben calcular los valores correspondientes a los percentiles 0.15% y 99.85%, lo cual se realiza de la siguiente manera:
#Se toman los datos de la media y desviación estándar como los obtenidos en el apartado 2.
prcntilinfpH <- qnorm(0.0015, mean = mu, sd = dstd)
prcntilsuppH <- qnorm(0.9985, mean = mu, sd = dstd)
El intervalo que deja fuera del mismo un 3 por mil de la producción es 4.11-4.95.
Prango3 <- 0
condicion2 <- ""
for (i in datospH){
if (i <= 4.75 & i >= 4.25) {
Prango3 <- Prango3+1
}}
porcentajeinrango2 <- Prango3/length(datospH)
if (porcentajeinrango2 >= 0.997){
condicion2 <- "sí"
} else {
condicion2 <- "no"
}
En función de las muestras recopiladas, un 100% del lote de producción debería tener un pH dentro de las especificaciones planteadas, de modo que el lote sí sería aceptable.
CppH <- ((mu+dstd)-(mu-dstd))/6*dstd
condicion3 <- ""
status <- ""
frase <- ""
if (CppH >= 1){
condicion3 <- "sí"
status <- "mayor que"
if (CppH > 2){
frase <- "El proceso es muy capaz, de modo que se puede hacer una inspección del proceso y máquinas leve, llevándose a cabo cada turno."
} else {
if (CppH > 1.5) {
frase <- "El proceso es capaz, de modo que se debe hacer una inspección del proceso y máquinas moderada, llevándose a cabo cada 2 horas."
} else {
frase <- "El proceso es justamente capaz, de modo que se debe hacer una inspección del proceso y máquinas intensiva, llevándose a cabo cada 30 minutos."
}
}
} else {
condicion3 <- "no"
status <- "menor que"
frase <- "Es necesario hacer una inspección de todas las unidades."
}
El proceso no es capaz, ya que el valor del Cp es menor que 1. Es necesario hacer una inspección de todas las unidades.
Se envasa leche en envases tipo brick. El bote es defectuoso si al llenarlo gotea. Para controlar el proceso se toman 60 muestras, cada una de 25 unidades. El número de envases defectuosos para cada muestra tomada se indica en la siguiente tabla:
nrodefectuosos <- c(2, 5, 4, 1, 0, 4, 2, 6, 3, 1, 1, 6, 4, 2, 3, 2, 5, 4, 1, 0, 2, 2, 6, 3, 9, 1, 2, 4, 2, 3, 2, 0, 4, 0, 0, 2, 2, 6, 3, 12, 1, 3, 4, 2, 3, 2, 5, 4, 1, 0, 2, 2, 6, 3, 0, 1, 6, 4, 5, 3)
El tipo de gráfico de control más adecuado para este caso es el gráfico de control de atributos por unidades defectuosas (np), ya que los datos observados son valores absolutos de atributos contables en lugar de proporciones, y se maneja un tamaño de muestra constante (de 25 unidades).
defectuosostotales <- 0
k <- 60
n <- 25
for (i in nrodefectuosos){
defectuosostotales <- defectuosostotales+i
}
prob <- defectuosostotales/(k*n)
defLC <- n*prob
defLCI <- n*prob-(3*sqrt(n*prob*(1-prob)))
if (defLCI < 0) {
defLCI <- 0
}
defLCS <- n*prob+(3*sqrt(n*prob*(1-prob)))
qcc(nrodefectuosos, type="np", size=n, center = defLC, limits = c(defLCI, defLCS), title="Gráfico de control por unidades defectuosas (np)", xlab="Muestra", ylab="nº defectos")
## List of 11
## $ call : language qcc(data = nrodefectuosos, type = "np", sizes = n, center = defLC, limits = c(defLCI, defLCS), title = "Gráf| __truncated__ ...
## $ type : chr "np"
## $ data.name : chr "nrodefectuosos"
## $ data : num [1:60, 1] 2 5 4 1 0 4 2 6 3 1 ...
## ..- attr(*, "dimnames")=List of 2
## $ statistics: Named num [1:60] 2 5 4 1 0 4 2 6 3 1 ...
## ..- attr(*, "names")= chr [1:60] "1" "2" "3" "4" ...
## $ sizes : num [1:60] 25 25 25 25 25 25 25 25 25 25 ...
## $ center : num 2.97
## $ std.dev : num 1.62
## $ nsigmas : num 3
## $ limits : num [1, 1:2] 0 7.82
## ..- attr(*, "dimnames")=List of 2
## $ violations:List of 2
## - attr(*, "class")= chr "qcc"
Para realizar el análisis de probabilidad de aceptación del lote, dado que se trata de un caso en que el resultado es de tipo binomial (aceptado/no aceptado), se utiliza la distribución binomial de los datos. Se tienen los siguientes datos:
\(p\): probabilidad de éxito
\(q\): probabilidad de fracaso \((1 - p)\)
\(n\): número de ensayos
\(k\): número de éxitos deseados, en este caso: \((k ≤ 1)\)
Fórmula general de distribución binomial:
\(P(X=k)=\binom{n}{k} * p^{k} * q^{(n-k)}\)
donde: \(\binom{n}{k} = \frac{n!}{k!(n-k)!}\)
y: \(P(X≤1)=P(X=1)+P(X=0)\)
#Los valores de la probabilidad son tomados del apartado 2.
p <- prob
q <- 1-prob
n <- 5
k1 <- 1
k2 <- 0
P1 <- (factorial(n)/(factorial(k1)*factorial(n-k1))) * (p^k1) * (q^(n-k1))
P2 <- (factorial(n)/(factorial(k2)*factorial(n-k2))) * (p^k2) * (q^(n-k2))
P <- P1 + P2
La probabilidad de aceptar el lote expuesto anteriormente es de 88.97%.