INTEGRANTES

Cristhian Omar Camacho Hermoza

Victor Kevin Carlos Escate León

Percy Rojas Saire

Alvaro Riega Motta

Analisis Exploratorio de las Caracteristicas del Vino

A continuación, se presenta un análisis exploratorio para evaluar el comportamiento de cada una de las variables organolépticas y físico-químicas que compone el vino, las cuales inciden de manera directa en su calidad final

#Importamos la base de datos en la variable BD
BD<-read.csv("E:/Cristhian Camacho/Business Analytics/Statistics Programming/4/winequality-red.csv")

#Vemos la estructura de la base de datos:Se observa que los tados son numericos y la variable calidad es entero.

str(BD)
## 'data.frame':    1599 obs. of  12 variables:
##  $ fixed.acidity       : num  7.4 7.8 7.8 11.2 7.4 7.4 7.9 7.3 7.8 7.5 ...
##  $ volatile.acidity    : num  0.7 0.88 0.76 0.28 0.7 0.66 0.6 0.65 0.58 0.5 ...
##  $ citric.acid         : num  0 0 0.04 0.56 0 0 0.06 0 0.02 0.36 ...
##  $ residual.sugar      : num  1.9 2.6 2.3 1.9 1.9 1.8 1.6 1.2 2 6.1 ...
##  $ chlorides           : num  0.076 0.098 0.092 0.075 0.076 0.075 0.069 0.065 0.073 0.071 ...
##  $ free.sulfur.dioxide : num  11 25 15 17 11 13 15 15 9 17 ...
##  $ total.sulfur.dioxide: num  34 67 54 60 34 40 59 21 18 102 ...
##  $ density             : num  0.998 0.997 0.997 0.998 0.998 ...
##  $ pH                  : num  3.51 3.2 3.26 3.16 3.51 3.51 3.3 3.39 3.36 3.35 ...
##  $ sulphates           : num  0.56 0.68 0.65 0.58 0.56 0.56 0.46 0.47 0.57 0.8 ...
##  $ alcohol             : num  9.4 9.8 9.8 9.8 9.4 9.4 9.4 10 9.5 10.5 ...
##  $ quality             : int  5 5 5 6 5 5 5 7 7 5 ...
#Posteriormente analizaremos cada uno de los atributos

summary(BD)
##  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

Analisis visual del comportamiento de cada atributo

Se uso el FOR como bucle operativo para leer cada columna -atributo de la base datos y poder asi automatizar su lectura y graficas, se realizo graficas de histogramas y boxplot, observandose:

Variable:fixed acidity, la existencia de outlires por encima del limite superior

Variable:volatile acidity la existencia de outlires por encima del limite superior

Variable:citric acid la existencia de outlires puntual por encima del limite superior

Variable:residual sugar la existencia de outlires puntual por encima del limite superior

Variable:chlorides la existencia de outlires puntual por encima del limite superior

Variable:free sulfur dioxide la existencia de outlires por encima del limite superior

Variable:total sulfur dioxide la existencia de outlires por encima del limite superior

Variable:density la existencia de outlires por encima del limite superior y limite inferior

Variable:pH la existencia de outlires por encima del limite superior y limite inferior

Variable:sulphates la existencia de outlires puntual por encima del limite superior

Variable:alcohol a existencia de outlires puntual por encima del limite superior

Variable:quality es una variable tipo entero se genro un barplot

BDN <- NULL # Guardará columnas continuas (histograma + boxplot)
BDC <- NULL # Guardará columnas enteras y categóricas (barplot)

# NOTA: Se elimina graphics.off() para no cerrar el dispositivo gráfico de R Markdown.

columnas <- ncol(BD)

# 1. Contar el número total de subgráficos para ajustar el lienzo
total_graficos <- 0
for (i in 1:columnas) {
  col_data <- BD[[i]]
  # Si es numérico Y tiene decimales -> es continuo (2 gráficos)
  es_continuo <- is.numeric(col_data) && any(col_data[!is.na(col_data)] %% 1 != 0)
  
  if (es_continuo) {
    total_graficos <- total_graficos + 2
  } else {
    total_graficos <- total_graficos + 1
  }
}

# 2. Configurar la cuadrícula y achicar márgenes para que quepa todo
filas <- 2
cols_grid <- ceiling(total_graficos / filas)

par(mfrow = c(filas, cols_grid), 
    mar = c(3, 3, 2, 1), 
    mgp = c(1.8, 0.5, 0))

