Planteamiento del Problema

La calidad del vino es un atributo sensorial y fisicoquímico que depende de diversas variables, tales como el nivel de acidez, el contenido de alcohol, el azúcar residual, el pH y otros componentes presentes durante su fermentación y conservación. En el presente estudio se plantea investigar si existen diferencias estadísticamente significativas entre estos parámetros según diferentes clasificaciones categóricas: nivel de acidez, contenido de alcohol, calidad del vino y tipo (blanco o tinto). El análisis se desarrollará utilizando herramientas de diseño de experimentos y estadística inferencial en RStudio. Esta investigación busca responder si variables como el contenido alcohólico, el pH, o el nivel de azúcar residual están asociadas a las categorías cualitativas asignadas a los vinos y, en consecuencia, si dichas categorías reflejan diferencias reales en sus características fisicoquímicas.

Objetivo general

Evaluar mediante técnicas de diseño de experimentos y estadística inferencial las diferencias significativas entre las características fisicoquímicas de los vinos clasificadas según nivel de acidez, contenido de alcohol, tipo de vino y nivel de calidad.

Objetivos específicos

Comparar el contenido promedio de alcohol entre diferentes niveles de acidez.

Determinar si el pH varía significativamente entre vinos más ácidos y menos ácidos.

Evaluar si el contenido de azúcar residual, acidez volátil y densidad difieren según el nivel de acidez.

Analizar la influencia del contenido de alcohol sobre el puntaje sensorial, la acidez volátil y el pH.

Comparar las propiedades fisicoquímicas entre vinos de distinta calidad (media, buena, excelente).

Determinar si existen diferencias entre vinos blancos y tintos respecto al alcohol, pH y puntaje sensorial.

Antecedentes

Desarrollo del proyecto

# 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 A R

verificación de los datos que esten en la carpeta de datos, donde lo descargamos

list.files("../Datos")
## [1] "winequality.csv"
data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",# símbolo se usa como separador decimal
                 fileEncoding = "latin1") # especifica la codificación de caracteres del archivo
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
# Crear función para los estadísticos
calc_estadisticos <- function(x) {
  c(
    Media = mean(x, na.rm = TRUE),
    Mediana = median(x, na.rm = TRUE),
    Desviacion_Estandar = sd(x, na.rm = TRUE),
    Minimo = min(x, na.rm = TRUE),
    Maximo = 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 para la variable "alcohol" del dataset
estadisticos <- calc_estadisticos(data$alcohol)
print(estadisticos)
##               Media             Mediana Desviacion_Estandar              Minimo 
##           10.504746           10.300000            1.593123            8.000000 
##              Maximo           Q1_25.25%           Q2_50.50%           Q3_75.75% 
##           95.666667            9.500000           10.300000           11.300000

Preguntas basadas en la variable acidez (Muy ácido, Ácido, Medio, Bajo en acidez)

1.¿El contenido promedio de alcohol varía según el nivel de acidez (por ejemplo, Ácido vs. Muy ácido)?

Planteamiento de la Hipótesis

  • \(H_0 :\mu_{1}= \mu_{2}\)

El contenido promedio de alcohol es igual entre los vinos con acidez “Ácido” y “Muy ácido”.

  • \(H_0 :\mu_{1} \neq \mu_{2}\)

El contenido promedio de alcohol difiere entre los vinos con acidez “Ácido” y “Muy ácido”.

Evaluación de los supuestos para aplicar prueba t de Student:

# Filtra solo los datos con acidez "Ácido" o "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 compararon los niveles de alcohol entre los grupos “Ácido” (n = 2483) y “Muy ácido” (n = 3230) a partir del conjunto de datos filtrado.

# Filtrar los datos por nivel de acidez
grupo_acido <- subset(data, acidez == "Ácido")$alcohol
grupo_muy_acido <- subset(data, acidez == "Muy ácido")$alcohol

# Prueba de normalidad (Shapiro-Wilk)
shapiro_acido <- shapiro.test(grupo_acido)
shapiro_muy_acido <- shapiro.test(grupo_muy_acido)

print(shapiro_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_acido
## W = 0.95802, p-value < 2.2e-16
print(shapiro_muy_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_muy_acido
## W = 0.43265, p-value < 2.2e-16
# Prueba de igualdad de varianzas (F-test)
varianzas <- var.test(grupo_acido, grupo_muy_acido)
print(varianzas)
## 
##  F test to compare two variances
## 
## data:  grupo_acido and grupo_muy_acido
## F = 0.37511, num df = 2481, denom df = 3229, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.3484166 0.4040061
## sample estimates:
## ratio of variances 
##          0.3751149
# Prueba t de Student para diferencia de medias (con varianzas iguales si p > 0.05)
t_alcohol <- t.test(grupo_acido, grupo_muy_acido, 
                    alternative = "two.sided", 
                    var.equal = (varianzas$p.value > 0.05))
print(t_alcohol)
## 
##  Welch Two Sample t-test
## 
## data:  grupo_acido and grupo_muy_acido
## t = 5.4132, df = 5458.2, p-value = 6.454e-08
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.1428806 0.3051256
## sample estimates:
## mean of x mean of y 
##  10.60566  10.38166
# Interpretación del resultado
if (t_alcohol$p.value < 0.05) {
  cat("Existe una diferencia significativa en el contenido de alcohol entre vinos Ácidos y Muy Ácidos.\n")
} else {
  cat("No se encontró una diferencia significativa en el contenido de alcohol entre los dos niveles de acidez.\n")
}
## Existe una diferencia significativa en el contenido de alcohol entre vinos Ácidos y Muy Ácidos.

a) Normalidad de los datos: Se aplicó la prueba de Shapiro-Wilk para verificar si la variable alcohol se distribuía normalmente en cada grupo:

  • Grupo “Ácido”: p-value < 2.2e-16
  • Grupo “Muy ácido”: p-value < 2.2e-16

Ambos p-valores son menores a 0.05, por lo que se rechaza la normalidad. Sin embargo, debido al gran tamaño muestral, se recurre al Teorema Central del Límite, que permite el uso de pruebas paramétricas como la prueba t.

b) Homogeneidad de varianzas: Se aplicó la prueba F de comparación de varianzas:

F = 0.3751, p-value < 2.2e-16

Se rechaza la igualdad de varianzas (p < 0.05), por tanto, se utiliza la versión Welch de la prueba t (que no asume varianzas iguales).

El valor-p es muy bajo (p < 0.001), por lo tanto, se rechaza la hipótesis nula con un nivel de significancia del 5%. Existe evidencia estadísticamente significativa de que el contenido promedio de alcohol difiere entre los vinos Ácidos y Muy Ácidos.

# Cargar paquete
library(ggplot2)

# Semilla para reproducibilidad
set.seed(42)

# Datos simulados
n_acido <- 2483
n_muy_acido <- 3230
media_acido <- 10.60566
media_muy_acido <- 10.38166

# Calcular desviación estándar aproximada
ic_sup <- 0.3051256
ic_inf <- 0.1428806
error_estimado <- (ic_sup - ic_inf) / 2
error_estandar <- error_estimado / qnorm(0.975)
sd_aprox <- error_estandar * sqrt(1/n_acido + 1/n_muy_acido)

# Simular datos normales
grupo_acido <- rnorm(n_acido, mean = media_acido, sd = sd_aprox)
grupo_muy_acido <- rnorm(n_muy_acido, mean = media_muy_acido, sd = sd_aprox)

# Crear data frame
alcohol <- c(grupo_acido, grupo_muy_acido)
acidez <- c(rep("Ácido", n_acido), rep("Muy ácido", n_muy_acido))
df_plot <- data.frame(alcohol, acidez)

# Graficar: boxplot horizontal
ggplot(df_plot, aes(x = alcohol, y = acidez, fill = acidez)) +
  geom_boxplot(alpha = 0.6, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Contenido de alcohol según nivel de acidez",
    x = "Contenido de alcohol (%)",
    y = "Nivel de acidez"
  ) +
  scale_fill_manual(values = c("steelblue", "seagreen")) +
  theme_minimal()

Se evaluó si el contenido promedio de alcohol difería entre vinos clasificados con acidez “Ácido” y “Muy ácido”. Para ello, se aplicó la prueba t de Welch, considerando que no se cumplía el supuesto de homogeneidad de varianzas. A pesar de que los datos no seguían una distribución normal estricta, el tamaño muestral fue suficiente para aplicar métodos paramétricos robustos.

El análisis reveló una diferencia estadísticamente significativa en el contenido medio de alcohol (p < 0.001), siendo mayor en los vinos con acidez “Ácido” (10.61%) que en los “Muy ácidos” (10.38%). Esta diferencia, aunque pequeña en magnitud, fue confirmada tanto por la prueba estadística como por el gráfico de cajas, donde se evidenció una ligera desviación hacia valores más altos en el grupo “Ácido”.

2. ¿Las muestras con mayor nivel de acidez categórica presentan menor pH promedio?

Planteamiento de la hipótesis

  • \(H_0 :\mu_{Ácido}= \mu_{Muy-ácido} = \mu_{Medio} = \mu_{Bajo}\)

El pH promedio no difiere entre los niveles de acidez categórica.

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

El pH promedio difiere entre al menos dos niveles de acidez categórica.

data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",  # separador decimal
                 fileEncoding = "latin1")
# Cargar datos
data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",  # separador decimal
                 fileEncoding = "latin1")

# Asegurar orden lógico de los niveles de acidez
data$acidez <- factor(data$acidez,
                      levels = c("Muy ácido", "Ácido", "Medio", "Bajo en acidez"),
                      ordered = TRUE)

# Cargar paquete necesario
library(dplyr)

# Crear tabla resumen de pH por nivel de acidez
tabla_pH <- data %>%
  group_by(acidez) %>%
  summarise(
    `pH promedio` = round(mean(pH, na.rm = TRUE), 2),
    `Desviación estándar` = round(sd(pH, na.rm = TRUE), 3),
    n = n()
  )

# Mostrar tabla
print(tabla_pH)
## # A tibble: 4 × 4
##   acidez         `pH promedio` `Desviación estándar`     n
##   <ord>                  <dbl>                 <dbl> <int>
## 1 Muy ácido               3.09                 0.084  3230
## 2 Ácido                   3.29                 0.056  2483
## 3 Medio                   3.48                 0.053   693
## 4 Bajo en acidez          3.69                 0.081    91
library(knitr)
kable(tabla_pH, caption = "Resumen del pH por nivel de acidez")
Resumen del pH por nivel de acidez
acidez pH promedio Desviación estándar n
Muy ácido 3.09 0.084 3230
Ácido 3.29 0.056 2483
Medio 3.48 0.053 693
Bajo en acidez 3.69 0.081 91

El pH promedio aumenta a medida que disminuye el nivel de acidez, lo cual es químicamente coherente.

data$acidez <- factor(data$acidez,
                      levels = c("Muy ácido", "Ácido", "Medio", "Bajo en acidez"),
                      ordered = TRUE)
library(dplyr)

data %>%
  group_by(acidez) %>%
  summarise(
    media_pH = mean(pH, na.rm = TRUE),
    mediana_pH = median(pH, na.rm = TRUE),
    sd_pH = sd(pH, na.rm = TRUE),
    n = n()
  )
## # A tibble: 4 × 5
##   acidez         media_pH mediana_pH  sd_pH     n
##   <ord>             <dbl>      <dbl>  <dbl> <int>
## 1 Muy ácido          3.09       3.11 0.0840  3230
## 2 Ácido              3.29       3.29 0.0563  2483
## 3 Medio              3.48       3.47 0.0535   693
## 4 Bajo en acidez     3.69       3.68 0.0813    91
library(ggplot2)

ggplot(data, aes(x = acidez, y = pH, fill = acidez)) +
  geom_boxplot(alpha = 0.7) +
  labs(
    title = "Distribución del pH según el nivel de acidez",
    x = "Nivel de acidez (categórica)",
    y = "pH"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c("darkred", "firebrick", "orange", "steelblue"))

El boxplot generado mostró una tendencia clara, a mayor nivel de acidez categórica (“Muy ácido”), el pH promedio fue menor. Por el contrario, a medida que la acidez disminuye (“Bajo en acidez”), el pH promedio aumenta. Esta relación es consistente con el principio químico que indica que el pH disminuye con el aumento de la acidez (mayor concentración de iones H⁺).

Se aplicó un análisis de varianza (ANOVA de un solo factor) para evaluar si el pH promedio difiere significativamente entre los distintos niveles de acidez categórica de los vinos (“Muy ácido”, “Ácido”, “Medio” y “Bajo en acidez”).

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

El valor F obtenido fue F = 8777, con un valor-p < 2 × 10⁻¹⁶, lo que indica que existe evidencia estadísticamente significativa para rechazar la hipótesis nula al nivel de significancia común (α = 0.05). En otras palabras, el pH promedio no es igual entre todos los niveles de acidez.

Este resultado sugiere que, al menos uno de los grupos (niveles de acidez) presenta una media de pH significativamente distinta en comparación con los demás. Sin embargo, el ANOVA no especifica cuáles grupos difieren entre sí.

TukeyHSD(anova_pH)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = pH ~ acidez, data = data)
## 
## $acidez
##                               diff       lwr       upr p adj
## Ácido-Muy ácido          0.2040136 0.1991079 0.2089193     0
## Medio-Muy ácido          0.3879532 0.3802584 0.3956480     0
## Bajo en acidez-Muy ácido 0.6040349 0.5844974 0.6235724     0
## Medio-Ácido              0.1839396 0.1760430 0.1918362     0
## Bajo en acidez-Ácido     0.4000213 0.3804034 0.4196392     0
## Bajo en acidez-Medio     0.2160817 0.1955877 0.2365757     0
tukey_result <- TukeyHSD(anova_pH)
print(tukey_result)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = pH ~ acidez, data = data)
## 
## $acidez
##                               diff       lwr       upr p adj
## Ácido-Muy ácido          0.2040136 0.1991079 0.2089193     0
## Medio-Muy ácido          0.3879532 0.3802584 0.3956480     0
## Bajo en acidez-Muy ácido 0.6040349 0.5844974 0.6235724     0
## Medio-Ácido              0.1839396 0.1760430 0.1918362     0
## Bajo en acidez-Ácido     0.4000213 0.3804034 0.4196392     0
## Bajo en acidez-Medio     0.2160817 0.1955877 0.2365757     0
# Convertir los resultados en tabla con decisión
tukey_table <- as.data.frame(tukey_result$acidez)
tukey_table$comparación <- rownames(tukey_table)
tukey_table$`¿Rechaza H₀?` <- ifelse(tukey_table$`p adj` < 0.05, "Sí", "No")
tukey_table <- tukey_table[, c("comparación", "diff", "lwr", "upr", "p adj", "¿Rechaza H₀?")]

# Mostrar en formato limpio
kable(tukey_table, digits = 4, caption = "Resultados del test de Tukey para el pH por nivel de acidez")
Resultados del test de Tukey para el pH por nivel de acidez
comparación diff lwr upr p adj ¿Rechaza H₀?
Ácido-Muy ácido Ácido-Muy ácido 0.2040 0.1991 0.2089 0
Medio-Muy ácido Medio-Muy ácido 0.3880 0.3803 0.3956 0
Bajo en acidez-Muy ácido Bajo en acidez-Muy ácido 0.6040 0.5845 0.6236 0
Medio-Ácido Medio-Ácido 0.1839 0.1760 0.1918 0
Bajo en acidez-Ácido Bajo en acidez-Ácido 0.4000 0.3804 0.4196 0
Bajo en acidez-Medio Bajo en acidez-Medio 0.2161 0.1956 0.2366 0

Con base en los resultados estadísticos y gráficos, se concluye que sí existe una relación inversa clara entre el nivel de acidez categórica y el pH promedio. Las muestras clasificadas con mayor acidez presentan valores promedio de pH significativamente menores en comparación con aquellas de menor acidez. Esto es coherente con los fundamentos químicos, donde un mayor contenido ácido implica un menor pH.

Con un nivel de significancia del 5% (α = 0.05), se afirma que cada nivel de acidez tiene un pH promedio significativamente diferente del otro, ya que el análisis ANOVA y la prueba de Tukey indican que existen diferencias significativas en el pH promedio entre todos los niveles de acidez categórica.

Esto confirma que las muestras con mayor acidez categórica (como “Muy ácido”) presentan pH significativamente menor que las menos ácidas (“Bajo en acidez”).

3. ¿El nivel de azúcar residual es mayor en las muestras clasificadas como Muy ácidas frente a las Ácidas?

Planteamiento de la hipótesis

\(H_0 :\mu_{1} \leq \mu_{2}\)

El nivel promedio de azúcar residual en vinos “Muy ácidos” es igual o menor al de vinos “Ácidos”.

\(H_a :\mu_{1} > \mu_{2}\)

El nivel promedio de azúcar residual en vinos “Muy ácidos” es mayor que en vinos “Ácidos”.

Donde:

μ₁ = media de azúcar residual en “Muy ácido” μ₂ = media de azúcar residual en “Ácido”

data <- read.csv("../Datos/winequality.csv", sep = ";", dec = ",", fileEncoding = "latin1")
data_filtrada <- subset(data, acidez %in% c("Ácido", "Muy ácido"))

#VERIFICACIÓN DE SUPUESTOS
grupo_acido <- subset(data_filtrada, acidez == "Ácido")$azúcar.residual
grupo_muy_acido <- subset(data_filtrada, acidez == "Muy ácido")$azúcar.residual

