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.
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)
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 | ▇▁▁▁▁ |
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
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)
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()
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")
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.
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)
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))
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()
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))
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)
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
\[ \]