# 3. Bucle para generar las gráficas
for (i in 1:columnas) {
  nombre   <- colnames(BD)[i]
  col_data <- BD[[i]]
  
  # Evalúa si la variable es numérica continua
  es_continuo <- is.numeric(col_data) && any(col_data[!is.na(col_data)] %% 1 != 0)
  
  if (es_continuo) {
    # Continuos: Histograma + Boxplot
    hist(col_data,
         main = paste("Hist:", nombre),
         xlab = nombre,
         col = i,
         cex.main = 0.8, cex.axis = 0.7)
    
    boxplot(col_data,
            horizontal = TRUE,
            col = i,
            xlab = nombre,
            cex.main = 0.8, cex.axis = 0.7)
    
    BDN <- c(BDN, i)
    
  } else {
    # Enteros y Categóricos: Barplot
    barplot(table(col_data),
            main = paste("Bar:", nombre),
            xlab = nombre,
            ylab = "Frec",
            col = i,
            cex.main = 0.8, cex.axis = 0.7)
    
    BDC <- c(BDC, i)
  }
}

# 4. Restaurar la configuración de gráficos al finalizar el chunk
par(mfrow = c(1, 1))

names(BD)
##  [1] "fixed.acidity"        "volatile.acidity"     "citric.acid"         
##  [4] "residual.sugar"       "chlorides"            "free.sulfur.dioxide" 
##  [7] "total.sulfur.dioxide" "density"              "pH"                  
## [10] "sulphates"            "alcohol"              "quality"
texto = paste("Analisis del atributo  ",colnames(BD)[1])
par(mfrow = c(1,2))
hist(BD[   , 1],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 1], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 1])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.60    7.10    7.90    8.32    9.20   15.90
texto = paste("Analisis del atributo  ",colnames(BD)[2])
par(mfrow = c(1,2))
hist(BD[   , 2],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 2], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 2])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1200  0.3900  0.5200  0.5278  0.6400  1.5800
texto = paste("Analisis del atributo  ",colnames(BD)[3])
par(mfrow = c(1,2))
hist(BD[   , 3],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 3], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 3])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.090   0.260   0.271   0.420   1.000
texto = paste("Analisis del atributo  ",colnames(BD)[4])
par(mfrow = c(1,2))
hist(BD[   , 4],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 4], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 4])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.900   1.900   2.200   2.539   2.600  15.500
texto = paste("Analisis del atributo  ",colnames(BD)[5])
par(mfrow = c(1,2))
hist(BD[   , 5],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 5], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 5])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01200 0.07000 0.07900 0.08747 0.09000 0.61100
texto = paste("Analisis del atributo  ",colnames(BD)[6])
par(mfrow = c(1,2))
hist(BD[   , 6],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 6], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 6])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    7.00   14.00   15.87   21.00   72.00
texto = paste("Analisis del atributo  ",colnames(BD)[7])
par(mfrow = c(1,2))
hist(BD[   , 7],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 7], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 7])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    6.00   22.00   38.00   46.47   62.00  289.00
texto = paste("Analisis del atributo  ",colnames(BD)[8])
par(mfrow = c(1,2))
hist(BD[   , 8],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 8], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 8])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9901  0.9956  0.9968  0.9967  0.9978  1.0037
texto = paste("Analisis del atributo  ",colnames(BD)[9])
par(mfrow = c(1,2))
hist(BD[   , 9],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 9], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 9])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.740   3.210   3.310   3.311   3.400   4.010
texto = paste("Analisis del atributo  ",colnames(BD)[10])
par(mfrow = c(1,2))
hist(BD[   , 10],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 10], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 10])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3300  0.5500  0.6200  0.6581  0.7300  2.0000
texto = paste("Analisis del atributo  ",colnames(BD)[11])
par(mfrow = c(1,2))
hist(BD[   , 11],
     main = texto,
     xlab = "Rango del comportamiento de los datos",
     ylab = "Frecuencia de los rango",
     col = i)
boxplot(BD[   , 11], 
        main = texto,
        col = i,
        horizontal = FALSE)

summary(BD[   , 11])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.40    9.50   10.20   10.42   11.10   14.90
texto = paste("Analisis del atributo  ",colnames(BD)[12])
par(mfrow = c(1,2))
barplot(table(BD[[12]]),
        main = texto,
        xlab = "Rango del comportamiento de los datos",
        ylab = "Frecuencia de los rangos",
        col = i)


summary(BD[12])
##     quality     
##  Min.   :3.000  
##  1st Qu.:5.000  
##  Median :6.000  
##  Mean   :5.636  
##  3rd Qu.:6.000  
##  Max.   :8.000