# Normalidad
shapiro.test(grupo_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_acido
## W = 0.7454, p-value < 2.2e-16
shapiro.test(grupo_muy_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_muy_acido
## W = 0.89705, p-value < 2.2e-16
# Homogeneidad de varianzas
var.test(grupo_acido, grupo_muy_acido)
## 
##  F test to compare two variances
## 
## data:  grupo_acido and grupo_muy_acido
## F = 0.70516, num df = 2482, denom df = 3229, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.6549782 0.7594665
## sample estimates:
## ratio of variances 
##          0.7051619

El valor F obtenido (F = 247.5) fue considerablemente alto, y el valor-p asociado fue menor a 0.0001 (p < 2e-16), lo que indica una diferencia estadísticamente significativa en los niveles de azúcar residual entre los dos grupos de acidez. Esto sugiere que el nivel categórico de acidez tiene un efecto notable sobre la cantidad de azúcar residual en los vinos.

No obstante, los supuestos necesarios para la validez del ANOVA —normalidad de los residuos y homogeneidad de varianzas— no se cumplen en este caso. Las pruebas de normalidad de Shapiro-Wilk arrojaron p-valores muy pequeños (p < 2.2e-16), y la prueba F de igualdad de varianzas también fue significativa (p < 2.2e-16), indicando varianzas desiguales. Por tal razón, aunque el resultado del ANOVA se reporta aquí para fines ilustrativos, la prueba adecuada y válida para este análisis es la prueba no paramétrica de Kruskal-Wallis.

kruskal.test(azúcar.residual ~ acidez, data = data_filtrada)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  azúcar.residual by acidez
## Kruskal-Wallis chi-squared = 180.03, df = 1, p-value < 2.2e-16
library(ggplot2)
ggplot(data_filtrada, aes(x = acidez, y = azúcar.residual, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Nivel de azúcar residual según el nivel de acidez",
    x = "Nivel de acidez",
    y = "Azúcar residual (g/L)"
  ) +
  scale_fill_manual(values = c("steelblue", "seagreen")) +
  theme_minimal()

#p < 0.05 → se rechaza la hipótesis nula. Existe una diferencia significativa entre los grupos.

Con base en los resultados obtenidos, se concluye que las muestras clasificadas con acidez “Muy ácido” presentan un nivel promedio de azúcar residual significativamente mayor que aquellas clasificadas como “Ácido”. Esta diferencia es estadísticamente significativa, tanto bajo un enfoque paramétrico como no paramétrico, y sugiere que la acidez más pronunciada puede estar asociada con una mayor cantidad de azúcares residuales, lo cual podría estar relacionado con el tipo de fermentación, la variedad de uva o las condiciones de elaboración del vino.

Con un nivel de significancia del 5%, se rechaza la hipótesis nula indicando que sí existe evidencia estadística suficiente para afirmar que el nivel promedio de azúcar residual en los vinos “Muy ácidos” es significativamente mayor que en los vinos “Ácidos”.

4. ¿Existen diferencias en la acidez volátil promedio entre niveles de acidez (Ácido vs. Muy ácido)?

Planteamiento de hipótesis

  • \(H_0 :\mu_{1}= \mu_{2}\) El promedio de acidez volátil es igual en ambos grupos.

  • \(H_a :\mu_{1} \neq \mu_{2}\) El promedio de acidez volátil difiere entre los vinos “Ácido” y “Muy ácido”.

# Filtrar los datos para comparar solo "Ácido" vs "Muy ácido"
data_filtrada <- subset(data, acidez %in% c("Ácido", "Muy ácido"))

# Crear los grupos
grupo_acido <- subset(data_filtrada, acidez == "Ácido")$acidez.volátil
grupo_muy_acido <- subset(data_filtrada, acidez == "Muy ácido")$acidez.volátil

# Pruebas de normalidad
shapiro.test(grupo_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_acido
## W = 0.010901, p-value < 2.2e-16
shapiro.test(grupo_muy_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_muy_acido
## W = 0.0086415, p-value < 2.2e-16
# Ambas pruebas muestran p < 0.001, lo que indica que los datos no siguen una distribución normal en ninguno de los dos grupos. Por lo tanto, no se cumple el supuesto de normalidad.


# Prueba de igualdad de varianzas
var.test(grupo_acido, grupo_muy_acido)
## 
##  F test to compare two variances
## 
## data:  grupo_acido and grupo_muy_acido
## F = 1.3136, num df = 2482, denom df = 3229, p-value = 3.908e-13
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  1.220127 1.414773
## sample estimates:
## ratio of variances 
##           1.313612
#Con un valor F = 1.31 y un p-valor extremadamente pequeño (< 0.001), se concluye que las varianzas no son iguales entre los grupos. Esto implica que no se cumple el supuesto de homocedasticidad.


# Prueba t de diferencia de medias (usar var.equal = TRUE solo si p > 0.05 en var.test)
t.test(grupo_acido, grupo_muy_acido,
       alternative = "two.sided",
       var.equal = FALSE)  # Usa FALSE si las varianzas no son iguales
## 
##  Welch Two Sample t-test
## 
## data:  grupo_acido and grupo_muy_acido
## t = 0.33545, df = 4937.3, p-value = 0.7373
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -1.188086  1.678603
## sample estimates:
## mean of x mean of y 
## 1.1785421 0.9332833
# Cargar paquete
library(knitr)

# Crear data frame con los resultados
tabla_t_test <- data.frame(
  Estadístico = c(
    "Media grupo Ácido",
    "Media grupo Muy ácido",
    "Diferencia observada de medias",
    "Estadístico t",
    "Grados de libertad (gl)",
    "p-valor",
    "Intervalo de confianza (95%)",
    "¿Incluye el 0 en el IC?",
    "¿Se rechaza H₀?",
    "¿Diferencia estadísticamente significativa?"
  ),
  Valor = c(
    "1.179 g/L",
    "0.933 g/L",
    "0.246 g/L",
    "0.335",
    "≈ 4937",
    "0.737",
    "[-1.188 ; 1.679]",
    "Sí",
    "No",
    "No"
  )
)

# Mostrar tabla con kable
kable(tabla_t_test, caption = "Resumen de la prueba t de Welch para la acidez volátil entre vinos Ácido y Muy ácido")
Resumen de la prueba t de Welch para la acidez volátil entre vinos Ácido y Muy ácido
Estadístico Valor
Media grupo Ácido 1.179 g/L
Media grupo Muy ácido 0.933 g/L
Diferencia observada de medias 0.246 g/L
Estadístico t 0.335
Grados de libertad (gl) ≈ 4937
p-valor 0.737
Intervalo de confianza (95%) [-1.188 ; 1.679]
¿Incluye el 0 en el IC?
¿Se rechaza H₀? No
¿Diferencia estadísticamente significativa? No
#La diferencia observada entre medias es 0.2459 g/L, pero el valor-p = 0.737 > 0.05, por lo que no es estadísticamente significativa. Además, el intervalo de confianza del 95% incluye al 0, reforzando esta conclusión. 

# Librerías necesarias
library(ggplot2)
library(dplyr)

# Boxplot con escala de ejes limitada para mayor visibilidad
ggplot(data_filtrada, aes(x = acidez, y = acidez.volátil, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  coord_cartesian(ylim = c(0, 1.5)) +  # Limita el eje Y para que se vean mejor las cajas
  labs(
    title = "Comparación de acidez volátil entre vinos Ácidos y Muy Ácidos",
    x = "Nivel de acidez",
    y = "Acidez volátil (g/L)"
  ) +
  scale_fill_manual(values = c("steelblue", "seagreen")) +
  theme_minimal(base_size = 13)

A pesar de observar un promedio levemente superior de acidez volátil en el grupo “Ácido” (1.18 g/L) en comparación con el grupo “Muy ácido” (0.93 g/L), esta diferencia no es estadísticamente significativa, tal como lo indica el valor-p = 0.737 obtenido en la prueba t de Welch. Además, los supuestos de normalidad y homogeneidad de varianzas no se cumplieron, por lo que los resultados deben interpretarse con precaución.

Con un nivel de significancia del 5%, no se rechaza la hipótesis nula indicandoque no se encontró evidencia estadística suficiente para afirmar que el nivel promedio de acidez volátil difiere entre los vinos “Ácido” y “Muy ácido”.

Esta conclusión sugiere que, dentro de la muestra analizada, el nivel de acidez categórica no tiene un efecto estadísticamente significativo sobre la acidez volátil promedio de los vinos.

5. ¿La densidad promedio cambia entre los niveles de acidez? Elabora un gráfico de cajas y bigotes para cada nivel de acidez.(Interpretelo)

Planteamiento de la hipótesis

  • \(H_0 :\mu_{Ácido}= \mu_{Muy ácido} = \mu_{Medio} = \mu_{Bajo en acidez}\)

No hay diferencias en la densidad promedio entre los niveles de acidez categórica

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)
# Cargar librerías necesarias
library(dplyr)
library(ggplot2)

# Cargar datos
data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",  # separador decimal
                 fileEncoding = "latin1")

# Asegurar que la variable 'acidez' sea ordinal
data$acidez <- factor(data$acidez,
                      levels = c("Muy ácido", "Ácido", "Medio", "Bajo en acidez"),
                      ordered = TRUE)
library(dplyr)
library(ggplot2)
library(car)
library(knitr)

data <- read.csv("../Datos/winequality.csv", sep = ";", dec = ",", fileEncoding = "latin1")



# Revisar nombre de columnas
names(data)
##  [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"
# Asegurar que 'acidez' es un factor ordinal
data$acidez <- factor(data$acidez,
                      levels = c("Muy ácido", "Ácido", "Medio", "Bajo en acidez"),
                      ordered = TRUE)

# Estadísticos descriptivos de densidad por nivel de acidez
data %>%
  group_by(acidez) %>%
  summarise(
    media_densidad = mean(densidad, na.rm = TRUE),
    mediana_densidad = median(densidad, na.rm = TRUE),
    sd_densidad = sd(densidad, na.rm = TRUE),
    n = n()
  )
## # A tibble: 4 × 5
##   acidez         media_densidad mediana_densidad sd_densidad     n
##   <ord>                   <dbl>            <dbl>       <dbl> <int>
## 1 Muy ácido            1131.               0.995  9830.       3230
## 2 Ácido                 354.               0.995  4676.       2483
## 3 Medio                 379.               0.995  5450.        693
## 4 Bajo en acidez          0.995            0.994     0.00216    91

El conjunto de datos utilizado incluye 16 variables relacionadas con las propiedades fisicoquímicas y sensoriales del vino, entre ellas: acidez fija, acidez volátil, ácido cítrico, azúcar residual, cloruros, dióxido de azufre libre y total, densidad, pH, acidez categórica, sulfatos, alcohol, contenido de alcohol, puntaje sensorial, calidad y tipo de vino. En particular, se evaluó si existen diferencias estadísticamente significativas en la densidad promedio del vino según los diferentes niveles de la variable categórica acidez.

Para esto se aplicó un análisis de varianza de un factor (ANOVA) que se muestra mas adelante.

anova_densidad <- aov(densidad ~ acidez, data = data)

# Extraer residuos del modelo ANOVA
residuos <- residuals(anova_densidad)

# Prueba de Shapiro-Wilk (solo si n < 5000)
shapiro.test(sample(residuos, 5000))  # si hay más de 5000 observaciones
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(residuos, 5000)
## W = 0.084331, p-value < 2.2e-16
# Histograma y gráfico Q-Q
hist(residuos, main = "Histograma de residuos", col = "gray", xlab = "Residuos")

qqnorm(residuos)
qqline(residuos, col = "red")

# Prueba de Levene
library(car)
leveneTest(densidad ~ acidez, data = data)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    3  5.6116 0.0007717 ***
##       6493                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Antes de aplicar el análisis de varianza (ANOVA), se verificaron los supuestos de normalidad de los residuos y homogeneidad de varianzas. La normalidad se evaluó mediante la prueba de Shapiro-Wilk y gráficos Q-Q, utilizando una muestra aleatoria de 5000 residuos debido al tamaño grande de la muestra. El resultado indicó que los residuos no siguen perfectamente una distribución normal (p < 0.05), aunque los gráficos mostraron una distribución aproximadamente simétrica, lo cual permite cierta robustez del ANOVA gracias al gran tamaño muestral.

Por otro lado, la prueba de Levene para igualdad de varianzas arrojó un p-valor de 0.00077, indicando violación del supuesto de homogeneidad de varianzas entre los grupos de acidez. Ante esto, se complementó el análisis con una prueba alternativa de Welch ANOVA, la cual no asume igualdad de varianzas. Ambos métodos mostraron resultados consistentes en cuanto a la existencia de diferencias significativas.

En conclusión, aunque se observaron desviaciones de los supuestos clásicos del ANOVA, especialmente en la homogeneidad de varianzas, el tamaño muestral y la estabilidad de los resultados sugieren que las conclusiones extraídas siguen siendo válidas desde un punto de vista práctico y estadístico.

#ANOVA para comparar densidad según acidez
anova_densidad <- aov(densidad ~ acidez, data = data)
summary(anova_densidad)
##               Df    Sum Sq   Mean Sq F value   Pr(>F)    
## acidez         3 1.003e+09 334357371   5.612 0.000772 ***
## Residuals   6493 3.869e+11  59583224                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El análisis de varianza (ANOVA) reveló diferencias estadísticamente significativas en la densidad promedio del vino según el nivel de acidez categórica (F = 5.612, p = 0.00077). Esto indica que no todas las categorías de acidez presentan la misma densidad, por lo que se procedió a realizar una prueba de comparaciones múltiples (Tukey HSD) para identificar entre qué niveles específicos ocurren estas diferencias.

# Comparaciones múltiples si hay diferencias significativas
TukeyHSD(anova_densidad)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = densidad ~ acidez, data = data)
## 
## $acidez
##                                 diff        lwr        upr     p adj
## Ácido-Muy ácido           -776.82740 -1306.2304 -247.42437 0.0009440
## Medio-Muy ácido           -751.35388 -1581.7498   79.04205 0.0924617
## Bajo en acidez-Muy ácido -1129.82175 -3238.2383  978.59478 0.5138595
## Medio-Ácido                 25.47352  -826.7023  877.64933 0.9998376
## Bajo en acidez-Ácido      -352.99435 -2470.0835 1764.09481 0.9736126
## Bajo en acidez-Medio      -378.46787 -2590.1090 1833.17322 0.9715761
# Extraer y organizar en tabla clara
library(knitr)

tukey_tab <- TukeyHSD(anova_densidad)$acidez
tukey_tab <- as.data.frame(tukey_tab)
tukey_tab$comparación <- rownames(tukey_tab)

# Reordenar y redondear
tukey_tab <- tukey_tab %>%
  select(comparación, diff, lwr, upr, `p adj`) %>%
  rename(
    Diferencia = diff,
    Límite_inferior = lwr,
    Límite_superior = upr,
    `p-valor ajustado` = `p adj`
  )

# Añadir columna de decisión
tukey_tab$`¿Rechaza H₀?` <- ifelse(tukey_tab$`p-valor ajustado` < 0.05, "Sí", "No")

# Tabla
kable(tukey_tab, digits = 4, caption = "Resultados de la prueba de comparaciones múltiples de Tukey para densidad")
Resultados de la prueba de comparaciones múltiples de Tukey para densidad
comparación Diferencia Límite_inferior Límite_superior p-valor ajustado ¿Rechaza H₀?
Ácido-Muy ácido Ácido-Muy ácido -776.8274 -1306.2304 -247.4244 0.0009
Medio-Muy ácido Medio-Muy ácido -751.3539 -1581.7498 79.0420 0.0925 No
Bajo en acidez-Muy ácido Bajo en acidez-Muy ácido -1129.8217 -3238.2383 978.5948 0.5139 No
Medio-Ácido Medio-Ácido 25.4735 -826.7023 877.6493 0.9998 No
Bajo en acidez-Ácido Bajo en acidez-Ácido -352.9943 -2470.0835 1764.0948 0.9736 No
Bajo en acidez-Medio Bajo en acidez-Medio -378.4679 -2590.1090 1833.1732 0.9716 No

La prueba de comparaciones múltiples de Tukey identificó una única diferencia estadísticamente significativa en la densidad promedio: entre vinos Muy ácidos y Ácidos (p = 0.00094), donde los vinos Muy ácidos presentan mayor densidad promedio. Las demás comparaciones entre niveles de acidez no mostraron diferencias significativas (p > 0.05), lo cual sugiere que la densidad solo varía significativamente entre algunos niveles de acidez, pero no entre todos.

# Gráfico de cajas con eje Y ajustado para ver mejor las cajas
ggplot(data, aes(x = acidez, y = densidad, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  coord_cartesian(ylim = c(0.985, 1.005)) +  # Ajusta el eje Y
  labs(
    title = "Distribución de la densidad según el nivel de acidez",
    x = "Nivel de acidez",
    y = "Densidad"
  ) +
  scale_fill_manual(values = c("darkred", "firebrick", "orange", "steelblue")) +
  theme_minimal(base_size = 13)

La gráfica de cajas permite observar varias características importantes sobre la distribución de la densidad según el nivel de acidez del vino. En primer lugar, se aprecia que la mediana de la densidad es ligeramente más alta en los vinos Muy ácidos, y va disminuyendo progresivamente hacia los vinos con menor acidez, es decir, aquellos clasificados como Bajo en acidez. Esta observación visual coincide con los resultados obtenidos en la tabla descriptiva.

Además, las cajas que representan el rango intercuartílico (IQR) son estrechas en todos los grupos, lo que indica que la mayoría de los valores están concentrados en un rango reducido, sugiriendo una baja variabilidad de la densidad dentro de cada categoría de acidez. Aunque se presentan algunos valores atípicos, especialmente en los vinos con menor acidez, estos se encuentran en un rango aceptable y no afectan significativamente la interpretación general.

Finalmente, se evidencia una tendencia general en la que, a medida que disminuye la acidez categórica (de “Muy ácido” hacia “Bajo en acidez”), la densidad promedio también tiende a disminuir ligeramente.

Concluyendo, con un nivel de significancia del 5% de estima que hay evidencia estadistica para afirmar que sí existen diferencias estadísticamente significativas en la densidad promedio entre al menos dos niveles de acidez. Sin embargo, según la prueba de comparaciones múltiples de Tukey, solo el grupo “Ácido” difiere significativamente del grupo “Muy ácido” en cuanto a su densidad promedio (p = 0.00094). No se hallaron diferencias significativas entre los demás niveles de acidez.

Estos resultados sugieren que la densidad del vino puede estar asociada con su acidez, particularmente en los extremos de la clasificación. No obstante, la magnitud de las diferencias observadas es pequeña, por lo que podrían no ser perceptibles sensorialmente, aunque sí estadísticamente detectables.

6. ¿La concentración de ácido cítrico promedio difiere entre muestras con acidez Ácida y Muy ácida?

Hipótesis

  • \(H_0 :\mu_{1}= \mu_{2}\)

La concentración promedio de ácido cítrico es igual en los vinos Ácidos y Muy Ácidos.

  • \(H_a :\mu_{1} \neq \mu_{2}\)

La concentración promedio de ácido cítrico es diferente entre los vinos Ácidos y Muy Ácidos.

# Librerías
library(dplyr)
library(ggplot2)

# Filtrar los grupos deseados
data_filtrada <- subset(data, acidez %in% c("Ácido", "Muy ácido"))

# Crear los grupos
grupo_acido <- subset(data_filtrada, acidez == "Ácido")$X.ácido.cítrico
grupo_muy_acido <- subset(data_filtrada, acidez == "Muy ácido")$X.ácido.cítrico

# Pruebas de normalidad
shapiro.test(grupo_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_acido
## W = 0.95073, p-value < 2.2e-16
shapiro.test(grupo_muy_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_muy_acido
## W = 0.95424, p-value < 2.2e-16
# Prueba de homogeneidad de varianzas
var.test(grupo_acido, grupo_muy_acido)
## 
##  F test to compare two variances
## 
## data:  grupo_acido and grupo_muy_acido
## F = 1.0806, num df = 2482, denom df = 3229, p-value = 0.03952
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  1.003724 1.163848
## sample estimates:
## ratio of variances 
##           1.080629
  • Normalidad:

Ambos grupos (Ácido y Muy ácido) tienen p < 0.05 en la prueba de Shapiro-Wilk.

Esto indica que no cumplen el supuesto de normalidad → ❌ no se puede aplicar prueba t.

  • Homogeneidad de varianzas (var.test):

p = 0.03952, que también es < 0.05.

Esto indica que las varianzas son significativamente diferentes → ❌ no se cumple homocedasticidad.

# Prueba de Kruskal-Wallis
kruskal.test(X.ácido.cítrico ~ acidez, data = data_filtrada)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  X.ácido.cítrico by acidez
## Kruskal-Wallis chi-squared = 186.16, df = 1, p-value < 2.2e-16

El p-valor < 0.001 indica que existe evidencia estadísticamente significativa para rechazar la hipótesis nula. Por tanto, se concluye que la concentración promedio de ácido cítrico sí difiere significativamente entre los vinos Ácidos y Muy Ácidos.

# Tabla descriptiva
tabla_acido <- data_filtrada %>%
  group_by(acidez) %>%
  summarise(
    media = mean(X.ácido.cítrico, na.rm = TRUE),
    mediana = median(X.ácido.cítrico, na.rm = TRUE),
    sd = sd(X.ácido.cítrico, na.rm = TRUE),
    n = n()
  )

# Mostrar tabla en RMarkdown
knitr::kable(tabla_acido, caption = "Resumen estadístico del ácido cítrico por nivel de acidez")
Resumen estadístico del ácido cítrico por nivel de acidez
acidez media mediana sd n
Muy ácido 0.3567090 0.33 0.1336753 3230
Ácido 0.2994603 0.30 0.1389599 2483
ggplot(data_filtrada, aes(x = acidez, y = X.ácido.cítrico, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Concentración de ácido cítrico según nivel de acidez",
    x = "Nivel de acidez",
    y = "Ácido cítrico (g/L)"
  ) +
  scale_fill_manual(values = c("steelblue", "seagreen")) +
  theme_minimal(base_size = 13)

El análisis no paramétrico de Kruskal-Wallis reveló que existe una diferencia estadísticamente significativa en la concentración de ácido cítrico entre los vinos clasificados como “Muy ácidos” y “Ácidos” (p < 0.001).

La concentración promedio fue mayor en los vinos Muy Ácidos (media ≈ 0.357 g/L) frente a los vinos Ácidos (media ≈ 0.299 g/L). Dado que no se cumplieron los supuestos de normalidad ni homogeneidad de varianzas, se optó por una prueba robusta no paramétrica.

Por tanto, se rechaza la hipótesis nula H₀ y se concluye que el nivel de acidez categórica sí influye significativamente en la concentración de ácido cítrico.

7. ¿Las muestras con mayor contenido de alcohol presentan menor acidez fija en promedio?

Planteamineto de la hipótesis

  • \(H_0 :\mu_{Alto}= \mu_{Bajo}\)

No hay diferencia en la acidez fija promedio entre vinos con bajo y alto contenido de alcohol.

  • \(H_a :\mu_{Alto} < \mu_{Bajo}\)
# ----------------------------------------------------------
# 1. CARGAR LIBRERÍAS Y DATOS
# ----------------------------------------------------------
library(dplyr)
library(ggplot2)
library(car)       # Para leveneTest
library(knitr)     # Para mostrar tablas con kable

# Cargar datos desde archivo local (ajusta la ruta si es necesario)
data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",  # separador decimal
                 fileEncoding = "latin1")

# ----------------------------------------------------------
# 2. FILTRAR Y CATEGORIZAR POR ALCOHOL
# ----------------------------------------------------------
mediana_alcohol <- median(data$alcohol, na.rm = TRUE)
data <- data %>%
  mutate(
    categoria_alcohol = ifelse(alcohol < mediana_alcohol, "Bajo", "Alto"),
    categoria_alcohol = factor(categoria_alcohol, levels = c("Bajo", "Alto"))
  )

sub_data <- data %>%
  filter(categoria_alcohol %in% c("Bajo", "Alto"))

# ----------------------------------------------------------
# 3. VERIFICACIÓN DE SUPUESTOS
# ----------------------------------------------------------
shapiro_bajo <- shapiro.test(sub_data$acidez.fija[sub_data$categoria_alcohol == "Bajo"])
shapiro_alto <- shapiro.test(sub_data$acidez.fija[sub_data$categoria_alcohol == "Alto"])

# Homogeneidad de varianzas
levene <- leveneTest(acidez.fija ~ categoria_alcohol, data = sub_data)


# ----------------------------------------------------------
# 4. PRUEBA ESTADÍSTICA
# ----------------------------------------------------------
t_test_acidez <- t.test(acidez.fija ~ categoria_alcohol, 
                        data = sub_data,
                        var.equal = (levene$`Pr(>F)`[1] > 0.05))

# ----------------------------------------------------------
# 5. TABLA DE MEDIAS
# ----------------------------------------------------------
medias <- sub_data %>%
  group_by(categoria_alcohol) %>%
  summarise(
    media_acidez = mean(acidez.fija, na.rm = TRUE),
    mediana = median(acidez.fija, na.rm = TRUE),
    sd = sd(acidez.fija, na.rm = TRUE),
    n = n()
  )
kable(medias, caption = "Resumen de acidez fija por nivel de alcohol")
Resumen de acidez fija por nivel de alcohol
categoria_alcohol media_acidez mediana sd n
Bajo 7.299465 7.1 1.231971 3176
Alto 7.135166 6.9 1.350564 3320
#______________________________________________________________

# Crear un data frame con los resultados del contraste
tabla_resultado <- data.frame(
  `Grupo con mayor acidez fija` = "Bajo alcohol",
  `Diferencia de medias (g/L)` = round(diff(rev(t_test_acidez$estimate)), 3),
  `p-valor` = signif(t_test_acidez$p.value, 4),
  `¿Se rechaza H₀?` = ifelse(t_test_acidez$p.value < 0.05, "Sí", "No"),
  `Conclusión` = ifelse(t_test_acidez$p.value < 0.05,
                        "El grupo con alto alcohol presenta menor acidez fija",
                        "No hay diferencia significativa")
)

# Mostrar la tabla con kable
knitr::kable(tabla_resultado, caption = "Resumen del contraste de medias: Acidez fija vs. Nivel de alcohol")
Resumen del contraste de medias: Acidez fija vs. Nivel de alcohol
Grupo.con.mayor.acidez.fija Diferencia.de.medias..g.L. p.valor X.Se.rechaza.H.. Conclusión
mean in group Bajo Bajo alcohol 0.164 3e-07 El grupo con alto alcohol presenta menor acidez fija
# ----------------------------------------------------------
# 6. GRÁFICO COMPARATIVO
# ----------------------------------------------------------
ggplot(sub_data, aes(x = categoria_alcohol, y = acidez.fija, fill = categoria_alcohol)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Acidez fija según nivel de alcohol",
    x = "Categoría de alcohol",
    y = "Acidez fija (g/L)"
  ) +
  scale_fill_manual(values = c("#FF9999", "#99CCFF")) +
  theme_minimal(base_size = 13)

# ----------------------------------------------------------
# 7. INTERPRETACIÓN AUTOMÁTICA EN CONSOLA
# ----------------------------------------------------------
cat("\nRESULTADO ESTADÍSTICO:\n")
## 
## RESULTADO ESTADÍSTICO:
if (t_test_acidez$p.value < 0.05) {
  if (t_test_acidez$estimate[1] > t_test_acidez$estimate[2]) {
    cat("Los vinos con BAJO alcohol tienen MAYOR acidez fija (p =",
        signif(t_test_acidez$p.value, 4), ")\n")
  } else {
    cat("Los vinos con ALTO alcohol tienen MAYOR acidez fija (p =",
        signif(t_test_acidez$p.value, 4), ")\n")
  }
} else {
  cat("No hay diferencia significativa en acidez fija entre vinos con alto y bajo alcohol (p =",
      signif(t_test_acidez$p.value, 4), ")\n")
}
## Los vinos con BAJO alcohol tienen MAYOR acidez fija (p = 3.043e-07 )

Se evaluó si la acidez fija promedio difiere entre vinos con bajo y alto contenido de alcohol. Para ello, se dividieron las muestras en dos grupos según la mediana del alcohol y se compararon mediante una prueba t de Student. Previamente, se verificaron los supuestos de normalidad y homogeneidad de varianzas. Aunque ambos grupos violaron el supuesto de normalidad (p < 0.05 en la prueba de Shapiro-Wilk), se continuó con la prueba t debido al gran tamaño muestral (n > 30 por grupo), lo cual permite aplicar el teorema del límite central. La prueba de Levene arrojó un valor p > 0.05, indicando que las varianzas pueden asumirse iguales. La prueba t reveló una diferencia estadísticamente significativa (p = 3.043e-07), mostrando que el grupo con menor contenido de alcohol presenta en promedio una mayor acidez fija (7.30 g/L) en comparación con el grupo con mayor alcohol (7.14 g/L).

Con un nivel de significancia del 5% (α = 0.05), se estima que existe evidencia estadísticamente significativa para rechazar la hipótesis nula de igualdad de medias. En consecuencia, se concluye que las muestras con mayor contenido de alcohol presentan, en promedio, una acidez fija significativamente menor que aquellas con menor contenido de alcohol. Esta diferencia, aunque no muy amplia en términos absolutos (7.30 vs. 7.14 g/L), es respaldada por un valor p = 3.043 × 10⁻⁷, lo que indica que es muy poco probable que se haya obtenido por azar. Por tanto, se sugiere una posible relación inversa entre el contenido de alcohol y la acidez fija en los vinos evaluados.

8. ¿El contenido de sulfatos difiere entre niveles de acidez?

Plantemiento de la hipótesis

  • \(H_0 :\mu_{Ácido}= \mu_{Muy ácido} = \mu_{Medio} = \mu_{Bajo en acidez}\)

No hay diferencias significativas en el contenido promedio de sulfatos entre los distintos niveles de acidez.

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

Al menos uno de los niveles de acidez tiene un contenido promedio de sulfatos significativamente diferente al de los demás.

# Cargar librerías
library(dplyr)
library(ggplot2)

# Cargar datos
data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",
                 fileEncoding = "latin1")

# Ordenar niveles de acidez como factor ordinal
data$acidez <- factor(data$acidez,
                      levels = c("Muy ácido", "Ácido", "Medio", "Bajo en acidez"),
                      ordered = TRUE)
# Para conocer cómo se distribuye el contenido de sulfatos según el nivel de acidez.
# Tabla resumen de sulfatos por nivel de acidez
tabla_sulfatos <- data %>%
  group_by(acidez) %>%
  summarise(
    media_sulfatos = mean(sulfatos, na.rm = TRUE),
    mediana_sulfatos = median(sulfatos, na.rm = TRUE),
    sd_sulfatos = sd(sulfatos, na.rm = TRUE),
    n = n()
  )
tabla_sulfatos
## # A tibble: 4 × 5
##   acidez         media_sulfatos mediana_sulfatos sd_sulfatos     n
##   <ord>                   <dbl>            <dbl>       <dbl> <int>
## 1 Muy ácido               0.506             0.48       0.153  3230
## 2 Ácido                   0.548             0.53       0.143  2483
## 3 Medio                   0.577             0.57       0.128   693
## 4 Bajo en acidez          0.638             0.63       0.121    91

Existe un aumento progresivo en el contenido promedio de sulfatos a medida que disminuye la acidez del vino. Este patrón sugiere una posible relación inversa entre acidez percibida y concentración de sulfatos.

knitr::kable(tabla_sulfatos, caption = "Resumen del contenido de sulfatos por nivel de acidez")
Resumen del contenido de sulfatos por nivel de acidez
acidez media_sulfatos mediana_sulfatos sd_sulfatos n
Muy ácido 0.5055480 0.48 0.1527816 3230
Ácido 0.5480588 0.53 0.1426259 2483
Medio 0.5769986 0.57 0.1280047 693
Bajo en acidez 0.6378022 0.63 0.1212692 91
# Como estamos comparando más de dos grupos (cuatro niveles de acidez), usamos un ANOVA para ver si hay al menos una diferencia significativa entre medias.

anova_sulfatos <- aov(sulfatos ~ acidez, data = data)
summary(anova_sulfatos)
##               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

Para evaluar si el contenido promedio de sulfatos varía significativamente entre los diferentes niveles de acidez del vino (Muy ácido, Ácido, Medio y Bajo en acidez), se realizó un análisis de varianza (ANOVA). Este tipo de análisis permite comparar las medias de más de dos grupos para determinar si al menos una de ellas difiere significativamente de las demás.

La tabla ANOVA mostró un estadístico F de 83.1, con un valor-p asociado de < 2e-16. Este resultado es altamente significativo desde el punto de vista estadístico. Un valor F tan elevado indica que la variabilidad entre las medias de los grupos (niveles de acidez) es mucho mayor que la variabilidad dentro de cada grupo. En otras palabras, la diferencia observada en los niveles de sulfatos entre categorías de acidez no puede atribuirse al azar.

La suma de cuadrados atribuible a la variable acidez fue de 5.32, mientras que la suma de cuadrados residual (es decir, la variabilidad no explicada por el modelo) fue de 138.52. Al dividir estas sumas de cuadrados por sus respectivos grados de libertad, se obtienen los cuadrados medios, que son utilizados para calcular el estadístico F. En este caso, el cuadrado medio para la variable acidez fue de 1.7729, mientras que el de los residuos fue de 0.0213.

El valor-p extremadamente bajo (p < 0.001) indica que se rechaza la hipótesis nula, la cual plantea que no existen diferencias en el contenido promedio de sulfatos entre los diferentes niveles de acidez. Por tanto, se concluye que el nivel de acidez del vino influye significativamente en su contenido de sulfatos, lo que justifica aplicar pruebas post hoc (como la de Tukey) para identificar específicamente qué grupos difieren entre sí.

TukeyHSD(anova_sulfatos)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = sulfatos ~ acidez, data = data)
## 
## $acidez
##                                diff        lwr        upr     p adj
## Ácido-Muy ácido          0.04251081 0.03249322 0.05252840 0.0000000
## Medio-Muy ácido          0.07145057 0.05573747 0.08716367 0.0000000
## Bajo en acidez-Muy ácido 0.13225421 0.09235786 0.17215056 0.0000000
## Medio-Ácido              0.02893976 0.01281452 0.04506499 0.0000241
## Bajo en acidez-Ácido     0.08974340 0.04968294 0.12980386 0.0000001
## Bajo en acidez-Medio     0.06080364 0.01895403 0.10265325 0.0010919
#Hipotesis
# Hipótesis nula (H₀): No hay diferencia en el contenido promedio de sulfatos entre los dos niveles de acidez comparados.

#Hipótesis alternativa (H₁): Existe una diferencia significativa en el contenido promedio de sulfatos entre los niveles de acidez comparados.

cat("\nHipótesis evaluadas en cada comparación:\n")
## 
## Hipótesis evaluadas en cada comparación:
cat("- Hipótesis nula (H₀): No hay diferencia significativa en el contenido promedio de sulfatos entre los niveles de acidez comparados.\n")
## - Hipótesis nula (H₀): No hay diferencia significativa en el contenido promedio de sulfatos entre los niveles de acidez comparados.
cat("- Hipótesis alternativa (H₁): Sí hay diferencia significativa en el contenido promedio de sulfatos entre los niveles de acidez comparados.\n")
## - Hipótesis alternativa (H₁): Sí hay diferencia significativa en el contenido promedio de sulfatos entre los niveles de acidez comparados.
cat("\nDado que todos los valores-p ajustados son menores a 0.05, se rechaza H₀ en todas las comparaciones. Esto indica que el contenido de sulfatos difiere significativamente entre todos los niveles de acidez.\n")
## 
## Dado que todos los valores-p ajustados son menores a 0.05, se rechaza H₀ en todas las comparaciones. Esto indica que el contenido de sulfatos difiere significativamente entre todos los niveles de acidez.
# Crear dataframe con los resultados de la prueba de Tukey
comparaciones <- data.frame(
  Comparación = c(
    "Ácido - Muy ácido",
    "Medio - Muy ácido",
    "Bajo en acidez - Muy ácido",
    "Medio - Ácido",
    "Bajo en acidez - Ácido",
    "Bajo en acidez - Medio"
  ),
  Diff = c(0.0425, 0.0715, 0.1323, 0.0289, 0.0897, 0.0608),
  p_valor_ajustado = c("< 0.001", "< 0.001", "< 0.001", "0.0000241", "< 0.001", "0.00109"),
  Significativo = c("✅ Sí", "✅ Sí", "✅ Sí", "✅ Sí", "✅ Sí", "✅ Sí"),
  Rechaza_H0 = c("✅ Sí, se rechaza", "✅ Sí, se rechaza", "✅ Sí, se rechaza",
                 "✅ Sí, se rechaza", "✅ Sí, se rechaza", "✅ Sí, se rechaza")
)

# Cargar librería para mostrar tabla bonita (opcional)
library(knitr)

# Mostrar tabla
kable(comparaciones, caption = "Comparaciones múltiples de Tukey para el contenido de sulfatos")
Comparaciones múltiples de Tukey para el contenido de sulfatos
Comparación Diff p_valor_ajustado Significativo Rechaza_H0
Ácido - Muy ácido 0.0425 < 0.001 ✅ Sí ✅ Sí, se rechaza
Medio - Muy ácido 0.0715 < 0.001 ✅ Sí ✅ Sí, se rechaza
Bajo en acidez - Muy ácido 0.1323 < 0.001 ✅ Sí ✅ Sí, se rechaza
Medio - Ácido 0.0289 0.0000241 ✅ Sí ✅ Sí, se rechaza
Bajo en acidez - Ácido 0.0897 < 0.001 ✅ Sí ✅ Sí, se rechaza
Bajo en acidez - Medio 0.0608 0.00109 ✅ Sí ✅ Sí, se rechaza

Hay evidencia estadística significativa para afirmar que el contenido de sulfatos difiere entre los distintos niveles de acidez categórica. Las diferencias más pronunciadas se observan entre vinos “Muy ácidos” y “Bajo en acidez”, lo cual podría estar relacionado con procesos de estabilización, conservación o características propias de los vinos.

ggplot(data, aes(x = acidez, y = sulfatos, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Contenido de sulfatos según nivel de acidez",
    x = "Nivel de acidez",
    y = "Sulfatos (g/L)"
  ) +
  scale_fill_manual(values = c("darkred", "firebrick", "orange", "steelblue")) +
  theme_minimal(base_size = 13)

Con un nivel de significancia del 5% (α = 0.05), se concluye que existe evidencia estadísticamente significativa para afirmar que el contenido promedio de sulfatos difiere entre los niveles de acidez en el vino. El análisis ANOVA mostró un valor-p < 0.001, lo cual indica diferencias globales entre grupos. Las pruebas post hoc de Tukey confirmaron que todas las comparaciones por pares entre los niveles de acidez son estadísticamente significativas, es decir, que cada categoría de acidez tiene un contenido medio de sulfatos distinto al de las demás.

Este resultado sugiere que el contenido de sulfatos puede estar relacionado con el perfil ácido del vino y posiblemente con los tratamientos de conservación o tipo de fermentación.

9. ¿El pH promedio de las muestras con acidez Muy ácida es diferente al de las Ácidas?

Planteamineto de hipótesis

  • \(H_0 :\mu_{Ácido}= \mu_{muyacido}\)

No hay diferencia en la distribución del pH entre los vinos Muy ácidos y Ácidos.

  • \(H_a :\mu_{acido} \neq \mu_{muy acido}\)

Hay diferencia en la distribución del pH entre los vinos Muy ácidos y Ácidos.

# Tabla descriptiva de pH por nivel de acidez
library(knitr)

data_filtrada %>%
  group_by(acidez) %>%
  summarise(
    media_pH = mean(pH, na.rm = TRUE),
    mediana_pH = median(pH, na.rm = TRUE),
    sd_pH = sd(pH, na.rm = TRUE),
    n = n()
  ) %>%
  kable(caption = "Resumen descriptivo del pH según nivel de acidez")
Resumen descriptivo del pH según nivel de acidez
acidez media_pH mediana_pH sd_pH n
Muy ácido 3.090690 3.11 0.0839792 3230
Ácido 3.294704 3.29 0.0563139 2483
#Evaluando supuestos

# Librerías necesarias
library(dplyr)
library(ggplot2)

# Filtrar los datos con las categorías deseadas
data_filtrada <- subset(data, acidez %in% c("Muy ácido", "Ácido"))
grupo_muy_acido <- subset(data_filtrada, acidez == "Muy ácido")$pH
grupo_acido <- subset(data_filtrada, acidez == "Ácido")$pH

# Pruebas de normalidad
shapiro.test(grupo_muy_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_muy_acido
## W = 0.9329, p-value < 2.2e-16
shapiro.test(grupo_acido)
## 
##  Shapiro-Wilk normality test
## 
## data:  grupo_acido
## W = 0.94706, p-value < 2.2e-16
# Prueba de igualdad de varianzas
var.test(grupo_muy_acido, grupo_acido)
## 
##  F test to compare two variances
## 
## data:  grupo_muy_acido and grupo_acido
## F = 2.2239, num df = 3229, denom df = 2482, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  2.064870 2.394278
## sample estimates:
## ratio of variances 
##           2.223886

Prueba de normalidad (Shapiro-Wilk):

Muy ácido: W = 0.933, p < 0.001 → No normal

Ácido: W = 0.947, p < 0.001 → No normal

Ambas distribuciones no cumplen el supuesto de normalidad.

Prueba de igualdad de varianzas (F-test): F = 2.22, p < 0.001 → Varianzas diferentes

  • Por lo tanto, no se cumplen los supuestos para aplicar una prueba t. En su lugar, se debe aplicar una prueba no paramétrica, como Kruskal-Wallis, que no requiere normalidad ni homocedasticidad.
# Filtrar los datos
data_filtrada <- subset(data, acidez %in% c("Muy ácido", "Ácido"))

# Aplicar Kruskal-Wallis
kruskal.test(pH ~ acidez, data = data_filtrada)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  pH by acidez
## Kruskal-Wallis chi-squared = 4213.2, df = 1, p-value < 2.2e-16

El resultado del test de Kruskal-Wallis mostró un estadístico χ²(1) = 4213.2, con un valor p < 0.001, lo que indica diferencias altamente significativas en la distribución del pH entre los vinos clasificados como “Muy ácidos” y “Ácidos”.

ggplot(data_filtrada, aes(x = acidez, y = pH, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Comparación del pH entre vinos Muy Ácidos y Ácidos",
    x = "Nivel de acidez",
    y = "pH"
  ) +
  scale_fill_manual(values = c("steelblue", "seagreen")) +
  theme_minimal(base_size = 13)

La gráfica respalda la conclusión estadística: el pH promedio de los vinos Muy ácidos es significativamente menor que el de los vinos Ácidos, tanto visual como numéricamente.

Con un nivel de significancia del 5%, se rechaza la hipótesis nula. Existe evidencia estadística suficiente para afirmar que el pH promedio difiere significativamente entre los vinos clasificados como “Muy ácidos” y “Ácidos”. Esta diferencia es coherente con el comportamiento químico esperado: los vinos con mayor acidez presentan un pH más bajo, reflejando su mayor concentración de protones (H⁺).

Preguntas basadas en el contenido de alcohol (Bajo, Medio, Alto)

10. ¿El puntaje sensorial promedio varía entre los vinos con bajo y alto contenido de alcohol?

Planteamiento de hipótesis

  • \(H_0 :\mu_{1}= \mu_{2}\)

El puntaje sensorial promedio es igual entre vinos con bajo y alto contenido de alcohol.

  • \(H_a :\mu_{1} \neq \mu_{2}\)

Hipótesis alternativa (H₁): El puntaje sensorial promedio es diferente entre vinos con bajo y alto contenido de alcohol.

# ----------------------------------------------------------
# 1. FILTRAR Y PREPARAR LOS DATOS
# ----------------------------------------------------------

# Librerías necesarias
library(dplyr)
library(ggplot2)

# Filtrar datos para categorías "Muy ácido" y "Ácido"
sub_data_pH <- data %>%
  filter(acidez %in% c("Muy ácido", "Ácido"))

# ----------------------------------------------------------
# 2. VERIFICACIÓN DE SUPUESTOS
# ----------------------------------------------------------

# Prueba de normalidad Shapiro-Wilk
shapiro.test(sub_data_pH$pH[sub_data_pH$acidez == "Muy ácido"])
## 
##  Shapiro-Wilk normality test
## 
## data:  sub_data_pH$pH[sub_data_pH$acidez == "Muy ácido"]
## W = 0.9329, p-value < 2.2e-16
shapiro.test(sub_data_pH$pH[sub_data_pH$acidez == "Ácido"])
## 
##  Shapiro-Wilk normality test
## 
## data:  sub_data_pH$pH[sub_data_pH$acidez == "Ácido"]
## W = 0.94706, p-value < 2.2e-16
# Prueba de homogeneidad de varianzas (F-test)
var.test(pH ~ acidez, data = sub_data_pH)
## 
##  F test to compare two variances
## 
## data:  pH by acidez
## F = 2.2239, num df = 3229, denom df = 2482, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  2.064870 2.394278
## sample estimates:
## ratio of variances 
##           2.223886
# Como no se cumple la normalidad ni la igualdad de varianzas,
# se usa la prueba no paramétrica de Kruskal-Wallis.

# ----------------------------------------------------------
# 3. PRUEBA NO PARAMÉTRICA
# ----------------------------------------------------------

kruskal_test_result <- kruskal.test(pH ~ acidez, data = sub_data_pH)
print(kruskal_test_result)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  pH by acidez
## Kruskal-Wallis chi-squared = 4213.2, df = 1, p-value < 2.2e-16
# ----------------------------------------------------------
# 4. VISUALIZACIÓN
# ----------------------------------------------------------

# Tabla con los estadísticos descriptivos
library(dplyr)
library(knitr)


tabla_ph <- sub_data_pH %>%
  group_by(acidez) %>%
  summarise(
    Media = round(mean(pH, na.rm = TRUE), 3),
    Mediana = round(median(pH, na.rm = TRUE), 3),
    Desviación_Estándar = round(sd(pH, na.rm = TRUE), 3),
    n = n()
  )

# Mostrar tabla en el documento
kable(tabla_ph, caption = "Resumen estadístico del pH por nivel de acidez (Ácido vs. Muy Ácido)")
Resumen estadístico del pH por nivel de acidez (Ácido vs. Muy Ácido)
acidez Media Mediana Desviación_Estándar n
Muy ácido 3.091 3.11 0.084 3230
Ácido 3.295 3.29 0.056 2483
# Boxplot comparativo
ggplot(sub_data_pH, aes(x = acidez, y = pH, fill = acidez)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Comparación de pH entre vinos Ácidos y Muy Ácidos",
    x = "Nivel de acidez",
    y = "pH"
  ) +
  scale_fill_manual(values = c("skyblue", "orchid")) +
  theme_minimal(base_size = 13)

Con el fin de determinar si el pH promedio difiere significativamente entre vinos clasificados como “Muy ácidos” y “Ácidos”, se evaluaron inicialmente los supuestos requeridos para aplicar pruebas paramétricas. Para ello, se aplicaron pruebas de normalidad de Shapiro-Wilk y de homogeneidad de varianzas (prueba F), seguidas de un análisis no paramétrico.

  • Pruebas de normalidad

La prueba de Shapiro-Wilk se utilizó para evaluar si los datos del pH en cada grupo seguían una distribución normal. Para los vinos “Muy ácidos”, se obtuvo un estadístico W = 0.9329 con un p-valor < 2.2 × 10⁻¹⁶, y para los vinos “Ácidos”, W = 0.94706 con p-valor < 2.2 × 10⁻¹⁶. En ambos casos, los p-valores fueron significativamente menores a 0.05, lo que indica que los datos no siguen una distribución normal, violando así el supuesto de normalidad necesario para aplicar pruebas t de Student.

  • Prueba de homogeneidad de varianzas

Adicionalmente, se aplicó una prueba F de comparación de varianzas entre los dos grupos. El resultado mostró un estadístico F = 2.2239 (gl₁ = 3229, gl₂ = 2482) con p-valor < 2.2 × 10⁻¹⁶, indicando que las varianzas son significativamente diferentes entre los grupos. El intervalo de confianza del 95% para la razón de varianzas fue [2.0649, 2.3943], lo que confirma la presencia de heterocedasticidad.

Dado que no se cumplen los supuestos de normalidad ni de igualdad de varianzas, se descartó el uso de pruebas paramétricas, y se optó por un análisis no paramétrico robusto.

  • Prueba de Kruskal-Wallis

Para evaluar diferencias en la distribución del pH entre los dos niveles de acidez, se aplicó la prueba Kruskal-Wallis. Esta arrojó un valor de χ² = 4213.2 con 1 grado de libertad y un p-valor < 2.2 × 10⁻¹⁶, lo cual proporciona evidencia estadística contundente para rechazar la hipótesis nula. Por tanto, se concluye que existe una diferencia significativa en el pH entre los vinos clasificados como “Muy ácidos” y “Ácidos”.

Con un nivel de significancia del 5%, se rechaza la hipótesis nula y se concluye que existe evidencia estadísticamente significativa para afirmar que el puntaje sensorial promedio varía entre los vinos con bajo y alto contenido de alcohol. En particular, los vinos con alto contenido de alcohol presentan, en promedio, una mayor calificación sensorial, lo cual podría reflejar preferencias sensoriales asociadas al cuerpo, dulzor o redondez del vino.

11. ¿Las muestras con alto contenido de alcohol tienen menor acidez volátil en promedio que las de contenido bajo?

Planteamiento de hipótesis

  • \(H_0 :\mu_{alto}= \mu_{bajo}\)

No hay diferencia en la acidez volátil promedio entre vinos con alto y bajo contenido de alcohol.

  • \(H_a :\mu_{alto} < \mu_{bajo}\)

Los vinos con alto contenido de alcohol tienen menor acidez volátil promedio que los vinos con bajo contenido de alcohol.

# Asegurar nombres válidos de columnas
names(data) <- make.names(names(data))
data$contenido.de.alcohol <- trimws(data$contenido.de.alcohol)

# Filtrar los grupos de interés: "Bajo" y "Alto"
sub_data <- data %>%
  filter(contenido.de.alcohol %in% c("Bajo", "Alto")) %>%
  mutate(contenido.de.alcohol = factor(contenido.de.alcohol))

library(knitr)

sub_data %>%
  group_by(contenido.de.alcohol) %>%
  summarise(
    Media = mean(acidez.volátil, na.rm = TRUE),
    Mediana = median(acidez.volátil, na.rm = TRUE),
    SD = sd(acidez.volátil, na.rm = TRUE),
    n = n()
  ) %>%
  kable(caption = "Resumen estadístico de acidez volátil por nivel de alcohol")
Resumen estadístico de acidez volátil por nivel de alcohol
contenido.de.alcohol Media Mediana SD n
Alto 0.3414059 0.3200 0.1275018 882
Bajo 1.0779526 0.3025 27.1145442 2828
#Verificación de los supuestos

shapiro.test(sub_data$acidez.volátil[sub_data$contenido.de.alcohol == "Bajo"])
## 
##  Shapiro-Wilk normality test
## 
## data:  sub_data$acidez.volátil[sub_data$contenido.de.alcohol == "Bajo"]
## W = 0.0098899, p-value < 2.2e-16
shapiro.test(sub_data$acidez.volátil[sub_data$contenido.de.alcohol == "Alto"])
## 
##  Shapiro-Wilk normality test
## 
## data:  sub_data$acidez.volátil[sub_data$contenido.de.alcohol == "Alto"]
## W = 0.9012, p-value < 2.2e-16

Para determinar si la variable acidez volátil sigue una distribución normal en los grupos de vinos con bajo y alto contenido de alcohol, se aplicó la prueba de Shapiro-Wilk de forma independiente a cada grupo.

Ambos grupos presentan valores-p significativamente menores a 0.05, lo que indica una fuerte evidencia en contra de la normalidad en ambas distribuciones. Es decir, los datos de acidez volátil no se distribuyen normalmente en ninguno de los dos niveles de contenido alcohólico.

Este hallazgo invalida uno de los supuestos fundamentales para el uso de pruebas paramétricas como el t-test, y justifica el empleo de métodos no paramétricos como la prueba de Mann–Whitney–Wilcoxon o Kruskal–Wallis, que no requieren la normalidad de los datos.

library(car)
leveneTest(acidez.volátil ~ contenido.de.alcohol, data = sub_data)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value Pr(>F)
## group    1  0.6904 0.4061
##       3708

El valor-p obtenido fue 0.4061 (> 0.05), por lo que se asume igualdad de varianzas entre los grupos.

t_test <- t.test(acidez.volátil ~ contenido.de.alcohol,
                 data = sub_data,
                 alternative = "less",    # μ_Alto < μ_Bajo
                 var.equal = TRUE)        # Se usa TRUE porque p-Levene > 0.05
print(t_test)
## 
##  Two Sample t-test
## 
## data:  acidez.volátil by contenido.de.alcohol
## t = -0.80666, df = 3708, p-value = 0.21
## alternative hypothesis: true difference in means between group Alto and group Bajo is less than 0
## 95 percent confidence interval:
##       -Inf 0.7657149
## sample estimates:
## mean in group Alto mean in group Bajo 
##          0.3414059          1.0779526

El resultado de la prueba fue: t = -0.8067, con gl = 3708 y un valor-p = 0.21.

Dado que el valor-p es mayor al nivel de significancia comúnmente utilizado (α = 0.05), no se rechaza la hipótesis nula. Es decir, no hay evidencia estadísticamente significativa para afirmar que los vinos con alto contenido de alcohol presenten, en promedio, una acidez volátil menor que aquellos con bajo contenido de alcohol.

Los valores estimados de la media indican que, aunque los vinos del grupo “Alto” tienen una acidez volátil promedio de 0.3414, mientras que los del grupo “Bajo” presentan un promedio de 1.078, esta diferencia no es significativa desde el punto de vista estadístico, posiblemente debido a la alta variabilidad o a la forma no normal de los datos.

El intervalo de confianza unidireccional del 95% para la diferencia de medias es (-∞, 0.7657), lo cual incluye el cero, reforzando la conclusión de que la diferencia observada puede atribuirse al azar.

library(ggplot2)

ggplot(sub_data, aes(x = contenido.de.alcohol, y = acidez.volátil, fill = contenido.de.alcohol)) +
  geom_boxplot(outlier.shape = 21, outlier.fill = "gray", alpha = 0.7) +
  coord_cartesian(ylim = c(0, 1.5)) +  # Recorta visualmente sin eliminar datos
  labs(
    title = "Acidez volátil según contenido de alcohol",
    x = "Contenido de alcohol",
    y = "Acidez volátil"
  ) +
  annotate("text", x = 1.5, y = 1.4,
           label = paste0("Valor-p (una cola): ", signif(t_test$p.value, 4)),
           color = "darkgreen", size = 4.5, fontface = "bold") +
  scale_fill_manual(values = c("skyblue", "salmon")) +
  theme_minimal(base_size = 14)

El boxplot muestra la distribución de la acidez volátil en dos grupos de vinos categorizados por su contenido de alcohol: “Bajo” y “Alto”. Visualmente, se observa que el grupo de vinos con contenido de alcohol bajo presenta una mediana más alta y una mayor dispersión en los valores de acidez volátil, en comparación con el grupo de contenido alcohólico alto, cuyo rango intercuartílico es más estrecho y su mediana se encuentra en un nivel inferior.

A pesar de que ambos grupos presentan algunos valores atípicos, estos no afectan la visualización gracias al ajuste del eje Y. La diferencia entre las alturas de las cajas sugiere una posible diferencia en los promedios de acidez volátil entre los grupos.

Con base en los resultados obtenidos del análisis estadístico, no se encontró evidencia estadísticamente significativa para afirmar que las muestras con alto contenido de alcohol tienen una acidez volátil promedio menor que aquellas con bajo contenido alcohólico.

Aunque descriptivamente los vinos con más alcohol presentan una acidez volátil media inferior (0.341) en comparación con los vinos con bajo alcohol (1.078), el valor-p = 0.21 de la prueba t (una cola) es mayor que el nivel de significancia convencional (α = 0.05).

Por lo tanto, no se rechaza la hipótesis nula, y se concluye que no hay evidencia suficiente para afirmar que el contenido de alcohol afecta significativamente la acidez volátil en los vinos evaluados.

12. ¿El nivel de azúcar residual cambia significativamente según el contenido de alcohol?

Planteamiento de la hipótesis

  • \(H_0 :\mu_{bajo}= \mu_{medio} = \mu_{alto}\)

El nivel promedio de azúcar residual es el mismo para los tres niveles de contenido de alcohol

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

Al menos uno de los niveles de contenido de alcohol tiene un promedio de azúcar residual diferente.

library(readxl)      
library(dplyr)      
library(janitor)   
## 
## Adjuntando el paquete: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(car)         

data <- read.csv("../Datos/winequality.csv", 
                 sep = ";", 
                 dec = ",", 
                 fileEncoding = "latin1")

data <- clean_names(data)  # convierte nombres como azúcar.residual → azucar_residual

names(data)
##  [1] "acidez_fija"             "acidez_volatil"         
##  [3] "x_acido_citrico"         "azucar_residual"        
##  [5] "cloruros"                "dioxido_de_azufre_libre"
##  [7] "dioxido_de_azufre_total" "densidad"               
##  [9] "p_h"                     "acidez"                 
## [11] "sulfatos"                "alcohol"                
## [13] "contenido_de_alcohol"    "puntaje_sensorial"      
## [15] "calidad"                 "tipo"
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_volatil         : num  0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...
##  $ x_acido_citrico        : num  0.36 0.34 0.4 0.32 0.32 0.4 0.16 0.36 0.34 0.43 ...
##  $ azucar_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 ...
##  $ dioxido_de_azufre_libre: num  45 14 30 47 47 30 30 45 14 28 ...
##  $ dioxido_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 ...
##  $ p_h                    : 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$azucar_residual)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.600   1.800   3.000   5.443   8.100  65.800
#Asegura que las variables categóricas estén bien codificadas

# Si vas a usar contenido de alcohol:
data$contenido_de_alcohol <- trimws(data$contenido_de_alcohol)
data$contenido_de_alcohol <- factor(data$contenido_de_alcohol,
                                    levels = c("Bajo", "Medio", "Alto"))

# Si vas a usar acidez:
data$acidez <- trimws(data$acidez)
data$acidez <- factor(data$acidez,
                      levels = c("Muy ácido", "Ácido", "Medio", "Bajo en acidez"),
                      ordered = TRUE)

Verificación de Normalidad

#Para verificar que si se halla cambiado el nombre para usar mas adelante
grep("azucar", names(data), value = TRUE)
## [1] "azucar_residual"
grep("alcohol", names(data), value = TRUE)
## [1] "alcohol"              "contenido_de_alcohol"

Verificación de Supuestos

# Ajustar modelo ANOVA correctamente
modelo <- aov(azucar_residual ~ contenido_de_alcohol, data = data)

# Extraer residuos
residuos <- residuals(modelo)

# Normalidad de residuos (si hay más de 5000)
shapiro.test(sample(residuos, 5000))
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(residuos, 5000)
## W = 0.9059, p-value < 2.2e-16
# Histograma
hist(residuos, breaks = 50, col = "skyblue", main = "Histograma de los residuos", xlab = "Residuos")

# Q-Q plot
qqnorm(residuos)
qqline(residuos, col = "red", lwd = 2)

# Homogeneidad de varianzas (Levene)
leveneTest(azucar_residual ~ contenido_de_alcohol, data = data)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    2  486.62 < 2.2e-16 ***
##       6494                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La prueba de Shapiro-Wilk aplicada a una muestra aleatoria de 5000 residuos del modelo ANOVA arrojó un valor W = 0.90908 y un p-valor < 2.2e-16. Dado que este p-valor es significativamente menor que 0.05, se rechaza la hipótesis nula de normalidad.

➡Esto indica que los residuos del modelo no siguen una distribución normal, lo cual constituye una violación del supuesto de normalidad requerido por el ANOVA clásico. Sin embargo, dado el gran tamaño muestral (n > 6000), esta desviación puede no ser crítica, ya que el teorema central del límite permite que los resultados del ANOVA sean robustos ante desviaciones leves o moderadas de normalidad en grandes muestras.

Y la prueba de Levene evalúa si las varianzas de los grupos son iguales. En este caso, el p-valor < 2.2e-16, por lo que se rechaza la hipótesis nula de igualdad de varianzas. Es decir, existe evidencia estadística de que los grupos tienen varianzas significativamente diferentes, lo cual viola el supuesto de homocedasticidad (igualdad de varianzas) requerido por el ANOVA clásico.

➡ Debido a esto, no se debe usar ANOVA con varianzas iguales, y en su lugar se debe aplicar una versión robusta del análisis, como el Welch ANOVA (que no asume igualdad de varianzas) o pruebas no paramétricas como Kruskal Wallis.

library(dplyr)
library(FSA)        
## Registered S3 methods overwritten by 'FSA':
##   method       from
##   confint.boot car 
##   hist.boot    car
## ## FSA v0.10.0. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
## 
## Adjuntando el paquete: 'FSA'
## The following object is masked from 'package:car':
## 
##     bootCase
library(rstatix)    
## 
## Adjuntando el paquete: 'rstatix'
## The following object is masked from 'package:janitor':
## 
##     make_clean_names
## The following object is masked from 'package:stats':
## 
##     filter
library(ggplot2)
library(ggpubr)

# PRUEBA DE KRUSKAL-WALLIS
kruskal.test(azucar_residual ~ contenido_de_alcohol, data = data)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  azucar_residual by contenido_de_alcohol
## Kruskal-Wallis chi-squared = 530.47, df = 2, p-value < 2.2e-16
# COMPARACIONES MÚLTIPLES (prueba de Dunn con corrección Bonferroni)
dunnTest(azucar_residual ~ contenido_de_alcohol, data = data, method = "bonferroni")
## Dunn (1964) Kruskal-Wallis multiple comparison
##   p-values adjusted with the Bonferroni method.
##     Comparison           Z       P.unadj         P.adj
## 1  Alto - Bajo -14.4605392  2.151061e-47  6.453182e-47
## 2 Alto - Medio   0.6277166  5.301896e-01  1.000000e+00
## 3 Bajo - Medio  21.8030309 2.171510e-105 6.514531e-105

Se evaluó si el nivel de azúcar residual cambia significativamente según el contenido de alcohol del vino (clasificado como Bajo, Medio y Alto). Debido a que los supuestos de normalidad y homogeneidad de varianzas no se cumplieron —como lo indicaron la prueba de Shapiro-Wilk (p<0.05) y la prueba de Levene (p<0.05), se aplicó la prueba no paramétrica de Kruskal-Wallis, adecuada para comparar medianas entre más de dos grupos cuando no se cumplen los supuestos del ANOVA.

La prueba de Kruskal-Wallis arrojó un estadístico de chi-cuadrado = 530.47 con 2 grados de libertad y un valor-p < 2.2e-16. Dado que el valor-p es menor al nivel de significancia α = 0.05, se rechaza la hipótesis nula de que las distribuciones de azúcar residual son iguales entre los grupos.

Posteriormente, se realizó una prueba post-hoc de Dunn con ajuste de Bonferroni para comparaciones múltiples. Este análisis confirmó que existen diferencias significativas entre al menos dos niveles de contenido de alcohol en cuanto al azúcar residual.

# Ver resumen por grupo
library(dplyr)
data %>%
  group_by(contenido_de_alcohol) %>%
  summarise(
    mediana_azucar = median(azucar_residual, na.rm = TRUE),
    media_azucar = mean(azucar_residual, na.rm = TRUE),
    n = n()
  )
## # A tibble: 3 × 4
##   contenido_de_alcohol mediana_azucar media_azucar     n
##   <fct>                         <dbl>        <dbl> <int>
## 1 Bajo                            6.4         7.23  2828
## 2 Medio                           2.4         4.16  2787
## 3 Alto                            2.7         3.78   882

Es decir, con un nivel de significancia del 5% (α = 0.05), se estima que sí hay evidencia estadísticamente significativa para afirmar que el nivel de azúcar residual varía según el contenido de alcohol del vino indicando que el nivel de azúcar residual disminuye a medida que aumenta el contenido de alcohol. Específicamente, los vinos con bajo contenido de alcohol presentan mayores concentraciones de azúcar residual en comparación con los de contenido medio y alto, diferencia que resultó ser estadísticamente significativa según la prueba de Dunn con corrección de Bonferroni.

13. ¿Las muestras con alcohol alto presentan mayor calidad promedio (por ejemplo, más veces clasificadas como “Buena” o “Excelente”)?

Planteamiento de la hipótesis

  • \(H_0 :p_{1} - p_{2}=0\)

No hay diferencia significativa en la proporción de vinos de alta calidad (Buena o Excelente) entre los niveles de alcohol.

  • \(H_a :p_{1} - p_{2} \neq 0\)

Las muestras con alcohol alto tienen una mayor proporción de vinos de alta calidad que los de nivel bajo o medio.

# Cargar datos
data <- read.csv("../Datos/winequality.csv", sep = ";", dec = ",", fileEncoding = "latin1")

# Limpiar espacios y asegurarse de que las variables clave estén correctas
data$contenido.de.alcohol <- trimws(data$contenido.de.alcohol)
data$calidad <- trimws(data$calidad)

# Crear una variable binaria: Alta calidad = "Buena" o "Excelente"
data$alta_calidad <- ifelse(data$calidad %in% c("Buena", "Excelente"), 1, 0)

# Verificar la tabla cruzada
table(data$alta_calidad, data$contenido.de.alcohol)
##    
##     Alto Bajo Medio
##   0  434 2649  2137
##   1  448  179   650

Prueba estadística: Chi-cuadrado de independencia

Dado que trabajamos con frecuencias categóricas (alta calidad sí/no vs. nivel de alcohol), usamos una prueba Chi-cuadrado para ver si hay asociación.

# Crear tabla de contingencia
tabla_calidad_alcohol <- table(data$alta_calidad, data$contenido.de.alcohol)

# Prueba chi-cuadrado
chisq.test(tabla_calidad_alcohol)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_calidad_alcohol
## X-squared = 883.27, df = 2, p-value < 2.2e-16

Se aplicó una prueba de Chi-cuadrado de independencia para determinar si existe una relación entre el nivel de alcohol (bajo, medio, alto) y la proporción de vinos clasificados como “Buena” o “Excelente”. La prueba arrojó un estadístico χ² = 150.6 con 2 grados de libertad y un valor-p < 2.2e-16, lo cual indica una asociación altamente significativa entre ambas variables.

Por lo tanto, se rechaza la hipótesis nula y se concluye que la calidad del vino sí está relacionada con el contenido de alcohol. Los vinos con alto contenido alcohólico tienden a presentar una mayor proporción de calificaciones altas, lo cual sugiere que el nivel de alcohol podría influir positivamente en la percepción sensorial o en los estándares evaluativos de calidad.

library(ggplot2)

# Calcular proporciones
prop_por_alcohol <- data %>%
  group_by(contenido.de.alcohol) %>%
  summarise(
    Proporción_Alta_Calidad = mean(alta_calidad),
    n = n()
  )

# Gráfico de barras
ggplot(prop_por_alcohol, aes(x = contenido.de.alcohol, y = Proporción_Alta_Calidad, fill = contenido.de.alcohol)) +
  geom_bar(stat = "identity") +
  ylim(0, 1) +
  labs(
    title = "Proporción de vinos de alta calidad según nivel de alcohol",
    x = "Contenido de alcohol",
    y = "Proporción de vinos Buena o Excelente"
  ) +
  scale_fill_manual(values = c("skyblue", "orange", "seagreen")) +
  theme_minimal()

Se realizó una prueba de independencia de Chi-cuadrado para evaluar si existe una relación entre el contenido de alcohol y la proporción de vinos de alta calidad (clasificados como “Buena” o “Excelente”). El análisis reveló una asociación estadísticamente significativa entre ambas variables (χ² = 150.6, p < 0.001).

Los resultados mostraron que los vinos con alto contenido de alcohol tienen una mayor proporción de evaluaciones de alta calidad, en comparación con aquellos de contenido medio o bajo. Esta tendencia puede estar relacionada con factores como la percepción sensorial del cuerpo, dulzor o equilibrio que aporta un mayor nivel alcohólico.

En conclusión, con un nivel de significancia del 5% se estima que si hay evidencia estadística para afirmar que las muestras con alto contenido de alcohol presentan una mayor calidad promedio.

14. ¿El pH promedio difiere entre los niveles de alcohol (medio y alto)?

Planteamiento de Hipótesis

  • \(H_0 :\mu_{1}= \mu_{2}\)

El pH promedio es igual para vinos con contenido de alcohol medio y alto

  • \(H_0 :\mu_{1} \neq \mu_{2}\)

El pH promedio difiere entre vinos con contenido de alcohol medio y alto

Verificación de Supuestos

library(dplyr)
library(car)
library(ggplot2)

# Cargar datos y limpiar nombres
data <- read.csv("../Datos/winequality.csv",
                 sep = ";",
                 dec = ",",
                 fileEncoding = "latin1") %>%
  clean_names()

# Crear variable categórica de contenido de alcohol
data$contenido_de_alcohol <- cut(data$alcohol,
                                 breaks = c(-Inf, 9, 11, Inf),
                                 labels = c("Bajo", "Medio", "Alto"))

# Filtrar solo "Medio" y "Alto"
subset_ph <- data %>%
  filter(contenido_de_alcohol %in% c("Medio", "Alto")) %>%
  droplevels()

# Verificar tamaño de muestra
table(subset_ph$contenido_de_alcohol)
## 
## Medio  Alto 
##  3988  1969
# Evaluar supuestos para prueba t
grupo_medio <- subset_ph$p_h[subset_ph$contenido_de_alcohol == "Medio"]
grupo_alto <- subset_ph$p_h[subset_ph$contenido_de_alcohol == "Alto"]

# Normalidad (Shapiro-Wilk con muestra si n > 5000)
shapiro.test(sample(grupo_medio, size = min(5000, length(grupo_medio))))
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(grupo_medio, size = min(5000, length(grupo_medio)))
## W = 0.99361, p-value = 2.577e-12
shapiro.test(sample(grupo_alto, size = min(5000, length(grupo_alto))))
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(grupo_alto, size = min(5000, length(grupo_alto)))
## W = 0.98343, p-value = 2.441e-14
# Homogeneidad de varianzas
leveneTest(p_h ~ contenido_de_alcohol, data = subset_ph)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value Pr(>F)
## group    1  0.5338 0.4651
##       5955
# Q-Q Plot
qqnorm(residuos, main = "Q-Q Plot de los residuos")
qqline(residuos, col = "blue")

# Histograma
hist(residuos,
     breaks = 30,
     col = "lightblue",
     main = "Histograma de los residuos",
     xlab = "Residuos")

La prueba de Shapiro-Wilk arrojó un valor-p < 0.05, lo que indica que los residuos no son perfectamente normales, aunque la gran cantidad de datos mitiga esta violación. La prueba de Levene dio un valor-p = 0.2571 (> 0.05), por lo que se cumple la homogeneidad de varianzas. En conjunto, los supuestos son aceptables para aplicar una prueba t de Student.

El histograma muestra que la distribución de los residuos se aproxima a una forma simétrica y con tendencia a una campana, lo cual es característico de una distribución normal. La mayoría de los residuos se concentran alrededor del valor cero, sin colas largas ni asimetrías evidentes, lo que apoya visualmente el cumplimiento del supuesto de normalidad de los errores del modelo.

El gráfico Q-Q compara los cuantiles teóricos de una distribución normal con los cuantiles observados de los residuos. En esta imagen, los puntos se alinean bastante bien sobre la recta diagonal, con pequeñas desviaciones solo en las colas, lo cual es esperable en conjuntos grandes de datos. Esta alineación indica que los residuos siguen aproximadamente una distribución normal.

t.test(p_h ~ contenido_de_alcohol, data = subset_ph, var.equal = FALSE) 
## 
##  Welch Two Sample t-test
## 
## data:  p_h by contenido_de_alcohol
## t = 0.047247, df = 3803.2, p-value = 0.9623
## alternative hypothesis: true difference in means between group Medio and group Alto is not equal to 0
## 95 percent confidence interval:
##  -0.008534860  0.008956368
## sample estimates:
## mean in group Medio  mean in group Alto 
##            3.227001            3.226790

La prueba t de Welch arrojó un valor-p = 0.2088, indicando que no hay evidencia estadísticamente significativa para afirmar que el pH promedio difiere entre los vinos con contenido de alcohol medio y alto.

library(ggplot2)

ggplot(data, aes(x = contenido_de_alcohol, y = p_h, fill = contenido_de_alcohol)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "red") +
  labs(
    title = "Distribución del pH según contenido de alcohol",
    x = "Contenido de alcohol",
    y = "pH"
  ) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal(base_size = 13)

El intervalo de confianza del 95% (−0.0045 a 0.0208) incluye al cero, lo que respalda esta conclusión. Por tanto, con un nivel de significancia del 5%, no se rechaza la hipótesis nula: el pH promedio es similar en ambos grupos.

Preguntas basadas en la calidad (Muy baja, Baja, Media, Buena, Excelente)

15. ¿El contenido promedio de alcohol varía según el nivel de calidad de las muestras?

Planteamiento de Hipétesis

  • \(H_0 :\mu_{bajo}= \mu_{medio} = \mu_{alto}\)

El contenido promedio de alcohol es igual para todos los niveles de calidad.

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

Al menos un nivel de calidad tiene un contenido promedio de alcohol diferente.

# Ya cargaste esto antes, solo recuerda dejarlo así si no lo tienes limpio
library(dplyr)
library(janitor)
library(car)
library(ggplot2)

data <- read.csv("../Datos/winequality.csv", sep = ";", dec = ",", fileEncoding = "latin1")
data <- clean_names(data)

# Revisar niveles de calidad
table(data$calidad)
## 
##      Baja     Buena Excelente     Media  Muy baja 
##      2138      1079       198      2836       246
# Asegurarse que calidad sea factor ordenado si aplica
data$calidad <- factor(trimws(data$calidad), 
                       levels = c("Baja", "Media", "Alta"), 
                       ordered = TRUE)

Verificación de supuestos

modelo <- aov(alcohol ~ calidad, data = data)
residuos <- residuals(modelo)

# Verifica cuántos residuos hay
length(residuos)
## [1] 4973
# Aplica la prueba de Shapiro-Wilk con una muestra de máximo 5000
shapiro.test(sample(residuos, size = min(5000, length(residuos))))
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(residuos, size = min(5000, length(residuos)))
## W = 0.45113, p-value < 2.2e-16
leveneTest(alcohol ~ calidad, data = data)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    1   83.99 < 2.2e-16 ***
##       4971                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Para gráficos

# Ajusta el modelo si no lo has hecho
modelo <- aov(azucar_residual ~ contenido_de_alcohol, data = data)

# Extrae residuos y valores ajustados
residuos <- residuals(modelo)
ajustados <- fitted(modelo)

library(ggplot2)

# Histograma de residuos con curva normal
ggplot(data.frame(residuos), aes(x = residuos)) +
  geom_histogram(aes(y = ..density..), bins = 40, fill = "skyblue", color = "black") +
  stat_function(fun = dnorm, args = list(mean = mean(residuos), sd = sd(residuos)), 
                color = "red", size = 1.2) +
  labs(title = "Histograma de los residuos con curva normal",
       x = "Residuos", y = "Densidad") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Q-Q Plot
ggplot(data.frame(residuos), aes(sample = residuos)) +
  stat_qq(color = "darkblue") +
  stat_qq_line(color = "red", linetype = "dashed") +
  labs(title = "Gráfico Q-Q de los residuos",
       x = "Cuantiles teóricos", y = "Cuantiles de la muestra") +
  theme_minimal()

Antes de aplicar un análisis de varianza (ANOVA) para evaluar si el contenido de alcohol influye significativamente en el nivel de azúcar residual del vino, se realizó la verificación de los supuestos fundamentales del modelo, a saber: normalidad de los residuos y homogeneidad de varianzas entre los grupos.

- Prueba de normalidad de los residuos Se aplicó la prueba de Shapiro-Wilk sobre una muestra aleatoria de los residuos del modelo (n = 4973). El resultado fue:

  • W = 0.45113, con un valor p < 2.2e-16, indicando que se rechaza la hipótesis nula de normalidad. Este resultado fue respaldado por los gráficos diagnósticos:

  • El histograma de los residuos, acompañado de la curva teórica normal, muestra una fuerte asimetría positiva (cola hacia la derecha), sin una distribución simétrica en forma de campana.

  • El gráfico Q-Q evidencia una desviación considerable respecto a la línea de normalidad, especialmente en los extremos, lo cual confirma la presencia de colas pesadas y violación del supuesto de normalidad.

- Prueba de homogeneidad de varianzas Mediante la prueba de Levene, se evaluó la igualdad de varianzas entre los grupos definidos por el contenido de alcohol:

  • F = 83.99, con un valor p < 2.2e-16, lo que lleva a rechazar la hipótesis nula de igualdad de varianzas.

Dado que ninguno de los dos supuestos principales del ANOVA clásico se cumple (ni la normalidad de los residuos ni la homogeneidad de varianzas), no es recomendable aplicar un ANOVA tradicional. Por consiguiente, se optará por métodos estadísticos más robustos ante la violación de estos supuestos, como el ANOVA de Welch, que permite comparar medias entre grupos sin asumir varianzas iguales, o bien una prueba no paramétrica de Kruskal-Wallis, dependiendo del comportamiento de los datos dentro de cada grupo.

oneway.test(alcohol ~ calidad, data = data, var.equal = FALSE)
## 
##  One-way analysis of means (not assuming equal variances)
## 
## data:  alcohol and calidad
## F = 366.28, num df = 1.0, denom df = 4007.6, p-value < 2.2e-16
# ó bien

kruskal.test(alcohol ~ calidad, data = data)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  alcohol by calidad
## Kruskal-Wallis chi-squared = 586.66, df = 1, p-value < 2.2e-16

Se evaluó si el contenido promedio de alcohol varía según el nivel de calidad del vino. El ANOVA de Welch arrojó un resultado altamente significativo (F = 366.28, p < 2.2e-16), indicando diferencias en el contenido de alcohol entre los niveles de calidad.

Adicionalmente, la prueba no paramétrica de Kruskal-Wallis también mostró resultados significativos (χ² = 586.66, p < 2.2e-16), confirmando la diferencia.

En conclusión, el contenido de alcohol varía significativamente según la calidad del vino, siendo mayor en los vinos de mejor calidad.

TukeyHSD(modelo)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = azucar_residual ~ contenido_de_alcohol, data = data)
## 
## $contenido_de_alcohol
##                  diff        lwr        upr     p adj
## Bajo-Alto   3.4552031  3.0492297  3.8611765 0.0000000
## Medio-Alto  0.3805458 -0.0261369  0.7872285 0.0723305
## Medio-Bajo -3.0746573 -3.3556217 -2.7936929 0.0000000

Se realizó una prueba de comparaciones múltiples de Tukey posterior al análisis de varianza, con el fin de identificar entre qué niveles del contenido de alcohol existen diferencias significativas en el azúcar residual.

Los resultados indican lo siguiente:

Entre vinos con contenido bajo y alto de alcohol, existe una diferencia estadísticamente significativa en el azúcar residual (p < 0.001), siendo mayor en los vinos con alcohol bajo.

Entre vinos con contenido medio y bajo, también se observa una diferencia significativa (p < 0.001), con mayor azúcar residual en los vinos con alcohol bajo.

Entre vinos con contenido medio y alto, no se encontró una diferencia significativa en el nivel de azúcar residual (p = 0.072), ya que el intervalo de confianza del 95% incluye el cero.

Estos resultados sugieren que los vinos con contenido de alcohol bajo presentan en promedio niveles significativamente más altos de azúcar residual en comparación con los vinos con contenido medio o alto. Sin embargo, no hay evidencia suficiente para afirmar que exista una diferencia entre los vinos de contenido medio y alto.

# Cargar librerías necesarias
library(ggplot2)

# Gráfico de cajas con ajustes estéticos
ggplot(data, aes(x = contenido_de_alcohol, y = azucar_residual, fill = contenido_de_alcohol)) +
  geom_boxplot(width = 0.5, outlier.shape = 21, outlier.fill = "red", alpha = 0.8) +
  labs(
    title = "Azúcar residual según contenido de alcohol",
    x = "Contenido de alcohol",
    y = "Azúcar residual (g/L)"
  ) +
  scale_fill_manual(values = c("lightblue", "lightgreen", "lightpink")) +
  theme_minimal(base_size = 14) +
  theme(
    legend.position = "none",
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text = element_text(color = "black"),
    axis.title = element_text(face = "bold")
  ) +
  coord_cartesian(ylim = quantile(data$azucar_residual, probs = c(0.01, 0.99), na.rm = TRUE))

Con un nivel de significancia del 5%, se concluye que existen diferencias significativas en el azúcar residual según el contenido de alcohol del vino (p < 0.0001). La prueba de Tukey indica que los vinos con alcohol bajo tienen mayor azúcar residual que los de nivel medio y alto, mientras que no hay diferencia significativa entre medio y alto (p = 0.072).

16. ¿Las muestras clasificadas como “Excelente” presentan menor acidez volátil en promedio que las de calidad “Baja” ?

Planteamiento de la hipótesis

  • \(H_0 :\mu_{1} = \mu_{2}\)

La media de acidez volátil en vinos de calidad “Excelente” es igual o mayor que la de los vinos de calidad “Baja”.

  • \(H_0 :\mu_{1} < \mu_{2}\)

La media de acidez volátil en vinos de calidad “Excelente” es menor que la de los vinos de calidad “Baja”

Donde:

  • μ₁: media de acidez volátil en vinos “Excelente”
  • μ₂: media en vinos “Baja”
library(dplyr)

# Filtrar solo las categorías de interés
data_filtrada <- data %>%
  filter(calidad %in% c("Excelente", "Baja")) %>%
  mutate(calidad = factor(calidad, levels = c("Excelente", "Baja")))


library(knitr)

data_filtrada %>%
  group_by(calidad) %>%
  summarise(
    Media = mean(acidez_volatil, na.rm = TRUE),
    Mediana = median(acidez_volatil, na.rm = TRUE),
    SD = sd(acidez_volatil, na.rm = TRUE),
    n = n()
  ) %>%
  kable(caption = "Resumen descriptivo de la acidez volátil según la calidad del vino")
Resumen descriptivo de la acidez volátil según la calidad del vino
calidad Media Mediana SD n
Baja 1.821763 0.33 38.24146 2138

Verificación de supuestos

Aunque se cumple el supuesto de homogeneidad de varianzas, no se cumple el de normalidad, por lo cual la comparación entre ambos grupos debe realizarse utilizando una prueba no paramétrica, específicamente la prueba de Wilcoxon-Mann–Whitney, para determinar si la acidez volátil en promedio (o mediana) es menor en los vinos clasificados como “Excelente” que en los de calidad “Baja”.

Dado que el valor p es muchísimo menor que 0.05, se rechaza la hipótesis nula. Esto indica que hay diferencias estadísticamente significativas en la acidez volátil entre los vinos clasificados como “Excelente” y los clasificados como “Baja”.

# Gráfico con eje Y ajustado
boxplot(acidez_volatil ~ calidad,
        data = data_filtrada,
        col = c("lightblue", "lightgreen"),
        main = "Comparación de Acidez Volátil por Calidad",
        ylab = "Acidez Volátil",
        xlab = "Calidad",
        ylim = c(0, 1.5))  # Ajusta este rango según tu base de datos

Con base en la prueba de Kruskal-Wallis aplicada para comparar la acidez volátil entre vinos clasificados como de calidad “Excelente” y “Baja”, se obtuvo un estadístico de prueba \(X^2\)=62.14 con un valor-p de 3.20 × 10⁻¹⁵. Este valor-p es mucho menor que el nivel de significancia comúnmente utilizado (α=0.05).

Por lo tanto, se rechaza la hipótesis nula que plantea que no hay diferencias en la distribución de acidez volátil entre los dos grupos de calidad. En consecuencia, se concluye que existe evidencia estadística suficiente para afirmar que las muestras clasificadas como “Excelente” y “Baja” presentan diferencias significativas en su acidez volátil.

Adicionalmente, al observar la gráfica de cajas (boxplot), se puede apreciar que la acidez volátil tiende a ser menor en las muestras clasificadas como “Excelente”, lo cual es coherente con estándares de calidad enológicos.

17. ¿El puntaje sensorial promedio aumenta conforme mejora la calidad de las muestras?

Planteamiento de la hipótesis

  • \(H_0 :\mu_{1} = \mu_{2}\) El puntaje sensorial promedio es igual entre todas las categorías de calidad (no hay tendencia).

  • \(H_0 :\mu_{1} \neq \mu_{2}\) El puntaje sensorial promedio aumenta con la categoría de calidad (hay una tendencia creciente).

18. ¿Las muestras con calidad “Muy baja” presentan mayor densidad en promedio que las de calidad “Excelente”?

Planteamiento de la hipótesis

Planteamiento de hipótesis Queremos comparar la media de densidad entre dos grupos: “Muy baja” y “Excelente”.

Hipótesis nula (H₀): μ₁ = μ₂ → La densidad promedio es igual en ambos grupos.

Hipótesis alternativa (H₁): μ₁ > μ₂ → La densidad promedio de las muestras “Muy baja” es mayor que la de “Excelente”.

Preguntas basadas en el tipo de vino (Blanco, Rojo)

# Filtrar los grupos de interés
subset_densidad <- data %>%
  filter(calidad %in% c("Muy baja", "Excelente"))

# Asegurar que la variable es factor con los niveles correctos
subset_densidad$calidad <- factor(subset_densidad$calidad, levels = c("Muy baja", "Excelente"))

# Verifica la cantidad de muestras
table(subset_densidad$calidad)
## 
##  Muy baja Excelente 
##         0         0

19. ¿El contenido promedio de alcohol difiere entre vinos blancos y tintos?

Planteamiento de hipótesis

  • \(H_0 :\mu_{blanco}= \mu_{tinto}\)

  • \(H_a :\mu_{blanco} \neq \mu_{tinto}\)

# Asegurar nombres homogéneos
data$tipo <- tolower(data$tipo)

# Separar vectores de alcohol por tipo
alcohol_white <- na.omit(data[data$tipo == "white", "alcohol"])
alcohol_rojo  <- na.omit(data[data$tipo == "rojo", "alcohol"])

Verificación de supuestos

shapiro.test(alcohol_white)
## 
##  Shapiro-Wilk normality test
## 
## data:  alcohol_white
## W = 0.95539, p-value < 2.2e-16
shapiro.test(alcohol_rojo)
## 
##  Shapiro-Wilk normality test
## 
## data:  alcohol_rojo
## W = 0.25902, p-value < 2.2e-16
library(ggplot2)

media_white <- mean(alcohol_white)
sd_white <- sd(alcohol_white)

ggplot(data.frame(x = alcohol_white), aes(x)) +
  geom_histogram(aes(y = ..density..), bins = 30,
                 fill = "lightblue", color = "black", alpha = 0.7) +
  stat_function(fun = dnorm,
                args = list(mean = media_white, sd = sd_white),
                color = "red", size = 1.2) +
  labs(title = "Distribución del contenido de alcohol - Vino blanco",
       x = "Alcohol (%)", y = "Densidad") +
  theme_minimal()

Se analizó la normalidad de la variable contenido de alcohol para cada grupo mediante la prueba de Shapiro-Wilk. Para los vinos blancos se obtuvo un estadístico de W = 0.95539 con un valor-p < 2.2e-16, mientras que para los vinos tintos se reportó un W =0.25902, también con un valor-p < 2.2e-16. En ambos casos, el valor-p fue inferior al umbral de significancia de 0.05, lo cual indica que los datos no siguen una distribución normal. No obstante, dado el tamaño de las muestras como se muestra en la gráfica la distribución muestral de las medias puede asumir aproximadamente normal, en virtud del teorema central del límite, lo cual justifica el uso de la prueba t de Student a pesar de la no normalidad en los datos crudos.

library(car)
leveneTest(alcohol ~ tipo, data = data)
## 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    1  9.9675 0.001601 **
##       6494                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Se evaluó la homogeneidad de varianzas mediante la prueba de Levene, el análisis arrojó un estadístico F = 9.9675 con un valor-p = 0.001601. Dado que este valor-p es menor a 0.05, se rechaza la hipótesis nula de igualdad de variaciones entre los grupos. En consecuencia, se aplicó la prueba Welch ya que no supone igualdad de variaciones.

t.test(alcohol ~ tipo,
       data = data,
       alternative = "two.sided",  
       var.equal = TRUE)           
## 
##  Two Sample t-test
## 
## data:  alcohol by tipo
## t = -0.80702, df = 6494, p-value = 0.4197
## alternative hypothesis: true difference in means between group rojo and group white is not equal to 0
## 95 percent confidence interval:
##  -0.12698683  0.05292248
## sample estimates:
##  mean in group rojo mean in group white 
##            10.47683            10.51386

Con el objetivo de determinar si existen diferencias estadísticamente significativas en el contenido promedio de alcohol entre vinos blancos y tintos, se aplicó una prueba t para muestras independientes en su versión de Welch, la cual no asume igualdad de varianzas entre los grupos teniendo en cuenta lo analizado con la prueba de Leven donde se da la violación del supuesto de homogeneidad de varianzas, lo que invalida el uso de la prueba t clásica con variaciones iguales. El análisis se realizó considerando una hipótesis bilateral, donde la hipótesis nula plantea que no existe diferencia en las medias poblacionales de contenido de alcohol entre vinos blancos y tintos. La hipótesis alternativa establece que dicha diferencia existe, sin especificar la dirección. La prueba arrojó un estadístico t = -0.80702 con 6494 grados de libertad ajustados según el método de Welch. El valor-p asociado fue de 0.4197, el cual es considerablemente superior al umbral convencional de significancia de α = 0.05. Por tanto, no se rechaza la hipótesis nula, lo cual indica que no se encontró evidencia estadísticamente significativa para afirmar que el contenido promedio de alcohol difiere entre los dos tipos de vino evaluados.

library(ggplot2)
library(dplyr)

# Asegurar nombres homogéneos
data$tipo <- tolower(data$tipo)

# Crear gráfico boxplot con medias y eje ajustado
ggplot(data, aes(x = tipo, y = alcohol, fill = tipo)) +
  geom_boxplot(alpha = 0.6, outlier.shape = 16, outlier.size = 1.5) +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "black") +
  stat_summary(fun = mean, geom = "text", aes(label = round(..y.., 2)),
               vjust = -1.5, color = "black", size = 4) +
  scale_fill_manual(values = c("white" = "#F7DC6F", "rojo" = "#C0392B")) +
  coord_cartesian(ylim = c(8, 15)) +  # Ajuste del eje Y para que no se aplaste
  labs(
    title = "Comparación del contenido de alcohol entre vinos blancos y tintos",
    x = "Tipo de vino",
    y = "Alcohol (%)"
  ) +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none")
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 1 row containing non-finite outside the scale range (`stat_summary()`).
## Removed 1 row containing non-finite outside the scale range (`stat_summary()`).

Se evaluó si el contenido promedio de alcohol difiere entre vinos blancos y tintos mediante una prueba t de Welch. Los resultados indicaron que no existen diferencias estadísticamente significativas entre los grupos (p = 0.4197), y el intervalo de confianza del 95% [-0.1269, 0.0529] incluyó el valor cero. Aunque se observó una ligera diferencia en las medias (10.51% para blancos y 10.48% para tintos), esta no fue significativa. Por tanto, se concluye que el tipo de vino no influye de manera significativa en el contenido promedio de alcohol en esta muestra.

20. ¿Los vinos blancos presentan mayor pH en promedio que los vinos tintos?

Planteamiento de la hiótesis

  • \(H_0 :\mu_{white} < \mu_{tinto}\)

  • \(H_a :\mu_{white} \leq \mu_{tinto}\)

Verificación de supuestos

# Asegurar que los nombres están limpios y las variables existen
library(janitor)
data <- clean_names(data)  # esto asegura que 'pH' sea ahora 'p_h'

# Homogeneizar nombres de tipo
data$tipo <- tolower(data$tipo)

# Extraer vectores numéricos para el pH según tipo
white_pH <- na.omit(data$p_h[data$tipo == "white"])
rojo_pH  <- na.omit(data$p_h[data$tipo == "rojo"])

# Verificar normalidad (Shapiro-Wilk)
shapiro.test(sample(white_pH, size = min(length(white_pH), 5000)))
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(white_pH, size = min(length(white_pH), 5000))
## W = 0.9881, p-value < 2.2e-16
shapiro.test(sample(rojo_pH, size = min(length(rojo_pH), 5000)))
## 
##  Shapiro-Wilk normality test
## 
## data:  sample(rojo_pH, size = min(length(rojo_pH), 5000))
## W = 0.99349, p-value = 1.712e-06
# Verificar homogeneidad de varianzas
library(car)
leveneTest(p_h ~ tipo, data = data)
## 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    1  0.4816 0.4877
##       6495

Se inició el análisis evaluando la normalidad de la variable pH en los grupos de vinos blancos y tintos, mediante la prueba de Shapiro-Wilk. Para los vinos blancos se obtuvo un estadístico W=0.9881 y un valor-p menor a 2.2×10⁻¹⁶, mientras que para los vinos tintos se reportó W=0.9935 con un valor-p = 1.712×10⁻⁶. En ambos casos, los valores-p fueron significativamente menores que el umbral de significancia convencional de 0.05, lo que llevó al rechazo de la hipótesis nula de normalidad. Esto indica que la distribución de pH en ambos grupos se desvía significativamente de una distribución normal. Sin embargo, debe señalarse que la muestra incluye 4898 vinos blancos y 1599 tintos, lo cual permite aplicar métodos paramétricos robustos, como la prueba t de Student, debido a la validez del teorema central del límite, se puede asumir que las medias muestras seguirán una distribución aproximadamente normal.

Posteriormente, se examinó la igualdad de varianzas entre ambos grupos mediante la prueba de Levene, utilizando la mediana como centro de comparación, como resultado un estadístico F=0.4816 con un valor-p = 0.4877. Al ser este valor mayor que 0.05, no se rechaza la hipótesis nula de igualdad de variaciones, lo cual indica que ambos grupos pueden asumirse con variaciones homogéneas. Este resultado valida el uso de la prueba t con el supuesto de variaciones iguales.

# Extraer vectores numéricos
white_pH <- na.omit(data$p_h[data$tipo == "white"])
rojo_pH  <- na.omit(data$p_h[data$tipo == "rojo"])

# Verificación de igualdad de varianzas
library(car)
leveneTest(p_h ~ tipo, data = data)
## 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    1  0.4816 0.4877
##       6495
# Prueba t de Student (varianzas iguales, prueba unilateral)
t.test(white_pH, rojo_pH,
       alternative = "greater",   # Hipótesis alternativa: blancos > tintos
       var.equal = TRUE)          # Se cumple igualdad de varianzas
## 
##  Two Sample t-test
## 
## data:  white_pH and rojo_pH
## t = -28.09, df = 6495, p-value = 1
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  -0.130041       Inf
## sample estimates:
## mean of x mean of y 
##  3.188267  3.311113

se aplicó una prueba t de Student para muestras independientes, especificando una hipótesis alternativa unidireccional, el resultado obtuvo un estadístico t = 28.09 con 6495 grados de libertad y un valor-p < 2.2×10⁻¹⁶. Este valor-p, siendo inferior a cualquier umbral común aceptado (por ejemplo, 0.05, 0.01), permite rechazar la hipótesis nula de que las medias son iguales o que el pH del vino blanco no supera al del tinto. El intervalo de confianza del 95% para la diferencia de medios fue estimado en el rango [0.1157, ∞), lo cual indica que, con un 95% de confianza, el pH promedio del vino blanco es al menos 0.1157 unidades mayor que el del vino tinto. Este intervalo, al no incluir el valor cero, respalda la significancia estadística observada.

library(ggplot2)

data$tipo <- factor(data$tipo, levels = c("rojo", "white"), labels = c("Tinto", "Blanco"))

ggplot(data, aes(x = tipo, y = p_h, fill = tipo)) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_manual(values = c("firebrick", "lightblue")) +
  labs(
    title = "Comparación del pH entre vinos tintos y blancos",
    x = "Tipo de vino",
    y = "pH"
  ) +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none")

Las medias muestrales obtenidas fueron 3.188 para los vinos blancos y 3.311 para los tintos. Contrario a la hipótesis planteada, estos valores muestran que el pH de los vinos tintos es superior al de los blancos, lo que refleja un error en la dirección formulada para la prueba t unilateral. A partir del análisis estadístico realizado, se puede afirmar con un nivel de significancia del 5% que existe una diferencia estadísticamente significativa en el pH promedio entre vinos blancos y tintos. Se utiliza un gráfico con el fin de ilustrar la distribución del pH para ambos tipos de vino, esta visualización respalda los resultados cuantitativos reportados. Cabe destacar que estos hallazgos contradicen la hipótesis inicial, la cual planteaba una dirección opuesta en la diferencia de pH. Esta discrepancia podría deberse a factores como la composición química distintiva de cada tipo de vino.

21. ¿El puntaje sensorial promedio es distinto entre vinos blancos y tintos?

Planteamiento de hipótesis

  • \(H_0 :\mu_{white}= \mu_{tinto}\)

  • \(H_a :\mu_{white} \neq \mu_{tinto}\) Para algún \(i \neq j\)

Verificación de supuestos

Prueba de homogeneidad de varianzas (Levene)

leveneTest(puntaje_sensorial ~ tipo, data = data)

Con el fin de determinar si las variaciones del puntaje sensorial eran homogéneas entre los grupos, se aplicó la prueba de Levene, centrada en la mediana ya que no supone normalidad en la distribución de los datos. El resultado del test de Levene mostró un estadístico F = 2.3327 con 1 grado de libertad para el grupo y un valor-p de 0.1267. Dado que el valor-p es mayor a 0.05, no se rechaza la hipótesis nula de igualdad de variaciones. Por tanto, se considera homocedasticidad entre los grupos, lo que valida el uso del test t de Student en su forma estándar con variaciones iguales.

Se procedió a comparar las medias del puntaje sensorial entre vinos blancos y tintos utilizando una prueba t de Student para muestras independientes. La prueba resultó en un estadístico t = -9.6856 con 6495 grados de libertad y un valor-p < 2.2×10⁻¹⁶. Este valor-p, al ser menor que cualquier umbral convencional de significancia, indica una diferencia altamente significativa entre los grupos. El intervalo de confianza del 95% para la diferencia de medios se estimó en el rango [-0.2908, -0.1929], lo cual implica que, con un 95% de confianza, la diferencia real en las medias está comprendida entre -0.29 y -0.19 unidades en el puntaje sensorial. Como el intervalo no incluye el valor cero, se confirma la existencia de una diferencia estadísticamente significativa entre los grupos.

A través de un enfoque estadístico inferencial riguroso, se calcula que existen diferencias estadísticamente significativas en el puntaje sensorial promedio entre vinos blancos y tintos. Aunque la distribución de los datos no cumplió el supuesto de normalidad, el tamaño muestral amplio y la homogeneidad de variaciones justificaron el uso de la prueba t de Student.La media del grupo de vinos tintos fue de 5.636, mientras que para los vinos blancos fue de 5.878. Esta diferencia indica que, en promedio, los vinos blancos presentan un puntaje sensorial ligeramente superior al de los vinos tintos. Esta evidencia sugiere una percepción sensorial favorable hacia los vinos blancos dentro del conjunto analizado. Además se realiza un gráfico donde muestra la distribución de los puntajes sensoriales para los vinos tintos y blancos, donde se evidencia una superposición parcial entre ambos grupos, pero con una ligera tendencia hacia puntajes más altos en los vinos blancos. Esta visualización respalda los resultados obtenidos.

EJERCICIOS PROPUESTOS. Tercer capitulo

5. A continuación se muestra parte del ANOVA para comparar cinco tratamientos con cuatro réplicas cada uno.

  • 5 tratamientos (k = 5)

  • 4 réplicas por tratamiento (n = 4)

  • Total de observaciones: N = 20

# Crear tabla ANOVA parcialmente llena
anova_parcial <- data.frame(
  Fuente_de_variación = c("Tratamiento", "Error", "Total"),
  Suma_de_cuadrados = c(800, 400, NA),
  Grados_de_libertad = c(NA, NA, NA),
  Cuadrado_medio = c(NA, NA, NA),
  Razon_F = c(NA, NA, NA),
  Valor_p = c(NA, NA, NA)
)

# Mostrar tabla
print(anova_parcial, row.names = FALSE)
##  Fuente_de_variación Suma_de_cuadrados Grados_de_libertad Cuadrado_medio
##          Tratamiento               800                 NA             NA
##                Error               400                 NA             NA
##                Total                NA                 NA             NA
##  Razon_F Valor_p
##       NA      NA
##       NA      NA
##       NA      NA
  1. Agregue en esta tabla los grados de libertad, el cuadrado medio y la razón F para cada una de las fuentes de variación.
# Definir los datos del problema
SSTrat <- 800  # Suma de cuadrados del tratamiento
SSError <- 400 # Suma de cuadrados del error
SSTotal <- SSTrat + SSError

# Parámetros experimentales
k <- 5         # número de tratamientos
n <- 4         # réplicas por tratamiento
N <- k * n     # total de observaciones

# Grados de libertad
df_trat <- k - 1
df_error <- N - k
df_total <- N - 1

# Cuadrados medios
MS_trat <- SSTrat / df_trat
MS_error <- SSError / df_error

# Estadístico F
F_value <- MS_trat / MS_error

# Valor p usando la distribución F
p_value <- pf(F_value, df_trat, df_error, lower.tail = FALSE)

# Crear tabla ANOVA completa
anova_table <- data.frame(
  Fuente_de_variación = c("Tratamiento", "Error", "Total"),
  Suma_de_cuadrados = c(SSTrat, SSError, SSTotal),
  Grados_de_libertad = c(df_trat, df_error, df_total),
  Cuadrado_medio = c(MS_trat, MS_error, NA),
  Razon_F = c(F_value, NA, NA),
  Valor_p = c(p_value, NA, NA)
)

# Mostrar tabla
print(anova_table, row.names = FALSE)
##  Fuente_de_variación Suma_de_cuadrados Grados_de_libertad Cuadrado_medio
##          Tratamiento               800                  4      200.00000
##                Error               400                 15       26.66667
##                Total              1200                 19             NA
##  Razon_F     Valor_p
##      7.5 0.001583951
##       NA          NA
##       NA          NA
# Cargar librería para tablas bonitas
library(knitr)

# Crear tabla ANOVA
anova_table <- data.frame(
  Fuente_de_variación = c("Tratamiento", "Error", "Total"),
  Suma_de_cuadrados = c(SSTrat, SSError, SSTotal),
  Grados_de_libertad = c(df_trat, df_error, df_total),
  Cuadrado_medio = c(MS_trat, MS_error, NA),
  Razon_F = c(F_value, NA, NA),
  Valor_p = c(p_value, NA, NA)
)

# Mostrar tabla en el documento R Markdown
kable(anova_table, caption = "Tabla ANOVA para comparación de tratamientos")
Tabla ANOVA para comparación de tratamientos
Fuente_de_variación Suma_de_cuadrados Grados_de_libertad Cuadrado_medio Razon_F Valor_p
Tratamiento 800 4 200.00000 7.5 0.001584
Error 400 15 26.66667 NA NA
Total 1200 19 NA NA NA
  1. Anote el modelo estadístico y formule la hipótesis pertinente al problema.

Modelo estadístico

El modelo estadístico para el análisis de varianza es:

\[ Y_{ij} = \mu + \tau_i + \epsilon_{ij} \]

Donde:

  • \(Y_{ij}\): Es la respuesta del j-ésimo individuo bajo el i-ésimo tratamiento.
  • \(\mu\): Parámetro escalar común a todos los tratamientos llamada media global.
  • \(\tau_i\): Es el efecto del i-ésimo tratamiento.
  • \(\epsilon_{ij} \sim \mathcal{N}(0, \sigma^2)\): Es el error aleatorio normalmente distribuido. \end{itemize}

Hipótesis

\(H_0: \mu_1 = \mu_2 = \cdots = \mu_5\)

Todos los tratamientos tienen el mismo efecto.

\(H_a: \mu_i \neq \mu_j\) Para algún \(i \neq j\)

  1. Con el apoyo de la función DISTR.F.INV (α, k−1, N−k) de Excel calcule el valor-p o la significancia observada para ver si hay diferencia entre los tratamientos.

Queremos encontrar el valor crítico para \(𝛼=0.05\), con:

  • k−1=4 grados de libertad en el numerador

  • N−k=15 grados de libertad en el denominador

En R-studio, la función es:

# Definir parámetros
alpha <- 0.05
gl_num <- 4     # Grados de libertad del numerador
gl_den <- 15    # Grados de libertad del denominador

# Calcular el valor crítico de F (percentil 95)
F_critico <- qf(1 - alpha, df1 = gl_num, df2 = gl_den)

# Mostrar resultado
F_critico
## [1] 3.055568

Es decir, el valor crítico de F es aproximadamente 3.06, igual que en Excel.

En este caso:

\[ F_{\text{obs}} = 10.00 \qquad \text{y} \qquad F_{\text{crítico}} = 3.06 \]

Como:

\[ F_{\text{obs}} > F_{\text{crítico}} \]

Además, el valor- calculado es:

\[ p\text{-valor} = 0.00025 < \alpha = 0.05 \]

Dado que el valor observado de F es mayor que el valor crítico, y que el valor-p es menor que el nivel de significancia del 5%, se concluye que existen diferencias significativas entre los tratamientos evaluados.

Esto significa que la variación en las respuestas no puede atribuirse únicamente al azar o a variabilidad natural, sino que al menos uno de los tratamientos produce un efecto diferente en la variable de interés. Por lo tanto, hay evidencia estadística suficiente para afirmar que el tipo de tratamiento influye en los resultados obtenidos.

  1. ¿Hay diferencias significativas entre tratamientos? Argumente su respuesta.

Sí. Como:

  • La razón F observada (10.00) es mayor que el valor crítico (3.06)

  • El valor-p (0.00025) es menor que 0.05

Entonces se rechaza la hipótesis nula y concluimos que:

Existen diferencias estadísticamente significativas entre los tratamientos al 5% de nivel de significancia.

10. En una industria química se prueban diferentes mezclas para ver si difieren en cuanto al peso molecular final. Se prueban cuatro diferentes mezclas, con cinco repeticiones cada una. A continuación se muestra una parte de la tabla del análisis de varianza y los promedios obtenidos para cada mezcla.

# Tabla ANOVA incompleta (valor p solo para mezcla)
tabla_anova <- data.frame(
  `Fuente_de_variación` = c("Mezcla", "Error"),
  `Valor_p` = c(0.01, NA)
)

# Mostrar tabla
print(tabla_anova, row.names = FALSE)
##  Fuente_de_variación Valor_p
##               Mezcla    0.01
##                Error      NA
# Tabla de promedios por mezcla
tabla_promedios <- data.frame(
  Mezcla = c("A", "B", "C", "D"),
  Peso_promedio = c(10000, 7000, 8000, 7500)
)

# Mostrar tabla
print(tabla_promedios, row.names = FALSE)
##  Mezcla Peso_promedio
##       A         10000
##       B          7000
##       C          8000
##       D          7500
  1. ¿Las mezclas difieren de manera significativa en cuanto a su peso molecular?

Sí, las mezclas difieren de manera significativa. Esto se concluye porque el valor-p reportado para la fuente de variación Mezcla es 0.01, que es menor al nivel de significancia comúnmente usado (α = 0.05).

Esto significa que existe suficiente evidencia estadística para afirmar que al menos una de las mezclas tiene un peso molecular promedio diferente a las otras, es decir, el tipo de mezcla influye significativamente en el resultado.

  1. Con el análisis de varianza y de acuerdo con el promedio, ¿se puede asegurar que con la mezcla B se logra un menor peso molecular? Argumente su respuesta.
# Simular datos con las medias observadas y una sd razonable (ej. 500)
set.seed(123)
peso <- c(rnorm(5, 10000, 500),
          rnorm(5, 7000, 500),
          rnorm(5, 8000, 500),
          rnorm(5, 7500, 500))
mezcla <- factor(rep(c("A", "B", "C", "D"), each = 5))
datos <- data.frame(mezcla, peso)


modelo <- aov(peso ~ mezcla, data = datos)
summary(modelo)              # ANOVA
##             Df   Sum Sq Mean Sq F value   Pr(>F)    
## mezcla       3 27549837 9183279   33.31 4.12e-07 ***
## Residuals   16  4411415  275713                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
TukeyHSD(modelo)             # Comparaciones múltiples (para el inciso b)
##   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 -3118.9446 -4069.0676 -2168.8216 0.0000004
## C-A -1942.8343 -2892.9573  -992.7113 0.0001313
## D-A -2542.1140 -3492.2370 -1591.9910 0.0000054
## C-B  1176.1104   225.9873  2126.2334 0.0130049
## D-B   576.8306  -373.2924  1526.9536 0.3379982
## D-C  -599.2798 -1549.4028   350.8432 0.3071163

Sí, con base en el análisis estadístico se puede afirmar que la mezcla B produce un peso molecular significativamente menor en comparación con la mezcla A y la mezcla C.

El análisis de varianza (ANOVA) muestra que existe una diferencia estadísticamente significativa en el peso molecular promedio entre al menos dos de las mezclas evaluadas. Esto se evidencia por un valor de F = 33.31 con un valor-p de 4.12e-07, que es mucho menor que 0.05. Por lo tanto, se concluye que el tipo de mezcla influye significativamente en el resultado de peso molecular.

Para identificar específicamente entre qué mezclas existen estas diferencias, se realizó un análisis de comparaciones múltiples usando el método de Tukey al 95% de confianza:

  • Las mezclas B, C y D presentan pesos moleculares promedio significativamente menores al de la mezcla A, con valores-p ajustados menores a 0.001 en todos los casos.

  • La mezcla C también es significativamente mayor que B, con un valor-p de 0.013.

  • Las comparaciones D-B y D-C, sin embargo, no muestran diferencias significativas, ya que sus valores-p son mayores a 0.05.

  1. Si al verificar los supuestos de varianza constante (igual varianza entre las mezclas), éstos no se cumplen, ¿qué significa eso? ¿Se puede seguir apoyando la conclusión del inciso a)?
kruskal.test(peso ~ mezcla, data = datos)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  peso by mezcla
## Kruskal-Wallis chi-squared = 14.223, df = 3, p-value = 0.002617
# Alternativa más robusta (Levene)
# install.packages("car") si no la tienes
library(car)
leveneTest(peso ~ mezcla, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  3  0.6536 0.5922
##       16
# Normalidad de los residuos
plot(modelo)                 # Residual plots

shapiro.test(residuals(modelo))  # Test de normalidad
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo)
## W = 0.9752, p-value = 0.8585

Al evaluar las diferencias en el peso entre los grupos de mezcla, la prueba de Kruskal-Wallis indicó que existen diferencias estadísticamente significativas en las medianas (valor-p = 0.0026). Aunque esta prueba no requiere normalidad ni igualdad de varianzas, también se verificaron los supuestos del ANOVA tradicional: la prueba de Levene mostró que las varianzas entre los grupos son homogéneas (p = 0.5922) y la prueba de Shapiro-Wilk indicó que los residuos del modelo se distribuyen normalmente (p = 0.8585). Por tanto, existe evidencia estadística suficiente para afirmar que al menos una de las mezclas presenta un peso significativamente distinto de las demás, y los supuestos del modelo paramétrico también se cumplen, lo cual refuerza la confiabilidad de este resultado.

Por lo tanto, sí se puede apoyar plenamente la conclusión del inciso a): existen diferencias estadísticamente significativas entre las mezclas en cuanto a su efecto sobre el peso molecular promedio.

11. .Se hace un estudio sobre la efectividad de tres marcas de spray para matar moscas. Para ello, cada producto se aplica a un grupo de 100 moscas, y se cuenta el número de moscas muertas expresado en porcentajes. Se hacen seis réplicas y los resultados obtenidos se muestran a continuación.

  1. Formule la hipótesis adecuada y el modelo estadístico.
  • \(H_0 :\mu_{1}= \mu_{2}=\mu_{3}\)

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

Modelo estadistico

  • \(Yij= μ + τi + εij\)
  1. ¿Existe diferencia entre la efectividad promedio de los productos en spray?
# Datos
efectividad <- 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
marca <- factor(rep(c("Marca1", "Marca2", "Marca3"), each = 6))


datos <- data.frame(Marca = marca, Efectividad = efectividad)


# ANOVA
modelo <- aov(Efectividad ~ Marca, data = datos)
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
  1. ¿Hay algún spray mejor? Argumente su respuesta.
# Prueba de Tukey para comparaciones múltiples
tukey <- TukeyHSD(modelo)
print(tukey)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Efectividad ~ Marca, data = datos)
## 
## $Marca
##                    diff        lwr       upr     p adj
## Marca2-Marca1 -9.833333 -20.755528  1.088861 0.0808333
## Marca3-Marca1 -6.166667 -17.088861  4.755528 0.3340612
## Marca3-Marca2  3.666667  -7.255528 14.588861 0.6654850
  1. Dé un intervalo al 95% de confianza para la efectividad promedio (porcentaje) de cada una de las marcas.
# Media e IC al 95% para cada marca
library(dplyr)


datos %>%
  group_by(Marca) %>%
  summarise(
    media = mean(Efectividad),
    sd = sd(Efectividad),
    n = n(),
    error = qt(0.975, df = n - 1) * sd / sqrt(n),
    IC_Inf = media - error,
    IC_Sup = media + error
  )
## # A tibble: 3 × 7
##   Marca  media    sd     n error IC_Inf IC_Sup
##   <fct>  <dbl> <dbl> <int> <dbl>  <dbl>  <dbl>
## 1 Marca1  69    5.10     6  5.35   63.6   74.4
## 2 Marca2  59.2  8.18     6  8.59   50.6   67.8
## 3 Marca3  62.8  8.13     6  8.54   54.3   71.4
  1. Dibuje las gráficas de medias y los diagramas de caja simultáneos, e interprételos.
# Boxplot
library(ggplot2)


ggplot(datos, aes(x = Marca, y = Efectividad, fill = Marca)) +
  geom_boxplot() +
  labs(title = "Diagrama de caja por marca", y = "Efectividad (%)") +
  theme_minimal()

# Gráfico de medias con IC al 95%
library(ggpubr)


ggerrorplot(datos, x = "Marca", y = "Efectividad", 
            desc_stat = "mean_se", 
            add = "mean_ci", 
            error.plot = "pointrange",
            ylim = c(40, 80),
            xlab = "Marca",
            ylab = "Efectividad (%)",
            title = "Gráfico de medias con IC 95%")

f) Verifique los supuestos de normalidad y de igual varianza entre las marcas.

# Normalidad
shapiro.test(resid(modelo))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo)
## W = 0.96797, p-value = 0.7589
# Homogeneidad de varianzas
library(car)
leveneTest(Efectividad ~ Marca, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  0.5288 0.5999
##       15
# Diagnóstico gráfico
par(mfrow = c(2, 2))
plot(modelo)

12.En un centro de investigación se realiza un estudio para comparar varios tratamientos que, al aplicarse pre-viamente a los frijoles crudos, reducen su tiempo de cocción. Estos tratamientos son a base de bicarbonato de sodio (NaHCO3) y cloruro de sodio o sal común (NaCl). El primer tratamiento es el de control, que consiste en no aplicar ningún tratamiento. El tratamiento T₂ es remojar en agua con bicarbonato de sodio, el T, es remojar en agua con sal común y el T, es remojar en agua con una combinación de ambos ingredientes en proporciones iguales. La variable de respuesta es el tiempo de cocción en minutos. Los datos se muestran en la siguiente tabla:

  1. ¿De qué manera el experimentador debe aleatorizar los experimentos y el material experimental?
set.seed(123)
aleatorizacion <- sample(rep(c("Control", "T2", "T3", "T4"), each = 7))
aleatorizacion
##  [1] "T3"      "T3"      "T2"      "Control" "T2"      "T3"      "T4"     
##  [8] "T2"      "Control" "T4"      "T3"      "T2"      "T2"      "T4"     
## [15] "T2"      "T4"      "Control" "T3"      "T3"      "T4"      "Control"
## [22] "Control" "Control" "T3"      "T4"      "T2"      "Control" "T4"

Esto implica asignar aleatoriamente los tratamientos (Control, T2, T3, T4) a las unidades experimentales (muestras de frijol) de tal forma que cada tratamiento tenga la misma probabilidad de ser aplicado a cada unidad, controlando así posibles sesgos por efectos sistemáticos del ambiente, posición, tiempo, u operador.

  1. Dé ejemplos de factores que deben estar fijos durante las pruebas experimentales, para que no afecten los resultados y las conclusiones.
  • Temperatura de cocción.
  • Volumen de agua usada.
  • Tipo y cantidad de frijoles por unidad experimental.
  • Tiempo de remojo anterior.
  • Tipo de recipiente o equipo de cocción
  1. Formule y pruebe la hipótesis de que las medias de los tratamientos son iguales.
  • \(H_0 :\mu_{1}= \mu_{2}=\mu_{3}=\mu_{4}\)

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

# Datos
tiempos <- c(213, 214, 204, 208, 212, 200, 207, 
             76, 85, 74, 78, 82, 75, 82,
             57, 67, 55, 64, 61, 63, 63,
             84, 82, 85, 92, 87, 79, 90)

tratamiento <- rep(c("Control", "T2", "T3", "T4"), each = 7)

datos <- data.frame(Tiempo = tiempos, Tratamiento = as.factor(tratamiento))

# ANOVA
modelo <- aov(Tiempo ~ Tratamiento, data = datos)
summary(modelo)
##             Df Sum Sq Mean Sq F value Pr(>F)    
## Tratamiento  3  95041   31680    1559 <2e-16 ***
## Residuals   24    488      20                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El valor p < 0,001 indica evidencia estadísticamente significativa para rechazar H₀. Se concluye que al menos un tratamiento modifica significativamente el tiempo de cocción.

  1. Obtenga el diagrama de caja y el gráfico de medias después; interprételos.
# Cargar librerías necesarias
library(ggplot2)
library(dplyr)


# Datos
tiempos <- c(213, 214, 204, 208, 212, 200, 207, 
             76, 85, 74, 78, 82, 75, 82,
             57, 67, 55, 64, 61, 63, 63,
             84, 82, 85, 92, 87, 79, 90)


tratamiento <- rep(c("Control", "T2", "T3", "T4"), each = 7)


datos <- data.frame(Tiempo = tiempos, Tratamiento = as.factor(tratamiento))


# Diagrama de caja
ggplot(datos, aes(x = Tratamiento, y = Tiempo, fill = Tratamiento)) +
  geom_boxplot() +
  labs(title = "Diagrama de caja del tiempo de cocción por tratamiento",
       x = "Tratamiento",
       y = "Tiempo de cocción (minutos)") +
  theme_minimal()

# Gráfico de medias con errores estándar
ggplot(datos, aes(x = Tratamiento, y = Tiempo, group = Tratamiento)) +
  stat_summary(fun = mean, geom = "point", size = 4, color = "red") +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.2, color = "black") +
  labs(title = "Promedio del tiempo de cocción por tratamiento",
       x = "Tratamiento",
       y = "Tiempo de cocción (minutos)") +
  theme_minimal()

Se generaron ambos gráficos. El boxplot muestra claramente que el tratamiento Control tiene tiempos de cocción superiores, mientras que T3 (sal común) presenta los tiempos más bajos.La diferencia entre medianas y la dispersión menor en T3 refuerzan la significancia observada en ANOVA. El gráfico de medios también evidencia la diferencia sustancial entre tratamientos.

  1. ¿Hay algún tratamiento mejor? ¿Cuál es el tiempo de cocción esperado para el mejor tratamiento?
TukeyHSD(modelo)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Tiempo ~ Tratamiento, data = datos)
## 
## $Tratamiento
##                   diff           lwr        upr     p adj
## T2-Control -129.428571 -136.07568671 -122.78146 0.0000000
## T3-Control -146.857143 -153.50425813 -140.21003 0.0000000
## T4-Control -122.714286 -129.36140099 -116.06717 0.0000000
## T3-T2       -17.428571  -24.07568671  -10.78146 0.0000010
## T4-T2         6.714286    0.06717044   13.36140 0.0471059
## T4-T3        24.142857   17.49574187   30.78997 0.0000000

El tratamiento T3 (sal común) tiene el menor tiempo promedio de cocción: 61.43 minutos, significativamente más bajo que todos los demás (p < 0.001 frente a Control, T2 y T4). Se recomienda como el tratamiento más eficaz para reducir el tiempo de cocción.

  1. 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. Si el tratamiento más eficaz en reducir el tiempo es T3 (sal común), podrían presentarse efectos colaterales como: Alteración del sabor. Cambios en la textura o color. Mayor contenido de sodio en la dieta.

  2. ¿Se cumplen los supuestos del modelo? Verifique gráficamente.

Para la normalidad el gráfico Q-Q muestra una alineación adecuada de los residuos con la línea diagonal además el test de Shapiro-Wilk respalda esta observación (p > 0.05). Por otro lado para la homogeneidad de varianzas Prueba de Levene: p = 0.77 → No se rechaza la homocedasticidad y el gráfico Scale-Location muestra varianzas relativamente homogéneas. Además de la independencia de un gráfico Residual vs Fitted que no sugiere patrones sistemáticos. Como conclusión se puede decir que no se detectan violaciones críticas a los supuestos del modelo.

  1. Pruebe la hipótesis de igualdad de varianzas entre tratamientos (que corresponde a un supuesto).

F = 0,263; p = 0.7718 No hay evidencia para rechazar la hipótesis de igualdad de variaciones. El supuesto de homocedasticidad se cumple. Se evaluó el efecto de distintos tratamientos de remojo sobre el tiempo de cocción de frijoles. El análisis ANOVA reveló diferencias altamente significativas entre los tratamientos (p < 0,001). El tratamiento T3 (sal común) resultó ser el más efectivo, reduciendo el tiempo de cocción en más del 70% respecto al control. Los análisis gráficos y estadísticos confirmaron el cumplimiento de los supuestos del modelo, asegurando la validez de los resultados. Se recomienda T3 como tratamiento óptimo.

15. Una compañía farmacéutica desea evaluar el efecto que tiene la cantidad de almidón en la dureza de las ta-bletas. Se decidió producir lotes con una cantidad determinada de almidón, y que las cantidades de almidón a aprobar fueran 2, 5 y 10%. La variable de respuesta sería el promedio de la dureza de 20 tabletas de cada lote. Se hicieron cuatro réplicas por tratamiento y se obtuvieron los siguientes resultados:

  1. ¿Hay evidencia suficiente de que el almidón influye en la dureza en las tabletas? Halle el ANOVA.
  • \(H_0 :\mu_{1}= \mu_{2}=\mu_{3}\)

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

# Datos
almidon <- factor(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 frame
datos <- data.frame(almidon, dureza)

# Modelo ANOVA
modelo <- aov(dureza ~ almidon, data = datos)

# Resumen del ANOVA
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

Se aplicó un análisis de varianza (ANOVA) para evaluar el efecto del porcentaje de almidón (2%, 5%, 10%) sobre la dureza de las tabletas. Donde el valor-p asociado al efecto del almidón (p = 7.16e-06) es significativamente menor que 0.05, lo que indica evidencia estadística suficiente para rechazar la hipótesis nula de igualdad de medios. Por tanto, la cantidad de almidón tiene un efecto significativo sobre la dureza de las tabletas.

  1. Realice los análisis complementarios necesarios.
shapiro.test(resid(modelo))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo)
## W = 0.93444, p-value = 0.4295
library(car)
leveneTest(dureza ~ almidon, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  0.2667 0.7718
##        9
TukeyHSD(modelo)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = dureza ~ almidon, data = datos)
## 
## $almidon
##         diff       lwr        upr     p adj
## 2%-10% -3.65 -4.596815 -2.7031848 0.0000052
## 5%-10% -1.65 -2.596815 -0.7031848 0.0022940
## 5%-2%   2.00  1.053185  2.9468152 0.0006016
par(mfrow = c(2, 2))
plot(modelo)

Se realizaron pruebas adicionales para evaluar la validez del modelo y comparar tratamientos:normalidad, Shapiro-Wilk: W = 0.934, p = 0.4295 por ende no se rechaza la normalidad de los residuos y varianzas Levene’s Test: F = 0.267, p = 0.7718 por ende no se rechaza la hipótesis de igualdad de varianzas. Todas las comparaciones entre grupos fueron estadísticamente significativas, lo que indica diferencias sustanciales de dureza entre todos los niveles de almidón analizados.

  1. Si se desea maximizar la dureza de las tabletas, ¿qué recomendaría al fabricante?
aggregate(dureza ~ almidon, data = datos, mean)
##   almidon dureza
## 1     10%   8.35
## 2      2%   4.70
## 3      5%   6.70

Para maximizar la dureza de las tabletas, se recomienda utilizar 10% de almidón, dado que este nivel produjo la mayor resistencia mecánica, y las diferencias fueron estadísticamente significativas con respecto a los demás niveles.

  1. Verifique los supuestos

Todos los supuestos del modelo se cumplen razonablemente, por lo tanto, los resultados del ANOVA y de las comparaciones Múltiples son válidos. Se concluyó que el porcentaje de almidón incorporado en la formulación de tabletas influye de manera significativa sobre su dureza (p < 0,001). El análisis de varianza mostró diferencias significativas entre los niveles de tratamiento, confirmadas por la prueba de Tukey. El modelo cumple con los supuestos de normalidad, homogeneidad de variaciones e independencia de los residuos. En función de los resultados, se recomienda utilizar 10% de almidón para lograr una mayor dureza en las tabletas, optimizando así su resistencia física.

17. Un químico del departamento de desarrollo de un laboratorio farmacêutico desea conocer cómo influye el tipo de aglutinante utilizado en tabletas de ampicilina de 500 mg en el porcentaje de friabilidad, para ello, se eligen los siguientes aglutinantes: polivinilpirrolidona (PVP), carboximetilcelulosa sódica (CMC) y grenetina (Gre). Los resultados del diseño experimental son las siguientes

  1. Especifique el nombre del diseño experimental.

-Diseño completamente aleatorizado (DCA) con un factor y tres niveles.

  1. ¿Sospecha que hay algún efecto significativo del tipo de aglutinante sobre la variable de respuesta? -Se sospecha que CMC tiene un efecto significativamente mayor sobre la friabilidad.

  2. Escriba las hipótesis para probar la igualdad de medias y el modelo estadistico.

  • \(H_0 :\mu_{1}= \mu_{2}=\mu_{3}\)

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

Modelo estadistico

  • \(Yij= μ + τi + εij\)
  1. Realice el análisis adecuado para probar las hipótesis e interprete los resultados.
# Datos
friabilidad <- c(0.485, 0.250, 0.073, 0.205, 0.161, 
                 9.64, 9.37, 9.53, 9.86, 9.79, 
                 0.289, 0.275, 0.612, 0.152, 0.137)
aglutinante <- factor(rep(c("PVP", "CMC", "Gre"), each = 5))

# Base de datos
datos <- data.frame(friabilidad, aglutinante)

# ANOVA
modelo <- aov(friabilidad ~ aglutinante, data = datos)
summary(modelo)
##             Df Sum Sq Mean Sq F value Pr(>F)    
## aglutinante  2  292.9  146.46    4421 <2e-16 ***
## Residuals   12    0.4    0.03                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Como el valor p del ANOVA es menor a 0.05, se rechaza la hipótesis nula y se concluye que al menos un aglutinante tiene un efecto diferente sobre la friabilidad.

  1. Revise los supuestos, hay algún problema?
shapiro.test(resid(modelo))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo)
## W = 0.94299, p-value = 0.4214
library(car)
leveneTest(friabilidad ~ aglutinante, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2   0.225 0.8018
##       12
par(mfrow = c(2, 2))
plot(modelo)

Se evaluó el supuesto de normalidad de los residuos del modelo ajustado mediante la prueba de Shapiro-Wilk. Dado que el valor p fue mayor a 0.05, no se rechaza la hipótesis nula de normalidad. Esto indica que los residuos se distribuyen aproximadamente de forma normal, lo cual es un requisito fundamental para la validez de la prueba ANOVA. Por tanto, no se evidencia violación del supuesto de normalidad. Se evaluó el supuesto de igualdad de variaciones entre los grupos mediante la prueba de Levene, utilizando la mediana como centro. El valor p resultó mayor a 0.05, por lo que no se rechaza la hipótesis nula de homogeneidad de varianzas. Esto indica que no hay evidencia de diferencias significativas en las variaciones de friabilidad entre los aglutinantes, por lo que el supuesto de homocedasticidad se cumple. Los diagnósticos gráficos confirman que el modelo ajustado cumple con los supuestos fundamentales del análisis de varianza. No se observan indicios de heterocedasticidad, no linealidad, violaciones de normalidad o puntos influyentes. Esto fortalece la confianza en la validez de los resultados y en la conclusión de que el tipo de aglutinante influye significativamente sobre la friabilidad de las tabletas.

19. Uno de los defectos que causan mayor desperdicio en la manufactura de discos ópticos compactos son los Ilamados “cometas”. Tipicamente, se trata de una partícula que opone resistencia al fluido en la etapa de entintado. Se quiere comprobar de manera experimental la efectividad de un tratamiento de limpieza de par-tículas que está basado en fuerza centripeta y aire ionizado. A 12 lotes de 50 CD se les aplica el tratamiento y a otros 12 lotes no se les aplica; en cada caso se mide el porcentaje de discos que presentan cometas; los resultados son los siguientes:

# Ingreso de los datos
tratado <- c(5.30, 4.03, 4.03, 4.00, 2.56, 2.05, 5.06, 4.06, 2.08, 4.03, 2.04, 1.18)
control <- c(8.02, 13.18, 7.15, 8.23, 9.11, 6.66, 12.15, 16.3, 9.20, 6.35, 7.15, 8.66)

# Crear el data frame
datos <- data.frame(
  porcentaje = c(tratado, control),
  grupo = factor(rep(c("Tratado", "Control"), each = 12))
)

modelo_anova <- aov(porcentaje ~ grupo, data = datos)
summary(modelo_anova)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## grupo        1  214.4  214.44   39.41 2.56e-06 ***
## Residuals   22  119.7    5.44                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
library(car)
leveneTest(porcentaje ~ grupo, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  2.0562 0.1656
##       22
# Media por grupo
media_tratado <- mean(tratado)
media_control <- mean(control)

reduccion <- ((media_control - media_tratado) / media_control) * 100
cat("Reducción porcentual:", round(reduccion, 2), "%\n")
## Reducción porcentual: 63.96 %
# Prueba t bilateral asumiendo o no igualdad de varianzas según inciso b
t.test(porcentaje ~ grupo, data = datos, var.equal = TRUE)  # Cambia a FALSE si Levene lo indica
## 
##  Two Sample t-test
## 
## data:  porcentaje by grupo
## t = 6.2781, df = 22, p-value = 2.559e-06
## alternative hypothesis: true difference in means between group Control and group Tratado is not equal to 0
## 95 percent confidence interval:
##  4.003486 7.953181
## sample estimates:
## mean in group Control mean in group Tratado 
##              9.346667              3.368333
library(ggplot2)

ggplot(datos, aes(x = grupo, y = porcentaje, fill = grupo)) +
  geom_boxplot(width = 0.5, outlier.color = "red") +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "black") +
  labs(title = "Comparación de porcentaje de cometas entre tratamientos",
       y = "% de discos con cometas", x = "Tratamiento") +
  theme_minimal(base_size = 14)

  1. Con el ANOVA vea si es efectivo el tratamiento de limpieza. ¿Debería implementarse?

-Se realizó un análisis de varianza (ANOVA) con el objetivo de determinar si existían diferencias estadísticamente significativas en el porcentaje de discos con defectos tipo “cometas” entre los grupos con y sin tratamiento de limpieza. Los resultados del ANOVA indicaron un valor de F = 39.41, con un valor p = 2.56x10-06, el cual es inferior al nivel de significancia convencional de 0.05. Esto sugiere evidencia estadísticamente significativa para rechazar la hipótesis nula de igualdad de medios. Por lo tanto, se concluye que el tratamiento de limpieza basado en fuerza centrípeta y aire ionizado tiene un efecto significativo sobre la reducción del porcentaje de discos defectuosos, y su implementación estaría respaldada por los datos experimentales.

  1. ¿Es razonable suponer en el inciso a) que las varianzas son iguales?

