Comparar el tiempo necesario para limpiar piezas metálicas mediante tres métodos: A, B y C. Un menor tiempo representa mayor rapidez, siempre que se alcance el mismo criterio de limpieza.
Todos los datos son simulados para fines académicos. No representan mediciones reales ni permiten recomendar un método industrial real.
| Elemento | Definición |
|---|---|
| Factor independiente | Método de limpieza: cualitativo nominal |
| Tratamientos | Métodos A, B y C |
| Respuesta | Tiempo de limpieza en segundos: cuantitativa continua |
| Unidad experimental | Una pieza que recibe un método de forma independiente |
| Controles | Material, dimensiones, producto dosificado y criterio de limpieza |
| Réplica | Una pieza distinta que recibe el mismo tratamiento |
El equipo se limpia o restablece entre aplicaciones para evitar arrastre. Se mantiene un procedimiento de medición uniforme. La selección de piezas disponibles sería por conveniencia; la asignación de tratamientos, en cambio, se realiza al azar. Muestreo y asignación aleatoria son procesos distintos.
Se dispone de 18 piezas similares de un mismo lote, con igual tipo y cantidad de suciedad. Se asignan aleatoriamente seis piezas a cada método. No se forman bloques porque no se identifica una fuente conocida de heterogeneidad que sea necesario controlar.
H₀: μA = μB = μC. Los métodos tienen el mismo tiempo
medio.
H₁: al menos una media es diferente.
Nivel de significación: α = 0.05.
El modelo es \(Y_{ij}=\mu+\tau_i+\varepsilon_{ij}\): media general, efecto del método y error aleatorio.
medias <- c(A=120,B=105,C=90)
dca <- data.frame(pieza=paste0('P',1:18),
metodo=factor(sample(rep(c('A','B','C'),each=6))))
dca$tiempo <- round(medias[as.character(dca$metodo)]+rnorm(18,0,8),1)
dca$orden <- sample(1:18)
dca <- dca[order(dca$orden),]
knitr::kable(dca,row.names=FALSE,caption='Asignación y orden de ejecución del DCA')
| pieza | metodo | tiempo | orden |
|---|---|---|---|
| P7 | B | 89.3 | 1 |
| P1 | C | 92.9 | 2 |
| P16 | C | 96.7 | 3 |
| P15 | B | 91.5 | 4 |
| P2 | C | 93.2 | 5 |
| P10 | C | 81.5 | 6 |
| P12 | C | 81.8 | 7 |
| P3 | A | 120.9 | 8 |
| P8 | A | 125.6 | 9 |
| P18 | B | 95.9 | 10 |
| P9 | A | 116.2 | 11 |
| P4 | B | 100.6 | 12 |
| P5 | A | 134.3 | 13 |
| P14 | B | 100.0 | 14 |
| P13 | C | 84.2 | 15 |
| P17 | B | 106.2 | 16 |
| P11 | A | 118.3 | 17 |
| P6 | A | 124.0 | 18 |
knitr::kable(resumir(dca),caption='Estadísticas descriptivas del DCA')
| Metodo | n | Media | DE |
|---|---|---|---|
| A | 6 | 123.217 | 6.4484 |
| B | 6 | 97.250 | 6.2765 |
| C | 6 | 88.383 | 6.6481 |
Las medias teóricas y las desviaciones usadas para generar datos son decisiones de simulación; no son resultados de observaciones reales.
par(mar=c(4.5,4.5,2,1))
boxplot(tiempo~metodo,dca,col=colores,xlab='Método',ylab='Tiempo (segundos)',main='DCA: distribución por método')
stripchart(tiempo~metodo,dca,vertical=TRUE,method='jitter',pch=19,add=TRUE)
modelo_dca <- aov(tiempo~metodo,data=dca)
summary(modelo_dca)
## Df Sum Sq Mean Sq F value Pr(>F)
## metodo 2 3932 1966 47.1 3.4e-07 ***
## Residuals 15 626 42
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
shapiro.test(residuals(modelo_dca))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_dca)
## W = 0.932, p-value = 0.21
fligner.test(tiempo~metodo,data=dca)
##
## Fligner-Killeen test of homogeneity of variances
##
## data: tiempo by metodo
## Fligner-Killeen:med chi-squared = 0.626, df = 2, p-value = 0.73
Shapiro evalúa normalidad de residuos y Fligner igualdad de varianzas. Un p menor que 0.05 aporta evidencia contra el supuesto correspondiente; un p mayor no demuestra su cumplimiento. La independencia se justifica mediante el procedimiento experimental.
par(mfrow=c(1,2),mar=c(4.5,4.5,3,1))
qqnorm(residuals(modelo_dca),main='DCA: Q-Q de residuos',pch=19);qqline(residuals(modelo_dca),col='red')
plot(fitted(modelo_dca),residuals(modelo_dca),pch=19,xlab='Ajustados',ylab='Residuos',main='DCA: residuos vs. ajustados');abline(h=0,lty=2)
par(mfrow=c(1,1))
TukeyHSD(modelo_dca,'metodo')
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = tiempo ~ metodo, data = dca)
##
## $metodo
## diff lwr upr p adj
## B-A -25.9667 -35.654 -16.27972 0.00001
## C-A -34.8333 -44.520 -25.14639 0.00000
## C-B -8.8667 -18.554 0.82028 0.07529
Conclusión DCA: p = 3.409e-07 . Se rechaza H₀: hay evidencia de diferencias entre tiempos medios.
Si el ANOVA es significativo y los supuestos son razonables, Tukey identifica parejas diferentes mediante p ajustado < 0.05. Un ANOVA significativo no implica que todas las parejas difieran.
Ahora las piezas proceden de seis lotes cuya suciedad puede presentar distinta adherencia. Cada lote constituye un bloque; dentro de un lote las piezas son similares. Se toman tres piezas distintas por lote y se asignan al azar A, B y C entre ellas.
Hay 18 unidades, tres tratamientos, seis bloques y seis réplicas por tratamiento. Cada bloque contiene los tres tratamientos, asignados aleatoriamente a piezas diferentes.
Hipótesis principal sobre métodos:
H₀: μA = μB = μC, ajustando por bloque.
H₁: al menos una media de tratamiento difiere.
Hipótesis adicional sobre bloques:
H₀: todos los efectos de bloque son cero.
H₁: al menos un efecto de bloque no es cero.
Modelo: \(Y_{ij}=\mu+\tau_i+\beta_j+\varepsilon_{ij}\). El término \(\beta_j\) representa el lote. Se supone aditividad: el efecto del método no cambia según el lote. Con una observación por combinación no se estima por separado la interacción método–lote y el error.
dba <- do.call(rbind,lapply(1:6,function(i)
data.frame(bloque=paste0('Lote',i),pieza=paste0('L',i,'P',1:3),metodo=sample(c('A','B','C')))))
dba$metodo <- factor(dba$metodo)
dba$bloque <- factor(dba$bloque)
efectos <- setNames(c(-20,-12,-4,4,12,20),paste0('Lote',1:6))
dba$tiempo <- round(medias[as.character(dba$metodo)]+efectos[as.character(dba$bloque)]+rnorm(18,0,6),1)
dba$orden <- sample(1:18)
dba <- dba[order(dba$orden),]
knitr::kable(dba,row.names=FALSE,caption='Asignación dentro de bloques y orden de ejecución')
| bloque | pieza | metodo | tiempo | orden |
|---|---|---|---|---|
| Lote6 | L6P3 | C | 110.0 | 1 |
| Lote6 | L6P1 | A | 131.4 | 2 |
| Lote5 | L5P1 | B | 115.6 | 3 |
| Lote5 | L5P2 | C | 96.6 | 4 |
| Lote4 | L4P1 | C | 96.5 | 5 |
| Lote3 | L3P1 | B | 104.0 | 6 |
| Lote1 | L1P3 | B | 82.2 | 7 |
| Lote6 | L6P2 | B | 128.7 | 8 |
| Lote4 | L4P3 | A | 123.1 | 9 |
| Lote2 | L2P3 | C | 70.0 | 10 |
| Lote1 | L1P2 | A | 98.5 | 11 |
| Lote4 | L4P2 | B | 113.8 | 12 |
| Lote2 | L2P1 | B | 88.4 | 13 |
| Lote3 | L3P2 | A | 123.4 | 14 |
| Lote3 | L3P3 | C | 89.8 | 15 |
| Lote2 | L2P2 | A | 120.9 | 16 |
| Lote1 | L1P1 | C | 80.1 | 17 |
| Lote5 | L5P3 | A | 127.6 | 18 |
knitr::kable(with(dba,table(bloque,metodo)),caption='Una pieza por método en cada bloque')
| A | B | C | |
|---|---|---|---|
| Lote1 | 1 | 1 | 1 |
| Lote2 | 1 | 1 | 1 |
| Lote3 | 1 | 1 | 1 |
| Lote4 | 1 | 1 | 1 |
| Lote5 | 1 | 1 | 1 |
| Lote6 | 1 | 1 | 1 |
knitr::kable(resumir(dba),caption='Descripción sin ajustar por bloque')
| Metodo | n | Media | DE |
|---|---|---|---|
| A | 6 | 120.82 | 11.558 |
| B | 6 | 105.45 | 17.588 |
| C | 6 | 90.50 | 14.017 |
La dispersión descriptiva mezcla diferencias entre lotes y error; no es la dispersión residual ajustada del modelo.
tabla <- with(dba,tapply(tiempo,list(bloque,metodo),mean))
par(mar=c(4.5,4.5,2,1))
matplot(1:3,t(tabla),type='b',pch=1:6,lty=1,col=hcl.colors(6,'Dark 3'),xaxt='n',xlab='Método',ylab='Tiempo (segundos)',main='DBA: comparación dentro de cada lote')
axis(1,at=1:3,labels=c('A','B','C'))
legend('topright',legend=rownames(tabla),col=hcl.colors(6,'Dark 3'),pch=1:6,lty=1,cex=.7,bty='n')
Cada línea representa un lote, pero sus puntos corresponden a piezas diferentes. No son mediciones repetidas de una misma pieza.
modelo_dba <- aov(tiempo~metodo+bloque,data=dba)
summary(modelo_dba)
## Df Sum Sq Mean Sq F value Pr(>F)
## metodo 2 2757 1379 29.5 6.4e-05 ***
## bloque 5 2729 546 11.7 0.00065 ***
## Residuals 10 468 47
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
shapiro.test(residuals(modelo_dba))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_dba)
## W = 0.959, p-value = 0.59
TukeyHSD(modelo_dba,'metodo')
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = tiempo ~ metodo + bloque, data = dba)
##
## $metodo
## diff lwr upr p adj
## B-A -15.367 -26.190 -4.5429 0.00768
## C-A -30.317 -41.140 -19.4929 0.00005
## C-B -14.950 -25.774 -4.1262 0.00909
La fila metodo responde la pregunta principal y la fila bloque evalúa diferencias entre lotes. La homogeneidad se examina gráficamente sobre los residuos del modelo que incorpora bloques; comparar solamente tiempos crudos puede mezclar la variación entre lotes.
par(mfrow=c(2,2),mar=c(4.5,4.5,3,1))
qqnorm(residuals(modelo_dba),pch=19,main='DBA: Q-Q');qqline(residuals(modelo_dba),col='red')
plot(fitted(modelo_dba),residuals(modelo_dba),pch=19,xlab='Ajustados',ylab='Residuos',main='DBA: residuos vs. ajustados');abline(h=0,lty=2)
boxplot(residuals(modelo_dba)~dba$metodo,col=colores,xlab='Método',ylab='Residuos',main='Dispersión por método')
plot(dba$orden,residuals(modelo_dba),pch=19,xlab='Orden de ejecución',ylab='Residuos',main='Residuos por orden');abline(h=0,lty=2)
par(mfrow=c(1,1))
El gráfico por orden ayuda a detectar patrones temporales, pero no demuestra independencia.
Conclusión DBA: p = 6.413e-05 . Se rechaza H₀: existen diferencias entre tiempos medios de los métodos, controlando los lotes.
El DCA compara métodos aplicados a piezas inicialmente similares. El DBA incorpora los lotes para controlar una fuente conocida de variación. Las conclusiones estadísticas de cada experimento se presentan en sus respectivas secciones y deben interpretarse junto con los diagnósticos del modelo.
Los datos son simulados y los escenarios son diferentes; no se comparan directamente sus errores para demostrar la superioridad de un diseño. Los resultados no constituyen evidencia experimental sobre métodos industriales reales.