En este documento, exploraremos el diseño completamente al azar, el cual es el diseño experimental más simple y proporciona el máximo número de grados de libertad para el error.
Instalaremos tidyverse debido a recientes actualizaciones en el paquete ggplot2.
#install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Un ingeniero de desarrollo está interesado en la resistencia a la tensión de una nueva fibra sintética para camisas de caballero. Se sabe que la calidad de la tela se afecta por la composición de algodón, variando entre 10% y 40%. Se decide probar cinco niveles de algodón (15%, 20%, 25%, 30% y 35%) con 5 replicaciones por nivel.
A continuación, elaboramos la tabla de datos directamente en R.
# Datos de resistencia por porcentaje de algodón
Resistencia <- c(7, 7, 15, 11, 9, 12, 17, 12, 18, 18, 14, 18, 18, 19, 19, 19, 25, 22, 19, 23, 7, 10, 11, 15, 11)
# Asignación de porcentajes como factor
Porcentaje <- factor(rep(c("15%", "20%", "25%", "30%", "35%"), each = 5))
# Creación del data frame
Datos <- data.frame(Porcentaje, Resistencia)
print(Datos)
## Porcentaje Resistencia
## 1 15% 7
## 2 15% 7
## 3 15% 15
## 4 15% 11
## 5 15% 9
## 6 20% 12
## 7 20% 17
## 8 20% 12
## 9 20% 18
## 10 20% 18
## 11 25% 14
## 12 25% 18
## 13 25% 18
## 14 25% 19
## 15 25% 19
## 16 30% 19
## 17 30% 25
## 18 30% 22
## 19 30% 19
## 20 30% 23
## 21 35% 7
## 22 35% 10
## 23 35% 11
## 24 35% 15
## 25 35% 11
Guardamos los datos en formato CSV para su uso externo.
write.csv(Datos, "exp_algodon.csv", row.names = FALSE)
Limpiamos el entorno y cargamos el archivo generado previamente.
rm(list = ls())
library(readr)
library(tidyverse)
Datos <- read_csv("exp_algodon.csv")
## Rows: 25 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Porcentaje
## dbl (1): Resistencia
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Generamos una tabla con promedios, desviación estándar, error estándar y límites de confianza.
#group_by(Datos, Porcentaje) = Datos %>% group_by(Porcentaje)
# Calculamos estadísticas descriptivas por porcentaje
estadisticas <- Datos %>%
group_by(Porcentaje) %>%
summarise(
Promedio = mean(Resistencia, na.rm = TRUE),
DE = sd(Resistencia, na.rm = TRUE),
n = n(),
Error = DE/sqrt(n),
Li = Promedio - Error,
Ls = Promedio + Error
) %>%
mutate(across(where(is.numeric), ~ round(.x, 2)))
# Mostramos la tabla de estadísticas
estadisticas
## # A tibble: 5 × 7
## Porcentaje Promedio DE n Error Li Ls
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 15% 9.8 3.35 5 1.5 8.3 11.3
## 2 20% 15.4 3.13 5 1.4 14 16.8
## 3 25% 17.6 2.07 5 0.93 16.7 18.5
## 4 30% 21.6 2.61 5 1.17 20.4 22.8
## 5 35% 10.8 2.86 5 1.28 9.52 12.1
Usamos gráficos de base para visualizar la variabilidad entre los tratamientos.
estadisticas %>%
ggplot(aes(x = Porcentaje, y = Promedio, col = Porcentaje)) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = Li, ymax = Ls), width = 0.2) +
theme_minimal() +
labs(x = "Porcentaje de Algodón", y = "Resistencia a la tension (lb/in^2)", title = "Error Estándar de la Resistencia a la tension")
Datos %>%
ggplot(aes(x = Porcentaje, y = Resistencia, fill = Porcentaje)) +
geom_boxplot() +
theme_minimal() +
coord_flip() +
labs(x = "Porcentaje de Algodón", y = "Resistencia a la tension (lb/in^2)", title = "Variabilidad de la Resistencia a la tension")
Realizamos un ANOVA para evaluar los efectos del porcentaje de algodón en la resistencia a la tension.
#install.packages("agricolae")
library(agricolae)
# convertir factor los tratamientos
Datos$Porcentaje <- as.factor(Datos$Porcentaje)
str(Datos)
## spc_tbl_ [25 × 2] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Porcentaje : Factor w/ 5 levels "15%","20%","25%",..: 1 1 1 1 1 2 2 2 2 2 ...
## $ Resistencia: num [1:25] 7 7 15 11 9 12 17 12 18 18 ...
## - attr(*, "spec")=
## .. cols(
## .. Porcentaje = col_character(),
## .. Resistencia = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
anova_telas <- aov(formula = Resistencia ~ Porcentaje, data = Datos)
summary(anova_telas)
## Df Sum Sq Mean Sq F value Pr(>F)
## Porcentaje 4 475.8 118.94 14.76 9.13e-06 ***
## Residuals 20 161.2 8.06
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Como el p_value es < 0.05 (valor de la significancia), entonces debo llevar a cabo una prueba de medias (duncan, DMS, Tukey)
qf(0.05, df1 = 4, df2 = 20, lower.tail = F)
## [1] 2.866081
# Ft = 2.866081
# Fc = 14.76
Aplicamos la prueba de Duncan para comparar las medias de los grupos.
compara_duncan <- duncan.test(anova_telas, "Porcentaje")
compara_duncan$groups
## Resistencia groups
## 30% 21.6 a
## 25% 17.6 b
## 20% 15.4 b
## 35% 10.8 c
## 15% 9.8 c
compara_duncan$groups
## Resistencia groups
## 30% 21.6 a
## 25% 17.6 b
## 20% 15.4 b
## 35% 10.8 c
## 15% 9.8 c
bar.group(compara_duncan$groups, ylim = c(0, max(compara_duncan$groups$Resistencia) * 1.4))
Link de yopad