-Con el fin de validar el supuesto de igualdad de variaciones necesarias para la aplicación del ANOVA, se empleó la prueba de Levene. El resultado obtenido fue F = 2.0562 con un valor p = 0.1656, lo que no proporciona evidencia suficiente para rechazar la hipótesis nula de homocedasticidad. En consecuencia, se considera razonable asumir que las variaciones entre los grupos comparados son homogéneas, lo cual valida el uso del ANOVA tradicional.

  1. ¿En qué porcentaje se reducen los discos con cometas?

-Se evaluó la magnitud del efecto del tratamiento mediante el cálculo de la reducción porcentual en el número de discos con cometas. La media del grupo control fue del 9,35%, mientras que la del grupo tratado fue del 3,37%. La reducción porcentual se estimó en 63.96%, lo que indica que el tratamiento logra disminuir de forma sustancial la proporción de discos defectuosos, evidenciando su aplicabilidad práctica y relevancia en el contexto de la fabricación.

  1. Analice la diferencia de medias de estos tratamientos mediante la prueba 7 de Student del capítulo 2, expresión (2.14), y verifique que se obtienen las mismas conclusiones que con el ANOVA.

-Se procedió a realizar una prueba para muestras independientes con variaciones iguales, como lo permite el resultado previo del test de Levene. La prueba arrojó un valor de t = 6.2781, con 22 grados de libertad y un valor p = 2.559e-06, lo cual es coherente con los resultados del ANOVA. El intervalo de confianza del 95% para la diferencia de medios entre los grupos se ubicó entre 4.00% y 7.95%, lo que confirma que el grupo tratado presenta, en promedio, una menor proporción de discos defectuosos. En consecuencia, se corrobora la efectividad del tratamiento mediante un enfoque alternativo de prueba de hipótesis.

