1. Carga de datos

df <- read_csv("winequality-red.csv")
summary(df)
##  fixed acidity   volatile acidity  citric acid    residual sugar  
##  Min.   : 4.60   Min.   :0.1200   Min.   :0.000   Min.   : 0.900  
##  1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090   1st Qu.: 1.900  
##  Median : 7.90   Median :0.5200   Median :0.260   Median : 2.200  
##  Mean   : 8.32   Mean   :0.5278   Mean   :0.271   Mean   : 2.539  
##  3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420   3rd Qu.: 2.600  
##  Max.   :15.90   Max.   :1.5800   Max.   :1.000   Max.   :15.500  
##    chlorides       free sulfur dioxide total sulfur dioxide    density      
##  Min.   :0.01200   Min.   : 1.00       Min.   :  6.00       Min.   :0.9901  
##  1st Qu.:0.07000   1st Qu.: 7.00       1st Qu.: 22.00       1st Qu.:0.9956  
##  Median :0.07900   Median :14.00       Median : 38.00       Median :0.9968  
##  Mean   :0.08747   Mean   :15.87       Mean   : 46.47       Mean   :0.9967  
##  3rd Qu.:0.09000   3rd Qu.:21.00       3rd Qu.: 62.00       3rd Qu.:0.9978  
##  Max.   :0.61100   Max.   :72.00       Max.   :289.00       Max.   :1.0037  
##        pH          sulphates         alcohol         quality     
##  Min.   :2.740   Min.   :0.3300   Min.   : 8.40   Min.   :3.000  
##  1st Qu.:3.210   1st Qu.:0.5500   1st Qu.: 9.50   1st Qu.:5.000  
##  Median :3.310   Median :0.6200   Median :10.20   Median :6.000  
##  Mean   :3.311   Mean   :0.6581   Mean   :10.42   Mean   :5.636  
##  3rd Qu.:3.400   3rd Qu.:0.7300   3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :4.010   Max.   :2.0000   Max.   :14.90   Max.   :8.000

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.