library(knitr)
library(kableExtra)
library(ggplot2)
library(patchwork)

Control 1 - Statistics programming for Business Analytics

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

Vemos las variables y los tipos de datos

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.

Resumen de las variables y distribuciones

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.

Gráficos de las distribuciones de las variables

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)