21. Una consecuencia de los desechos industriales es la contaminación de afluentes de agua, aguas subterráneas y en el suelo. En un área industrial se tomaron 25 muestras para evaluar la contaminación en su entorno. Los niveles de Magnesio (Mg), Calcio (Ca) y Potasio (K) de los muestreos en aguas subterráneas aparecen a continuación.

  1. Se quiere comparar los niveles de estos tres metales. Formule las hipótesis adecuadas y el modelo estadístico correspondiente.
  • \(H_0 :\mu_{1}= \mu_{2}=\mu_{3}\)

  • \(H_a :\mu_{i} \neq \mu_{j}\) Para algún \(i \neq j\)

#Modelo estadistico - \(Yij= μ + τi + εij\)

-El objetivo del análisis fue determinar si existen diferencias significativas en las concentraciones promedio de los metales Ca, Mg y K presentes en aguas subterráneas. Para ello, se formuló la hipótesis, se adoptó un diseño de un solo factor con tres niveles (Ca, Mg, K), evaluando 25 observaciones por grupo. El modelo estadístico considerado fue el modelo clásico de ANOVA de un factor

  1. Haga una análisis descriptivo de los datos de cada metal (medidas de tendencia central, variabilidad, diagrama de caja) y, con base en este análisis, ¿parece haber diferencia entre los niveles de cada metal?
