El data frame ‘diamantes’ del paquete ‘datos’ contiene información sobre las características físicas y precios (en $USD) de alrededor de 54.000 diamantes. En este informe, se utilizarán gráficas y medidas de tendencia, dispersión, posición, entre otras, para realizar un análisis descriptivo de una muestra tomada de dicha base de datos.
Para que favorecer la correcta interpretación de los resultados, a continuación, se define cada una de las variables que usted verá a lo largo del informe y sus mediciones:
Precio: valor en $USD. Quilate: peso del diamante (cada quilate es equivalente a 200 mg). Corte: Calidad del corte en escala de Regular a Ideal. Color: Color del diamante en escala alfabética de J(peor) a D(mejor). Claridad: Que tan claro es el diamante en escala: I1 (peor), SI1, SI2, VS1, VS2, VVS1, VVS2, IF (mejor). Profundidad: Porcentaje de profundidad total. Tabla: Relación del ancho de la parte superior con su punto más ancho.

Todo el informe ha sido realizado utilizando el lenguaje de programación R y R markdown, en el entorno RStudio. La mayoría del código usado se muestra con el fin de favorecer el entendimiento del procedimiento, además de facilitar la verificación y replicación de los resultados en caso de ser necesario. Si desea ocultar el código, lo puede hacer desde el menú desplegable de la esquina superior derecha.
El informe, como se mencionó, incluye varios gráficos, alguno de los cuales están marcados como: ‘Gráfico Interactivo’, para sacar provecho de estos, utilice las herramientas que aparecen en la esquina superior derecha de cada uno, interactúe con las leyendas y mueva su cursor sobre estas. Usted podrá hacer zoom, cambiar la escala, aislar o eliminar datos de la visualización, ampliar información, entre otros.
Para el presente informe, tomaremos una muestra aleatoria de 1000 datos de este data frame, esto utilizando una semilla dada por los últimos números de la cédula de cada uno de los miembros del grupo.
Nota: Se eliminaron las variables ‘x’, ‘y’, ‘z’ pues son bastantes especificas y ya contamos con suficientes variables cuantitativas para nuestro trabajo.
set.seed(605)
datos.d <- data.frame(diamantes)
muestra1 <- datos.d[sample(nrow(datos.d),size=1000),0:10]
muestra1 <- subset(muestra1, select = c(precio, quilate, corte, color, claridad, profundidad, tabla))
attach(muestra1)A continuación se enseña la muestra tomada:
muestra1Las variables cualitativas son aquellas que expresan una característica o cualidad de un objeto (en este caso los diamantes). Las variables cualitativas presentes en la base de datos son ordinales, pues también tienen un orden (mejor - peor), estas son: ‘corte’, ‘color’ y ‘claridad’.
La tabla de frecuencia permite resumir la información de 1000 datos en solo unas líneas. Nos muestra las categorías de cada varible y la frecuencia con la que se repite cada una dentro de la muestra, además de la frecuencia relativa o participación porcentual que tienen en el total.
freq_corte <- table(corte)
freq_color <- table(color)
freq_claridad <- table(claridad)
freq_corte_df <- as.data.frame(freq_corte)
freq_color_df <- as.data.frame(freq_color)
freq_claridad_df <- as.data.frame(freq_claridad)
freq_corte_df$Participación <- prop.table(freq_corte_df$Freq)*100
freq_color_df$Participación <- prop.table(freq_color_df$Freq)*100
freq_claridad_df$Participación <- prop.table(freq_claridad_df$Freq)*100freq_corte_dffreq_color_dffreq_claridad_dfLa gráficas de barras muestran la frecuencia de cada categoria, además se usaron colores para mostrar el orden de las categorías. Los tonos verdes indican las categorías consideradas como mejores, mientras las rojas las peores.
barras_1 <- plot_ly(freq_corte_df, x = ~corte, y = ~Freq, type = 'bar',
marker = list(color = ColBarras,
line = list(color = 'rgb(8,48,107)', width = 1.5)))
barras_1 <- barras_1 %>% layout(title = "Frecuencias de Cortes",
xaxis = list(title = "Cortes"),
yaxis = list(title = "Frecuencia"))barras_1Gráfico Interactivo
barras_2 <- plot_ly(freq_color_df, x = ~color, y = ~Freq, type = 'bar',
marker = list(color = ColBarras1,
line = list(color = 'rgb(8,48,107)', width = 1.5)))
barras_2 <- barras_2 %>% layout(title = "Frecuencias de Colores",
xaxis = list(title = "Colores"),
yaxis = list(title = "Frecuencia"))barras_2Gráfico Interactivo
barras_3 <- plot_ly(freq_claridad_df, x = ~claridad, y = ~Freq, type = 'bar',
marker = list(color = ColBarras2,
line = list(color = 'rgb(8,48,107)', width = 1.5)))
barras_3 <- barras_3 %>% layout(title = "Frecuencias de Claridades",
xaxis = list(title = "Claridades"),
yaxis = list(title = "Frecuencia"))barras_3Gráfico Interactivo
Los treemaps no muestran frecuencia absoluta, sino participación. El área que ocupan en el cuadrado total es proporcional a su participación en la muestra, además, la escala de colores ayuda a conocer de forma un poco más precisa cual es esta: entre más claro sea el azul, mayor es la frecuencia relativa de la categoría.
attach(freq_corte_df)
ggplot(freq_corte_df, aes(area = Freq, fill = Participación, label = corte)) + geom_treemap() + geom_treemap_text(fontface = "italic", colour = "white", place = "centre",
grow = TRUE)attach(what = NULL)attach(freq_color_df)
ggplot(freq_color_df, aes(area = Freq, fill = Participación, label = color)) + geom_treemap() + geom_treemap_text(fontface = "italic", colour = "white", place = "centre",
grow = TRUE)attach(what = NULL)attach(freq_claridad_df)
ggplot(freq_claridad_df, aes(area = Freq, fill = Participación, label = claridad)) + geom_treemap() + geom_treemap_text(fontface = "italic", colour = "white", place = "centre",
grow = TRUE)attach(what = NULL)Las gráficas de torta también muestran frecuencia relativa. Al igual que en los treemaps, cada porción representa una clase, y su área dependerá de su frecuencia relativa, sin embargo, en este caso, los colores sirven únicamente para diferenciar las categorías.
x <- table(muestra1$corte)
dat <- data.frame(x)
colors <- c('rgb(211,94,96)', 'rgb(128,133,133)', 'rgb(144,103,167)', 'rgb(171,104,87)', 'rgb(114,147,203)')fig <- plot_ly(dat, labels = ~Var1, values = ~Freq, type = 'pie',
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(Freq, ' diamantes'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)),
#The 'pull' attribute can also be used to create space between the sectors
showlegend = FALSE)
fig <- fig %>% layout(title = 'Distribución de diamantes por corte',
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))figGráfico Interactivo
De las 1000 muestras mas de la mitad tienen cortes premium o ideales
y <- table(muestra1$color)
dat2 <- data.frame(y)
fig2 <- plot_ly(dat2, labels = ~Var1, values = ~Freq, type = 'pie',
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(Freq, ' diamantes'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)),
#The 'pull' attribute can also be used to create space between the sectors
showlegend = FALSE)
fig2 <- fig2 %>% layout(title = 'Distribución de diamantes por color',
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))fig2Gráfico Interactivo
z <- table(muestra1$claridad)
dat3 <- data.frame(z)
fig3 <- plot_ly(dat3, labels = ~Var1, values = ~Freq, type = 'pie',
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(Freq, ' diamantes'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)),
#The 'pull' attribute can also be used to create space between the sectors
showlegend = FALSE)
fig3 <- fig3 %>% layout(title = 'Distribución de diamantes por claridad',
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))fig3Gráfico Interactivo
La mayoria de diamantes están considerados en claridades medias, medias bajas
A partir de las tablas de frecuencia y las gráficas presentadas, podemos evidenciar que lo más común en la muestra es que los diamantes tengan un corte ‘Ideal’, un color ‘G’, y una claridad ‘SI1’. Por otro lado, vemos que lo menos común son lo diamantes de corte ‘Regular’, color ‘J’ y color ‘I1’, es llamativo que las categorías consideradas como peores, son de hecho las menos comunes. Además, podemos ver que la distribución en categorías es más homogénea en los colores y más heterogénea en los cortes.
Las medidas de tendencia central son aquellas que buscan ubicar un punto al rededor del cuál los datos de un conjunto tienden a agruparse. Las que utilizaremos en nuestro análisis son: Media o Promedio, Mediana y Moda. Cada una de estas tiene características diferentes: La media o promedio, toma la sumatoria de los valores y la divide entre el total de datos. La mediana es el valor central del conjunto de datos ordenados por magnitud. Finalmente, la moda es el dato con mayor frecuencia.
Para hayar estas medidas en R, utilizamos la función ‘ds_tidy_stats()’ y después eliminamos las columnas relacionadas con medidas diferentes a las discutidas en esta sección. Como se muestra a continuación:
resumen <- ds_tidy_stats(muestra1)
resumen <- subset(resumen, select = c(vars, mean, median, mode))Los resultados fueron los siguientes:
resumenDe los resultado podemos decir que en promedio, los diamantes de nuestra muestra tienen un precio de $3784,3 USD, un peso de 0,79 quilates, una medida tabla de 57,4 y una profundidad de 61,8. Además, lo más común es que los diamantes cuesten $675 USD, pesen 0,3 quilates, tengan medida tabla de 57 y profundidad de 62.
Finalmente podemos decir que, teniendo en cuenta que el promedio es la medición más sensible a datos atípicos, la diferencia entre esta y las otras medidas nos adelanta la existencia de estos.
Entraremos en más detalles sobre los datos atípicos en nuestra muestra en las siguientes secciones.
Como se mostrará, exiten varias medidas de dispersión con diferentes funciones y que brindan información única.
El Rango es la diferencia numérica entre el valor máximo y el valor mínimo; por ello, comparte unidades con los datos. Permite obtener una idea de la dispersión de los datos, cuanto mayor es el rango, más dispersos están los datos (sin considerar la afectación de los valores extremos). En R Studio utilizamos el comando “range” para encontrar los dos valores que nos permite encontrar el rango, que son la medida mínima y máxima. Luego se procede a realizar la diferencia entre estos datos y encontramos el rango.
range(muestra1$precio)## [1] 357 18729
max(muestra1$precio)- min(muestra1$precio)## [1] 18372
range(muestra1$quilate)## [1] 0.23 2.54
max(muestra1$quilate)-min(muestra1$quilate)## [1] 2.31
range(muestra1$tabla)## [1] 52 66
max(muestra1$tabla)-min(muestra1$tabla)## [1] 14
La varianza de una variable aleatoria es una medida de dispersión definida como la esperanza del cuadrado de la desviación de dicha variable respecto a su media. Su unidad de medida corresponde al cuadrado de la unidad de medida de la variable. En R Studio usamos el comando “var” que nos permite hallar la varianza entre los dos datos que necesitemos.
var(muestra1$precio)## [1] 15323557
var(muestra1$quilate)## [1] 0.2066906
var(muestra1$tabla)## [1] 4.594817
La desviación estándar o desviación típica es una medida que se utiliza para cuantificar la variación o la dispersión de un conjunto de datos numéricos. Una desviación estándar baja indica que la mayor parte de los datos de una muestra tienden a estar agrupados cerca de su media (también denominada el valor esperado), mientras que una desviación estándar alta indica que los datos se extienden sobre un rango de valores más amplio. En R studio usamos el comando “sd” que nos permite hallar la desviación estándar entre los datos que necesitemos correlacionar.
sd(muestra1$precio)## [1] 3914.532
sd(muestra1$quilate)## [1] 0.4546324
sd(muestra1$tabla)## [1] 2.143552
El Coeficiente de Variación es una medida de dispersión que permite el análisis de las desviaciones de los datos con respecto a la media y al mismo tiempo las dispersiones que tienen los datos dispersos entre sí. En R Studio usamos el comando “sd” y el comando “mean”, y dividimos estas variables para hallar el coeficiente de variación,
sd(muestra1$precio)/mean(muestra1$precio)## [1] 1.01038
sd(muestra1$quilate)/mean(muestra1$quilate)## [1] 0.5754184
sd(muestra1$tabla)/mean(muestra1$tabla)## [1] 0.03736156
Los gráficos de dispersión visualizan la relación entre dos variables numéricas, de forma que una variable se muestra en el eje x y la otra, en el eje y. Para cada registro, se traza un punto donde las dos variables se intersecan en el gráfico. Cuando los puntos resultantes forman una estructura no aleatoria, existe una relación entre las dos variables.
Un diagrama de dispersión puede sugerir varios tipos de correlaciones entre las variables con un intervalo de confianza determinado. La correlación puede ser positiva (aumento), negativa (descenso), o nula (las variables no están correlacionadas).
ggplot(muestra1, aes(precio, quilate))+geom_point()Este gráfico demuestra de manera sencilla la correlación de los datos “quilate” en el eje Y y los datos “precio” en el eje X, los cuales sobre el plano expresan un diagrama de dispersión que explica de manera precisa la calidad de los diamantes.
ggplot(muestra1, aes(x=precio, y=quilate)) + geom_point()+stat_smooth(method = lm)## `geom_smooth()` using formula = 'y ~ x'
Se puede dibujar una línea de ajuste (llamada también “línea de tendencia”) con el fin de estudiar la correlación entre las variables.Una ecuación para la correlación entre las variables puede ser determinada por procedimientos de ajuste. Para una correlación lineal, el procedimiento de ajuste es conocido como regresión lineal y garantiza una solución correcta en un tiempo finito. En R Studio la línea de tendencia se obtiene con el comando “stat_smooth(method_lm)”, precedido por los datos que se desean correlacionar.
plot_ly(muestra1, x = ~ precio, y = ~ quilate, color = ~ corte)Gráfico Interactivo
Esta gráfica de dispersión nos muestra la correlación de los datos de dos variables cualitativas como lo son “precio” y “quilate” que estarán esparcidos por el plano cartesiano, y la variable cualitativa “corte” la cual determina según el color del punto la calidad del corte del diamante en varios ÍTEMS como lo son: ideal, premium, muy bueno, bueno y regular.
Las medidas de forma se usan para describir de que manera se distribuyen los datos, esto, teníendo en cuenta la simetría y que tan pronunciada es la punta de la distribución.
Para medir la simetría, se utiliza el coeficiente de sesgo, que puede tomar valores, menores, iguales o mayores que 0, indicando un sesgo negativo (a la izquierda), distribución simétrica o sesgo positivo (a la derecha) respectivamente.
Para la medición de la pronunciación del pico, se utiliza el coeficiente de curtusis, que puede tomar valores del mismo rango que el coeficiente de sesgo (<, = o > a 0), en este caso indicando una platocúrtica (chata), mesocúrtica (normal), y leptocúrtica (pico pronunciado).
Para hallar estas mediciones en R, utilizamos el mismo procedimiento que para las medidas de tendencia central. La función ds_tidy_stats, y después filtramos las columnas que nos interesan para esta sección.
nota: El coeficiente de sesgo aparece como ‘skew’ y el de curtosis como ‘kurtosis’
resumen1 <- ds_tidy_stats(muestra1)
resumen1 <- subset(resumen1, select = c(vars, skew, kurtosis))resumen1Ahora, utilizaremos histogramas de estas variables para visualizar los resultados de estas medidas.
Primero determinamos el número de intervalos utilizando la formula de Sturges
nclass.Sturges(precio)## [1] 11
Ya que todas las variables tienen la misma cantidad de datos, también compartirán el número de intervalos
Precio
hist(precio , breaks = seq(min(precio), max(precio), length.out = 12), main = "Histograma de Precios" , xlab = "", ylab = "Densidad", freq = FALSE, col = myPal)
lines(density(precio), col = "red", lwd = 2)Podemos evidenciar que el conjunto de datos tiene un sesgo considerable a la derecha y una forma leptocúrtica.
Quilate
hist(quilate , breaks = seq(min(quilate), max(quilate), length.out = 12), main = "Histograma de Quilates" , xlab = "", ylab = "Densidad", freq = FALSE, col = myPal)
lines(density(quilate), col = "red", lwd = 2)En este caso también podemos ver un sesgo a la derecha y forma leptocúrtica, sin embargo, ambos son menores que en el caso de los precios.
Tabla
hist(tabla , breaks = seq(min(tabla), max(tabla), length.out = 12), main = "Histograma de Tabla" , xlab = "", ylab = "Densidad", freq = FALSE, col = myPal)
lines(density(tabla), col = "red", lwd = 2)Para la medida tabla vemos al igual que en el caso de la variable precios, un sesgo a la derecha (aunque menos pronunciado), y una forma achatada, aunque cercana a una figura mesocúrtica, como también es evidente en su coeficiente de curtosis cercano a 0. Podemos decir que este conjunto tiene la distribución y forma más cercana a la “normal”.
Profundidad
hist(profundidad , breaks = seq(min(profundidad), max(profundidad), length.out = 12), main = "Histograma de Profundidad" , xlab = "", ylab = "Densidad", freq = FALSE, col = myPal)
lines(density(profundidad), col = "red", lwd = 2)Finalmente, para la variable de profundidad, vemos un muy ligero sesgo (el menor de todos) a la izquierda. Además, una curtosis considerablemente alta.
Gráfico de caja para ver valores atípicos en el precio de los diamantes según la variación esperada en el valor según la concentración de el número de muestras
plot_ly(data = muestra1, color = ~ corte,
type="box",x= ~ precio)Gráfico Interactivo
Esta grafica nos muestra que el corte influye mucho en el precio final del diamante, esto debido a que a medida que va aumentando el tipo de corte, el valor máximo esperado y la distancia entre la mediana y el cuartil 3 se va haciendo más grande, lo que significa que a medida que mejora esta característica, el precio del diamante varia haciéndose cada vez más caro y al ver que a medida que mejora el corte, aparecen cada vez más valores atípicos, corrobora que empieza a dejar de hacerse raro encontrar un diamante más caro a medida que mejora el nivel del corte. Cabe anotar que más o menos todas las medianas están en un mismo rango de precios, esto puede deberse a otros factores de igual o mayor peso como lo pueden ser el quilate o el tamaño.
plot_ly(data = muestra1, color = ~color, y = ~ precio,
type="box")Gráfico Interactivo
De este diagrama de caja se puede ver que hay 3 indicaciones en la claridad del diamante que tienen un rango intercuartílico muy pequeño,IF,VVS1 y I1, lo que nos indicaría que normalmente un diamante con alguna de esas referencias en claridad, será más económico respecto a las otras 5referencias, sin embargo teniendo en cuenta que las clasificaciones IF e VVSI son las que presentan menos imperfecciones, lo que significa que debería aumentar su precio, este efecto se puede presentar por otros parámetros que se toman en cuenta a la hora de tasar un diamante como lo puede ser el tamaño o el quilate, razón que justificaría la aparición de valores atípicos tan alejados del rango máximo esperado.
Viendo los otros 5 niveles de claridad, de los cuales también se pueden clasificar en otras 2 categorías, el nivel medio, lo tendrían las claridades SI1 y SI2, que tienen precios similares respecto a más o menos el mismo porcentaje de muestras, y el alto rango, de las claridades VVS2, VS1 y VS2, los cuales tienen valor alto respecto al precio en el cuartil 3 y en el valor máximo esperado, es decir 1.5 veces el rango intercuartílico, y un valor muy bajo entre la mediana y el cuartil 1, es decir que más de la mitad de las muestras varían mucho sus precios, siendo cada vez más caros, esto pudiendo deberse a alguna otra propiedad del diamante.
plot_ly(data = muestra1, color = ~ corte,
type="box",x= ~ quilate)Gráfico Interactivo
En esta grafica se muestra la influencia del corte en el nivel del quilate del diamante, se ve que a mayor peso, y por consiguiente tamaño, es más difícil conseguir mejores acabados, proporciones y brillo.
Destacando el corte ideal, el cual tiene tanto de los valores más bajos, como los valores más altos en sus puntos atípicos, esto nos puede decir que se tienen diamantes ideales tanto grandes como pequeños, siendo más común tener este tipo de cortes en diamantes de bajo quilate, cosa que se evidencia en el corrimiento de la mediana hacia abajo.
plot_ly(data = muestra1, color = ~ color,
type="box",y= ~ quilate)Gráfico Interactivo
De la muestra de 1000 diamantes sobre esta grafica se puede afirmar que el color del diamante va mejorando a medida que aumenta su quilate, cosa que se evidencia en el desplazamiento de las medianas de las cajas, que nos dice que los diamantes pequeños, o de pocos quilates suelen tener los peores colores.
plot_ly(data = muestra1, color = ~ claridad,
type="box",y= ~ quilate)Gráfico Interactivo
Este diagrama de cajas nos muestra que a medida que mejora la claridad, o que tan limpio es el diamante, se va haciendo más difícil o poco común encontrar uno grande o pesado, significando que los diamantes grandes suelen tener muchas imperfecciones. esto se evidencia en el desplazamiento de la caja y la mediana hacia arriba en quilates a medida que se va empeorando la claridad.
plot_ly(data = muestra1, color = ~ corte,
type="box",y= ~ profundidad)Gráfico Interactivo
Como información adicional de posible interés, en este diagrama se puede ver que de las 1000 muestras seleccionadas, es cada vez más frecuente encontrar diamantes con más profundidad a medida que el corte de este empeora.