INTEGRANTES
Cristhian Omar Camacho Hermoza
Victor Kevin Carlos Escate León
Percy Rojas Saire
Alvaro Riega Motta
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
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