La evaluación sensorial permite identificar las características que determinan la aceptación de un alimento o bebida por parte de los consumidores. En el caso del café, el aroma y el sabor son dos atributos fundamentales para establecer diferencias entre productos comerciales.
En este análisis se compararon tres marcas de café tostado y molido: La Casona, Tostao Selecto y Café Córdoba. Se estudiaron las calificaciones otorgadas por seis catadores, utilizando una escala de 1 a 10 para cada atributo.
El propósito es determinar si existen diferencias estadísticamente significativas entre las marcas evaluadas, mediante un análisis de varianza y pruebas de comparación de medias.
Se trabajó con un Diseño Completamente al Azar (DCA), considerando un factor experimental: la marca de café.
tratamientos <- c(
"La Casona",
"Tostao Selecto",
"Café Córdoba"
)
tabla_tratamientos <- data.frame(
Codigo = 1:3,
Marca = tratamientos,
Presentacion = c(
"Café tostado y molido, 100 % colombiano, 300 g",
"Café tostado y molido, 400 g",
"Café tostado y molido, 100 % puro, 300 g"
)
)
kable(
tabla_tratamientos,
caption = "Identificación de las marcas utilizadas en el ensayo."
)
| Codigo | Marca | Presentacion |
|---|---|---|
| 1 | La Casona | Café tostado y molido, 100 % colombiano, 300 g |
| 2 | Tostao Selecto | Café tostado y molido, 400 g |
| 3 | Café Córdoba | Café tostado y molido, 100 % puro, 300 g |
Se registraron las puntuaciones obtenidas por cada una de las tres marcas, teniendo en cuenta las seis evaluaciones realizadas para cada atributo sensorial.
datos <- data.frame(
Tratamiento = factor(
rep(tratamientos, each = 6),
levels = tratamientos
),
Aroma = c(
8, 9, 7, 8, 9, 8,
7, 8, 8, 7, 9, 8,
6, 7, 6, 8, 7, 6
),
Sabor = c(
7, 8, 7, 9, 8, 8,
8, 9, 8, 7, 8, 9,
6, 7, 7, 6, 8, 7
)
)
kable(
datos,
caption = "Registro de las puntuaciones sensoriales de las muestras."
)
| Tratamiento | Aroma | Sabor |
|---|---|---|
| La Casona | 8 | 7 |
| La Casona | 9 | 8 |
| La Casona | 7 | 7 |
| La Casona | 8 | 9 |
| La Casona | 9 | 8 |
| La Casona | 8 | 8 |
| Tostao Selecto | 7 | 8 |
| Tostao Selecto | 8 | 9 |
| Tostao Selecto | 8 | 8 |
| Tostao Selecto | 7 | 7 |
| Tostao Selecto | 9 | 8 |
| Tostao Selecto | 8 | 9 |
| Café Córdoba | 6 | 6 |
| Café Córdoba | 7 | 7 |
| Café Córdoba | 6 | 7 |
| Café Córdoba | 8 | 6 |
| Café Córdoba | 7 | 8 |
| Café Córdoba | 6 | 7 |
Se calcularon los principales estadísticos descriptivos para conocer el comportamiento de las calificaciones del aroma en cada tratamiento.
resumen_aroma <- do.call(
rbind,
lapply(tratamientos, function(marca) {
x <- datos$Aroma[datos$Tratamiento == marca]
data.frame(
Tratamiento = marca,
Repeticiones = length(x),
Media = mean(x),
Desviacion = sd(x),
Mediana = median(x),
Minimo = min(x),
Maximo = max(x)
)
})
)
kable(
resumen_aroma,
digits = 3,
caption = "Estadística descriptiva de las calificaciones del aroma."
)
| Tratamiento | Repeticiones | Media | Desviacion | Mediana | Minimo | Maximo |
|---|---|---|---|---|---|---|
| La Casona | 6 | 8.167 | 0.753 | 8.0 | 7 | 9 |
| Tostao Selecto | 6 | 7.833 | 0.753 | 8.0 | 7 | 9 |
| Café Córdoba | 6 | 6.667 | 0.816 | 6.5 | 6 | 8 |
boxplot(
Aroma ~ Tratamiento,
data = datos,
col = c("lightblue", "lightgreen", "lightpink"),
main = "Distribución de las calificaciones del aroma",
xlab = "Marcas de café",
ylab = "Puntuación sensorial",
ylim = c(1, 10)
)
Se realizó un ANOVA de una vía para determinar si la marca comercial influye significativamente en la percepción del aroma.
modelo_aroma <- aov(
Aroma ~ Tratamiento,
data = datos
)
anova_aroma <- summary(modelo_aroma)
kable(
as.data.frame(anova_aroma[[1]]),
digits = 4,
caption = "Análisis de varianza correspondiente al aroma."
)
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Tratamiento | 2 | 7.4444 | 3.7222 | 6.2037 | 0.0109 |
| Residuals | 15 | 9.0000 | 0.6000 | NA | NA |
p_aroma <- anova_aroma[[1]][["Pr(>F)"]][1]
if (p_aroma < 0.05) {
cat(
"\nInterpretación: Se rechaza la hipótesis nula. ",
"Existen diferencias significativas entre las marcas ",
"en relación con la percepción del aroma."
)
} else {
cat(
"\nInterpretación: No se encontraron diferencias ",
"estadísticamente significativas entre las marcas."
)
}
##
## Interpretación: Se rechaza la hipótesis nula. Existen diferencias significativas entre las marcas en relación con la percepción del aroma.
Esta prueba permite identificar cuáles marcas presentan diferencias significativas en sus puntuaciones promedio.
tukey_aroma <- TukeyHSD(
modelo_aroma,
"Tratamiento",
conf.level = 0.95
)
kable(
as.data.frame(tukey_aroma$Tratamiento),
digits = 4,
caption = "Comparaciones múltiples de Tukey para el aroma."
)
| diff | lwr | upr | p adj | |
|---|---|---|---|---|
| Tostao Selecto-La Casona | -0.3333 | -1.4950 | 0.8283 | 0.7409 |
| Café Córdoba-La Casona | -1.5000 | -2.6616 | -0.3384 | 0.0114 |
| Café Córdoba-Tostao Selecto | -1.1667 | -2.3283 | -0.0050 | 0.0489 |
plot(tukey_aroma)
Se utilizó la prueba de Shapiro-Wilk para verificar si los residuos del modelo presentan una distribución aproximadamente normal.
residuos_aroma <- residuals(modelo_aroma)
shapiro_aroma <- shapiro.test(residuos_aroma)
shapiro_aroma
##
## Shapiro-Wilk normality test
##
## data: residuos_aroma
## W = 0.95369, p-value = 0.4858
if (shapiro_aroma$p.value > 0.05) {
cat("\nSe cumple el supuesto de normalidad.")
} else {
cat("\nNo se cumple el supuesto de normalidad.")
}
##
## Se cumple el supuesto de normalidad.
qqnorm(
residuos_aroma,
main = "Gráfico Q-Q de los residuos del aroma",
pch = 19
)
qqline(
residuos_aroma,
col = "red",
lwd = 2
)
Se aplicó la prueba de Levene, utilizando la mediana como centro, para comprobar la igualdad de varianzas entre los tratamientos.
levene_aroma <- car::leveneTest(
Aroma ~ Tratamiento,
data = datos,
center = median
)
levene_aroma
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.2174 0.8071
## 15
par(mfrow = c(2, 2))
plot(modelo_aroma)
par(mfrow = c(1, 1))
Se analizaron las calificaciones del sabor para determinar el comportamiento de cada marca a partir de sus medidas descriptivas.
resumen_sabor <- do.call(
rbind,
lapply(tratamientos, function(marca) {
x <- datos$Sabor[datos$Tratamiento == marca]
data.frame(
Tratamiento = marca,
Repeticiones = length(x),
Media = mean(x),
Desviacion = sd(x),
Mediana = median(x),
Minimo = min(x),
Maximo = max(x)
)
})
)
kable(
resumen_sabor,
digits = 3,
caption = "Estadística descriptiva de las calificaciones del sabor."
)
| Tratamiento | Repeticiones | Media | Desviacion | Mediana | Minimo | Maximo |
|---|---|---|---|---|---|---|
| La Casona | 6 | 7.833 | 0.753 | 8 | 7 | 9 |
| Tostao Selecto | 6 | 8.167 | 0.753 | 8 | 7 | 9 |
| Café Córdoba | 6 | 6.833 | 0.753 | 7 | 6 | 8 |
boxplot(
Sabor ~ Tratamiento,
data = datos,
col = c("lightblue", "lightgreen", "lightpink"),
main = "Distribución de las calificaciones del sabor",
xlab = "Marcas de café",
ylab = "Puntuación sensorial",
ylim = c(1, 10)
)
Se evaluó si las diferencias observadas entre las puntuaciones promedio del sabor son estadísticamente significativas.
modelo_sabor <- aov(
Sabor ~ Tratamiento,
data = datos
)
anova_sabor <- summary(modelo_sabor)
kable(
as.data.frame(anova_sabor[[1]]),
digits = 4,
caption = "Análisis de varianza correspondiente al sabor."
)
| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Tratamiento | 2 | 5.7778 | 2.8889 | 5.098 | 0.0204 |
| Residuals | 15 | 8.5000 | 0.5667 | NA | NA |
p_sabor <- anova_sabor[[1]][["Pr(>F)"]][1]
if (p_sabor < 0.05) {
cat(
"\nInterpretación: Se rechaza la hipótesis nula. ",
"Existen diferencias significativas entre las marcas ",
"en relación con la percepción del sabor."
)
} else {
cat(
"\nInterpretación: No se encontraron diferencias ",
"estadísticamente significativas entre las marcas."
)
}
##
## Interpretación: Se rechaza la hipótesis nula. Existen diferencias significativas entre las marcas en relación con la percepción del sabor.
tukey_sabor <- TukeyHSD(
modelo_sabor,
"Tratamiento",
conf.level = 0.95
)
kable(
as.data.frame(tukey_sabor$Tratamiento),
digits = 4,
caption = "Comparaciones múltiples de Tukey para el sabor."
)
| diff | lwr | upr | p adj | |
|---|---|---|---|---|
| Tostao Selecto-La Casona | 0.3333 | -0.7956 | 1.4622 | 0.7283 |
| Café Córdoba-La Casona | -1.0000 | -2.1289 | 0.1289 | 0.0865 |
| Café Córdoba-Tostao Selecto | -1.3333 | -2.4622 | -0.2044 | 0.0201 |
plot(tukey_sabor)
residuos_sabor <- residuals(modelo_sabor)
shapiro_sabor <- shapiro.test(residuos_sabor)
shapiro_sabor
##
## Shapiro-Wilk normality test
##
## data: residuos_sabor
## W = 0.92015, p-value = 0.1301
if (shapiro_sabor$p.value > 0.05) {
cat("\nSe cumple el supuesto de normalidad.")
} else {
cat("\nNo se cumple el supuesto de normalidad.")
}
##
## Se cumple el supuesto de normalidad.
qqnorm(
residuos_sabor,
main = "Gráfico Q-Q de los residuos del sabor",
pch = 19
)
qqline(
residuos_sabor,
col = "red",
lwd = 2
)
levene_sabor <- car::leveneTest(
Sabor ~ Tratamiento,
data = datos,
center = median
)
levene_sabor
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0 1
## 15
par(mfrow = c(2, 2))
plot(modelo_sabor)
par(mfrow = c(1, 1))
Se presenta una comparación de los promedios obtenidos por cada marca para los dos atributos evaluados.
comparacion <- data.frame(
Tratamiento = tratamientos,
Promedio_Aroma = as.numeric(
tapply(datos$Aroma, datos$Tratamiento, mean)
),
Promedio_Sabor = as.numeric(
tapply(datos$Sabor, datos$Tratamiento, mean)
)
)
kable(
comparacion,
digits = 3,
caption = "Comparación de los promedios de aroma y sabor."
)
| Tratamiento | Promedio_Aroma | Promedio_Sabor |
|---|---|---|
| La Casona | 8.167 | 7.833 |
| Tostao Selecto | 7.833 | 8.167 |
| Café Córdoba | 6.667 | 6.833 |
promedios <- rbind(
comparacion$Promedio_Aroma,
comparacion$Promedio_Sabor
)
barplot(
promedios,
beside = TRUE,
names.arg = tratamientos,
col = c("lightblue", "lightgreen"),
main = "Comparación sensorial de las marcas de café",
xlab = "Marcas evaluadas",
ylab = "Puntuación promedio",
ylim = c(0, 10),
legend.text = c("Aroma", "Sabor"),
args.legend = list(x = "topleft", bty = "n")
)
Se calculó eta cuadrado (η²) para estimar la proporción de variabilidad explicada por los tratamientos en cada atributo.
eta_aroma <- sum(
anova_aroma[[1]]["Tratamiento", "Sum Sq"]
) / sum(anova_aroma[[1]][["Sum Sq"]])
eta_sabor <- sum(
anova_sabor[[1]]["Tratamiento", "Sum Sq"]
) / sum(anova_sabor[[1]][["Sum Sq"]])
efectos <- data.frame(
Variable = c("Aroma", "Sabor"),
Eta_cuadrado = c(eta_aroma, eta_sabor)
)
kable(
efectos,
digits = 4,
caption = "Tamaño del efecto de los tratamientos."
)
| Variable | Eta_cuadrado |
|---|---|
| Aroma | 0.4527 |
| Sabor | 0.4047 |
A partir de los resultados obtenidos en el análisis estadístico se identificaron diferencias en la percepción sensorial de las tres marcas comerciales de café.
Para el atributo aroma, La Casona presentó el mayor promedio, seguida de Tostao Selecto y Café Córdoba. El análisis de varianza evidenció diferencias significativas entre los tratamientos.
En cuanto al sabor, Tostao Selecto obtuvo la mayor puntuación promedio, seguido de La Casona y Café Córdoba. También se encontraron diferencias estadísticamente significativas entre las marcas.
Las comparaciones múltiples de Tukey permitieron establecer que las diferencias dependen del atributo sensorial evaluado. Café Córdoba presentó las menores calificaciones en ambas variables.
Finalmente, las pruebas de Shapiro-Wilk y Levene permitieron verificar los supuestos de normalidad y homogeneidad de varianzas, respaldando el análisis estadístico realizado.