La función shapiro_density() se aplica a una dataframe, selecciona solamente las variables numéricas, les aplica el test de normalidad de Shapiro-Wilk y crea una matriz con los gráficos de densidad y el p-valor de cada test.

La función depende de dos parámetros, data que es el dataframe que queremos analizar y ncols que es número de columnas de la matriz de gráficos de densidad. Por defecto ncols = 2.

Sin demasiado esfuerzo el lector podría modificar esta función para que realice otro test y muestre otro tipo de gráfico.

# Definición de la función

shapiro_density <- function(data, ncols = 2) {
  # Selecciona las numéricas, sus valores y sus nombres
  num_vars <- sapply(data, is.numeric)
  num_data <- data[, num_vars, drop = FALSE]
  num_var_names <- names(num_data)
  num_vars_count <- length(num_var_names)
  
  # Configura la interfaz gráfica con el ncols elegido
  par(mfrow = c(ceiling(num_vars_count/ncols), ncols))
  
  # Bucle para cada variable
  for (i in 1:num_vars_count) {
    var_name <- num_var_names[i]
    var_data <- num_data[[var_name]]
    
    # Realiza el test, extrae el pvalor y calcula la f.d.densidad
    shapiro_result <- shapiro.test(var_data)
    p_value <- format(shapiro_result$p.value, digits = 3)
    density <- density(var_data)
    
    # Pinta la densidad añadiendo como texto el pvalor  
    plot(density, main = var_name, xlab = var_name, zero.line = FALSE)
    text(x = mean(var_data) * 1, y = min(density$y) * 1, 
         labels = paste("Shapiro-Wilk test p-value =", p_value), 
         col = "blue", cex = 0.85)
  }
  # Restaura la interfaz gráfica a una columna
  par(mfrow = c(1,1))
}

Ejemplo: Con la función shapiro_density() mostramos varios ejemplos, primero aplicada a los datos iris y luego a los datos LifeCycleSavings eligiendo el número de columnas ncols de la matriz de gráficos.

# Por defecto gráficos en 2 columnas
shapiro_density(data = iris)

# Elegimos 2 columnas
shapiro_density(data = LifeCycleSavings, ncols = 2)

# Elegimos 3 columnas
shapiro_density(data = LifeCycleSavings, ncols = 3)