library(knitr)
library(kableExtra)
library(ggplot2)
library(patchwork)
Pregunta del caso:
Desarrollar el análisis exploratorio de los datos. Realice una función para el análisis cada variable. El reporte que presentará será realizado en el rmarkdown, y publicado en Rpubs. Debe adjuntar el link de su publicación.
Basde de datos
“winequality-red.csv” – Descargada de Paideia
data_proyecto <- read.csv("winequality-red.csv")
Se usará una función simple
descriptivos_xd <- 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_xd(data_proyecto)
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 |
*Se puede apreciar que se cuentran con 12 columnas todas númericas. Hay un total de 1599 filas.
estadisticos <- function(datos){
datos <- datos[sapply(datos, is.numeric)]
minimo <- c()
maximo <- c()
mediana <- c()
primer_cuartil <- c()
tercer_cuartil <- c()
desviacion_estandar <- c()
nombres <- c()
for(col in names(datos)){
x <- datos[[col]]
nombres <- c(nombres, col)
minimo <- c(minimo, min(x, na.rm = TRUE))
maximo <- c(maximo, max(x, na.rm = TRUE))
mediana <- c(mediana, median(x, na.rm = TRUE))
primer_cuartil <- c(primer_cuartil, quantile(x, 0.25, na.rm = TRUE))
tercer_cuartil <- c(tercer_cuartil, quantile(x, 0.75, na.rm = TRUE))
desviacion_estandar <- c(desviacion_estandar, sd(x, na.rm = TRUE))
}
resultado <- data.frame(
variable = nombres,
min = minimo,
max = maximo,
mediana = mediana,
primer_cuartil = primer_cuartil,
tercer_cuartil = tercer_cuartil,
desviacion_estandar = desviacion_estandar
)
return(resultado)
}
kable(estadisticos(data_proyecto))
| variable | min | max | mediana | primer_cuartil | tercer_cuartil | desviacion_estandar |
|---|---|---|---|---|---|---|
| fixed.acidity | 4.60000 | 15.90000 | 7.90000 | 7.1000 | 9.200000 | 1.7410963 |
| volatile.acidity | 0.12000 | 1.58000 | 0.52000 | 0.3900 | 0.640000 | 0.1790597 |
| citric.acid | 0.00000 | 1.00000 | 0.26000 | 0.0900 | 0.420000 | 0.1948011 |
| residual.sugar | 0.90000 | 15.50000 | 2.20000 | 1.9000 | 2.600000 | 1.4099281 |
| chlorides | 0.01200 | 0.61100 | 0.07900 | 0.0700 | 0.090000 | 0.0470653 |
| free.sulfur.dioxide | 1.00000 | 72.00000 | 14.00000 | 7.0000 | 21.000000 | 10.4601570 |
| total.sulfur.dioxide | 6.00000 | 289.00000 | 38.00000 | 22.0000 | 62.000000 | 32.8953245 |
| density | 0.99007 | 1.00369 | 0.99675 | 0.9956 | 0.997835 | 0.0018873 |
| pH | 2.74000 | 4.01000 | 3.31000 | 3.2100 | 3.400000 | 0.1543865 |
| sulphates | 0.33000 | 2.00000 | 0.62000 | 0.5500 | 0.730000 | 0.1695070 |
| alcohol | 8.40000 | 14.90000 | 10.20000 | 9.5000 | 11.100000 | 1.0656676 |
| quality | 3.00000 | 8.00000 | 6.00000 | 5.0000 | 6.000000 | 0.8075694 |
Se utilizó la función personalizada para obtener los principales estadísticos de todas las variables del dataset. Los resultados muestran que las variables free.sulfur.dioxide y total.sulfur.dioxide presentan las desviaciones estándar más altas, lo que sugiere una mayor dispersión en su data y es posible que tenga un gran número de valore atipicos.
Teniendo en cuenta lo anterior, se elaborará una serie de gráficos de densidad, así como diagramas de cajas y bigotes, con el fin de identificar posibles valores atípicos y analizar la forma en que se distribuyen los datos.
graficadora <- function(data){
# Filtrar solo columnas numéricas
data <- data[sapply(data, is.numeric)]
lista_graficos_d <- list()
for(columna in names(data)){
## Densidad
g <- ggplot(data, aes(x = .data[[columna]])) +
geom_density(fill = "skyblue", color = "darkblue", alpha = 0.7) +
labs(
title = paste("Distribución de", columna),
x = columna,
y = "Densidad"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
## Bigotes
b <- ggplot(data, aes(x = .data[[columna]]))+
geom_boxplot(fill = "lightgreen", color = "darkgreen", width = 0.5) +
labs(
title = paste("Boxplot de", columna),
) +
theme_minimal() +
theme(
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
plot.title = element_text(hjust = 0.5)
)
graf_conjunto <- g + b + plot_layout(heights = c(3, 1))
lista_graficos_d[[columna]] <- graf_conjunto
}
return(lista_graficos_d)
}
plots <- graficadora(data_proyecto)
for (p in plots) print(p)