logo

Introducción

Las visualizaciones en el campo de la minería de datos son esenciales para comprender patrones, tendencias y relaciones ocultas en conjuntos de datos complejos. Estas visualizaciones pueden variar desde gráficos simples hasta visualizaciones interactivas avanzadas, dependiendo de la complejidad de los datos y los objetivos del análisis.

En este módulo, discutiremos los diferentes gráficos que se pueden utilizar para explorar la naturaleza multidimensional de un conjunto de datos. Iniciamos con análisis de gráficos básicos (gráficos de barras, gráficos de líneas, diagramas de dispersión, diagrama de caja e histogramas) y diferentes mejoras que amplían las capacidades de estos diagramas para visualizar más información. La elección de la visualización adecuada depende del tipo de datos y del objetivo del análisis. También discutiremos las ventajas de la visualizaciones dinámicas sobre las visualizaciones estáticas.

Vale la pena resaltar que en las diferentes tareas de minería de datos (predicción, clasificación, agrupación, entre otros) aprenderemos a construir visualizaciones particulares que respalden esas tareas.

Librerías ggplot2 y plolty

La librería ggplot2 es una de las herramientas de visualización más poderosas y populares en el lenguaje de programación R. Se basa en el concepto de “gramática de gráficos”, que permite a los usuarios construir gráficos complejos a partir de componentes simples de manera intuitiva y consistente.

La librería plotly es una librería en R que ofrece una amplia gama de herramientas para crear visualizaciones interactivas y dinámicas. Desde simples gráficos de barras hasta complejas tramas tridimensionales. Una de las características distintivas de esta librería es su capacidad para generar gráficos interactivos que permiten a los usuarios explorar y manipular los datos directamente desde la visualización. Esto brinda una experiencia más rica y atractiva para los usuarios, además de facilitar la identificación de patrones y tendencias en los datos.

Para discutir las diferentes visualizaciones trabajaremos con la base de datos diamonds. Es uno de los conjuntos de datos incluidos en la librería ggplot2. Este conjunto de datos contiene información sobre diferentes características de diamantes, lo que lo hace útil para la práctica de visualización de datos y análisis exploratorio.

Cargamos las librerías y el conjunto de datos:

library(ggplot2)
library(plotly)
library(printr)  # visualizaciones en html
library(tidyverse)
data(diamonds, package = "ggplot2")
skimr::skim(diamonds)
Data summary
Name diamonds
Number of rows 53940
Number of columns 10
_______________________
Column type frequency:
factor 3
numeric 7
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
cut 0 1 TRUE 5 Ide: 21551, Pre: 13791, Ver: 12082, Goo: 4906
color 0 1 TRUE 7 G: 11292, E: 9797, F: 9542, H: 8304
clarity 0 1 TRUE 8 SI1: 13065, VS2: 12258, SI2: 9194, VS1: 8171

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
carat 0 1 0.80 0.47 0.2 0.40 0.70 1.04 5.01 ▇▂▁▁▁
depth 0 1 61.75 1.43 43.0 61.00 61.80 62.50 79.00 ▁▁▇▁▁
table 0 1 57.46 2.23 43.0 56.00 57.00 59.00 95.00 ▁▇▁▁▁
price 0 1 3932.80 3989.44 326.0 950.00 2401.00 5324.25 18823.00 ▇▂▁▁▁
x 0 1 5.73 1.12 0.0 4.71 5.70 6.54 10.74 ▁▁▇▃▁
y 0 1 5.73 1.14 0.0 4.72 5.71 6.54 58.90 ▇▁▁▁▁
z 0 1 3.54 0.71 0.0 2.91 3.53 4.04 31.80 ▇▁▁▁▁

Diagrama circular y de barras

Estas librerías tiene ya incorporado un conocimiento sobre el tipo de datos. Es decir, sin especificarle que gráfico deseas hacer, realizará el que considere más acertado dependiendo del tipo de dato.

Por ejemplo, la variable cut es una variable categórica, por lo que se debería hacer una gráfica de pastel o un diagrama de barras.

# Diagrama recomendado por R
plot_ly(diamonds, x = ~cut)

Ahora, pero si queremos que nuestra gráfica sea un diagrama circular.

pie <- plot_ly() %>% 
       add_pie(data = count(diamonds, cut), labels = ~cut, values = ~n)
pie

Si por el contrario quieres estar seguros que realizará el diagrama de barras.

barras <- diamonds %>%
          count(cut) %>%
          plot_ly(x = ~cut, y = ~n,type="bar",
                  marker = list(color = "lightgreen"))
barras

Diagrama de barras agrupado

En ocasiones es importante hacer la visualización de más de una variable y si estas son discretas, se puede lograr por medio de diagramas de barras agrupados. Por ejemplo podemos visualizar los recuentos de diamantes, tanto por talla como claridad.

plot_ly(diamonds, x = ~cut, color = ~clarity) 

La distribución de la claridad dentro de los diamantes “ideales” parece ser bastante similar a la de otros diamantes, pero es difícil hacer esta comparación utilizando solo los recuentos. Quizás conviene hacer las barras apiladas.

plot_ly(diamonds, x = ~cut, color = ~clarity) %>%
        layout(barmode = "stack")