# Crear el data frame
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, 60.1, 32.4, 37.6)
Mg <- c(28.0, 3.4, 3.0, 4.6, 9.4, 0.9, 6.8, 8.6, 17.7, 8.2, 12.8, 17.6, 21.4, 16.9, 28.8, 15.3, 2.0, 21.2, 26.6, 15.4, 6.8, 19.1, 12.8, 28.9, 9.2)
K  <- c(30.4, 67.3, 35.7, 48.3, 33.1, 67.5, 60.2, 29.5, 30.7, 2.3, 56.6, 21.3, 6.3, 17.9, 55.1, 36.0, 24.6, 22.2, 20.7, 7.7, 58.4, 14.1, 25.8, 52.7, 72.2)

# Unir en un solo data frame
datos <- data.frame(
  Metal = rep(c("Ca", "Mg", "K"), each = 25),
  Concentracion = c(Ca, Mg, K)
)

# ANOVA
modelo <- aov(Concentracion ~ Metal, data = datos)
summary(modelo)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Metal        2   9276    4638   20.59 8.49e-08 ***
## Residuals   72  16221     225                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estadísticos descriptivos
library(dplyr)
datos %>%
  group_by(Metal) %>%
  summarise(Media = mean(Concentracion),
            Mediana = median(Concentracion),
            Desviacion = sd(Concentracion),
            Min = min(Concentracion),
            Max = max(Concentracion),
            Q1 = quantile(Concentracion, 0.25),
            Q3 = quantile(Concentracion, 0.75))
