Introducción

La evaluación sensorial permite estudiar las características de un producto a partir de las percepciones de los consumidores. En este análisis se consideran dos atributos fundamentales de tres tipos de café: el aroma y el sabor. El propósito es establecer si las puntuaciones promedio asignadas a los productos presentan diferencias estadísticamente significativas.

Para el estudio se empleó un Diseño Completamente Aleatorizado (DCA), en el que se evaluaron seis muestras de cada tipo de café. Las calificaciones se registraron en una escala de 1 a 10, donde 1 corresponde a una valoración muy baja y 10 a una valoración excelente.

Los tratamientos corresponden a Café Tostao, Café Viejo Molino y Café Colcafé. El análisis de cada atributo se desarrolla por separado, de manera que las diferencias observadas en el aroma no se confundan con las del sabor.

Fundamento del diseño experimental

El Diseño Completamente Aleatorizado se caracteriza por la asignación aleatoria de los tratamientos a las unidades experimentales, bajo condiciones que se consideran homogéneas. La repetición de las observaciones permite estimar el error experimental y comparar las respuestas promedio de los tratamientos.

En este ejercicio, el factor de estudio es el tipo de café y las variables de respuesta son las puntuaciones sensoriales de aroma y sabor. Para cada variable se ajusta un modelo independiente.

Preparación y organización de los datos

A continuación se presentan las puntuaciones registradas para cada tratamiento. También se calculan los totales y los promedios de las seis réplicas.

{r configuracion, message=FALSE, warning=FALSE} knitr::opts_chunk$set( echo = TRUE, message = FALSE, warning = FALSE, fig.align = “center”, fig.width = 8, fig.height = 5 )

paquetes <- c(“agricolae”, “car”) faltantes <- paquetes[!paquetes %in% rownames(installed.packages())]

if (length(faltantes) > 0) { install.packages(faltantes) }

library(agricolae) library(car)

{r datos} tratamientos <- c(“Café Tostao”, “Café Viejo Molino”, “Café Colcafé”)

aroma <- data.frame( Tratamiento = tratamientos, Replica_1 = c(8, 7, 9), Replica_2 = c(9, 8, 8), Replica_3 = c(8, 7, 10), Replica_4 = c(9, 6, 9), Replica_5 = c(10, 8, 8), Replica_6 = c(8, 7, 10) )

sabor <- data.frame( Tratamiento = tratamientos, Replica_1 = c(9, 7, 10), Replica_2 = c(8, 6, 9), Replica_3 = c(9, 8, 9), Replica_4 = c(8, 7, 10), Replica_5 = c(10, 7, 8), Replica_6 = c(9, 8, 9) )

aroma\(Total <- rowSums(aroma[, 2:7]) aroma\)Promedio <- rowMeans(aroma[, 2:7])

sabor\(Total <- rowSums(sabor[, 2:7]) sabor\)Promedio <- rowMeans(sabor[, 2:7])

knitr::kable(aroma, digits = 2, caption = “Puntuaciones y estadísticos descriptivos del aroma”)

knitr::kable(sabor, digits = 2, caption = “Puntuaciones y estadísticos descriptivos del sabor”)

Análisis de las características sensoriales

Se utiliza una función de análisis para aplicar el mismo procedimiento estadístico a cada variable de respuesta. Aunque el procedimiento es común, los modelos se ajustan de forma independiente para aroma y sabor.