Este tipo de diagrama, es un caso especial de diagrama en mosaico. En un gráfico de mosaico, puede escalar tanto el ancho como la altura de las barras según distribuciones discretas. Para gráficos de mosaico, podemos usar la librería ggmosaic, que implementa una figura en ggplot2, que podemos convertir a plotly a través de ggplotly

library(ggmosaic)
cc <- count(diamonds, cut, clarity)
p <- ggplot(data = cc) +
     geom_mosaic(aes(weight = n, x = product(cut), fill = clarity))
ggplotly(p)

Histograma

Los histogramas son gráficos recomendados para variables continuas o categóricas con muchos factores. Por ejemplo, la variable price es continua.

plot_ly(diamonds, x = ~price) %>%
        add_histogram()

Histogramas múltiples

Similar a trabajar con más de una característica, podemos mezclar variables. Es decir, revisar la distribución de una variable por su característica. Por ejemplo, hacer histogramas por cada factor de la vaiable claridad.

one_plot <- function(d) {
  plot_ly(d, x = ~price) %>%
    add_annotations(~unique(clarity), x = 0.5, y = 1, 
      xref = "paper", yref = "paper", showarrow = FALSE)}

diamonds %>%
  split(.$clarity) %>%
  lapply(one_plot) %>% 
  subplot(nrows = 2, shareX = TRUE, titleX = FALSE) %>%
  hide_legend()

También podrias querer colocarlos en un mismo gráfico para compararlos.

p1  <- filter(diamonds, clarity=="SI1") %>% select(price) %>% as.vector()
p2  <- filter(diamonds, clarity=="SI2") %>% select(price) %>% as.vector()
p3  <- filter(diamonds, clarity=="IF") %>% select(price) %>% as.vector()


plot_ly(alpha = 0.6) %>% 
  add_histogram(x=~p1$price) %>% 
  add_histogram(x=~p2$price) %>% 
  add_histogram(x=~p3$price) %>%
  layout(barmode = "stack")
plot_ly(alpha = 0.6) %>% 
  add_histogram(x=~p1$price) %>% 
  add_histogram(x=~p2$price) %>% 
  add_histogram(x=~p3$price) %>%
  layout(barmode = "overlay")

Diagramas de dispersión

Los diagramas de dispersión es un gráfico para variables continuas o series de tiempo, que normalmente se puede realizar por medio de puntos, líneas, o polígonos.

Diagramas de puntos

d <- diamonds[sample(nrow(diamonds), 1000), ]

plot_ly(d, x = ~carat, y = ~price, color = ~carat, size = ~carat)
p <-ggplot(d,aes(x=carat,y=price)) + geom_point() + geom_smooth(method="lm", linetype="dashed", fill="blue")

ggplotly(p)

Diagramas de líneas

Si los datos son una serie de tiempo,a la recomendación es hacer un diagrama de líneas.

Para este ejemplo trabajaremos con la base de datos economics, de la librería ggplot2

data(economics, package = "ggplot2")

economics %>%
  arrange(psavert) %>%
  plot_ly(x = ~date, y = ~psavert) %>%
  add_lines()

También puede ser de interés comparar el comportamiento por año.

econ <- economics %>%
        mutate(yr = year(date), mnth = month(date))

plot_ly(econ, x = ~mnth, y = ~uempmed) %>%
  add_lines(color = ~ordered(yr))

Boxplots

Los diagramas de caja codifican el resumen de cinco números de una variable numérica y proporcionan una forma decente de comparar muchas distribuciones numéricas. La tarea visual de comparar múltiples diagramas de caja es relativamente fácil (es decir, comparar la posición a lo largo de una escala común) en comparación con algunas alternativas comunes.

plot_ly(diamonds, y = ~price, color = ~cut) %>%
        add_boxplot()

También se puede para múltiples variables.

plot_ly(diamonds, x=~cut, y = ~price, color = ~clarity) %>%
        layout(boxmode = "group") %>%
        add_boxplot()

Agrupaciones rectangulares

Otra forma de visualizar relaciones entre variables, puede ser por medio de las correlaciones. Las correlaciones se suelen mostrar en diagramas rectangulares.

corr <- cor(dplyr::select_if(diamonds, is.numeric))
        plot_ly(colors = "RdBu") %>%
        add_heatmap(x = rownames(corr), y = colnames(corr), z = corr) %>%
        colorbar(limits = c(-1, 1))

Gráficos 3D

En plotly, simplemente le agregas la variable z e inmediatamente entenderá que es una gráfica 3D.

plot_ly(iris,x = ~Sepal.Length,y = ~Sepal.Width,z = ~Petal.Length,colors="Set1") %>%
  add_markers(color = ~Species)

Hay muchas opciones para agregarle. Por ejemplo, seguimiento lineal de cada grupo.

plot_ly(iris,x = ~Sepal.Length,y = ~Sepal.Width,z = ~Petal.Length,colors="Set1") %>%
        group_by(Species) %>%
        add_lines(color = ~Species)

Superficies

Los gráficos en 3D son muy útiles para gráficar superficies.

x <- seq_len(nrow(volcano)) 
y <- seq_len(ncol(volcano)) 
plot_ly() %>% 
        add_surface(x = ~x, y = ~y, z = ~volcano)

Para más información, pueden visitar: Gráficos 3D

\[ \]