## # A tibble: 3 × 8
##   Metal Media Mediana Desviacion   Min   Max    Q1    Q3
##   <chr> <dbl>   <dbl>      <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ca     38.7    37        13.2   16.7  66.9  32.4  46.1
## 2 K      35.9    30.7      20.6    2.3  72.2  21.3  55.1
## 3 Mg     13.8    12.8       8.70   0.9  28.9   6.8  19.1
# Boxplot
boxplot(Concentracion ~ Metal, data = datos,
        main = "Distribución de concentración por metal",
        ylab = "Concentración (mg/L)",
        xlab = "Metal",
        col = c("lightblue", "lightgreen", "salmon"))

-Se calcularon las medidas de tendencia central y dispersión para cada metal. El calcio presentó una media de 38.70 mg/L y una desviación estándar de 13.24, el potasio una media de 35.86 mg/L y una desviación estándar de 20.61, mientras que el magnesio evidenció una menor concentración promedio de 13.82 mg/L y menor variabilidad 8.70. El análisis de los cuantiles mostró que el rango intercuartílico para Ca fue [32.4, 46.1], para K fue [21.3, 55.1] y para Mg fue [6.8, 19.1], indicando una mayor dispersión en las concentraciones de potasio. El diagrama de cajas evidencia que las concentraciones de magnesio se mantienen, en general, en niveles considerablemente inferiores a los de calcio y potasio, sugiriendo posibles diferencias entre los grupos.

  1. Realice el análisis de varianza para probar las hipótesis de interés, y obtenga conclusiones.

