1. Introducción

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.

2. Características del diseño experimental

Se trabajó con un Diseño Completamente al Azar (DCA), considerando un factor experimental: la marca de café.

2.1. Identificación de los tratamientos

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."
)
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

3. Organización de los datos experimentales

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."
)
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

4. Evaluación de la variable aroma

4.1. Estadística descriptiva

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."
)
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

4.2. Representación gráfica del aroma

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)
)

4.3. Análisis de varianza (ANOVA)

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."
)
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.

4.4. Comparaciones múltiples mediante Tukey

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."
)
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)

4.5. Comprobación de normalidad

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.

Gráfico Q-Q

qqnorm(
  residuos_aroma,
  main = "Gráfico Q-Q de los residuos del aroma",
  pch = 19
)

qqline(
  residuos_aroma,
  col = "red",
  lwd = 2
)

4.6. Homogeneidad de varianzas

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

4.7. Diagnóstico del modelo

par(mfrow = c(2, 2))
plot(modelo_aroma)

par(mfrow = c(1, 1))

5. Evaluación de la variable sabor

5.1. Resumen estadístico

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."
)
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

5.2. Representación gráfica del sabor

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)
)

5.3. Análisis de varianza (ANOVA)

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."
)
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.

5.4. Comparaciones múltiples de Tukey

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."
)
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)

5.5. Verificación de normalidad

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.

Gráfico Q-Q

qqnorm(
  residuos_sabor,
  main = "Gráfico Q-Q de los residuos del sabor",
  pch = 19
)

qqline(
  residuos_sabor,
  col = "red",
  lwd = 2
)

5.6. Prueba de homogeneidad de varianzas

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

5.7. Diagnóstico del modelo

par(mfrow = c(2, 2))
plot(modelo_sabor)

par(mfrow = c(1, 1))

6. Comparación general de las dos variables

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."
)
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

Representación conjunta

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")
)

7. Tamaño del efecto

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."
)
Tamaño del efecto de los tratamientos.
Variable Eta_cuadrado
Aroma 0.4527
Sabor 0.4047

8. Conclusiones

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.

9. Referencias bibliográficas