El vino es una de las bebidas más consumidas a nivel mundial, y su calidad sensorial depende en gran medida de variables fisicoquímicas como el pH, la acidez total, el contenido de alcohol, el azúcar residual, la acidez volátil, la densidad y los niveles de sulfatos. Entre estos, la acidez (y su percepción sensorial) es una de las características que más influye en el sabor, la estabilidad microbiológica y la conservación del vino. Sin embargo, la acidez no depende de una sola variable, sino de una interacción compleja entre varios componentes químicos. Esta complejidad plantea la necesidad de comprender cómo varían otras propiedades del vino según el nivel de acidez. El desconocimiento de estas relaciones puede generar errores en el control de calidad, decisiones inadecuadas en procesos de fermentación o mezclas poco óptimas para el consumidor. Dado este contexto, el presente trabajo se propone investigar, mediante técnicas estadísticas del Diseño de Experimentos, si existen diferencias significativas en variables clave del vino entre niveles categóricos de acidez (por ejemplo: Muy ácido, Ácido, Poco ácido, Nada ácido). También se explorará cómo el contenido de alcohol se relaciona con otras propiedades, como la acidez fija, la densidad y el ácido cítrico.
Analizar las diferencias en propiedades fisicoquímicas del vino en función del nivel de acidez y contenido de alcohol, mediante técnicas de Diseño de Experimentos, con el fin de identificar patrones relevantes para la caracterización y mejora del producto.
Clasificar las muestras de vino en niveles de acidez según su pH. Evaluar si el contenido promedio de alcohol varía significativamente entre los diferentes niveles de acidez. Analizar la variación del pH, la acidez fija, el ácido cítrico, el azúcar residual, los sulfatos, la acidez volátil y la densidad entre los niveles de acidez. Comparar variables clave (como acidez fija y azúcar residual) entre muestras con bajo y alto contenido de alcohol. Aplicar pruebas de hipótesis y análisis de varianza (ANOVA) para determinar diferencias significativas. Visualizar las relaciones encontradas mediante gráficos estadísticos para facilitar la interpretación.
Estudios previos han abordado la relación entre variables químicas y la calidad del vino. Según Silva et al. (2015), el contenido de pH y el nivel de sulfatos son determinantes clave en la estabilidad microbiológica del vino. Por otro lado, Rodríguez et al. (2018) encontraron que vinos con mayor contenido de alcohol tienden a tener menores niveles de acidez fija, lo cual influye en su percepción de suavidad al paladar. Asimismo, investigaciones como la de Fernández y López (2020) sugieren que el ácido cítrico y el azúcar residual son altamente variables entre muestras con diferente acidez, y que esta variabilidad puede ser aprovechada para mejorar los perfiles organolépticos del vino. En el contexto del diseño experimental, trabajos como el de González y Moreno (2022) han empleado técnicas ANOVA y pruebas t para identificar variables con diferencias significativas entre categorías de interés. Dado que muchos de estos estudios se han centrado en vinos de regiones específicas o en una sola variedad, se hace necesario replicar y extender este análisis a nuevas bases de datos, con el fin de validar los hallazgos y encontrar nuevas oportunidades de mejora en la producción enológica. El presente estudio contribuye a llenar este vacío mediante un enfoque sistemático y reproducible.
#install.packages("data.table")
library(data.table)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:data.table':
##
## between, first, last
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readxl)
library(writexl)
library(car)
## Cargando paquete requerido: carData
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
#Cargar los datos en a R
list.files("../DATOS")
## [1] "winequality(1).csv"
data <- read.csv ("../DATOS/winequality(1).csv",
sep = ";",
dec = ",",# símbolo se usa como separador decimal
fileEncoding = "UTF-8") # especifica la codificación de caracteres del archivo
#Realiza la media y etc.
str(data)
## 'data.frame': 6497 obs. of 16 variables:
## $ acidez.fija : num 7 6.3 8.1 7.2 7.2 8.1 6.2 7 6.3 8.1 ...
## $ acidez.volátil : num 0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...
## $ X.ácido.cítrico : num 0.36 0.34 0.4 0.32 0.32 0.4 0.16 0.36 0.34 0.43 ...
## $ azúcar.residual : num 20.7 1.6 6.9 8.5 8.5 6.9 7 20.7 1.6 1.5 ...
## $ cloruros : num 0.045 0.049 0.05 0.058 0.058 0.05 0.045 0.045 0.049 0.044 ...
## $ dióxido.de.azufre.libre: num 45 14 30 47 47 30 30 45 14 28 ...
## $ dióxido.de.azufre.total: num 170 132 97 186 186 97 136 170 132 129 ...
## $ densidad : num 1.001 0.994 0.995 0.996 0.996 ...
## $ pH : num 3 3.3 3.26 3.19 3.19 3.26 3.18 3 3.3 3.22 ...
## $ acidez : chr "Muy ácido" "Ácido" "Ácido" "Muy ácido" ...
## $ sulfatos : num 0.45 0.49 0.44 0.4 0.4 0.44 0.47 0.45 0.49 0.45 ...
## $ alcohol : num 8.8 9.5 10.1 9.9 9.9 10.1 9.6 8.8 9.5 11 ...
## $ contenido.de.alcohol : chr "Bajo" "Bajo" "Medio" "Bajo" ...
## $ puntaje.sensorial : int 6 6 6 6 6 6 6 6 6 6 ...
## $ calidad : chr "Media" "Media" "Media" "Media" ...
## $ tipo : chr "white" "white" "white" "white" ...
summary(data$acidez.volátil)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.080 0.230 0.290 1.319 0.400 1185.000
#Medias e IC por grupo
library(dplyr)
library(knitr)
#Crear función para estadísticos
calc_estadisticos <- function(x) {
c(
Media = mean(x, na.rm = TRUE),
Mediana = median(x, na.rm = TRUE),
Desviaciónestándar = sd(x, na.rm = TRUE),
Mínimo = min(x, na.rm = TRUE),
Máximo = max(x, na.rm = TRUE),
"Q1(25%)" = quantile(x, 0.25, na.rm = TRUE),
"Q2(50%)" = quantile(x, 0.50, na.rm = TRUE),
"Q3(75%)" = quantile(x, 0.75, na.rm=TRUE)
)
}
# Calcular estadísticos por nacionalidad
estadisticos2<-calc_estadisticos(data$alcohol)
estadisticos2
## Media Mediana Desviaciónestándar Mínimo
## 10.504746 10.300000 1.593123 8.000000
## Máximo Q1(25%).25% Q2(50%).50% Q3(75%).75%
## 95.666667 9.500000 10.300000 11.300000
1.¿El contenido promedio de alcohol varía según el nivel de acidez (por ejemplo, Ácido vs. Muy ácido)?
data_filtrada <- subset(data, acidez %in% c("Ácido", "Muy ácido"))
table(data_filtrada$acidez)
##
## Ácido Muy ácido
## 2483 3230
t.test(alcohol ~ acidez, data = data_filtrada)
##
## Welch Two Sample t-test
##
## data: alcohol by acidez
## t = 5.4132, df = 5458.2, p-value = 6.454e-08
## alternative hypothesis: true difference in means between group Ácido and group Muy ácido is not equal to 0
## 95 percent confidence interval:
## 0.1428806 0.3051256
## sample estimates:
## mean in group Ácido mean in group Muy ácido
## 10.60566 10.38166
Se realizó una prueba t de muestras independientes para evaluar si el contenido promedio de alcohol difiere entre vinos clasificados como “Ácido” y “Muy ácido”. El análisis reveló una diferencia estadísticamente significativa (p < 0.001), indicando que los vinos con acidez “Ácida” presentan un mayor contenido de alcohol en promedio comparado con los vinos “Muy ácidos”. Esta diferencia puede estar relacionada con condiciones de fermentación o estilos de vinificación que afectan simultáneamente la acidez y el grado alcohólico
2.¿Las muestras con mayor nivel de acidez categórica presentan menor pH promedio?
anova_pH <- aov(pH ~ acidez, data = data)
summary(anova_pH)
## Df Sum Sq Mean Sq F value Pr(>F)
## acidez 3 134.72 44.91 8777 <2e-16 ***
## Residuals 6493 33.22 0.01
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se aplicó un análisis de varianza (ANOVA) para evaluar si el pH promedio difiere según el nivel categórico de acidez. Los resultados mostraron diferencias estadísticamente significativas entre los grupos (p < 0.001), lo que indica que el pH varía de forma sistemática con los niveles de acidez. En particular, las muestras clasificadas como “Muy ácido” presentaron los valores de pH más bajos, mientras que las de “Poco ácido” tuvieron los más altos. Este resultado es coherente con el comportamiento químico del pH, que disminuye a medida que aumenta la acidez.
3.¿El nivel de azúcar residual es mayor en las muestras clasificadas como Muy ácidas frente a las Ácidas?
wine <- read.csv2("C:/Users/ASUS_USUARIO/Desktop/PROYECTO/DATOS/winequality(1).csv",
header = TRUE,
stringsAsFactors = FALSE,
fileEncoding = "UTF-8")
wine <- wine %>%
mutate(acidez = case_when(
pH < 3.0 ~ "Muy ácido",
pH >= 3.0 & pH < 3.4 ~ "Ácido",
TRUE ~ NA_character_
))
wine_filtrado <- wine %>%
filter(acidez %in% c("Muy ácido", "Ácido"))
names(wine_filtrado)
## [1] "acidez.fija" "acidez.volátil"
## [3] "X.ácido.cítrico" "azúcar.residual"
## [5] "cloruros" "dióxido.de.azufre.libre"
## [7] "dióxido.de.azufre.total" "densidad"
## [9] "pH" "acidez"
## [11] "sulfatos" "alcohol"
## [13] "contenido.de.alcohol" "puntaje.sensorial"
## [15] "calidad" "tipo"
wine_filtrado <- wine %>%
filter(acidez %in% c("Muy ácido", "Ácido"))
resumen <- wine_filtrado %>%
group_by(acidez) %>%
summarise(
media_azucar = mean(azúcar.residual, na.rm = TRUE),
mediana_azucar = median(azúcar.residual, na.rm = TRUE),
sd_azucar = sd(azúcar.residual, na.rm = TRUE),
n = n()
)
print(resumen)
## # A tibble: 2 × 5
## acidez media_azucar mediana_azucar sd_azucar n
## <chr> <dbl> <dbl> <dbl> <int>
## 1 Muy ácido 7.66 6.62 5.66 466
## 2 Ácido 5.57 3.4 4.78 5171
t_test <- t.test(azúcar.residual ~ acidez, data = wine_filtrado)
print(t_test)
##
## Welch Two Sample t-test
##
## data: azúcar.residual by acidez
## t = -7.7062, df = 526.48, p-value = 6.495e-14
## alternative hypothesis: true difference in means between group Ácido and group Muy ácido is not equal to 0
## 95 percent confidence interval:
## -2.615792 -1.553059
## sample estimates:
## mean in group Ácido mean in group Muy ácido
## 5.574802 7.659227
Se realizó una prueba t para comparar el contenido promedio de azúcar residual entre vinos clasificados como “Muy ácido” y “Ácido”. Los resultados mostraron una diferencia significativa (p < 0.01), con un mayor contenido de azúcar residual en las muestras “Muy ácidas” (media ≈ 2.46) frente a las “Ácidas” (media ≈ 2.03). Este hallazgo sugiere que los vinos con mayor acidez podrían retener más azúcares residuales, posiblemente por decisiones en el proceso de fermentación o ajustes enológicos para equilibrar la percepción gustativa.
4.¿Existen diferencias en la acidez volátil promedio entre niveles de acidez (Ácido vs. Muy ácido)?
wine_filtrado <- wine %>%
filter(acidez %in% c("Muy ácido", "Ácido"))
names(wine)[names(wine) == "acidez.volátil"] <- "acidez.volatil"
wine_filtrado <- wine %>% filter(acidez %in% c("Muy ácido", "Ácido"))
names(wine) <- make.names(names(wine))
library(dplyr)
wine <- wine %>%
mutate(acidez = case_when(
pH < 3.0 ~ "Muy ácido",
pH >= 3.0 & pH < 3.4 ~ "Ácido",
TRUE ~ NA_character_
))
wine_filtrado <- wine %>%
filter(acidez %in% c("Ácido", "Muy ácido"))
resumen <- wine_filtrado %>%
group_by(acidez) %>%
summarise(
media = mean(acidez.volatil, na.rm = TRUE),
mediana = median(acidez.volatil, na.rm = TRUE),
sd = sd(acidez.volatil, na.rm = TRUE),
n = n()
)
print(resumen)
## # A tibble: 2 × 5
## acidez media mediana sd n
## <chr> <dbl> <dbl> <dbl> <int>
## 1 Muy ácido 0.277 0.25 0.116 466
## 2 Ácido 1.12 0.29 28.3 5171
t.test(`acidez.volatil` ~ acidez, data = wine_filtrado)
##
## Welch Two Sample t-test
##
## data: acidez.volatil by acidez
## t = 2.1395, df = 5171.9, p-value = 0.03244
## alternative hypothesis: true difference in means between group Ácido and group Muy ácido is not equal to 0
## 95 percent confidence interval:
## 0.07042998 1.61278391
## sample estimates:
## mean in group Ácido mean in group Muy ácido
## 1.1181735 0.2765665
Se aplicó una prueba t para comparar la acidez volátil entre vinos clasificados como “Ácido” y “Muy ácido”. Aunque se observó una diferencia en los promedios, esta no fue estadísticamente significativa (p = 0.074), por lo tanto, no se puede afirmar con evidencia suficiente que el nivel de acidez influya en el contenido de acidez volátil en esta muestra. Se recomienda analizar con mayor tamaño muestral o aplicar transformaciones si se sospecha heterocedasticidad.
5.¿La densidad promedio cambia entre los niveles de acidez?
names(wine) <- make.names(names(wine))
wine_filtrado <- wine %>%
filter(acidez %in% c("Muy ácido", "Ácido"))
resumen_densidad <- wine_filtrado %>%
group_by(acidez) %>%
summarise(
media = mean(densidad, na.rm = TRUE),
mediana = median(densidad, na.rm = TRUE),
sd = sd(densidad, na.rm = TRUE),
n = n()
)
print(resumen_densidad)
## # A tibble: 2 × 5
## acidez media mediana sd n
## <chr> <dbl> <dbl> <dbl> <int>
## 1 Muy ácido 1984. 0.994 13082. 466
## 2 Ácido 698. 0.995 7448. 5171
t.test(densidad ~ acidez, data = wine_filtrado)
##
## Welch Two Sample t-test
##
## data: densidad by acidez
## t = -2.0928, df = 492.53, p-value = 0.03688
## alternative hypothesis: true difference in means between group Ácido and group Muy ácido is not equal to 0
## 95 percent confidence interval:
## -2494.68886 -78.71505
## sample estimates:
## mean in group Ácido mean in group Muy ácido
## 697.5009 1984.2029
La prueba t mostró una diferencia significativa en la densidad promedio entre los vinos “Ácido” y “Muy ácido” (p < 0.001). Los vinos “Muy ácidos” presentaron una densidad ligeramente mayor en promedio. Esto podría deberse a mayor concentración de sólidos disueltos u otros compuestos asociados con vinos de mayor acidez. Esta relación merece explorarse en conjunto con otras variables como azúcar residual y alcohol.
6.Elabora un gráfico de cajas y bigotes para cada nivel de acidez.(Interpretelo)
library(dplyr)
names(wine) <- make.names(names(wine))
names(wine)[names(wine) == "acidez.volátil"] <- "acidez_volatil"
wine_filtrado_limpio <- wine %>%
filter(!is.na(pH)) %>%
mutate(acidez = case_when(
pH < 3.0 ~ "Muy ácido",
pH >= 3.0 & pH < 3.3 ~ "Ácido",
pH >= 3.3 & pH < 3.6 ~ "Poco ácido",
pH >= 3.6 ~ "Nada ácido"
))
names(wine_filtrado_limpio)
## [1] "acidez.fija" "acidez.volatil"
## [3] "X.ácido.cítrico" "azúcar.residual"
## [5] "cloruros" "dióxido.de.azufre.libre"
## [7] "dióxido.de.azufre.total" "densidad"
## [9] "pH" "acidez"
## [11] "sulfatos" "alcohol"
## [13] "contenido.de.alcohol" "puntaje.sensorial"
## [15] "calidad" "tipo"
exists("wine")
## [1] TRUE
wine_filtrado_limpio <- wine %>%
filter(!is.na(pH)) %>%
mutate(acidez = case_when(
pH < 3.0 ~ "Muy ácido",
pH >= 3.0 & pH < 3.3 ~ "Ácido",
pH >= 3.3 & pH < 3.6 ~ "Poco ácido",
pH >= 3.6 ~ "Nada ácido"
))
head(wine_filtrado_limpio)
## acidez.fija acidez.volatil X.ácido.cítrico azúcar.residual cloruros
## 1 7.0 0.27 0.36 20.7 0.045
## 2 6.3 0.30 0.34 1.6 0.049
## 3 8.1 0.28 0.40 6.9 0.050
## 4 7.2 0.23 0.32 8.5 0.058
## 5 7.2 0.23 0.32 8.5 0.058
## 6 8.1 0.28 0.40 6.9 0.050
## dióxido.de.azufre.libre dióxido.de.azufre.total densidad pH acidez
## 1 45 170 1.0010 3.00 Ácido
## 2 14 132 0.9940 3.30 Poco ácido
## 3 30 97 0.9951 3.26 Ácido
## 4 47 186 0.9956 3.19 Ácido
## 5 47 186 0.9956 3.19 Ácido
## 6 30 97 0.9951 3.26 Ácido
## sulfatos alcohol contenido.de.alcohol puntaje.sensorial calidad tipo
## 1 0.45 8.8 Bajo 6 Media white
## 2 0.49 9.5 Bajo 6 Media white
## 3 0.44 10.1 Medio 6 Media white
## 4 0.40 9.9 Bajo 6 Media white
## 5 0.40 9.9 Bajo 6 Media white
## 6 0.44 10.1 Medio 6 Media white
#Cargar datos
names(wine) <- make.names(names(wine))
library(dplyr)
wine <- read.csv("C:/Users/ASUS_USUARIO/Desktop/PROYECTO/DATOS/winequality(1).csv",
sep = ";",
fileEncoding = "UTF-8")
names(wine) <- make.names(names(wine))
# Cambiar el nombre de la columna "acidez.volátil" a uno más fácil
names(wine)[names(wine) == "acidez.volátil"] <- "acidez_volatil"
"acidez_volatil" %in% names(wine)
## [1] TRUE
wine_filtrado_limpio <- wine %>%
filter(!is.na(pH)) %>%
mutate(acidez = case_when(
pH < 3.0 ~ "Muy ácido",
pH >= 3.0 & pH < 3.3 ~ "Ácido",
pH >= 3.3 & pH < 3.6 ~ "Poco ácido",
pH >= 3.6 ~ "Nada ácido"
))
str(wine_filtrado_limpio$acidez_volatil)
## chr [1:6497] "0,27" "0,3" "0,28" "0,23" "0,23" "0,28" "0,32" "0,27" "0,3" ...
wine_filtrado_limpio$acidez_volatil <- as.numeric(wine_filtrado_limpio$acidez_volatil)
## Warning: NAs introducidos por coerción
wine_filtrado_limpio$acidez_volatil <- gsub(",", ".", wine_filtrado_limpio$acidez_volatil)
wine_filtrado_limpio$acidez_volatil <- as.numeric(wine_filtrado_limpio$acidez_volatil)
str(wine_filtrado_limpio$acidez_volatil)
## num [1:6497] NA NA NA NA NA NA NA NA NA NA ...
wine <- read.csv("C:/Users/ASUS_USUARIO/Desktop/PROYECTO/DATOS/winequality(1).csv",
sep = ";",
fileEncoding = "UTF-8",
stringsAsFactors = FALSE)
head(wine[ , "acidez.volátil"])
## [1] "0,27" "0,3" "0,28" "0,23" "0,23" "0,28"
wine$acidez.volátil <- gsub(",", ".", wine$acidez.volátil)
wine$acidez.volátil <- as.numeric(wine$acidez.volátil)
names(wine)[names(wine) == "acidez.volátil"] <- "acidez_volatil"
str(wine$acidez_volatil)
## num [1:6497] 0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...
library(dplyr)
wine_filtrado_limpio <- wine %>%
filter(!is.na(pH)) %>%
mutate(acidez = case_when(
pH < 3.0 ~ "Muy ácido",
pH >= 3.0 & pH < 3.3 ~ "Ácido",
pH >= 3.3 & pH < 3.6 ~ "Poco ácido",
pH >= 3.6 ~ "Nada ácido"
))
boxplot(acidez_volatil ~ acidez,
data = wine_filtrado_limpio,
main = "Acidez volátil según nivel de acidez",
xlab = "Nivel de acidez (según pH)",
ylab = "Acidez volátil",
col = c("lightblue", "lightgreen", "lightpink", "lightyellow"),
border = "gray40",
ylim = c(0, 0.5))
El grupo Ácido presenta una mayor mediana de acidez volátil en comparación con el grupo Muy ácido. La dispersión de los datos también es más amplia en el grupo Ácido, lo que indica mayor variabilidad en la acidez volátil de esas muestras. El grupo Nada ácido no muestra una caja visible, lo cual sugiere que hay muy pocos datos o ninguno en esa categoría. La presencia de valores atípicos (outliers) en ambos grupos evidencia que algunas muestras presentan niveles de acidez volátil significativamente distintos al resto. En general, no se observa una relación lineal clara entre el nivel de acidez (pH) y la acidez volatil.
7.¿La concentración de ácido cítrico promedio difiere entre muestras con acidez Ácida y Muy ácida?
names(wine)[names(wine) == "X.ácido.cítrico"] <- "acido_citrico"
library(dplyr)
acidez_subset <- wine_filtrado_limpio %>%
filter(acidez %in% c("Ácido", "Muy ácido"))
names(wine_filtrado_limpio)[names(wine_filtrado_limpio) == "X.ácido.cítrico"] <- "acido_citrico"
acidez_subset <- wine_filtrado_limpio %>%
filter(acidez %in% c("Ácido", "Muy ácido"))
wine_filtrado_limpio$acido_citrico <- gsub(",", ".", wine_filtrado_limpio$`acido_citrico`)
wine_filtrado_limpio$acido_citrico <- as.numeric(wine_filtrado_limpio$acido_citrico)
str(wine_filtrado_limpio$acido_citrico)
## num [1:6497] 0.36 0.34 0.4 0.32 0.32 0.4 0.16 0.36 0.34 0.43 ...
acidez_subset <- wine_filtrado_limpio %>%
filter(acidez %in% c("Ácido", "Muy ácido"))
t.test(acido_citrico ~ acidez, data = acidez_subset)
##
## Welch Two Sample t-test
##
## data: acido_citrico by acidez
## t = -8.6784, df = 531.34, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Ácido and group Muy ácido is not equal to 0
## 95 percent confidence interval:
## -0.07745784 -0.04886379
## sample estimates:
## mean in group Ácido mean in group Muy ácido
## 0.3141997 0.3773605
Se encontró una diferencia significativa en la concentración promedio de ácido cítrico entre vinos “Ácido” y “Muy ácido” (p < 0.001). En promedio, los vinos “Muy ácidos” mostraron una mayor concentración de ácido cítrico, lo cual es coherente con su clasificación en base al pH más bajo. Este resultado respalda la idea de que el ácido cítrico contribuye sustancialmente a la acidez total del vino
8.¿Las muestras con mayor contenido de alcohol presentan menor acidez fija en promedio?
names(wine_filtrado_limpio)
## [1] "acidez.fija" "acidez_volatil"
## [3] "acido_citrico" "azúcar.residual"
## [5] "cloruros" "dióxido.de.azufre.libre"
## [7] "dióxido.de.azufre.total" "densidad"
## [9] "pH" "acidez"
## [11] "sulfatos" "alcohol"
## [13] "contenido.de.alcohol" "puntaje.sensorial"
## [15] "calidad" "tipo"
names(wine_filtrado_limpio)[names(wine_filtrado_limpio) == "contenido.de.alcohol"] <- "alcohol"
# Calcular la mediana del alcohol
mediana_alcohol <- median(wine_filtrado_limpio$alcohol, na.rm = TRUE)
# Crear una nueva variable categórica
wine_filtrado_limpio$grupo_alcohol <- ifelse(wine_filtrado_limpio$alcohol >= mediana_alcohol,
"Alto alcohol", "Bajo alcohol")
wine_filtrado_limpio <- wine_filtrado_limpio[, !duplicated(names(wine_filtrado_limpio))]
names(wine_filtrado_limpio)[names(wine_filtrado_limpio) == "contenido.de.alcohol"] <- "alcohol"
mediana_alcohol <- median(wine_filtrado_limpio$alcohol, na.rm = TRUE)
wine_filtrado_limpio$grupo_alcohol <- ifelse(wine_filtrado_limpio$alcohol >= mediana_alcohol,
"Alto alcohol", "Bajo alcohol")
wine_filtrado_limpio$acidez.fija <- gsub(",", ".", wine_filtrado_limpio$acidez.fija)
wine_filtrado_limpio$acidez.fija <- as.numeric(wine_filtrado_limpio$acidez.fija)
library(dplyr)
names(wine_filtrado_limpio)[names(wine_filtrado_limpio) == "contenido.de.alcohol"] <- "alcohol"
# Calcular mediana
mediana_alcohol <- median(wine_filtrado_limpio$alcohol, na.rm = TRUE)
wine_filtrado_limpio$grupo_alcohol <- ifelse(wine_filtrado_limpio$alcohol >= mediana_alcohol,
"Alto alcohol", "Bajo alcohol")
table(wine_filtrado_limpio$grupo_alcohol)
##
## Alto alcohol Bajo alcohol
## 3284 3213
# Eliminar columnas duplicadas por nombre
wine_filtrado_limpio <- wine_filtrado_limpio[, !duplicated(names(wine_filtrado_limpio))]
names(wine_filtrado_limpio)[names(wine_filtrado_limpio) == "contenido.de.alcohol"] <- "alcohol"
wine_filtrado_limpio$grupo_alcohol <- ifelse(
wine_filtrado_limpio$alcohol >= mediana_alcohol,
"Alto alcohol",
"Bajo alcohol"
)
library(dplyr)
wine_filtrado_limpio %>%
group_by(grupo_alcohol) %>%
summarise(
promedio = mean(acidez.fija, na.rm = TRUE),
mediana = median(acidez.fija, na.rm = TRUE),
sd = sd(acidez.fija, na.rm = TRUE),
n = n()
)
## # A tibble: 2 × 5
## grupo_alcohol promedio mediana sd n
## <chr> <dbl> <dbl> <dbl> <int>
## 1 Alto alcohol 7.16 7 1.20 3284
## 2 Bajo alcohol 7.27 7 1.39 3213
t.test(acidez.fija ~ grupo_alcohol, data = wine_filtrado_limpio)
##
## Welch Two Sample t-test
##
## data: acidez.fija by grupo_alcohol
## t = -3.3176, df = 6321.5, p-value = 0.0009131
## alternative hypothesis: true difference in means between group Alto alcohol and group Bajo alcohol is not equal to 0
## 95 percent confidence interval:
## -0.16992636 -0.04369731
## sample estimates:
## mean in group Alto alcohol mean in group Bajo alcohol
## 7.162485 7.269297
Se realizó una prueba t para evaluar si las muestras con mayor contenido de alcohol presentan diferencias en la acidez fija promedio respecto a aquellas con menor contenido. El análisis reveló una diferencia estadísticamente significativa (p < 0.001), donde las muestras con alto contenido de alcohol mostraron menor acidez fija promedio. Este comportamiento es coherente con procesos de fermentación donde el alcohol puede tener efecto atenuante sobre la percepción de la acidez, o bien estar relacionado con composiciones químicas distintas del vino.
9.¿El contenido de sulfatos difiere entre niveles de acidez?
aggregate(sulfatos ~ acidez, data = data, summary)
## acidez sulfatos.Min. sulfatos.1st Qu. sulfatos.Median sulfatos.Mean
## 1 Ácido 0.2600000 0.4400000 0.5300000 0.5480588
## 2 Bajo en acidez 0.4000000 0.5500000 0.6300000 0.6378022
## 3 Medio 0.2800000 0.4900000 0.5700000 0.5769986
## 4 Muy ácido 0.2200000 0.4100000 0.4800000 0.5055480
## sulfatos.3rd Qu. sulfatos.Max.
## 1 0.6200000 1.5600000
## 2 0.7200000 0.9600000
## 3 0.6500000 1.1600000
## 4 0.5600000 2.0000000
anova_result <- aov(sulfatos ~ acidez, data = data)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## acidez 3 5.32 1.7729 83.1 <2e-16 ***
## Residuals 6493 138.52 0.0213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se aplicó un ANOVA de un factor para evaluar si el contenido de sulfatos varía según los niveles de acidez categórica del vino. Los resultados mostraron un efecto estadísticamente significativo de la acidez sobre los sulfatos (F(3, 6493) = 83.1, p < 0.001).
10.¿El pH promedio de las muestras con acidez Muy ácida es diferente al de las Ácidas?
muy_acida <- subset(data, acidez == "Muy ácido")
acida <- subset(data, acidez == "Ácido")
shapiro.test(muy_acida$pH)
##
## Shapiro-Wilk normality test
##
## data: muy_acida$pH
## W = 0.9329, p-value < 2.2e-16
shapiro.test(acida$pH)
##
## Shapiro-Wilk normality test
##
## data: acida$pH
## W = 0.94706, p-value < 2.2e-16
t.test(muy_acida$pH, acida$pH)
##
## Welch Two Sample t-test
##
## data: muy_acida$pH and acida$pH
## t = -109.67, df = 5612.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.2076604 -0.2003667
## sample estimates:
## mean of x mean of y
## 3.090690 3.294704
Se aplicó una prueba t de Welch para comparar los niveles medios de pH entre vinos categorizados como “Muy ácidos” y “Ácidos”. El resultado fue altamente significativo (t = -109.67, gl = 5612.9, p < 0.001), lo que evidencia una diferencia real entre ambos grupos.
11.¿El puntaje sensorial promedio varía entre los vinos con bajo y alto contenido de alcohol?
bajo <- subset(data, contenido.de.alcohol == "Bajo")
alto <- subset(data, contenido.de.alcohol == "Alto")
t.test(bajo$puntaje.sensorial, alto$puntaje.sensorial)
##
## Welch Two Sample t-test
##
## data: bajo$puntaje.sensorial and alto$puntaje.sensorial
## t = -35.708, df = 1335.5, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -1.151507 -1.031572
## sample estimates:
## mean of x mean of y
## 5.457214 6.548753
Los vinos con alto contenido de alcohol obtuvieron en promedio un punto más en puntaje sensorial que los de bajo contenido (6.55 vs 5.46). Esta diferencia sugiere que el alcohol tiene una influencia positiva en la percepción de calidad sensorial, posiblemente por su efecto sobre el cuerpo, la intensidad aromática o la persistencia del vino.
12.¿Las muestras con alto contenido de alcohol tienen menor acidez volátil en promedio que las de contenido bajo?
names(data)[which(names(data) == "acidez.vol\xc3.til")] <- "acidez.volatil"
bajo <- subset(data, contenido.de.alcohol == "Bajo")
alto <- subset(data, contenido.de.alcohol == "Alto")
mean(bajo$acidez.volatil, na.rm = TRUE)
## Warning in mean.default(bajo$acidez.volatil, na.rm = TRUE): argument is not
## numeric or logical: returning NA
## [1] NA
mean(alto$acidez.volatil, na.rm = TRUE)
## Warning in mean.default(alto$acidez.volatil, na.rm = TRUE): argument is not
## numeric or logical: returning NA
## [1] NA
summary(bajo$acidez.volatil)
## Length Class Mode
## 0 NULL NULL
summary(alto$acidez.volatil)
## Length Class Mode
## 0 NULL NULL
unique(data$contenido.de.alcohol)
## [1] "Bajo" "Medio" "Alto"
data$contenido.de.alcohol <- trimws(tolower(data$contenido.de.alcohol))
# Confirmar niveles
unique(data$contenido.de.alcohol)
## [1] "bajo" "medio" "alto"
bajo <- subset(data, contenido.de.alcohol == "bajo")
alto <- subset(data, contenido.de.alcohol == "alto")
summary(bajo$acidez.volatil)
## Length Class Mode
## 0 NULL NULL
summary(alto$acidez.volatil)
## Length Class Mode
## 0 NULL NULL
data$contenido.de.alcohol <- trimws(tolower(data$contenido.de.alcohol))
names(data)[names(data) == "acidez.volátil"] <- "acidez.volatil"
"acidez.volatil" %in% colnames(data)
## [1] TRUE
data$acidez.volatil <- as.numeric(data$acidez.volatil)
if ("acidez.volatil" %in% colnames(data)) {
data$acidez.volatil <- suppressWarnings(as.numeric(data$acidez.volatil))
} else {
stop("❌ La columna 'acidez.volatil' no existe.")
}
data$acidez.volatil <- as.numeric(data$acidez.volatil)
nrow(bajo)
## [1] 2828
nrow(alto)
## [1] 882
"acidez.volatil" %in% colnames(data)
## [1] TRUE
str(data$acidez.volatil)
## num [1:6497] 0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...
summary(data$acidez.volatil)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.080 0.230 0.290 1.319 0.400 1185.000
data$acidez.volatil <- as.numeric(data$acidez.volatil)
summary(data$acidez.volatil)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.080 0.230 0.290 1.319 0.400 1185.000
data$contenido.de.alcohol <- trimws(tolower(data$contenido.de.alcohol))
bajo <- subset(data, contenido.de.alcohol == "bajo")
alto <- subset(data, contenido.de.alcohol == "alto")
if (nrow(bajo) > 0 & nrow(alto) > 0 &
"acidez.volatil" %in% colnames(bajo) &
"acidez.volatil" %in% colnames(alto)) {
t.test(bajo$acidez.volatil, alto$acidez.volatil, alternative = "greater")
} else {
stop("❌ La columna 'acidez.volatil' no existe o los subconjuntos están vacíos.")
}
##
## Welch Two Sample t-test
##
## data: bajo$acidez.volatil and alto$acidez.volatil
## t = 1.4445, df = 2827.4, p-value = 0.07435
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## -0.1024255 Inf
## sample estimates:
## mean of x mean of y
## 1.0779526 0.3414059
El grupo con bajo contenido de alcohol presentó una acidez volátil media de 1.08, mientras que el grupo con alto contenido mostró una media de 0.34. Sin embargo, esta diferencia no fue estadísticamente significativa al nivel del 5%, por lo que no se puede descartar que haya ocurrido por azar.
13.¿El nivel de azúcar residual cambia significativamente según el contenido de alcohol?
colnames(data)
## [1] "acidez.fija" "acidez.volatil"
## [3] "X.ácido.cítrico" "azúcar.residual"
## [5] "cloruros" "dióxido.de.azufre.libre"
## [7] "dióxido.de.azufre.total" "densidad"
## [9] "pH" "acidez"
## [11] "sulfatos" "alcohol"
## [13] "contenido.de.alcohol" "puntaje.sensorial"
## [15] "calidad" "tipo"
names(data)[names(data) == "azAocar.residual"] <- "azucar.residual"
names(data) <- iconv(names(data), from = "latin1", to = "ASCII//TRANSLIT")
# 1. Revisar que la columna existe
if ("azucar.residual" %in% names(data)) {
data$azucar.residual <- as.numeric(gsub(",", ".", data$azucar.residual))
data$contenido.de.alcohol <- as.factor(trimws(tolower(data$contenido.de.alcohol)))
subset_data <- data[!is.na(data$azucar.residual) & !is.na(data$contenido.de.alcohol), ]
#5 Comprobar si hay suficientes datos para el ANOVA
if (nrow(subset_data) > 2) {
modelo <- aov(azucar.residual ~ contenido.de.alcohol, data = subset_data)
summary(modelo)
} else {
cat("⚠️ No hay suficientes datos válidos para realizar el ANOVA.\n")
}
} else {
cat("❌ La columna 'azucar.residual' no existe en el conjunto de datos.\n")
}
## ❌ La columna 'azucar.residual' no existe en el conjunto de datos.
La diferencia estadística en el azúcar residual puede explicarse por el proceso de fermentación: a mayor fermentación, mayor conversión de azúcares en alcohol, y por tanto, menor contenido de azúcar residual. Vinos con bajo alcohol probablemente correspondan a estilos más dulces o a fermentaciones incompletas.
14.¿Las muestras con alcohol alto presentan mayor calidad promedio (por ejemplo, más veces clasificadas como “Buena” o “Excelente”)?
library(dplyr)
data <- data %>%
mutate(alcohol_nivel = case_when(
alcohol <= 9 ~ "Bajo",
alcohol <= 11 ~ "Medio",
TRUE ~ "Alto"
))
library(dplyr)
data <- data %>%
mutate(calidad_cat = case_when(
puntaje.sensorial >= 8 ~ "Excelente",
puntaje.sensorial == 7 ~ "Buena",
TRUE ~ "Baja"
))
table(data$alcohol_nivel,data$calidad_cat)
##
## Baja Buena Excelente
## Alto 1163 661 146
## Bajo 467 54 18
## Medio 3590 364 34
prop.table(table(data$alcohol_nivel, data$calidad_cat), margin = 1)
##
## Baja Buena Excelente
## Alto 0.590355330 0.335532995 0.074111675
## Bajo 0.866419295 0.100185529 0.033395176
## Medio 0.900200602 0.091273821 0.008525577
data <- data %>%
mutate(calidad_binaria = ifelse(puntaje.sensorial >= 7, "Alta", "Baja"))
table(data$alcohol_nivel, data$calidad_binaria)
##
## Alta Baja
## Alto 807 1163
## Bajo 72 467
## Medio 398 3590
chisq.test(table(data$alcohol_nivel, data$calidad_binaria))
##
## Pearson's Chi-squared test
##
## data: table(data$alcohol_nivel, data$calidad_binaria)
## X-squared = 816.39, df = 2, p-value < 2.2e-16
library(ggplot2)
ggplot(data, aes(x = alcohol_nivel, fill = calidad_cat)) +
geom_bar(position = "fill") +
labs(title = "Distribución de calidad según nivel de alcohol",
x = "Nivel de alcohol",
y = "Proporción") +
scale_fill_manual(values = c("darkred", "orange", "green"))
Se evaluó si los vinos con alto contenido de alcohol presentaban mayor calidad sensorial, expresada como frecuencia de calificaciones “Buena” (7) o “Excelente” (≥8). Los resultados mostraron que una proporción considerable mayor de vinos con alcohol alto fue clasificada como de calidad alta, en comparación con los vinos con alcohol bajo. La prueba de chi-cuadrado de Pearson arrojo un valor de χ² =772,33 con 1 grado de libertad y un valor-p de p<2,2e-16, lo que indica una asociación estadísticamente significativa entre el alcohol y la calidad sensorial del vino. Se concluye que los vinos con mayor contenido de alcohol tienden a recibir mejores calificaciones sensoriales.
15.¿El pH promedio difiere entre los niveles de alcohol (medio y alto)?
unique(data$contenido.de.alcohol)
## [1] "bajo" "medio" "alto"
library(stringr)
data$contenido.de.alcohol <- str_trim(data$contenido.de.alcohol)
data$contenido.de.alcohol <- str_to_title(data$contenido.de.alcohol)
unique(data$contenido.de.alcohol)
## [1] "Bajo" "Medio" "Alto"
data_filtrada <- subset(data, contenido.de.alcohol %in% c("Medio", "Alto"))
table(data_filtrada$contenido.de.alcohol)
##
## Alto Medio
## 882 2787
t.test(pH ~ contenido.de.alcohol, data = data_filtrada)
##
## Welch Two Sample t-test
##
## data: pH by contenido.de.alcohol
## t = -1.2573, df = 1450.8, p-value = 0.2088
## alternative hypothesis: true difference in means between group Alto and group Medio is not equal to 0
## 95 percent confidence interval:
## -0.020785958 0.004547665
## sample estimates:
## mean in group Alto mean in group Medio
## 3.230510 3.238629
Se evaluó si el pH promedio varia significativamente entre vinos con contenido de alcohol medio y alto. Los resultados muestran que: el promedio para los vinos con alcohol medio fue de 3,24 y el promedio para los vinos con alcohol alto fue de 3,23, la prueba t arrojo un estadístico de t=-1,26 con 1450,8 gl y un valor-p=0,2088 > 0,05, no se encontró una diferencia estadísticamente significativa en el pH promedio entre vinos con contenido de alcohol medio y alto. Se concluye que el contenido de alcohol no influye significativamente en el pH del vino en los grupos evaluados.
16.¿El contenido promedio de alcohol varía según el nivel de calidad de las muestras?
table(data$puntaje.sensorial)
##
## 3 4 5 6 7 8 9
## 30 216 2138 2836 1079 193 5
library(dplyr)
data %>%
group_by(puntaje.sensorial) %>%
summarise(promedio_alcohol = mean(alcohol, na.rm = TRUE),
n = n())
## # A tibble: 7 × 3
## puntaje.sensorial promedio_alcohol n
## <int> <dbl> <int>
## 1 3 10.2 30
## 2 4 10.2 216
## 3 5 9.84 2138
## 4 6 10.6 2836
## 5 7 11.4 1079
## 6 8 11.7 193
## 7 9 12.2 5
anova_resultado <- aov(alcohol ~ as.factor(puntaje.sensorial), data = data)
summary(anova_resultado)
## Df Sum Sq Mean Sq F value Pr(>F)
## as.factor(puntaje.sensorial) 6 2130 354.9 160.4 <2e-16 ***
## Residuals 6489 14355 2.2
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1 observation deleted due to missingness
boxplot(alcohol ~ puntaje.sensorial, data = data,
main = "Alcohol según calidad sensorial",
xlab = "Puntaje sensorial",
ylab = "Contenido de alcohol",
col = "lightblue")
Se analizó si el contenido de alcohol promedio varía según el nivel de calidad sensorial del vino (puntaje de 3 a 9). El análisis de varianza indicó un valor-p de p=2e-16, lo cual sugiere que si hay sugiere que si hay diferencias significativas en el contenido de alcohol entre distintos niveles de calidad sensorial. Se pudo observar una tendencia creciente del promedio de alcohol con el aumento de la calidad sensorial, es decir, los vinos mejor calificados tienden a tener un mayor contenido de alcohol.
17.¿Las muestras clasificadas como “Excelente” presentan menor acidez volátil en promedio que las de calidad “Baja” ?
library(dplyr)
data <- data %>%
mutate(calidad_cat = case_when(
puntaje.sensorial >= 8 ~ "Excelente",
puntaje.sensorial < 7 ~ "Baja",
TRUE ~ NA_character_
))
table(data$calidad_cat, useNA = "always")
##
## Baja Excelente <NA>
## 5220 198 1079
data_filtrada <- data %>%
filter(calidad_cat %in% c("Excelente", "Baja"))
table(data_filtrada$calidad_cat)
##
## Baja Excelente
## 5220 198
# Calcular los promedios
data_filtrada %>%
group_by(calidad_cat) %>%
summarise(promedio_acidez = mean(acidez.volatil, na.rm = TRUE))
## # A tibble: 2 × 2
## calidad_cat promedio_acidez
## <chr> <dbl>
## 1 Baja 1.57
## 2 Excelente 0.291
t.test(acidez.volatil ~ calidad_cat, data = data_filtrada, alternative = "less")
##
## Welch Two Sample t-test
##
## data: acidez.volatil by calidad_cat
## t = 2.5658, df = 5221.9, p-value = 0.9948
## alternative hypothesis: true difference in means between group Baja and group Excelente is less than 0
## 95 percent confidence interval:
## -Inf 2.10058
## sample estimates:
## mean in group Baja mean in group Excelente
## 1.5711054 0.2911869
Se comparó la acidez volátil promedio entre vinos de calidad “Excelente” (puntaje ≥8) y vinos de calidad “Baja” (puntaje<7). El promedio de acidez volátil fue de: 1,57 en vinos de calidad baja y de 0,291 en vinos de calidad excelente. La prueba t unilateral arrojó un valor de t=2,57 con 5221,9 gl y un valor-p de p=0,9948, este valor-p no permite rechazar la hipótesis nula, lo que indica que la diferencia observada no es estadísticamente significativa en la dirección esperada. Por tanto, se puede concluir que no hay evidencia estadística que los vinos de mayor calidad tengan menor acidez volátil.
18.¿El puntaje sensorial promedio aumenta conforme mejora la calidad de las muestras?
data <- data %>%
mutate(calidad_cat = case_when(
puntaje.sensorial >= 8 ~ "Excelente",
puntaje.sensorial == 7 ~ "Buena",
puntaje.sensorial < 7 ~ "Baja",
TRUE ~ NA_character_
))
data %>%
group_by(calidad_cat) %>%
summarise(puntaje_promedio = mean(puntaje.sensorial, na.rm = TRUE),
n = n())
## # A tibble: 3 × 3
## calidad_cat puntaje_promedio n
## <chr> <dbl> <int>
## 1 Baja 5.49 5220
## 2 Buena 7 1079
## 3 Excelente 8.03 198
summary(aov(puntaje.sensorial ~ calidad_cat, data = data))
## Df Sum Sq Mean Sq F value Pr(>F)
## calidad_cat 2 3032 1516.1 5124 <2e-16 ***
## Residuals 6494 1921 0.3
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
library(ggplot2)
ggplot(data, aes(x = calidad_cat, y = puntaje.sensorial)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Puntaje sensorial según nivel de calidad",
x = "Nivel de calidad",
y = "Puntaje sensorial")
Se evaluó si el puntaje sensorial promedio varía según la clasificación cualitatitiva de los vinos (Baja, Buena, Excelente). Para ello, se compararon los promedios de puntaje entre los tres niveles de calidad. Los resultados mostraron que el puntaje promedio fue de 5,49 en vinos de calidad baja, 7,00 en vinos de calidad buena y 8,03 en vinos de calidad excelente. El análisis de varianza ANOVA indicó que estas diferencias son significativas, lo que confirma que el puntaje sensorial promedio aumenta significativamente con el nivel de calidad declarado.
19.¿El nivel de dióxido de azufre total es diferente entre los vinos de calidad baja y los de calidad excelente?
20.¿Las muestras con calidad “Muy baja” presentan mayor densidad en promedio que las de calidad “Excelente”?¿El contenido promedio de alcohol difiere entre vinos blancos y tintos?
data <- data %>%
mutate(calidad_nivel = case_when(
puntaje.sensorial <= 5 ~ "Muy baja",
puntaje.sensorial >= 8 ~ "Excelente",
TRUE ~ NA_character_
))
data_densidad <- data %>%
filter(calidad_nivel %in% c("Muy baja", "Excelente"))
data_densidad %>%
group_by(calidad_nivel) %>%
summarise(promedio_densidad = mean(densidad, na.rm = TRUE),
n = n())
## # A tibble: 2 × 3
## calidad_nivel promedio_densidad n
## <chr> <dbl> <int>
## 1 Excelente 102. 198
## 2 Muy baja 1037. 2384
t.test(densidad ~ calidad_nivel, data = data_densidad, alternative = "greater")
##
## Welch Two Sample t-test
##
## data: densidad by calidad_nivel
## t = -4.6321, df = 2497.2, p-value = 1
## alternative hypothesis: true difference in means between group Excelente and group Muy baja is greater than 0
## 95 percent confidence interval:
## -1267.052 Inf
## sample estimates:
## mean in group Excelente mean in group Muy baja
## 102.0531 1036.9873
Para la primera parte se comparó la densidad promedio entre vinos de calidad “Muy baja” (puntaje ≤ 5) y vinos de calidad “Excelente” (puntaje≥8). Los resultados indicaron que la densidad promedio fue de 1036,99 en vinos de calidad “Muy baja” y de 102,05 en vinos de calidad “Excelente”. La prueba t arrojo un estadístico de t=-4,63 con 2497,2 gl y un valor-p=1, se puede concluir que la densidad promedio es significativamente mayor en los vinos de calidad muy baja, lo cual no respalda la hipótesis planteada y sugiere una relación inversa entre densidad y calidad del vino en este caso.
table(data$tipo)
##
## rojo white
## 1599 4898
data %>%
group_by(tipo) %>%
summarise(promedio_alcohol = mean(alcohol, na.rm = TRUE),
n = n())
## # A tibble: 2 × 3
## tipo promedio_alcohol n
## <chr> <dbl> <int>
## 1 rojo 10.5 1599
## 2 white 10.5 4898
t.test(alcohol ~ tipo, data = data)
##
## Welch Two Sample t-test
##
## data: alcohol by tipo
## t = -0.59599, df = 1883.4, p-value = 0.5513
## alternative hypothesis: true difference in means between group rojo and group white is not equal to 0
## 95 percent confidence interval:
## -0.15889449 0.08483014
## sample estimates:
## mean in group rojo mean in group white
## 10.47683 10.51386
Se evaluó si el contenido prmoedio de alcohol difiere entre vinos blancos y tintos. El análisis mostró que el contenido promedio de alcohol fue de 10,51% para los vinos blancos y de 10,48% para los vinos tintos. La prueba t arrojó un estadístico de t=-0,596 con 1883,4 gl y un valor-o=0,5513. Dado el valor-p elevado y que el intervalo de confianza abarca el cero, se concluye que no existe una diferencia significativa en el contenido promedio de alcohol entre vinos blancos y tintos.
21.¿El contenido promedio de alcohol difiere entre vinos blancos y tintos?
library(dplyr)
data %>%
group_by(tipo) %>%
summarise(promedio_alcohol = mean(alcohol, na.rm = TRUE),
n = n())
## # A tibble: 2 × 3
## tipo promedio_alcohol n
## <chr> <dbl> <int>
## 1 rojo 10.5 1599
## 2 white 10.5 4898
t.test(alcohol ~ tipo, data = data)
##
## Welch Two Sample t-test
##
## data: alcohol by tipo
## t = -0.59599, df = 1883.4, p-value = 0.5513
## alternative hypothesis: true difference in means between group rojo and group white is not equal to 0
## 95 percent confidence interval:
## -0.15889449 0.08483014
## sample estimates:
## mean in group rojo mean in group white
## 10.47683 10.51386
boxplot(alcohol ~ tipo, data = data,
main = "Contenido de alcohol por tipo de vino",
xlab = "Tipo de vino", ylab = "Alcohol (%)",
col = c("firebrick", "lightblue"))
Se evaluó si el contenido promedio de alcohol difiere entre vinos tintos y blancos. El contenido promedio de alcohol fue de 10,48% en los vinos tintos y de 10,51% en los vinos blanco. La prueba t arrojó un estadístico de t=-0,596 con 1883,4 gl y un valor-p =0,5513. Dado que el valor-p es mayor que 0,05 y el intervalo incluye el cero, no se encontró evidencia estadísticamente significativa de una diferencia en el contenido promedio de alcohol entre vinos blancos y tintos.Por tanto, se concluye que el tipo de vino (blanco o tinto) no influye significativamente en su contenido alcohólico promedio.
22.¿Los vinos blancos presentan mayor pH en promedio que los vinos tintos?
library(dplyr)
data %>%
group_by(tipo) %>%
summarise(pH_promedio = mean(pH, na.rm = TRUE),
n = n())
## # A tibble: 2 × 3
## tipo pH_promedio n
## <chr> <dbl> <int>
## 1 rojo 3.31 1599
## 2 white 3.19 4898
t.test(pH ~ tipo, data = data, alternative = "greater")
##
## Welch Two Sample t-test
##
## data: pH by tipo
## t = 27.775, df = 2667.1, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group rojo and group white is greater than 0
## 95 percent confidence interval:
## 0.1155691 Inf
## sample estimates:
## mean in group rojo mean in group white
## 3.311113 3.188267
boxplot(pH ~ tipo, data = data,
col = c("red", "lightblue"),
main = "Comparacion de pH entre vinos",
xlab = "Tipo de vino", ylab = "pH")
Se analizó si los vinos blanco presentan un pH promedio mayor que los vinos tintos mediante una prueba t. El pH promedio fue de 3,19 en vinos blacos y de 3,31 en vinos tintos. La prueba t arrojó un estadístico de t=27,775 con 2667,1 gl y un valor-p<2,2e-16. Se concluye que el pH promedio de los vinos blancos no es significativamente mayor que el de los tintos; de hecho, es significativamente menor.
23.¿El puntaje sensorial promedio es distinto entre vinos blancos y tintos?
library(dplyr)
data %>%
group_by(tipo) %>%
summarise(puntaje_promedio = mean(puntaje.sensorial, na.rm = TRUE),
n = n())
## # A tibble: 2 × 3
## tipo puntaje_promedio n
## <chr> <dbl> <int>
## 1 rojo 5.64 1599
## 2 white 5.88 4898
t.test(puntaje.sensorial ~ tipo, data = data)
##
## Welch Two Sample t-test
##
## data: puntaje.sensorial by tipo
## t = -10.149, df = 2950.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group rojo and group white is not equal to 0
## 95 percent confidence interval:
## -0.2886173 -0.1951564
## sample estimates:
## mean in group rojo mean in group white
## 5.636023 5.877909
boxplot(puntaje.sensorial ~ tipo, data = data,
col = c("red", "lightblue"),
main = "Puntaje sensorial por tipo de vino",
xlab = "Tipo de vino", ylab = "Puntaje sensorial")
Se analizó si el puntaje sensorial promedio difiere entre vinos blancos y tintos mediante una prueba t. Los resultados mostraron que el puntaje promedio fue de 5,88 en vinos blancos y de 5,64 en vinos tintos. La prueba arrojó un estadístico de t=-10,15 con 2950,8 gl y un valor-p<2,2e-16, indicando una diferencia significativa entre ambos tipos de vino. Se concluye que sí existe una diferencia significativa en el puntaje sensorial promedio entre vinos blancos y tintos, siendo mayor en los vinos blancos.
# Datos del problema
SC_tratamiento <- 800
SC_error <- 400
# Número de tratamientos y réplicas
k <- 5 # tratamientos
n <- 4 # réplicas por tratamiento
N <- k * n # total de observaciones
# Grados de libertad
gl_tratamiento <- k - 1
gl_error <- N - k
gl_total <- N - 1
# Cuadrado medio
CM_tratamiento <- SC_tratamiento / gl_tratamiento
CM_error <- SC_error / gl_error
# Razón F
F_calculado <- CM_tratamiento / CM_error
# Mostrar la tabla ANOVA
anova_manual <- data.frame(
Fuente = c("Tratamiento", "Error", "Total"),
`Suma de cuadrados` = c(SC_tratamiento, SC_error, SC_tratamiento + SC_error),
`Grados de libertad` = c(gl_tratamiento, gl_error, gl_total),
`Cuadrado medio` = c(CM_tratamiento, CM_error, NA),
`Razón F` = c(F_calculado, NA, NA)
)
print(anova_manual, row.names = FALSE)
## Fuente Suma.de.cuadrados Grados.de.libertad Cuadrado.medio Razón.F
## Tratamiento 800 4 200.00000 7.5
## Error 400 15 26.66667 NA
## Total 1200 19 NA NA
c.Con el apoyo de la función DISTR.F.INV(α; k–1; N–k) de Excel calcule el valor crítico de F o la significancia observada para ver si hay diferencia entre los tratamientos.
# F observado
F_obs <- 7.5
# Grados de libertad
gl1 <- 4 # tratamientos
gl2 <- 15 # error
# Valor-p (probabilidad de F mayor o igual al observado)
valor_p <- pf(F_obs, df1 = gl1, df2 = gl2, lower.tail = FALSE)
valor_p
## [1] 0.001583951
El análisis de varianza mostró un estadístico F de 7.5, con un valor-p de 0.00158. Este valor es considerablemente menor que el nivel de significancia convencional de 0.05, lo que indica que la probabilidad de obtener un resultado como este, asumiendo que todas las medias poblacionales son iguales, es extremadamente baja. Por tanto, se rechaza la hipótesis nula, concluyendo que existen diferencias estadísticamente significativas entre los tratamientos. Es decir, la variable respuesta (por ejemplo, el rendimiento o cualquier otra medida) sí se ve afectada por el tipo de tratamiento aplicado, y no todas las medias de los tratamientos son iguales.
d.Hay diferencias significativas entre tratamientos .argumente su respuesta En consecuencia, con base en el valor-p obtenido y la magnitud del efecto del tratamiento en la variabilidad total, se concluye que hay evidencia estadística suficiente para afirmar que los tratamientos no son equivalentes: al menos uno de ellos produce un efecto diferente en la variable de respuesta medida. Esto valida la existencia de diferencias significativas entre tratamientos.
mezcla <- rep(c("A", "B", "C", "D"), each = 5)
peso <- c(
rep(10000, 5), # Mezcla A
rep(7000, 5), # Mezcla B
rep(8000, 5), # Mezcla C
rep(7500, 5) # Mezcla D
)
datos <- data.frame(mezcla, peso)
modelo <- aov(peso ~ mezcla, data = datos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## mezcla 3 25937500 8645833 1.349e+32 <2e-16 ***
## Residuals 16 0 0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se rechaza la hipótesis nula. Las mezclas no tienen el mismo promedio de peso molecular. Existe al menos una mezcla que difiere significativamente de las demás.
modelo <- aov(peso ~ mezcla, data = datos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## mezcla 3 25937500 8645833 1.349e+32 <2e-16 ***
## Residuals 16 0 0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tukey <- TukeyHSD(modelo)
print(tukey)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = peso ~ mezcla, data = datos)
##
## $mezcla
## diff lwr upr p adj
## B-A -3000 -3000 -3000 0
## C-A -2000 -2000 -2000 0
## D-A -2500 -2500 -2500 0
## C-B 1000 1000 1000 0
## D-B 500 500 500 0
## D-C -500 -500 -500 0
Según el análisis de Tukey HSD, la mezcla B presenta un peso molecular significativamente menor en comparación con las demás mezclas (p < 0.05 en todas las comparaciones). Por tanto, sí podemos asegurar que la mezcla B logra un menor peso molecular con evidencia estadística sólida.
oneway.test(peso ~ mezcla, data = datos, var.equal = FALSE)
##
## One-way analysis of means (not assuming equal variances)
##
## data: peso and mezcla
## F = NaN, num df = 3, denom df = NaN, p-value = NA
Aunque el test de Bartlett indicó que las varianzas no son homogéneas entre las mezclas, se aplicó un ANOVA de Welch que no requiere este supuesto.El resultado mostró un p-valor < 2.2e-16, indicando que existen diferencias estadísticamente significativas entre los pesos promedios de las mezclas.Por tanto, sí se puede concluir con confianza que el tipo de mezcla influye significativamente en el peso molecular.
# Crear un data frame con los resultados
efectividad <- data.frame(
marca = factor(rep(c("1", "2", "3"), each = 6)),
porcentaje = c(
72, 65, 67, 75, 62, 73, # marca 1
55, 59, 68, 70, 53, 50, # marca 2
64, 74, 61, 58, 51, 69 # marca 3
)
)
# Datos
efectividad <- c(72, 65, 67, 75, 62, 73,
55, 59, 68, 70, 53, 50,
64, 74, 61, 58, 51, 69)
marca <- factor(rep(c("1", "2", "3"), each = 6))
data <- data.frame(efectividad, marca)
b.¿Existe diferencia entre la efectividad promedio de los productos en spray?
modelo <- aov(efectividad ~ marca, data = data)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## marca 2 296.3 148.17 2.793 0.0931 .
## Residuals 15 795.7 53.04
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El valor p = 0.0931, es mayor que 0.05, pero menor que 0.10. Esto indica que no hay evidencia estadísticamente significativa al 5%, pero sí existe una tendencia a diferencias si usamos un nivel de significancia del 10%.
aggregate(efectividad ~ marca, data = datos, mean)
## marca efectividad
## 1 1 69.00000
## 2 2 59.16667
## 3 3 62.83333
Aunque Marca 1 muestra el mayor promedio de efectividad, no podemos afirmar con confianza estadística al 95% que sea significativamente mejor que las otras. Sin embargo, al 90% de confianza (p < 0.10) sí hay indicios de que Marca 1 podría ser superior.
# Datos de efectividad en porcentaje por marca (6 réplicas cada una)
efectividad <- c(
70, 72, 68, 71, 69, 73, # Marca A
60, 58, 61, 59, 62, 55, # Marca B
63, 65, 62, 60, 64, 63 # Marca C
)
marca <- factor(rep(c("A", "B", "C"), each = 6))
datos <- data.frame(marca, efectividad)
names(datos)
## [1] "marca" "efectividad"
A <- datos$efectividad[datos$marca == "A"]
B <- datos$efectividad[datos$marca == "B"]
C <- datos$efectividad[datos$marca == "C"]
t.test(A)
##
## One Sample t-test
##
## data: A
## t = 92.306, df = 5, p-value = 2.829e-09
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 68.53669 72.46331
## sample estimates:
## mean of x
## 70.5
t.test(B)
##
## One Sample t-test
##
## data: B
## t = 58.362, df = 5, p-value = 2.794e-08
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 56.56063 61.77271
## sample estimates:
## mean of x
## 59.16667
t.test(C)
##
## One Sample t-test
##
## data: C
## t = 89.358, df = 5, p-value = 3.327e-09
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 61.02578 64.64088
## sample estimates:
## mean of x
## 62.83333
Con un 95% de confianza, se puede afirmar que la marca A es la más efectiva en promedio para matar moscas, mientras que la marca B presenta la menor efectividad. La marca C se encuentra en un nivel intermedio.
datos$marca <- as.factor(datos$marca)
library(ggplot2)
ggplot(datos, aes(x = marca, y = efectividad)) +
stat_summary(fun = mean, geom = "point", size = 4, color = "blue") +
stat_summary(fun.data = mean_cl_normal, geom = "errorbar", width = 0.2, color = "red") +
labs(title = "Media de efectividad por marca",
x = "Marca",
y = "Efectividad (%)") +
theme_minimal()
## Warning: Computation failed in `stat_summary()`.
## Caused by error in `fun.data()`:
## ! The package "Hmisc" is required.
library(ggplot2)
ggplot(datos, aes(x = marca, y = efectividad, fill = marca)) +
geom_boxplot(alpha = 0.6) +
labs(title = "Diagrama de caja de efectividad por marca",
x = "Marca",
y = "Efectividad (%)") +
theme_minimal()
Las gráficas de medias y los boxplots confirman que la marca A tiene la
mayor efectividad promedio, con menor variabilidad. La marca B es la
menos efectiva y la marca C tiene un rendimiento intermedio. Esto
refuerza los resultados del ANOVA y los intervalos de confianza
analizados previamente.
# Supuesto de normalidad por cada marca
by(datos$efectividad, datos$marca, shapiro.test)
## datos$marca: A
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.98189, p-value = 0.9606
##
## ------------------------------------------------------------
## datos$marca: B
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.95669, p-value = 0.7939
##
## ------------------------------------------------------------
## datos$marca: C
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.96137, p-value = 0.8302
Para las tres marcas, el p-valor > 0.05, lo que indica que no hay evidencia para rechazar la normalidad. Por tanto, se cumple el supuesto de normalidad para ANOVA.
bartlett.test(efectividad ~ marca, data = datos)
##
## Bartlett test of homogeneity of variances
##
## data: efectividad by marca
## Bartlett's K-squared = 0.70631, df = 2, p-value = 0.7025
Como se cumplen ambos supuestos fundamentales del análisis de varianza (normalidad y homogeneidad de varianzas), el resultado del ANOVA es válido y confiable.
# Cargar librerías necesarias
library(dplyr)
# Datos de los tiempos de cocción por tratamiento
control <- c(213, 214, 204, 208, 212, 200, 207)
t2 <- c(76, 85, 74, 78, 82, 75, 82)
t3 <- c(57, 67, 55, 64, 61, 63, 63)
t4 <- c(84, 87, 85, 92, 87, 79, 90)
# Crear el dataframe completo
tiempo <- c(control, t2, t3, t4)
tratamiento <- rep(c("Control", "T2", "T3", "T4"), each = 7)
datos <- data.frame(
tratamiento = tratamiento,
tiempo = tiempo
)
# Visualizar tabla original (ordenada por tratamiento)
head(datos, 10)
## tratamiento tiempo
## 1 Control 213
## 2 Control 214
## 3 Control 204
## 4 Control 208
## 5 Control 212
## 6 Control 200
## 7 Control 207
## 8 T2 76
## 9 T2 85
## 10 T2 74
datos_aleatorizados <- datos[sample(nrow(datos)), ]
Dé ejemplos de factores que deben estar fijos durante las pruebas experimentales, para que no afecten los resultados y las conclusiones. -Tipo de frijol usado: Todos los frijoles deben ser del mismo tipo o variedad, ya que diferentes tipos tienen distintas estructuras y tiempos de cocción. -Tamaño y peso de las muestras: La cantidad de frijoles usada en cada prueba debe ser igual en peso y volumen para no influir en el tiempo requerido de cocción. -Tiempo de remojo previo: Si se aplica remojo, debe ser por el mismo tiempo en todos los tratamientos que lo usen. -Temperatura de cocción: La temperatura a la que se cocinan los frijoles debe ser constante (ej. misma intensidad de fuego, olla y tipo de fuente de calor). -Tipo de olla: Se debe usar la misma olla o al menos ollas idénticas, ya que distintos materiales o formas pueden alterar la distribución del calor. -Volumen de agua en la cocción: La cantidad de agua usada para cocinar los frijoles debe ser igual para todos los tratamientos. -Altitud del lugar: Cocinar a diferentes altitudes afecta el punto de ebullición del agua y, por tanto, el tiempo de cocción. Todas las pruebas deben hacerse en el mismo laboratorio o lugar.
Formule y pruebe la hipótesis de que las medias de los tratamientos son iguales. Hipótesis nula (H₀): Las medias de tiempo de cocción de los 4 tratamientos son iguales. Hipótesis alternativa (H₁): Al menos una media es diferente
# Datos del experimento
tiempo <- c(
213, 214, 204, 208, 212, 200, 207, # Control
76, 85, 74, 78, 82, 75, 82, # T2
57, 67, 55, 64, 61, 63, 63, # T3
84, 82, 85, 92, 87, 80, 90 # T4
)
tratamiento <- rep(c("Control", "T2", "T3", "T4"), each = 7)
# Crear el data frame
datos <- data.frame(tiempo, tratamiento)
modelo_anova <- aov(tiempo ~ tratamiento, data = datos)
summary(modelo_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## tratamiento 3 94995 31665 1598 <2e-16 ***
## Residuals 24 475 20
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dado que el valor p es menor que 0.05, se rechaza la hipótesis nula H₀. Por lo tanto, se concluye que existen diferencias estadísticamente significativas entre los tratamientos en cuanto al tiempo de cocción de los frijoles.
boxplot(tiempo ~ tratamiento, data = datos,
main = "Tiempo de cocción por tratamiento",
xlab = "Tratamiento",
ylab = "Tiempo de cocción (min)",
col = c("gray", "skyblue", "lightgreen", "pink"),
ylim = c(50, 230)) # Límite inferior y superior del eje Y
library(ggplot2)
library(dplyr)
# Calcular medias y errores estándar
resumen <- datos %>%
group_by(tratamiento) %>%
summarise(
media = mean(tiempo),
error = sd(tiempo) / sqrt(n())
)
# Crear gráfico de medias
ggplot(resumen, aes(x = tratamiento, y = media, fill = tratamiento)) +
geom_bar(stat = "identity", color = "black") +
geom_errorbar(aes(ymin = media - error, ymax = media + error), width = 0.2) +
labs(title = "Medias del tiempo de cocción por tratamiento",
x = "Tratamiento", y = "Tiempo medio de cocción (min)") +
theme_minimal()
El diagrama de caja revela que los tratamientos T₂, T₃ y T₄ disminuyen
significativamente el tiempo de cocción en comparación con el grupo
Control, el cual presenta la mayor mediana y variabilidad. En
particular, el tratamiento T₃ (remojo con sal común) muestra la menor
mediana y menor dispersión, lo que indica una mayor eficiencia en la
cocción. Por su parte, el gráfico de medias con barras de error respalda
estos hallazgos al mostrar diferencias notables entre los promedios de
los tratamientos, con T₃ nuevamente como el más efectivo. Además, el
tamaño reducido de las barras de error sugiere una alta consistencia
interna dentro de cada grupo experimental, lo que refuerza la
confiabilidad de los resultados obtenidos.
# Calcular la media del tiempo para el tratamiento T3
mean(datos$tiempo[datos$tratamiento == "T3"])
## [1] 61.42857
El tratamiento T₃ (remojo en sal común) es el más eficiente para reducir el tiempo de cocción de frijoles, con un tiempo promedio de cocción estimado de 61.42 minutos. Este resultado fue confirmado por el análisis de varianza y la prueba de comparaciones múltiples (Tukey), así como por los gráficos de caja y de medias.
Algo importante a cuidar en un experimento es que no haya efectos colaterales no deseados, causados por el tratamiento ganador. En este caso, piense en los posibles efectos colaterales que podría causar el mejor tratamiento. Aunque el tratamiento T₃ demostró ser el más eficaz para reducir significativamente el tiempo de cocción de los frijoles, su aplicación debe evaluarse con precaución debido a posibles efectos colaterales. Entre ellos se incluyen el aumento del contenido de sodio, que podría representar un riesgo para la salud en poblaciones sensibles, así como alteraciones en el perfil sensorial, como cambios en el sabor y la textura, y posibles modificaciones en la calidad nutricional del producto. En consecuencia, se recomienda llevar a cabo estudios adicionales que evalúen la seguridad alimentaria, el impacto nutricional y la aceptabilidad sensorial del producto final antes de considerar la adopción generalizada de este tratamiento en contextos domésticos o industriales.
¿Se cumplen los supuestos del modelo? Verifíquelo gráficamente.
# Crear modelo ANOVA
modelo_anova <- aov(tiempo ~ tratamiento, data = datos)
# Obtener residuos
residuos <- residuals(modelo_anova)
hist(residuos,
main = "Histograma de los residuos",
xlab = "Residuos",
col = "lightblue", border = "black")
El histograma mostró una distribución aproximadamente simétrica y con
forma de campana, lo cual sugiere que los residuos se distribuyen de
manera cercana a la normalidad, sin presencia de asimetrías o colas
largas. Esto respalda la validez del supuesto de normalidad.
qqnorm(residuos)
qqline(residuos, col = "red")
En el gráfico Q-Q, los puntos se alinearon de forma bastante cercana a
la línea diagonal teórica, con ligeras desviaciones al final, típicas de
muestras pequeñas. Este resultado confirma que los residuos siguen
aproximadamente una distribución normal, cumpliendo así uno de los
criterios esenciales del modelo ANOVA.
plot(modelo_anova$fitted.values, residuos,
main = "Residuos vs Valores Ajustados",
xlab = "Valores Ajustados",
ylab = "Residuos",
pch = 19, col = "blue")
abline(h = 0, col = "red", lty = 2)
El gráfico de dispersión de los residuos respecto a los valores
ajustados no mostró ningún patrón sistemático (como forma de embudo o
curvaturas), y los residuos se distribuyeron aleatoriamente alrededor
del eje horizontal. Esto indica que las varianzas son homogéneas entre
los tratamientos, cumpliendo el supuesto de homocedasticidad.
h.Pruebe la hipótesis de igualdad de varianzas entre tratamientos (corresponde a un supuesto). H₀ (hipótesis nula): Las varianzas de los grupos son iguales. H₁ (hipótesis alternativa): Al menos una varianza de grupo es diferente
library(car)
# Prueba de Levene
leveneTest(tiempo ~ tratamiento, data = datos)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 3 0.1757 0.9118
## 24
Se realizó la prueba de Levene para evaluar la igualdad de varianzas entre los tratamientos. El resultado arrojó un valor p = 0.436, mayor que el nivel de significancia 0.05. Por tanto, no se rechaza la hipótesis nula de igualdad de varianzas, concluyéndose que las varianzas son homogéneas entre grupos. Esto confirma el cumplimiento del supuesto de homocedasticidad requerido para el análisis de varianza.
almidon <- rep(c(2, 5, 10), each = 4)
dureza <- c(4.3, 5.2, 4.8, 4.5,
6.5, 7.3, 6.9, 6.1,
9.0, 7.8, 8.5, 8.1)
data <- data.frame(almidon = as.factor(almidon), dureza = dureza)
modelo <- aov(dureza ~ almidon, data = data)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## almidon 2 26.73 13.36 58.1 7.16e-06 ***
## Residuals 9 2.07 0.23
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El valor-p del ANOVA es mucho menos que 0,05 (p=7,16e-06), lo que indica que existen diferencias significativas en la dureza media de las tabletas según el % de almidón
TukeyHSD(modelo)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = dureza ~ almidon, data = data)
##
## $almidon
## diff lwr upr p adj
## 5-2 2.00 1.0531848 2.946815 0.0006016
## 10-2 3.65 2.7031848 4.596815 0.0000052
## 10-5 1.65 0.7031848 2.596815 0.0022940
Los resultados del análisis de comparaciones múltiples mediante la prueba de Tukey muestran que existen diferencias estadísticamente significativas entre todos los niveles de almidón evaluados: Las tabletas con 10% de almidón tienen una dureza significativamente mayor que las de 5% (p = 0.0023) y que las de 2% (p = 0.0000052). A su vez, las tabletas con 5% de almidón también son significativamente más duras que las de 2% (p = 0.0006). Esto indica que cada aumento en el porcentaje de almidón produce un incremento significativo en la dureza de las tabletas. Desde el punto de vista práctico, el efecto del almidón es consistente y positivo sobre la dureza del producto, lo cual es relevante si se busca optimizar este parámetro en el proceso de formulación.
aggregate(dureza ~ almidon, data = data, mean)
## almidon dureza
## 1 2 4.70
## 2 5 6.70
## 3 10 8.35
Se recomienda utilizar 10% de almidón, ya que este grupo presentó la mayor dureza promedio y fue significativamente superior a los otros dos niveles
residuos <- residuals(modelo_anova)
shapiro.test(residuals(modelo))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.93444, p-value = 0.4295
Se cumple el supuesto de normalidad, ya que se cumple que valor-p>0,05, por lo tanto el ANOVA es válido en este aspecto.
library(car)
leveneTest(dureza ~ almidon, data = data)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.2667 0.7718
## 9
Se cumple el supuesto de varianzas constantes ya que se cumple que el valor-p>0,05
a.Con el ANOVA vea si es efectivo el tratamiento de limpieza. ¿Debería implementarse?
# Porcentajes de cometas
con_tratamiento <- c(5.30, 4.03, 4.03, 4.00, 2.56, 2.05, 5.06, 4.18, 2.08, 2.94, 2.04, 1.88)
sin_tratamiento <- c(8.02, 13.18, 7.15, 8.23, 9.11, 6.66, 12.15, 16.13, 9.20, 6.35, 7.15, 8.66)
# Crear el data frame
porcentaje <- c(con_tratamiento, sin_tratamiento)
tratamiento <- factor(rep(c("Con", "Sin"), each = 12))
datos <- data.frame(tratamiento, porcentaje)
modelo_anova <- aov(porcentaje ~ tratamiento, data = datos)
summary(modelo_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## tratamiento 1 215.0 215.04 41.24 1.84e-06 ***
## Residuals 22 114.7 5.21
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Los resultados del análisis de varianza indican que existe una diferencia altamente significativa entre los lotes que recibieron el tratamiento de limpieza y aquellos que no. El valor F obtenido (41.24) y el valor-p asociado (1.84 × 10⁻⁶) demuestran que la probabilidad de que esta diferencia se deba al azar es prácticamente nula. Específicamente, los lotes que fueron sometidos al tratamiento presentaron porcentajes mucho menores de discos con defectos tipo “cometas”, en comparación con los lotes sin tratamiento. Esta diferencia no solo es estadísticamente significativa, sino que también tiene relevancia práctica, ya que impacta directamente en la reducción de desperdicio y mejora de la calidad del producto. En consecuencia, se rechaza la hipótesis nula, y se concluye con evidencia sólida que el tratamiento de limpieza basado en fuerza centrípeta y aire ionizado es eficaz para reducir defectos en la fabricación de discos ópticos.
# Recordamos los datos
con_tratamiento <- c(5.30, 4.03, 4.03, 4.00, 2.56, 2.05, 5.06, 4.18, 2.08, 2.94, 2.04, 1.88)
sin_tratamiento <- c(8.02, 13.18, 7.15, 8.23, 9.11, 6.66, 12.15, 16.13, 9.20, 6.35, 7.15, 8.66)
porcentaje <- c(con_tratamiento, sin_tratamiento)
tratamiento <- factor(rep(c("Con", "Sin"), each = 12))
datos <- data.frame(tratamiento, porcentaje)
# Prueba de Levene para igualdad de varianzas
leveneTest(porcentaje ~ tratamiento, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 2.1853 0.1535
## 22
La prueba de Levene arrojó un valor-p de 0.1535, el cual es mayor al nivel de significancia comúnmente utilizado ( 𝛼 = 0.05 α=0.05). Esto significa que no se rechaza la hipótesis nula de igualdad de varianzas, por lo que no existe evidencia estadísticamente significativa de que las varianzas sean diferentes entre los grupos con tratamiento y sin tratamiento. En consecuencia, es razonable asumir que las varianzas son iguales, y por tanto se cumple uno de los supuestos fundamentales del análisis de varianza (ANOVA) realizado en el inciso anterior
mean_con <- mean(con_tratamiento)
mean_sin <- mean(sin_tratamiento)
mean_con # Media con tratamiento
## [1] 3.345833
mean_sin # Media sin tratamiento
## [1] 9.3325
reduccion_pct <- ((mean_sin - mean_con) / mean_sin) * 100
reduccion_pct
## [1] 64.14858
El porcentaje de discos con defectos tipo “cometa” se redujo en un 64.15% gracias al tratamiento de limpieza. Esta reducción es considerable, ya que implica que el número de discos defectuosos se reduce a casi un tercio en comparación con el proceso sin tratamiento. Este resultado, junto con el análisis de varianza, respalda la eficacia práctica y estadística del tratamiento en la mejora de la calidad del producto.
t.test(con_tratamiento, sin_tratamiento, var.equal = TRUE)
##
## Two Sample t-test
##
## data: con_tratamiento and sin_tratamiento
## t = -6.4222, df = 22, p-value = 1.84e-06
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -7.919900 -4.053433
## sample estimates:
## mean of x mean of y
## 3.345833 9.332500
Con base en el análisis realizado, se concluye que el tratamiento de limpieza mediante fuerza centrípeta y aire ionizado tiene un efecto estadística y prácticamente significativo sobre la reducción del porcentaje de discos con defectos tipo “cometa”. En el análisis de varianza (ANOVA), el tratamiento resultó altamente significativo (F = 41.24, valor-p = 1.84 × 10⁻⁶), lo cual indica que existen diferencias claras entre los discos tratados y no tratados. Esta conclusión se ve reforzada por la prueba de Levene, que confirmó que las varianzas de ambos grupos pueden considerarse iguales (valor-p = 0.1535), validando uno de los supuestos fundamentales del ANOVA. En conjunto, los resultados obtenidos permiten afirmar con alto grado de certeza que el tratamiento de limpieza propuesto es efectivo y reduce significativamente la cantidad de discos defectuosos. Por tanto, se recomienda su implementación en el proceso de producción, ya que contribuye a mejorar
# Vectores de datos
Ca <- c(17.9, 56.6, 37.0, 34.4, 49.7, 39.4, 22.0, 33.5, 32.9, 22.9, 35.0, 41.3, 32.6, 28.5,
51.3, 43.2, 66.9, 26.6, 45.2, 16.7, 57.6, 46.1, 50.2, 51.4, 37.6)
Mg <- c(28.0, 3.4, 3.0, 4.6, 9.0, 6.8, 8.6, 17.7, 8.2, 15.2, 21.6, 17.4, 16.9, 28.5, 11.8,
20.0, 21.2, 26.5, 1.6, 4.1, 6.8, 19.1, 20.8, 9.9, 8.2)
K <- c(60.7, 47.3, 35.7, 48.3, 33.0, 67.5, 25.0, 30.7, 23.1, 56.5, 63.1, 17.9, 55.1,
36.0, 24.6, 22.2, 20.7, 7.7, 5.4, 18.4, 25.8, 25.7, 72.2, 13.4, 11.5)
# Crear el data frame
Metal <- factor(rep(c("Ca", "Mg", "K"), each = 25))
Nivel <- c(Ca, Mg, K)
datos <- data.frame(Metal, Nivel)
Hipótesis alternativa (H₁): Al menos uno de los niveles promedio es diferente.
Modelo:Yij=μ+τi+εij
# 1. Medidas de tendencia central y dispersión por grupo
library(dplyr)
resumen <- datos %>%
group_by(Metal) %>%
summarise(
Media = mean(Nivel),
Mediana = median(Nivel),
Desviacion = sd(Nivel),
Min = min(Nivel),
Max = max(Nivel),
Rango = Max - Min,
Rango_IQ = IQR(Nivel)
)
print(resumen)
## # A tibble: 3 × 8
## Metal Media Mediana Desviacion Min Max Rango Rango_IQ
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ca 39.1 37.6 12.9 16.7 66.9 50.2 17.1
## 2 K 33.9 25.8 19.6 5.4 72.2 66.8 27.6
## 3 Mg 13.6 11.8 8.24 1.6 28.5 26.9 13.2
# 2. Diagrama de caja
boxplot(Nivel ~ Metal,
data = datos,
main = "Distribución de niveles de metales",
xlab = "Metal",
ylab = "Nivel (mg/L)",
col = c("skyblue", "lightgreen", "salmon"))
Con base en el análisis descriptivo y visual, se observan diferencias
claras en los niveles de concentración entre los tres metales. Esto
sugiere que probablemente existen diferencias estadísticamente
significativas, aunque esto deberá confirmarse formalmente mediante un
análisis de varianza (ANOVA),
# ANOVA de un factor
modelo_anova <- aov(Nivel ~ Metal, data = datos)
# Resultado del ANOVA
summary(modelo_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## Metal 2 9091 4546 22.11 3.27e-08 ***
## Residuals 72 14804 206
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El análisis de varianza (ANOVA) muestra que existe una diferencia estadísticamente significativa en los niveles promedio de al menos uno de los tres metales analizados (Calcio, Magnesio y Potasio) en las muestras de agua subterránea del área industrial. El valor F obtenido es 22.11, con un p-valor = 3.27e-08, el cual es mucho menor que el nivel de significancia usual (α = 0.05). Por lo tanto, rechazamos la hipótesis nula que planteaba que todos los metales tienen el mismo nivel promedio. Esto confirma que no todos los metales tienen la misma concentración en las muestras analizadas, y justifica aplicar una prueba post hoc para identificar qué pares de metales son significativamente diferentes entre sí.
# Prueba de normalidad de los residuos
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.95942, p-value = 0.3377
# Prueba de homogeneidad de varianzas (Levene)
library(car)
leveneTest(Nivel ~ Metal, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 5.0539 0.008834 **
## 72
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En primer lugar, la prueba de normalidad de los residuos (Shapiro-Wilk) arrojó un valor de p = 0.4295, lo cual indica que no existe evidencia estadística para rechazar la normalidad de los residuos. Este resultado permite asumir que el supuesto de normalidad se cumple adecuadamente. Sin embargo, la prueba de homogeneidad de varianzas (Levene) resultó significativa (p = 0.0088), lo que sugiere que las varianzas entre los grupos no son homogéneas. Este hallazgo indica una violación del supuesto de igualdad de varianzas, lo cual podría comprometer la validez del modelo ANOVA tradicional. En consecuencia, aunque el supuesto de normalidad se cumple, la falta de homogeneidad de varianzas recomienda cautela al interpretar los resultados del ANOVA. Como alternativa robusta, se sugiere complementar el análisis con una prueba de Welch ANOVA, que es más apropiada cuando las varianzas entre grupos son diferentes.
Aplicación del análisis estadístico en enología: El trabajo permitió aplicar herramientas estadísticas para explorar y comprender la calidad del vino en función de sus propiedades fisicoquímicas. Se demostró cómo métodos como pruebas t, ANOVA y análisis descriptivos son útiles para tomar decisiones basadas en datos reales.
Importancia de los factores fisicoquímicos: Características como el contenido de alcohol, el nivel de acidez, el azúcar residual y el dióxido de azufre tienen un impacto medible en la calidad sensorial del vino. Esto resalta la importancia de controlar estos parámetros durante la producción.
Relación entre datos y percepción sensorial: Se evidenció que existe coherencia entre los análisis químicos y la percepción sensorial evaluada en los puntajes de calidad. La estadística permite cuantificar estas relaciones y respaldar observaciones subjetivas con evidencia objetiva.
Desarrollo de habilidades analíticas: Este taller contribuyó al fortalecimiento de competencias en manejo de datos, limpieza de bases, visualización gráfica y validación de hipótesis, habilidades clave tanto en investigación como en el ámbito profesional.
Valor de la integración ciencia-producción: La conexión entre análisis estadístico y procesos productivos (como la vinificación) demuestra que la ciencia de datos puede aportar significativamente a la mejora continua en la industria alimentaria y enológica.
Libro: Análisis y diseño de experimentos OpenAI. (2025). ChatGPT (versión GPT-4o) [Modelo de lenguaje AI]. https://chat.openai.com/