En el control de calidad por aceptación, un plan de muestreo simple consiste en tomar una muestra de tamaño \(n\) de un lote de tamaño \(N\), y aceptar el lote si el número de defectuosos encontrados es menor o igual al número de aceptación \(c\).
La Curva Característica de Operación (CO) describe la probabilidad de aceptar un lote en función de la proporción real de defectuosos \(p\), y permite visualizar los dos riesgos asociados al plan:
La distribución de probabilidad utilizada se selecciona según la razón \(r = n/N\):
| Condición | Distribución |
|---|---|
| \(r > 0.1\) | Hipergeométrica |
| \(r \leq 0.1\) y \(n \cdot r > 1\) | Poisson |
| \(r \leq 0.1\) | Binomial |
Se reciben lotes de N = 150 unidades. Se define:
Se evalúan tres planes con criterio de proporcionalidad en \(c/n \approx AQL\):
| Plan | n | c |
|---|---|---|
| 1 | 100 | 5 |
| 2 | 80 | 4 |
| 3 | 40 | 2 |
N <- 150; n <- 100; c <- 5; AQL <- 0.05; LTPD <- 0.10
cat("Distribución seleccionada:", seleccionar_distribucion(n, N), "\n")## Distribución seleccionada: Hipergeométrica
# Defectuosos y no defectuosos en lote bueno (AQL)
D_AQL <- round(AQL * N)
ND_AQL <- N - D_AQL
# Defectuosos y no defectuosos en lote malo (LTPD)
D_LTPD <- round(LTPD * N)
ND_LTPD <- N - D_LTPD
# Riesgo del productor: α = P(d > c | lote bueno)
alpha <- phyper(c, D_AQL, ND_AQL, n, lower.tail=F, log.p=F)
# Riesgo del consumidor: β = P(d ≤ c | lote malo)
beta <- phyper(c, D_LTPD, ND_LTPD, n, lower.tail=T, log.p=F)
cat("D_AQL =", D_AQL, "| ND_AQL =", ND_AQL, "\n")## D_AQL = 8 | ND_AQL = 142
## D_LTPD = 15 | ND_LTPD = 135
## Alpha (riesgo productor) = 0.4654
## Beta (riesgo consumidor) = 0.0058
N2 <- 150; n2 <- 80; c2 <- 4; AQL2 <- 0.05; LTPD2 <- 0.10
cat("Distribución seleccionada:", seleccionar_distribucion(n2, N2), "\n")## Distribución seleccionada: Hipergeométrica
D_AQL2 <- round(AQL2 * N2)
ND_AQL2 <- N2 - D_AQL2
D_LTPD2 <- round(LTPD2 * N2)
ND_LTPD2 <- N2 - D_LTPD2
alpha2 <- phyper(c2, D_AQL2, ND_AQL2, n2, lower.tail=F, log.p=F)
beta2 <- phyper(c2, D_LTPD2, ND_LTPD2, n2, lower.tail=T, log.p=F)
cat("D_AQL2 =", D_AQL2, "| ND_AQL2 =", ND_AQL2, "\n")## D_AQL2 = 8 | ND_AQL2 = 142
## D_LTPD2 = 15 | ND_LTPD2 = 135
## Alpha (riesgo productor) = 0.4362
## Beta (riesgo consumidor) = 0.0275
N3 <- 150; n3 <- 40; c3 <- 2; AQL3 <- 0.05; LTPD3 <- 0.10
cat("Distribución seleccionada:", seleccionar_distribucion(n3, N3), "\n")## Distribución seleccionada: Hipergeométrica
D_AQL3 <- round(AQL3 * N3)
ND_AQL3 <- N3 - D_AQL3
D_LTPD3 <- round(LTPD3 * N3)
ND_LTPD3 <- N3 - D_LTPD3
alpha3 <- phyper(c3, D_AQL3, ND_AQL3, n3, lower.tail=F, log.p=F)
beta3 <- phyper(c3, D_LTPD3, ND_LTPD3, n3, lower.tail=T, log.p=F)
cat("D_AQL3 =", D_AQL3, "| ND_AQL3 =", ND_AQL3, "\n")## D_AQL3 = 8 | ND_AQL3 = 142
## D_LTPD3 = 15 | ND_LTPD3 = 135
## Alpha (riesgo productor) = 0.3622
## Beta (riesgo consumidor) = 0.1798
resumen <- data.frame(
Plan = c("Plan 1 (n=100, c=5)", "Plan 2 (n=80, c=4)", "Plan 3 (n=40, c=2)"),
Dist = c(seleccionar_distribucion(100,150),
seleccionar_distribucion(80,150),
seleccionar_distribucion(40,150)),
Alpha = round(c(alpha, alpha2, alpha3), 4),
Beta = round(c(beta, beta2, beta3), 4)
)
knitr::kable(resumen, col.names = c("Plan", "Distribución", "α (Riesgo Productor)", "β (Riesgo Consumidor)"),
caption = "Comparación de riesgos entre los tres planes de muestreo")| Plan | Distribución | α (Riesgo Productor) | β (Riesgo Consumidor) |
|---|---|---|---|
| Plan 1 (n=100, c=5) | Hipergeométrica | 0.4654 | 0.0058 |
| Plan 2 (n=80, c=4) | Hipergeométrica | 0.4362 | 0.0275 |
| Plan 3 (n=40, c=2) | Hipergeométrica | 0.3622 | 0.1798 |
p_seq <- seq(0, 0.30, by = 0.001)
# Probabilidades de aceptación para cada plan (Hipergeométrica)
Pa1 <- sapply(p_seq, function(p) phyper(5, round(p*150), 150-round(p*150), 100, lower.tail=T, log.p=F))
Pa2 <- sapply(p_seq, function(p) phyper(4, round(p*150), 150-round(p*150), 80, lower.tail=T, log.p=F))
Pa3 <- sapply(p_seq, function(p) phyper(2, round(p*150), 150-round(p*150), 40, lower.tail=T, log.p=F))
df_co <- data.frame(p = p_seq,
`Plan 1 (n=100, c=5)` = Pa1,
`Plan 2 (n=80, c=4)` = Pa2,
`Plan 3 (n=40, c=2)` = Pa3,
check.names = FALSE) %>%
pivot_longer(-p, names_to = "Plan", values_to = "Pa")
ggplot(df_co, aes(x = p, y = Pa, color = Plan)) +
geom_line(linewidth = 1) +
geom_vline(xintercept = 0.05, linetype = "dashed", color = "steelblue", alpha = 0.7) +
geom_vline(xintercept = 0.10, linetype = "dashed", color = "tomato", alpha = 0.7) +
annotate("text", x = 0.05, y = 0.05, label = "AQL = 5%", hjust = -0.1, color = "steelblue", size = 3.5) +
annotate("text", x = 0.10, y = 0.05, label = "LTPD = 10%", hjust = -0.1, color = "tomato", size = 3.5) +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1)) +
scale_x_continuous(labels = scales::percent_format()) +
labs(title = "Curvas CO – Comparación de los tres planes de muestreo",
subtitle = "Distribución Hipergeométrica | N = 150",
x = "Proporción de defectuosos (p)",
y = "Probabilidad de aceptación P(a)",
color = "Plan") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Los resultados muestran que, aunque los tres planes mantienen la misma proporción \(c/n = 0.05\) (condición de proporcionalidad con el AQL), los riesgos no son equivalentes:
No. Aunque los tres cumplen \(c/n = AQL\), tener la misma proporción no hace que los planes sean iguales. El tamaño de muestra sí importa:entre más grande sea \(n\), la curva CO es más empinada y los riesgos del consumidor bajan. Los tres planes se comportan diferente, como se evidencia en la gráfica y en la tabla de riesgos.
Se construye una Curva CO para un plan de muestreo simple con:
Se utilizan las tres distribuciones: Hipergeométrica, Binomial y Poisson.
## r = n/N = 0.5
## Distribución sugerida: Hipergeométrica
Como \(r = 0.5 > 0.1\), la distribución Hipergeométrica es la más adecuada. Sin embargo, se calcularán las tres para comparar.
p_seq2 <- seq(0, 0.50, by = 0.005)
N2a <- 100; n2a <- 50; c2a <- 2
# Hipergeométrica
Pa_hyper <- sapply(p_seq2, function(p) {
D <- round(p * N2a)
ND <- N2a - D
phyper(c2a, D, ND, n2a, lower.tail=T, log.p=F)
})
# Binomial
Pa_binom <- sapply(p_seq2, function(p) pbinom(c2a, n2a, p, lower.tail=T, log.p=F))
# Poisson
Pa_pois <- sapply(p_seq2, function(p) ppois(c2a, lambda = n2a * p, lower.tail=T, log.p=F))
df_p2a <- data.frame(
p = p_seq2,
Hipergeométrica = Pa_hyper,
Binomial = Pa_binom,
Poisson = Pa_pois
) %>% pivot_longer(-p, names_to = "Distribución", values_to = "Pa")
ggplot(df_p2a, aes(x = p, y = Pa, color = Distribución, linetype = Distribución)) +
geom_line(linewidth = 1) +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1)) +
scale_x_continuous(labels = scales::percent_format()) +
labs(title = "Curvas CO – Tres distribuciones (N = 100, n = 50, c = 2)",
x = "Proporción de defectuosos (p)",
y = "Probabilidad de aceptación P(a)",
color = "Distribución",
linetype = "Distribución") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Sí. Cuando \(N = 100\) y \(n = 50\), la razón \(r = 0.5 > 0.1\), lo que indica que la fracción de muestreo es grande. En este caso:
Las curvas no coinciden porque las condiciones para usar las aproximaciones (Binomial y Poisson) no se satisfacen con este lote pequeño.
N2b <- 2000; n2b <- 50; c2b <- 2
r2b <- n2b / N2b
cat("r = n/N =", r2b, "→", seleccionar_distribucion(n2b, N2b), "\n")## r = n/N = 0.025 → Poisson
Pa_hyper2 <- sapply(p_seq2, function(p) {
D <- round(p * N2b)
ND <- N2b - D
phyper(c2b, D, ND, n2b, lower.tail=T, log.p=F)
})
Pa_binom2 <- sapply(p_seq2, function(p) pbinom(c2b, n2b, p, lower.tail=T, log.p=F))
Pa_pois2 <- sapply(p_seq2, function(p) ppois(c2b, lambda = n2b * p, lower.tail=T, log.p=F))
df_p2b <- data.frame(
p = p_seq2,
Hipergeométrica = Pa_hyper2,
Binomial = Pa_binom2,
Poisson = Pa_pois2
) %>% pivot_longer(-p, names_to = "Distribución", values_to = "Pa")
ggplot(df_p2b, aes(x = p, y = Pa, color = Distribución, linetype = Distribución)) +
geom_line(linewidth = 1) +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1)) +
scale_x_continuous(labels = scales::percent_format()) +
labs(title = "Curvas CO – Tres distribuciones (N = 2000, n = 50, c = 2)",
x = "Proporción de defectuosos (p)",
y = "Probabilidad de aceptación P(a)",
color = "Distribución",
linetype = "Distribución") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Cuando \(N = 2000\), la razón \(r = 50/2000 = 0.025 \leq 0.1\), por lo que las condiciones de aproximación sí se cumplen. En este caso:
Es decir, \(n \cdot r = 50 \times 0.025 = 1.25 > 1\), así que la distribución sugerida es Poisson (Curva CO tipo B). En este caso las tres curvas quedan casi encima una de la otra, lo que muestra que cuando el lote es grande respecto a la muestra, las tres distribuciones dan resultados muy similares y es válido usar cualquiera de las aproximaciones.
Punto 1: Los tres planes con proporcionalidad \(c/n = AQL\) no son equivalentes. A mayor \(n\), menor riesgo del consumidor y mayor riesgo del productor. El tamaño de muestra determina el poder discriminatorio del plan.
Punto 2 (N=100): Con fracción de muestreo alta (\(r = 0.5\)), las tres distribuciones producen curvas CO diferentes. La Hipergeométrica es la única correcta en este escenario.
Punto 2 (N=2000): Con fracción de muestreo baja (\(r = 0.025\)), las tres distribuciones convergen, validando el uso de Binomial o Poisson como aproximaciones cuando el lote es suficientemente grande.