Para un mejor entendimiento de el ejercicio realizado, es necesario tener en cuenta los siguientes conceptos relacionados con los diamantes:
Corte: Procesos de transformación de una piedra en bruto a una con facetas (simetría, dimensiones, pulido, etc)
Carat (Quilataje): Es la unidad de medida de los diamantes. Determina
Claridad: Medida de pureza y rareza de un diamante
Tabla: Cantidad de cristales que componen un quilate
X, Y, Z: Direcciones de ejes critalográficos
Los boxplots o “Diagramas de caja y Bigote” resumen las variables numéricas y permiten comparar sus distribuciones.
Por medio de este método de análisis de datos, es posible compara un grupo grande de datos y determinar las diferencias entre sus cuartiles, medias, límites y valores atípicos
La función de los boxplots en R es comparar visualmente las variables numéricas por medio de la función add_boxplot.
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(plotly)
##
## Attaching package: 'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
data("diamonds", package = "ggplot2")
p <- plot_ly(diamonds, y= ~price, color = I("black"),
alpha = 0.1, boxpoints = "suspectedoutliers")
p1 <- p %>% add_boxplot(x= "Overall")
p2 <- p %>% add_boxplot(x= ~cut)
subplot(
p1, p2, shareY = TRUE,
widths = c(0.2, 0.8), margin = 0
) %>%hide_legend()
Figura 1. Precio general de los diamantes y precio según corte
En la gráfica se muestra una comparación de los precios de los diamantes según el nivel de su corte, esto es realizado a través de diagramas de caja y bigotes.
Usando la función add_ boxplot segeneró un conjunto de diagramas de caja y bigotes los cuales comparten un mismo eje el cual conidciona los datos y los grupa con respecto a esta característica.
A partir de este gráfico, se puede apreciar que los diamantes Justos poseen una mediana en el precio mayor que el resto de diamantes, esto seguido por los diamantes Premium. Del mismo modo, el sesgo de los diamantes Premium es superior al resto de diamantes por lo que se afirma que los precios de estos son valores bastante distantes con respecto a la mediana. Todos los grupos poseen valores atípicos superiores a sus valores máximos.
plot_ly(diamonds, x= ~price, y = ~interaction(clarity, cut))%>%
add_boxplot(color = ~clarity) %>%
layout(yaxis = list(title = ""))
Figura 2. Precio de diamantes según corte y claridad
En esta gráfica se particionan los datos con más de una variable, en este caso usando claridad y corte.
Con base a esta información, se agrupan los diamantes con el mismo corte y claridad para poder comparar su precio. Con los diagramas es posible detectar que:
Existen muchos valores atípicos distantes para todos los diamantes, especialmente para los VVS1 Ideal y VS1 Ideal
Los diamantes Premium con claridad VVS1 tienen un sesgo bajo por lo que los precios de este tipo de diamantes es muy cercano
La variación en el precio de los diamantes de Muy Buen corte y claridad VVS1 es extensa y tienen una varianza esperada con un valor muy alto
No hay mucha dispersión en el precio de los diamantes Justos, independientemente de su claridad, esto en comparación con los demás tipos.
Los diamantes de corte Justo tienen my pocos valores atípicos y su varianza es baja.
d <- diamonds %>%
mutate(cc= interaction(clarity, cut))
lvls <- d %>%
group_by(cc) %>%
summarise(m = median(price)) %>%
arrange(m) %>%
pull(cc)
plot_ly(d, x = ~price, y = ~factor(cc, lvls))%>%
add_boxplot(color = ~clarity) %>%
layout(yaxis = list(title = ""))
Figura 3. Precio de diamantes según corte y claridad, organizados por la mediana de precios.
Del mismo modo, en la figura 3 se realizó un gráfico de caja y bigotes utilizando el corte y claridad de los diamantes, sin embargo, en este gráfico se ordena con respecto a la mediana de los precios del diamante.
Los gráficos de frecuencias en 2D son útiles para analizar los patrones y asociaciones que poseen algunas variables. Con ellos es posible visualizar la densidad poblacional y la variabilidad de los datos.
Para utilizar gráficos de frecuencias en 2D es necesario usar el paquete de plotly con las funciones de add_heatmap( ) y add_histogram2d( ).
p<- plot_ly(diamonds, x = ~log(carat),y = ~log(price))
subplot(
add_histogram2d(p)%>%
colorbar(title = "default")%>%
layout(xaxis = list(title = "default")),
add_histogram2d(p, zsmooth= "best")%>%
colorbar(title ="zsmooth") %>%
layout(xaxis = list(title= "zsmooth")),
add_histogram2d(p, nbinsx = 60, nbinsy = 60) %>%
colorbar(title = "nbins") %>%
layout(xaxis = list(title= "nbins")),
shareY = TRUE, titleX = TRUE
)
Figura 4. Tres usos diferentes de los histogramas 2D
En esta figura se evidenciasn diferentes usos de los histogramas 2D usando la función add_histogram2d.
El histográma default presenta el algoritmo pre establecido por la función. El histográma zsmooth es el algoritmo establecido por defecto por la función plotly, sin embargo presenta un suavizado en el pixelaje. En el histograma nbins se determina un número barras en las direcciones X y Y.
kde_count <- function(x, y, ...){
kde <- MASS::kde2d(x, y, ...)
df <- with(kde, setNames(expand.grid(x, y), c ("x", "y")))
df$count <- with(kde, c(z) * length(x)[1] * diff(y)[1])
data.frame(df)
}
kd <- with(diamonds, kde_count (log(carat), log(price), n = 30))
plot_ly(kd, x = ~x, y = ~y, z = ~count)%>%
add_heatmap()%>%
colorbar(title = "Numer of Diamonds")
Figura 5. Estimación de densidad 2D de los diamantes según sus carates
Para la figura 5, se utilizó la Estimación de Densidad de Kernel por mediode la función kde2d ( ), la cual se encarga de mostrar la distribución de una variable (codificando la densidad en un eje con altura proporcional en el otro, de odo que proporciona una escala). Posteriormente, se grafican los datos obtenidos con Kernel usando la función de add_heatmap ( ).
A partir de la figura se determina que los puntos con mayor densidad son (0, 8.5) y (-1.1, 6.6).
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))
Figura 6. Matriz de correlación con múltiples ejes.
El propósito de esta gráfica es comparar los datos según diferentes grupos, para ello se usa la función add_heatmap ( ) y colorbar ( ). Con estas funciones se genera una matriz que correlaciona todas las variables numéricas de los datos. A partir d esto, se utiliza una escala de color para diferenciar los valores de las relaciones obtenidas.
La menor relación presentada es la tabla con la profundidad con un valor de -2.95; esto quiere decir que su proporcionalidad es inversa, los diamantes con menor tabla se encuentran a una mayor profundidad.
Las mayores relaciones presentadas son de 1 y estas son dadas por igualdades en ambos ejes. Por el otro lado, los valores “neutros” están presentes en las variables que se correlacionan con la profundidad. Esto quiere decir que uno de las variables aumenta con mayor volumen que la otra.
En esta sección se busca comparar visualmente la asociación de dos variables cuantitativas por medio de la función add_markers ( ). En estos gráficos se comparan puntos individuales on tendecias discontinuas y ayudan a identificar patrones y tendencias entre estos.
Para poder generar el gráfico en 3D se utiliza la función plot_ly ( ), la cual se encarga de representar gráficamente las lineas, caminos y marcadores en tres dimensiones.
crt <- diamonds$carat
tbl <- diamonds$table
price <- diamonds$price
plot_ly(diamonds, x = ~crt, y = ~tbl,z = ~price) %>%
add_markers(color = ~price)
Figura 7. Marcador 3D de diamantes según precio.
Con este marcador se busca comparar cada diamante según su Carat, Precio y Tabla a la que se encuentran. Con las funciones plot_ly y add_markers se genera un Plano Cartesiano con ejes x, y y z. En este se ubican los valores específicos de cada diamante según esta variable y se agrupan según color con respecto a su precio.
Teniendo en cuenta la gráfica, se establece que el precio del diamante aumenta cuando tiene un valor bajo en su tabla y un alto quilataje. Además de esto, se puede afi
plot_ly(diamonds, x = ~crt, y = ~tbl, z = ~price)%>%
add_paths(color = ~crt)
Figura 8. Camino 3D de diamantes según carates.
En esta figura se utiliza la función add_path; esta se encarga de crear un trauecto entre los puntos el cual es organizado según el orden que poseean los datos en la tabla.
En esta gráfica se observa que una menor cantidad de diamantes posee alto quilataje, además, estos pertenecen a los últimos valores anotados en la tabla.
plot_ly(diamonds, x = ~crt, y = ~tbl, z = ~price) %>%
add_lines(color = ~crt)
Figura 9. Linea 3D de diamantes según quilataje
En esta gráfica se utiliza la función add_lines; esta se encarga de dibujar lineas según los valores de X, en este caso siendo el quilataje.
De acuerdo a la proximidad de las lineas moradas y azules, se afirma que la mayoría de los valores de la tabla se encuentran en un quilataje entre 1 y 2.5 carats. Del mismo modo, los diamantes con quilataje mayor a 3 son muy escasos.
plot_ly(diamonds, x = ~crt, y = ~tbl,z = ~price)%>%
add_lines(color = ~crt)%>%
layout(
scene = list(
xaxis = list(title = "Carat"),
yaxis = list(title = "Profundidad"),
zaxis = list(title = "Precio")
)
)
Figura 10. Linea 3D de diamantes según quilataje con titulo en los ejes
La figura 10 presenta los mismos datos y gráfico que la figura 9, sin embargo, en esta los ejes se encuentran con título.
Para generar superficies en 3D es necesario usar la función add_surface ( ). Esta función utiliza datos numéricos y genera columnas y filas las cuales forman una imagen en tres dimensiones.
x <- seq_len(nrow(volcano)) + 100
y <- seq_len(ncol(volcano)) + 500
plot_ly() %>% add_surface(x = ~x, y = ~y, z = ~volcano
)
Figura 11. Superficie 3D de la altura volcán.
En esta figura se utilliza la función add_surface ( ) para mostrar la altura de un volcán. En esta gráfica se observa la detallada réplica del volcán utilizando un conjunto de datos.
corr <- cor (dplyr:: select_if(diamonds, is.numeric))
plot_ly(colors = "RdBu") %>%
add_surface(x = rownames(corr), y = colnames(corr), z = corr) %>%
colorbar(limits = c(-1, 1))
## Warning: 'surface' objects don't have these attributes: 'zmin', 'zmax'
## Valid attributes include:
## '_deprecated', 'autocolorscale', 'cauto', 'cmax', 'cmid', 'cmin', 'coloraxis', 'colorbar', 'colorscale', 'connectgaps', 'contours', 'customdata', 'customdatasrc', 'hidesurface', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'lighting', 'lightposition', 'meta', 'metasrc', 'name', 'opacity', 'opacityscale', 'reversescale', 'scene', 'showlegend', 'showscale', 'stream', 'surfacecolor', 'surfacecolorsrc', 'text', 'textsrc', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
Figura 12. Gráfico de superficie correlacionando múltiples ejes.
En esta figura se replicó lo realizado en la figura 6,cambiando add_heatmap ( ) por add_surface ( ). En esta se muestra la relación de varios ejes entre sí, generando picos y zonas planas las cuales denotan el rápido crecimiento de estas variables. Además, esta figura presenta divisiones por color en eleje Z, el cual es una interpolación .