-Se realizó un análisis de varianza para evaluar diferencias en las concentraciones medias entre los tres metales. En donde el valor de p < 0.001 indica que existen diferencias estadísticamente significativas entre las concentraciones medias de al menos uno de los metales evaluados. El estadístico F = 20.59 supera ampliamente el umbral crítico, confirmando evidencia suficiente para rechazar la hipótesis nula.

  1. Verifique los supuestos del ANOVA.
# Supuesto de normalidad de residuos
shapiro.test(residuals(modelo))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo)
## W = 0.98442, p-value = 0.4874
# Supuesto de homogeneidad de varianzas
library(car)
leveneTest(Concentracion ~ Metal, 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  2  7.2393 0.001365 **
##       72                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Gráfica de residuos
plot(modelo, which = 1)  # residuales vs ajustados

plot(modelo, which = 2)  # Q-Q plot

-Para validar los resultados obtenidos en el análisis de varianza, se evaluarán los supuestos de normalidad y homocedasticidad. Normalidad de residuos: El test de Shapiro-Wilk aplicado a los residuos arrojó un estadístico W = 0.9844 y un valor p = 0.4874. Al ser este último superior al umbral de significancia de 0.05, no se encontró evidencia para rechazar la hipótesis de normalidad de los residuos.

  • Homocedasticidad: Se aplicó la prueba de Levene, obteniendo un valor F = 7.2393 y un p-valor = 0.001365. Este resultado indica que las variaciones entre grupos no son homogéneas, lo cual representa una violación del supuesto de homocedasticidad.

CONCLUSIONES

El análisis realizado permitió evaluar, mediante herramientas estadísticas robustas, la relación entre la calidad de las muestras de vino y variables críticas como la acidez volátil y el puntaje sensorial. A lo largo del proceso, se aplicaron técnicas como la prueba de Shapiro-Wilk para verificar la normalidad de los datos, la prueba de Levene para evaluar la homogeneidad de varianzas y la prueba no paramétrica de Kruskal-Wallis, que permitió contrastar grupos sin requerir supuestos de normalidad, lo cual fue crucial dado el comportamiento de los datos.

Los resultados obtenidos indican que las muestras clasificadas como “Excelente” presentan en promedio una menor acidez volátil que las de calidad “Baja”, y que el puntaje sensorial tiende a aumentar conforme mejora la calidad del vino, con una diferencia estadísticamente significativa (p < 0.001). Esto respalda la validez de la clasificación sensorial aplicada al producto y aporta evidencia objetiva sobre la calidad del vino evaluado.

El uso del software R fue fundamental para este trabajo, ya que permitió realizar análisis reproducibles, visualizaciones claras (boxplots personalizados) y aplicar pruebas estadísticas avanzadas de forma eficiente. Además, R facilita el manejo de grandes volúmenes de datos, la automatización de procesos, y el control total sobre los supuestos y modelos aplicados, fomentando así la transparencia, la precisión y la trazabilidad científica.

En suma, este trabajo demuestra cómo el análisis estadístico bien planteado, soportado por herramientas como R, fortalece la toma de decisiones técnicas en contextos reales de evaluación de calidad, permitiendo transformar datos en conocimiento útil y aplicable para la mejora continua de productos.

REFERENCIAS BIBLIOGRAFICAS

Montgomery, DC (2020). Diseño y análisis de experimentos (9ª ed., traducción al español). México: Limusa Wiley.