Datos
Como ejemplo, vamos a utilizar los datos del estudio Framingham sobre riesgo cardiovascular (https://es.wikipedia.org/wiki/Estudio_de_Framingham). Podés encontrarlos en el paquete LocalControl.
<- LocalControl::framingham
framingham names(framingham) <- c("Sexo", "Colesterol", "Edad", "IMC", "BPvar", "Frecuencia cardíaca", "Glucosa", "Fuma", "Resultado", "Tiempo", "Cigarrillos por día")
<- framingham %>%
framingham mutate(Sexo = ifelse(Sexo == 1, "Femenino", "Masculino"),
Fuma = ifelse(Fuma == 0, "No", "Si"),
Resultado = case_when(Resultado == 0 ~ "Sin evento",
== 1 ~ "Con hipertensión",
Resultado == 2 ~ "Fallecido")) Resultado
Para reproducir los gráficos, instalá y cargá los siguientes paquetes:
library(tidyverse)
library(ggthemr) # Temas
library(scales) # Para incluir porcentajes en un eje
library(treemapify) # para el gráfico de rectángulos
# Definit tema
ggthemr("flat")
Gráficos univariados
Son aquellos gráficos que se utilizan para mostrar la distribución de una única variable.
Variables categóricas
Usualmente, este tipo de variables se visualiza con gráficos de barras o de sectores. Si bien su uso es menos frecuente, también pueden utilizarse gráficos de rectángulos o treemap.
Vamos a graficar la situación de los 2316 participantes al último registro del estudio.
Gráfico de barras
ggplot(data = framingham, aes(x = Resultado)) +
geom_bar()
En el eje x podemos ver las distintas categorías de la variable “Resultado” y en el eje y un conteo de cuántas veces aparece cada categoría en la base de datos, es decir, cuántos participantes pertenecen a cada categoría. Ese conteo se hace automáticamente, solo necesitamos indicar la variable categórica que nos interesa.
El gráfico muestra que, de los 2316 participantes, alrededor de 700 estaban vivos al momento de terminar el estudio y no tenían hipertensión, un poco más de 200 habían fallecido y más de 1000 estaban vivos pero tenían hipertensión.
También podemos graficar la proporción o porcentaje de participantes, en lugar de la frecuencia absoluta.
%>%
framingham count(Resultado) %>%
mutate(prop = n/sum(n)) %>%
ggplot(aes(x = Resultado, y = prop)) +
geom_bar(stat = "identity") +
scale_y_continuous(labels = scales::percent)
En muchas ocasiones, los porcentajes son más fáciles de interpretar, pero el resultado es el mismo.
Gráfico de sectores
%>%
framingham count(Resultado) %>%
mutate(porcentaje = round(n/sum(n)*100), 1) %>%
ggplot(mapping = aes(factor(1), y = porcentaje, fill = Resultado)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y") +
theme_void()
En el gráfico de sectores, el círculo completo representa el total de las observaciones y cada segmento, la proporción o porcentaje de observaciones que pertenecen a una categoría particular.
Este gráfico muestra que la mayor parte de los participantes finalizaron el estudio con hipertensión y una proporción mucho menor sin hipertensión. La categoría menos frecuente fue la de participantes que fallecieron durante el estudio.
Podemos incluir etiquetas para tener una mejor idea de qué porcentaje de participantes pertenece a cada grupo.
%>%
framingham count(Resultado) %>%
mutate(porcentaje = round(n/sum(n)*100), 1) %>%
ggplot(mapping = aes(factor(1), y = porcentaje, fill = Resultado)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y") +
theme_void() +
geom_text(aes(label = paste(porcentaje,"%", sep = "")),
position = position_stack(vjust = 0.5))
El gráfico de sectores no es útil si contamos con muchas categorías o si las categorías siguen un orden específico (por ejemplo, “alto”, “medio,”bajo").
Gráficos de rectángulos (treemap)
%>%
framingham count(Resultado) %>%
ggplot(mapping = aes(fill = Resultado, area = n, label = Resultado)) +
geom_treemap() +
geom_treemap_text(place = "centre") +
theme(legend.position = "none")
El gráfico de rectángulos (treemap) es equivalente al de sectores, cada rectángulo representa la proporción de participantes que pertenece a una categoría determinada.
Si bien es poco usado, tiene dos ventajas sobre el gráfico anterior: visualmente, es más sencillo discriminar el tamaño de rectángulos que de triángulos y permite incluir un mayor número de categorías.
Variables cuantitativas
Para observar la distribución de los datos en variables cuantitativas, se utilizan principalmente los histogramas y los gráficos de densidad.
Vamos a graficar la distribución de los participantes según su nivel de colesterol.
Histograma
El histograma es equivalente al gráfico de barras en el caso de variables categóricas, pero como la variable numérica no puede agruparse en categorías se necesita una transformación.
ggplot(data = framingham, mapping = aes(x = Colesterol)) +
geom_histogram(color = "white", binwidth = 20)
El gráfico muestra los valores numéricos agrupados en intervalos o “bins” de igual ancho. Cada intervalo se grafica como una barra, y su altura corresponde a la cantidad de observaciones que caen dentro de ese intervalo.
En este caso, los intervalos tienen un ancho de 20 puntos. El colesterol mínimo detectado es de 113, por lo que la primera barra representa a la cantidad de participantes que tienen un colesterol de entre 110 y 130. Sólo dos participantes tienen valores dentro de este rango, por lo que la primer barra no es visible. La segunda barra incluye a los participantes que tienen valores de 130 a 150, y así hasta cubrir el rango total de valores.
Podemos ver que los valores de colesterol más frecuentes se encuentran entre 220 y 240 (la barra más alta).
ggplot(data = framingham, mapping = aes(x = Colesterol)) +
geom_histogram(color = "white", binwidth = 50)
El ancho de los intervalos influye sobre la forma que toma el gráfico. Es una buena práctica realizar el histograma con distintos intervalos.
Curvas de densidad
Un gráfico de densidad busca mostrar la distribución de probabilidades que subyace a los datos. Se toma el rango total de valores, no los intervalos.
ggplot(data = framingham, mapping = aes(x = Colesterol)) +
geom_density(fill = "#3498DB")
Las curvas de densidad se escalan de manera que el área bajo la curva sea igual a uno (el 100% de las observaciones). Esto hace que la escala del eje y sea confusa, porque depende de las unidades del eje x. En el caso de este gráfico, el eje y toma valores de entre 0 y 0.01.
No es tan claro para ver la cantidad o el porcentaje de participantes dentro de un rango específico, pero a veces muestra la distribución de la variable de forma más precisa porque no se ve afectado por el número de intervalos o bins.
Boxplots
ggplot(data = framingham, mapping = aes(x = Colesterol)) +
geom_boxplot() +
ylim(-1, 1) +
xlim(60, 500)
Al igual que los histogramas o los gráficos de densidad, los boxplots muestran la distribución de una variable cuantitativa. Permiten ver si la misma es simétrica o no, y qué tan dispersos se encuentran los datos alrededor de una medida central.
En general, no se los utiliza tanto como a los otros dos cuando de trata de describir una variable cuantitativa únicamente, pero resultan muy útiles cuando se quiere evaluar la distribución en distintos grupos.
El gráfico se construye en base a cinco medidas: el valor mínimo, el primer cuartil (Q1), la mediana (Q2), el tercer cuartil (Q3) y el valor máximo.
La distancia entre el 1er y 3er cuartil es el rango intercuartil (IQR). El valor mínimo se obtiene restando al 1er cuartil el rango intercuartil multiplicado por 1.5. El valor máximo se obtiene sumando al 3er cuartil el rango intercuartil multiplicado por 1.5.
Entre el 1er y 3er cuartil se ubican el 50% de las observaciones.
Las observaciones por debajo del valor mínimo y por encima del valor máximo pueden ser observaciones extremas o outliers.
Gráficos bivariados
Son aquellos gráficos que se utilizan para mostrar la asociación entre dos variables.
Asociación entre dos variables categóricas
¿Se asocia el fumar con el resultado al final del estudio?
Gráfico de barras agrupadas
ggplot(data = framingham, aes(x = Fuma, fill = Resultado)) +
geom_bar(position = "dodge")
Es equivalente al gráfico de barras univariado, pero con barras y colores adicionales en función de una segunda variable categórica.
Gráfico de barras segmentadas
ggplot(data = framingham, aes(x = Fuma, fill = Resultado)) +
geom_bar(position = "fill")
En los gráficos de barras segmentadas una barra suma el 100% de las observaciones de una de las categorías. Por ejemplo, la primera barra representa a todos los participantes no fumadores.
Luego, la barra se separa en partes que representan el porcentaje de observaciones dentro de esa categoría que caen dentro de un subgrupo de otra categoría. En este caso, los segmentos de la primera barra muestran, del total de no fumadores, el porcentaje de participantes con hipertensión (azul), libres de evento (amarillo) o muertos (verde) al final del estudio.
A diferencia del gráfico de barras agrupadas, permite comparar como se distribuyen los valores de la variable resultado en cada categoría de la variable suma.
En base a este gráfico podemos decir que hay una mayor proporción de participantes con hipertensión entre los no fumadores que entre los fumadores, y una proporción menor de participantes sin evento.
Por otro lado, el grupo de fumadores tiene una mayor proporción de participantes que fallecieron antes de finalizar el estudio.
Asociación entre una variable categórica y una cuantitativa.
¿Se asocia el resultado con el nivel de colesterol?
Histogramas y gráficos de densidad agrupados
ggplot(data = framingham, aes(x = Colesterol, fill = Resultado)) +
geom_histogram(binwidth = 20, color = "white")
Podemos ver que, si bien hay más observaciones dentro del grupo de los hipertensos que en cualquiera de los otros dos, la distribución es similar en los tres grupos.
Esto puede resultar más claro en un gráfico de densidad, ya que no depende de la cantidad de observaciones.
ggplot(data = framingham, aes(x = Colesterol, fill = Resultado)) +
geom_density(alpha = 0.5, color = "darkblue")
Boxplots
ggplot(data = framingham, aes(x = Resultado, y = Colesterol)) +
geom_boxplot()
Al igual que con los gráficos anteriores, se puede observar que la distribución es similar en los tres grupos. Este gráfico es más útil para visualizar si las medias o medianas difieren entre los grupos.
Gráficos de violín
Este gráfico es una combinación de un boxplot y bigotes y un gráfico de densidad superpuesto.
ggplot(data = framingham, aes(x = Resultado, y = Colesterol)) +
geom_violin() +
geom_boxplot(width = .5)
Gráficos de medias con barra de error
Este gráfico muestra el valor medio de una variable numérica para cada valor de una variable categórica, y una medida de dispersión que puede ser el error estándar o el desvío estándar.
%>%
framingham group_by(Resultado) %>%
summarise(Colesterol_medio = mean(Colesterol),
es = sd(Colesterol)/sqrt(n())) %>%
ggplot(mapping = aes(x = Resultado, y = Colesterol_medio)) +
geom_point() +
geom_errorbar(aes(ymin = Colesterol_medio - es,
ymax = Colesterol_medio + es),
width = .1)
En este caso graficamos el error estándar. A simple vista parece que el valor promedio de colesterol para el grupo sin evento es notablemente menor. Sin embargo, esto se debe a que el rango de valores que se mapeo al eje y es bastante acotado. Si ampliamos el rango, vemos algo distinto.
%>%
framingham group_by(Resultado) %>%
summarise(Colesterol_medio = mean(Colesterol),
es = sd(Colesterol)/sqrt(n())) %>%
ggplot(mapping = aes(x = Resultado, y = Colesterol_medio)) +
geom_point() +
geom_errorbar(aes(ymin = Colesterol_medio - es,
ymax = Colesterol_medio + es),
width = .1) +
ylim(60, 450)
Asociación entre dos variables cuantitativas.
¿Se asocia el colesterol con la variabilidad en la presión sanguínea (BPvar)?
Gráfico de dispersión
Este gráfico representa a cada observación como un punto. Este punto se ubica en base a los valores que la observación toma en dos variables cuantitativas, una ubicada en el eje x y otra en el eje y.
ggplot(data = framingham,
mapping = aes(x = IMC, y = BPvar)) +
geom_point()
Cuando existe una asociación entre las variables, esperamos ver que: - cuando los valores de una de las variables aumentan los de la otra también (asociación positiva). - cuando los valores de una de las variables disminuyen los de la otra aumentan (asociación negativa).
En este caso, no resulta tan claro a simple vista. Podemos agregar una recta de tendencia para ayudarnos.
ggplot(data = framingham,
mapping = aes(x = IMC, y = BPvar)) +
geom_point() +
geom_smooth(method = "lm")
La recta de tendencia sugiere que existe una asociación positiva entre las variables. A mayor IMC, mayor variabilidad en la presión sanguínea.