2. Análisis exploratorio por variable
#Liz Madeley Hinostroza Vidal
#Magna Maricely Zelada Alvarado
#Angel Rodrigo Mendivil Rodriguez
summary(df$`fixed acidity`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.60 7.10 7.90 8.32 9.20 15.90
tab <- as.data.frame(table(df$`fixed acidity`))
ggplot(df, aes(x = `fixed acidity`)) +
geom_histogram(bins = 30) +
labs(
title = "Histograma de Fixed Acidity",
x = "Fixed Acidity",
y = "Frecuencia"
) +
theme_minimal()

#Vemos que la primera variable sobre "fixed acidity" tiene una cortosis ligeramente desviada a la izquierda,
#demostrando una forma tipo chi2 con ligeras puntas que rondan los 8 puntos en acidity. No hay datos faltantes.
### Volatile Acidity ###
summary(df$`volatile acidity`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.1200 0.3900 0.5200 0.5278 0.6400 1.5800
tab <- as.data.frame(table(df$`volatile acidity`))
ggplot(df, aes(x = `volatile acidity`)) +
geom_histogram(bins = 30) +
labs(
title = "Histograma de volatilidad de acidez",
x = "volatility",
y = "Frecuencia"
) +
theme_minimal()

#test de normalidad
shapiro.test(df$`volatile acidity`)
##
## Shapiro-Wilk normality test
##
## data: df$`volatile acidity`
## W = 0.97434, p-value = 2.693e-16
#Después de observar la tabla de frecuencia (en su forma numérica) y el histograma, si bien, los datos están agrupados
#se muestra una forma concentrada entre 39% y 64%. Con un máximo del 158%, donde el histograma va cayendo mientras mayor se
#hace la volatilidad. Los datos podrían decirse a simple vista que muestra una forma normalizada, sin embargo el test de
#shapiro sale menor a 0.05, por lo que rechazamos la normalidad de los datos de manera estocástica.
### citric acid ###
summary(df$`citric acid`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.090 0.260 0.271 0.420 1.000
tab <- as.data.frame(table(df$`citric acid`))
ggplot(df, aes(y = `citric acid`)) +
geom_boxplot() +
labs(
title = "Boxplot de ácido cítrico",
y = "Ácido cítrico",
x = ""
) +
theme_minimal()

#claramente, con el gráfico y al observar la tabla de frecuencia, podemos concluir que el comportamiento
#de la variable de citric acid no es normalizada, como solución lo más recomendable sería recurrir a una normalización
#estadística, mediante regresión lineal ir eliminando o "trimeando" los outliers.
### residual sugar ###
summary(df$`residual sugar`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.900 1.900 2.200 2.539 2.600 15.500
tab <- as.data.frame(table(df$`citric acid`))
ggplot(df, aes(y = `residual sugar`)) +
geom_boxplot() +
labs(
title = "Boxplot de azucar residual",
y = "Azucar residual",
x = ""
) +
theme_minimal()

#El gráfico en caja nos muestra la disperción de la variable. Siendo la moda el valor "0", y teniendo una máxima de 15.
#podemos observar la desviación cuando la mediana es 2.2, por lo que una limpieza de outliers sería lo más indicado.
### chlorides ###
summary(df$`chlorides`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01200 0.07000 0.07900 0.08747 0.09000 0.61100
tab <- as.data.frame(table(df$`chlorides`))
ggplot(df, aes(y = `chlorides`)) +
geom_boxplot() +
labs(
title = "Boxplot de chlorides",
y = "chloride",
x = ""
) +
theme_minimal()

#Esta variable también está demasiado sezgada respecto a la media y mediana, ya que ambas están entre 0.079 y 0.08
#respectivamente, sin embargo, el punto más alto es 0.6. La normalidad en esta variable es inexistente, pero dependemos
#de un contexto exógeno a los datos puros.
### free sulfur dioxide ###
summary(df$`free sulfur dioxide`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 7.00 14.00 15.87 21.00 72.00
tab <- as.data.frame(table(df$`free sulfur dioxide`))
ggplot(df, aes(y = `free sulfur dioxide`)) +
geom_boxplot() +
labs(
title = "Boxplot de free sulfur dioxide",
y = "chloride",
x = ""
) +
theme_minimal()

#la concentración u homocedasticidad de los datos en este caso es mayor que en los demás según el
#gráfico de barras, siendo tal vez los outliers no significativos por el volumen que representan
#con el total de los datos.
### total sulfur dioxide ###
summary(df$`total sulfur dioxide`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.00 22.00 38.00 46.47 62.00 289.00
tab <- as.data.frame(table(df$`total sulfur dioxide`))
ggplot(df, aes(y = `total sulfur dioxide`)) +
geom_boxplot() +
labs(
title = "Boxplot de total sulfur dioxide",
y = "chloride",
x = ""
) +
theme_minimal()

#en este caso los outliers son cada vez menos significativos para la bse en sí, pero se mantiene una disperción
#considerable, ya que no se cumple con la homocedasticidad ni con la normalidad de los datos, de manera que estimarlos
#puede ser complicado y no eficaz. Los puntos outliers puede que no terminen siendo significativos para el modelo.
### density ###
summary(df$`density`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.9901 0.9956 0.9968 0.9967 0.9978 1.0037
tab <- as.data.frame(table(df$`density`))
ggplot(df, aes(x = density)) +
geom_histogram(bins = 30) +
labs(
title = "Histograma de densidad",
x = "Densidad",
y = "Frecuencia"
) +
theme_minimal()

#debido al tipo de variable, podemos ver gráficamente una normalidad en la distribución de los datos bastante clara.
#Por lo que en esta situación no es necesario hacer un test de normalidad. Siendo que los datos están distribuidos en un campo
#pequeño que va de 0.990 a 1.003, como máxia
### ph ###
summary(df$`pH`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.740 3.210 3.310 3.311 3.400 4.010
tab <- as.data.frame(table(df$`pH`))
ggplot(df, aes(x = pH)) +
geom_histogram(bins = 30) +
labs(
title = "Histograma de ph",
x = "ph",
y = "Frecuencia"
) +
theme_minimal()

#igual, esta variable por la concentración de los datos se puede llamar relativa normalidad,
#respondiendo a la forma que meustra. Tampoco procederemos con pruebas estocásticas, pero si es importante recalcar la forma
#de la composición.
### sulphates ###
summary(df$`sulphates`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3300 0.5500 0.6200 0.6581 0.7300 2.0000
tab <- as.data.frame(table(df$`sulphates`))
ggplot(df, aes(x = sulphates)) +
geom_histogram(bins = 30) +
labs(
title = "Histograma de ph",
x = "ph",
y = "Frecuencia"
) +
theme_minimal()

#igual corresponde a una distribución chi2, con alta concentración en valores bajos y menos en mayores observaciones
#lo que se puede hacer es normalizar la variable mediante reemplazo o triming de outliers altos.
### alcohol ###
summary(df$`alcohol`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.40 9.50 10.20 10.42 11.10 14.90
tab <- as.data.frame(table(df$`alcohol`))
ggplot(df, aes(y = `alcohol`)) +
geom_boxplot() +
labs(
title = "Boxplot de total sulfur dioxide",
y = "chloride",
x = ""
) +
theme_minimal()

#con una moda de 9.5, la media y mediana están bastante cerca, por lo que el gráfico de boxplot
#da pistas de una posible normalidad. Hay unos cuantos outliers, sin embargo, rechazamos la significancia
#que puedan conllevar tales observaciones.
### quality ###
summary(df$`quality`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.000 5.000 6.000 5.636 6.000 8.000
tab <- as.data.frame(table(df$`quality`))
ggplot(df, aes(y = `alcohol`)) +
geom_boxplot() +
labs(
title = "Boxplot de total sulfur dioxide",
y = "chloride",
x = ""
) +
theme_minimal()

#la calificación que va de 3 a 8 es bastante clara, con un promedio de 6. Sin mucha disperción al ser una variable discreta,
#debatilblemente categórica, sin embargo la conscentración es clara entre 5.6 y 6 están el promedio y el tercer cuartil
#entre dichos valores.