Integrantes del Grupo:

Control 1: Análisis exploratorio

Se realizó el análisis exploratorio del conjunto de datos utilizado en el caso Winequality-red. Para automatizar el proceso se construyó una función en R que identifica automáticamente el tipo de variable (numérica o categórica) y genera estadísticas descriptivas junto con dos gráficos por variable (histograma y boxplot para numéricas; gráfico de barras y gráfico circular para categóricas).

El análisis se ejecutó sobre todas las variables del dataset, permitiendo identificar su distribución, rangos, valores atípicos y patrones relevantes para la toma de decisiones.

Mostramos las variables y los tipos de datos

library(knitr)

data <- read.csv("winequality-red.csv")

descriptivos<- function(datos){
  nombres <- c()
  tipos <- c()
  nulos <- c()
  number_datos <- c()
  
  for(columna in names(datos)){
    data <- datos[[columna]]
    nombres <-c(nombres, columna)
    tipos <- c(tipos, class(data))
    nulos <- c(nulos, sum(is.na(data)))
    number_datos <- c(number_datos, length(data))
  }
  resultado <- data.frame(
    variable = nombres,
    tipo_datos = tipos,
    valores_nulos = nulos,
    number_datos = number_datos
  )
  return(resultado)
}
resultados <-descriptivos(data)
kable(resultados)
variable tipo_datos valores_nulos number_datos
fixed.acidity numeric 0 1599
volatile.acidity numeric 0 1599
citric.acid numeric 0 1599
residual.sugar numeric 0 1599
chlorides numeric 0 1599
free.sulfur.dioxide numeric 0 1599
total.sulfur.dioxide numeric 0 1599
density numeric 0 1599
pH numeric 0 1599
sulphates numeric 0 1599
alcohol numeric 0 1599
quality integer 0 1599

Gráficos Histograma y Boxplot de las variables

analizar_variable <- function(x,variable) {
print(paste("Clase:", class(x)))
  
  par(mfrow = c(1,2))  # 1 fila, 2 gráficos
  if(is.numeric(x)){
    print(summary(x))
    print(paste("Rango:", round(diff(range(x)),2)))
    print(paste("Varianza:", round(var(x),2)))
    print(paste("Desviación estándar:", round(sd(x),2)))
    print(paste("Coeficiente de Variación:", round(sd(x)/mean(x)*100,2)))
    hist(x, main = paste("Histograma de", variable), xlab=variable, ylab="Frecuencia", col="green")
    boxplot(x, main = paste("Boxplot de", variable), col="blue")
  }
  else{
    print(table(x))
    barplot(table(x), main = paste("Frecuencias de", variable))
  }
}

aplicar_a_variables <- function(data, funcion){
  for (col in names(data)) {
    cat("Variable:", col, "\n")
    funcion(data[[col]],col)   
    }
}

aplicar_a_variables(data, analizar_variable)
## Variable: fixed.acidity 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.60    7.10    7.90    8.32    9.20   15.90 
## [1] "Rango: 11.3"
## [1] "Varianza: 3.03"
## [1] "Desviación estándar: 1.74"
## [1] "Coeficiente de Variación: 20.93"

## Variable: volatile.acidity 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1200  0.3900  0.5200  0.5278  0.6400  1.5800 
## [1] "Rango: 1.46"
## [1] "Varianza: 0.03"
## [1] "Desviación estándar: 0.18"
## [1] "Coeficiente de Variación: 33.92"

## Variable: citric.acid 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.090   0.260   0.271   0.420   1.000 
## [1] "Rango: 1"
## [1] "Varianza: 0.04"
## [1] "Desviación estándar: 0.19"
## [1] "Coeficiente de Variación: 71.89"

## Variable: residual.sugar 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.900   1.900   2.200   2.539   2.600  15.500 
## [1] "Rango: 14.6"
## [1] "Varianza: 1.99"
## [1] "Desviación estándar: 1.41"
## [1] "Coeficiente de Variación: 55.54"

## Variable: chlorides 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01200 0.07000 0.07900 0.08747 0.09000 0.61100 
## [1] "Rango: 0.6"
## [1] "Varianza: 0"
## [1] "Desviación estándar: 0.05"
## [1] "Coeficiente de Variación: 53.81"

## Variable: free.sulfur.dioxide 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    7.00   14.00   15.87   21.00   72.00 
## [1] "Rango: 71"
## [1] "Varianza: 109.41"
## [1] "Desviación estándar: 10.46"
## [1] "Coeficiente de Variación: 65.89"

## Variable: total.sulfur.dioxide 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    6.00   22.00   38.00   46.47   62.00  289.00 
## [1] "Rango: 283"
## [1] "Varianza: 1082.1"
## [1] "Desviación estándar: 32.9"
## [1] "Coeficiente de Variación: 70.79"

## Variable: density 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9901  0.9956  0.9968  0.9967  0.9978  1.0037 
## [1] "Rango: 0.01"
## [1] "Varianza: 0"
## [1] "Desviación estándar: 0"
## [1] "Coeficiente de Variación: 0.19"

## Variable: pH 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.740   3.210   3.310   3.311   3.400   4.010 
## [1] "Rango: 1.27"
## [1] "Varianza: 0.02"
## [1] "Desviación estándar: 0.15"
## [1] "Coeficiente de Variación: 4.66"

## Variable: sulphates 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3300  0.5500  0.6200  0.6581  0.7300  2.0000 
## [1] "Rango: 1.67"
## [1] "Varianza: 0.03"
## [1] "Desviación estándar: 0.17"
## [1] "Coeficiente de Variación: 25.76"

## Variable: alcohol 
## [1] "Clase: numeric"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.40    9.50   10.20   10.42   11.10   14.90 
## [1] "Rango: 6.5"
## [1] "Varianza: 1.14"
## [1] "Desviación estándar: 1.07"
## [1] "Coeficiente de Variación: 10.22"

## Variable: quality 
## [1] "Clase: integer"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.000   5.000   6.000   5.636   6.000   8.000 
## [1] "Rango: 5"
## [1] "Varianza: 0.65"
## [1] "Desviación estándar: 0.81"
## [1] "Coeficiente de Variación: 14.33"