{r funcion-analisis} analizar_atributo <- function(datos, nombre_atributo) {

cat(“DEL”, toupper(nombre_atributo), “”)

descriptivos <- aggregate( puntuacion ~ tratamiento, data = datos, FUN = function(x) c( n = length(x), media = mean(x), desviacion = sd(x), minimo = min(x), maximo = max(x) ) )

descriptivos_final <- data.frame( Tratamiento = descriptivos\(tratamiento, descriptivos\)puntuacion )

print(knitr::kable( descriptivos_final, digits = 3, caption = paste(“Estadísticos descriptivos del”, nombre_atributo) ))

boxplot( puntuacion ~ tratamiento, data = datos, col = c(“lightblue”, “lightpink”, “lightgoldenrod”), main = paste(“Distribución de las puntuaciones de”, nombre_atributo), xlab = “Tipos de café”, ylab = “Puntuación sensorial”, ylim = c(1, 10), las = 1 )

modelo <- lm(puntuacion ~ tratamiento, data = datos) modelo_anova <- aov(modelo)

cat(“del modelo lineal:”) print(summary(modelo))

cat(“de varianza:”) print(summary(modelo_anova))

cat(“LSD de Fisher:”) resultado_lsd <- agricolae::LSD.test( modelo, “tratamiento”, group = TRUE, console = TRUE, main = paste(“Comparación LSD para”, nombre_atributo) ) print(resultado_lsd$groups)

cat(“de Tukey:”) resultado_tukey <- TukeyHSD( modelo_anova, “tratamiento”, conf.level = 0.95 ) print(resultado_tukey)

plot( resultado_tukey, main = paste(“Comparaciones de Tukey para”, nombre_atributo) )

cat(“de Duncan:”) resultado_duncan <- agricolae::duncan.test( modelo, “tratamiento”, group = TRUE, console = TRUE, main = paste(“Comparación de Duncan para”, nombre_atributo) ) print(resultado_duncan$groups)

residuos <- residuals(modelo) datos_diagnostico <- data.frame( tratamiento = datos$tratamiento, residuos = residuos )

cat(“del modelo:”) print(residuos)

cat(“ordenados:”) print(sort(residuos))

cat(“de residuos por tratamiento:”) print(knitr::kable( datos_diagnostico, digits = 4, caption = paste(“Residuos del modelo para”, nombre_atributo) ))

qqnorm( residuos, main = paste(“Gráfico Q-Q de los residuos:”, nombre_atributo), pch = 19 ) qqline(residuos, col = “red”, lwd = 2)

car::qqPlot( residuos, pch = 19, main = paste(“Evaluación Q-Q:”, nombre_atributo) )

cat(“de Shapiro-Wilk:”) resultado_shapiro <- shapiro.test(residuos) print(resultado_shapiro)

plot( fitted(modelo), residuos, main = paste(“Residuos frente a valores ajustados:”, nombre_atributo), xlab = “Valores ajustados”, ylab = “Residuos”, pch = 19 ) abline(h = 0, col = “red”, lty = 2, lwd = 2)

par(mfrow = c(2, 2)) plot(modelo) par(mfrow = c(1, 1))

cat(“de Levene:”) resultado_levene <- car::leveneTest( residuos ~ tratamiento, data = datos_diagnostico, center = mean ) print(resultado_levene)

cat(“de los residuos absolutos:”) modelo_abs <- aov( abs(residuos) ~ tratamiento, data = datos_diagnostico ) print(summary(modelo_abs))

p_anova <- summary(modelo_anova)[[1]][[“Pr(>F)”]][1] p_shapiro <- resultado_shapiro$p.value p_levene <- resultado_levene[[“Pr(>F)”]][1]

cat(“de pruebas para”, nombre_atributo, “”) cat(“ANOVA:”, p_anova, “”) cat(“Shapiro-Wilk:”, p_shapiro, “”) cat(“Levene:”, p_levene, “”)

if (p_anova < 0.05) { cat(“El ANOVA evidencia diferencias significativas entre las medias.”) } else { cat(“El ANOVA no evidencia diferencias significativas entre las medias.”) }

if (p_shapiro > 0.05) { cat(“Shapiro-Wilk no aporta evidencia suficiente para rechazar la normalidad de los residuos.”) } else { cat(“Shapiro-Wilk indica desviaciones estadísticamente significativas respecto a la normalidad.”) }

if (p_levene > 0.05) { cat(“Levene no detecta diferencias significativas entre las varianzas.”) } else { cat(“Levene detecta diferencias significativas entre las varianzas.”) }

invisible(list( modelo = modelo, anova = modelo_anova, lsd = resultado_lsd, tukey = resultado_tukey, duncan = resultado_duncan, shapiro = resultado_shapiro, levene = resultado_levene, residuos = residuos )) }

Evaluación del aroma

Para esta primera parte se estudian las puntuaciones asignadas al aroma de los tres tipos de café. Se comparan sus promedios y se examina el cumplimiento de los supuestos del modelo.

{r datos-aroma} datos_aroma <- data.frame( tratamiento = factor( rep(tratamientos, each = 6), levels = tratamientos ), puntuacion = c( 8, 9, 8, 9, 10, 8, 7, 8, 7, 6, 8, 7, 9, 8, 10, 9, 8, 10 ) )

knitr::kable( datos_aroma, caption = “Registro individual de las puntuaciones de aroma” )

resultados_aroma <- analizar_atributo( datos = datos_aroma, nombre_atributo = “aroma” )

Evaluación del sabor

En esta segunda parte se realiza el mismo procedimiento estadístico con las puntuaciones del sabor. Esto permite determinar si el comportamiento de los tratamientos es similar o diferente al observado para el aroma.

{r datos-sabor} datos_sabor <- data.frame( tratamiento = factor( rep(tratamientos, each = 6), levels = tratamientos ), puntuacion = c( 9, 8, 9, 8, 10, 9, 7, 6, 8, 7, 7, 8, 10, 9, 9, 10, 8, 9 ) )

knitr::kable( datos_sabor, caption = “Registro individual de las puntuaciones de sabor” )

resultados_sabor <- analizar_atributo( datos = datos_sabor, nombre_atributo = “sabor” )

Comparación descriptiva de los atributos

Finalmente, se reúnen los promedios obtenidos para aroma y sabor. Esta tabla permite observar conjuntamente las valoraciones promedio de cada tratamiento, sin reemplazar los análisis de varianza independientes realizados anteriormente.

{r comparacion-final} comparacion_medias <- data.frame( Tratamiento = tratamientos, Media_aroma = aroma\(Promedio, Media_sabor = sabor\)Promedio )

knitr::kable( comparacion_medias, digits = 3, caption = “Comparación de las puntuaciones promedio de aroma y sabor” )

Consideraciones para la interpretación

Para interpretar los resultados se utiliza un nivel de significancia de 0,05. En el ANOVA, un valor p inferior a este nivel indica evidencia de diferencias entre las medias de los tratamientos. Las pruebas LSD de Fisher, Tukey y Duncan permiten examinar las comparaciones entre tratamientos.

La prueba de Shapiro-Wilk se utiliza para evaluar la normalidad de los residuos, mientras que la prueba de Levene permite examinar la homogeneidad de las varianzas. En ambos casos, los resultados deben interpretarse considerando el valor p y el comportamiento de los gráficos de diagnóstico.

La ausencia de significancia estadística no demuestra que los tratamientos sean idénticos; indica que, con los datos y el diseño utilizados, no se encontró evidencia suficiente de diferencias.

Conclusiones

El análisis desarrollado permite estudiar de manera independiente las puntuaciones sensoriales de aroma y sabor para los tres tipos de café. El uso del Diseño Completamente Aleatorizado y del análisis de varianza permite evaluar las diferencias entre las medias de los tratamientos, mientras que las pruebas de comparación múltiple ayudan a identificar los grupos que presentan diferencias estadísticas.

La revisión de los residuos y de los supuestos del modelo complementa la interpretación de los resultados y permite valorar si el análisis estadístico utilizado resulta adecuado para los datos obtenidos.