Problema 1

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.

1. Representar los Gráficos de Control para la media (X) y desviaciones típicas (S). Observando los Gráficos de Control anteriores, explicar si puede decirse que el proceso está bajo control estadístico y qué significa que el proceso esté bajo control estadístico.

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.

2. Estimar la media y desviación estándar del proceso de producción con los datos muestrales de que dispones. Calcular el Índice de Capacidad del proceso. ¿Es el proceso capaz?
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.

3. ¿Qué probabilidad existe de encontrar en el lote de producción quesos envasados en unidades con pesos inferiores o iguales al límite inferior de especificación?

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%.

4. ¿Qué porcentaje del lote completo de producción tendrá un peso mayor al límite superior de especificación?
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).

5. ¿Qué porcentaje del lote tiene pesos comprendidos entre 245 y 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.

6. ¿Qué intervalo de valores (centrado en la media de la producción) dejará fuera del mismo un 5% de la producción?

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.

7. Si las especificaciones del producto fueran peso = 250±25 gramos y el lote fuera aceptable sólo cuando el 5% está fuera de la especificación, ¿sería aceptable el lote de producción?
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.

Problema 2

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.

1. Representar el histograma.
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")

2. ¿Son los datos aproximadamente normales?
#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.

3. ¿Qué porcentaje de los datos de la muestra está a no más de 1 σ de μ?
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%.

4. ¿Qué probabilidad existe de encontrar yogures con pH inferior o igual a 4.33?
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%.

5. ¿Qué porcentaje del lote completo tendrá un pH superior a 4.68?
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.

6. ¿Qué porcentaje del lote tendrá un pH entre 4.4 y 4.6?
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.

7. ¿Qué intervalo de valores dejará fuera del mismo al 3 por mil de la producción?

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.

8. Si las especificaciones del lote fueran que el pH debe estar entre 4.25 y 4.75, y el lote fuera aceptable solo cuando el 3 por mil está fuera de la especificación, ¿sería aceptable el lote?
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.

9. Calcular el Índice de Capacidad del proceso. ¿Es el proceso capaz?
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.

Problema 3

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)
1. ¿Qué tipo de gráfico de control te parece más adecuado? Brevemente, ¿Por qué?

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).

2. Calcular el valor de la línea central y de los límites de control superior e inferior. Representar el gráfico de control propuesto en el apartado anterior.
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"
3. Encontrar la probabilidad de aceptar un lote de 2000 unidades si se toma una muestra de 5 envases, y el lote se acepta sólo si no más de un envase gotea.

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%.