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.
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 |
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"