Histogramas para Múltiples Variables Continuas.

Una de las actividades más importantes a la hora de trabajar en proyectos de Machine Learning y Data Science es aquella relacionada con el análisis de las variables continuas de un dataset. A razón de esto, el presente post describe las actividades llevadas a cabo por  un conjunto de funciones que, asociadas, generan un histograma y una colección de estadísticas básicas para los atributos especificados de un dataset.

f_normalizar <- function( p_data )
{
x_min <- min(x = p_data)
x_max <- max(x = p_data)
( p_data - x_min ) / ( x_max - x_min )
}
view raw f_normalizar.R hosted with ❤ by GitHub

La función f_normalizar escala todos los atributos numéricos que se le argumenten y los guarda en un data.frame.

f_computos <- function( p_data )
{
media <- mean( x = p_data, na.rm = T )
mediana <- median( x = p_data, na.rm = T )
moda <- unique( p_data )
moda <- moda[ which.max( x = tabulate( bin = match( x = p_data, table = moda ) ) ) ]
data.frame( Media = media
, Mediana = mediana
, Moda = moda
)
}
view raw f_computos.R hosted with ❤ by GitHub

Por su parte, la función f_computos calcula la media, mediana y moda para cada uno de los atributos que se le especifiquen y al gual que la función f_normalizar, los almacena en un data.frame.

f_transformar <- function( p_data, p_summ )
{
# Melt Data
mltd_data <- melt( data = p_data
, variable.name = "Atributo"
, value.name = "Value"
)
# Melt Summary
mltd_summ <- melt( data = p_summ
, id.vars = "Atributo"
, variable.name = "Metrica"
, value.name = "Value"
)
list( mltd_data = mltd_data
, mltd_summ = mltd_summ
)
}
view raw f_transformar.R hosted with ❤ by GitHub

Más aún, la función f_transformar redimensiona los data.frames formulados por la funciones f_normalizar y f_computos por medio del paquete reshape2 a un formato apropiado para graficarlos por la función ggplot2. Ambos data.frames redimensionados son alojados en una sola lista, esto con el objetivo de guarecer todos los datos a graficar en un único objeto.

f_generarGrafica <- function( p_mltd )
{
( ggplot()
+ geom_histogram( data = p_mltd$mltd_data
, aes( x = Value
, fill = Atributo
)
, bins = 40
, color = "black"
, alpha = 0.5
)
+ geom_vline( data = p_mltd$mltd_summ
, aes( xintercept = Value
, color = Metrica
, linetype = Metrica
)
, size = 1
)
+ facet_wrap( facets = ~Atributo
, scales = "fixed"
)
+ labs( x = "Value"
, y = "Frequency"
)
+ scale_color_manual( values = c("goldenrod","deeppink3","dodgerblue") )
+ scale_fill_brewer( palette = "Greens", guide = F )
+ theme_bw()
+ theme( panel.grid = element_blank()
, strip.background = element_rect( fill = "dodgerblue4" )
, strip.text = element_text( color = 'white' )
, axis.text = element_text( size = 10.5 )
, plot.title = element_text( size = 11 )
, legend.title = element_text( size = 11 )
)
)
}

Por otro lado, el código en f_generarGrafica genera la gráfica objetivo  y la almacena como una lista. Para concluir, la función f_crearHistograma tan sólo vincula las funciones explicadas a lo largo de este texto y guarda tanto la gráfica como los datos graficados en una lista.

f_crearHistograma <- function( p_data, p_columnas )
{
# Iterar sobre columnas y normalizar
my_data <- mapply( FUN = f_normalizar
, USE.NAMES = T
, SIMPLIFY = T
, p_data[ , p_columnas ]
)
my_data <- as.data.frame.matrix( x = my_data )
# Crear resumen de numeros
my_summ <- lapply( FUN = f_computos
, X = my_data
)
my_summ <- do.call( what = rbind, args = my_summ )
my_summ$Atributo <- row.names( x = my_summ )
row.names( x = my_summ ) <- NULL
# Transformar Datasets
mltd <- f_transformar(p_data = my_data, p_summ = my_summ)
# Crear grafica
grafica <- f_generarGrafica( mltd )
list( grafica = grafica
, datos = my_data
, resumen = my_summ
)
}

El histograma computado puede verse en la siguiente imagen:

Rplot

El código completo puede ser descargado desde aquí.

Anuncio publicitario

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s