Paquetes: - ggplot2
- gapminder
(necesita instalarse) - ggthemes
(necesita instalarse)
Paquetes: - ggplot2
- gapminder
(necesita instalarse) - ggthemes
(necesita instalarse)
Las variables numéricas son aquellas que representan números, y con ellas se pueden realizar operaciones aritméticas. Por ejemplo:
Las variables numéricas pueden ser continuas o discretas
Son variables que tienen un número infinito de valores entre dos valores cualquiera. Es decir, son medidas dentro de un rango continuo infinito de valores. Algunos ejemplos:
Por lo general estamos hablando de datos que se obtienen mediante procesos de medición.
Tomamos la estatura de dos personas, la primera mide 1.70m y la segunda 1.73m. ¿Cuántos valores posibles de estatura existen entre 1.70 m y 1.73m?
Podríamos estar tentados a pensar que los únicos valores posibles serían 1.71m y 1.72m. Sin embargo, si tenemos un instrumento de medición más preciso podría darnos un valor de 1.701m, 1.7113m, 1.70000001, 1.729999999, etc. Es decir, entre dos valores cualquiera de estatura, podemos tener infinitos valores.
Son variables que tienen un número contable de valores entre dos valores cualquiera. Algunos ejemplos:
Por lo general estamos hablando de datos que se obtienen mediante procesos de conteo o registro.
Tomamos la cantidad de hijos que tuvieron dos mujeres, la primera tuvo 3 hijos y la segunda tuvo 6. ¿Cuántos valores posibles de número de hijos existen entre 3 y 6?
En este caso, sí es posible decir que entre 3 y 6 sólo es posible tener 4 o 5 hijos. En ningún escenario posible una persona podría decir que tuvo 3.1, 4.5 o 5.999 hijos. Es decir, entre dos valores cualquiera de número de hijos por persona, tenemos un número limitado de valores posibles.
En algunos casos, las variables discretas tienen un rango muy grande de valores potenciales y tiene sentido tratarlos como variables continuas en nuestras tareas estadísticas. Por ejemplo:
Piensa en la población de El Vaticano versus la población en China. ¿Cuántos valores potenciales de población existen entre ambos valores?
Se refieren a características o atributos cuyas posibilidades de variación no se expresan en función de números o cantidades. Las variables categóricas contienen un conjunto finito de categorías o grupos distintos. Por ejemplo:
Las variables categóricas pueden ser nominales u ordinales
Las variables categóricas son ordinales cuando sí tienen un orden lógico natural. Es decir, las categorías representan valores que pueden ordenarse de menor a mayor o viceversa. Por ejemplo:
Las variables categóricas son nominales cuando no tienen un orden lógico natural. Es decir, las categorías no representan valores que pueden ordenarse de menor a mayor, o viceversa. Por ejemplo:
Dentro de tu grupo, discute de qué tipo son las siguientes variables:
Cuando realizamos nuestros gráficos, la computadora trata todos nuestros datos como si fueran números.
Miremos el gráfico de la siguiente diapositiva. Representa la cantidad de diamantes según su tipo de corte.
El gráfico representa el recuento de observaciones por cada categoría de la variable corte.
Antes de poder representar nuestros datos de forma gráfica, necesitamos, obviamente, tener los datos. En este caso, el set de datos luce de esta manera:
ggplot2::diamonds |> dplyr::count(cut) |> dplyr::rename(corte = cut, recuento = n)
## # A tibble: 5 x 2 ## corte recuento ## <ord> <int> ## 1 Fair 1610 ## 2 Good 4906 ## 3 Very Good 12082 ## 4 Premium 13791 ## 5 Ideal 21551
Vemos que la variable corte es netamente categórica. Sin embargo, asume una posición en el eje X. Internamente, R trata a las variables categóricas como numéricas discretas para poder representar su información en una escala gráfica.
Por esto, de ahora en adelante, cuando nos refiramos a variables discretas, nos estamos refiriendo tanto a variables categóricas como a numéricas discretas con poca cantidad de valores posibles.
La habilidad de crear gráficos a partir de los datos que recolectamos potencia nuestra capacidad de análisis. Los gráficos nos pueden ayudar a percibir de manera rápida patrones de comportamiento en nuestra data y, al mismo tiempo, resumir de manera visual aquello que queremos mostrar a nuestra audiencia.
Esta sesión tiene como objetivo explicar el uso de la gramática de los gráficos, un marco conceptual cuya aplicación permite realizar visualizaciones de datos de manera sencilla y coherente. No vamos a buscar explicar todos los elementos teóricos que existen detrás del marco conceptual mencionado. En cambio, preferimos explicar sólo los elementos clave, usando ejemplos claros para que, al finalizar la, cualquiera pueda intentar crear sus propios gráficos.
No somos las primeras personas en tratar de explicar este tema. De hecho, este tutorial será una adaptación del gran trabajo realizado por Chester Ismay y Albert Y. Kim en su libro Statistical Inference via Data Science: A ModernDive into R and the Tidyverse.
Durante esta sesión usaremos el conjunto de datos gapminder
que viene incluido dentro del paquete gapminder
para los gráficos de ejemplo. Si aún no cuentas con el paquete, puedes instalarlo usando el siguiente código en la consola.
install.packages("gapminder")
La instalación de paquetes es un proceso que debe realizarse una sola vez. Cuando requieras usar un paquete instalado debes llamarlo usando la función library()
.
library(gapminder)
gapminder
## # A tibble: 1,704 x 6 ## country continent year lifeExp pop gdpPercap ## <fct> <fct> <int> <dbl> <int> <dbl> ## 1 Afghanistan Asia 1952 28.8 8425333 779. ## 2 Afghanistan Asia 1957 30.3 9240934 821. ## 3 Afghanistan Asia 1962 32.0 10267083 853. ## 4 Afghanistan Asia 1967 34.0 11537966 836. ## 5 Afghanistan Asia 1972 36.1 13079460 740. ## 6 Afghanistan Asia 1977 38.4 14880372 786. ## 7 Afghanistan Asia 1982 39.9 12881816 978. ## 8 Afghanistan Asia 1987 40.8 13867957 852. ## 9 Afghanistan Asia 1992 41.7 16317921 649. ## 10 Afghanistan Asia 1997 41.8 22227415 635. ## # ... with 1,694 more rows
Recuerda que gapminder
es un set de datos que ha sido previamente limpiado y ordenado. Normalmente, estos son pasos previos que debe realizar el analista de datos.
El paquete ggplot2
, elaborado por Hadley Wickham es la implementanción en R de la gramática de los gráficos, teoría desarrollada por Leland Wilkinson.
# Sólo ggplot2 library(ggplot2)
Puedes cargar ggplot2
individualmente o junto con los paquetes del tidyverse
.
# Todo el tidyverse library(tidyverse)
Del mismo modo que para construir una oración en nuestro idioma, hacemos uso de combinaciones de palabras (que pueden ser sustantivos, verbos, adjetivos, etc) siguiendo un conjunto de reglas conocido como gramática, la gramática de los gráficos nos brinda las reglas para construir gráficos estadísticos.
En pocas palabras, la gramática de los gráficos nos quiere decir que:
Un gráfico estadístico es el mapeo de variables en nuestra data hacia atributos estéticos de figuras geométricas.
Podemos construir un gráfico a partir de tres componentes esenciales:
data
: el set de datos que contiene las variables de interésgeom
: las figuras geométricas en cuestión. Nos referimos al tipo de objeto que podemos observar en un gráfico. Por ejemplo: puntos, líneas o barras.aes
: los atributos estéticos de la figura geométrica. Por ejemplo, su posición en los ejes x/y, color, forma y tamaño. Los atributos estéticos son mapeados a las variables contenidas en nuestro set de datos.Para mostrar lo simple que puede resultar graficar usando los componentes mencionados, usaremos datos del paquete gapminder
. Para este primer ejemplo utilizaremos sólo los datos de expectativa de vida en Perú a lo largo de los años. Para ello crearemos datos_peru
usando algunas funciones del paquete dplyr
.
library(dplyr) datos_peru <- filter(gapminder, country == "Peru")
Ahora que tenemos df_ejemplo
, sólo necesitamos usar dos líneas de código para ver la evolución de la expectativa de vida de los peruanos. Recuerda que para ello hemos cargado previamente ggplot2
.
ggplot(data = datos_peru, mapping = aes(x = year, y = lifeExp)) + geom_line()
¿Cómo funciona la gramática? Anteriormente te habíamos mencionado que ggplot
requiere tres componentes básicos para crear gráficos: los datos, el mapeo de variables y las figuras geométricas que representarán nuestros datos.
En el código anterior:
ggplot()
que nuestra data será df_ejemplo
.year
al eje X y la variable lifeExp
al eje Y.ggplot
para representar nuestros datos. Esta instrucción se la indicamos con geom_line()
, pidiendole que lo haga con una línea.Debido a que el primer argumento siempre será nuestra data, y en el mapeo de variables los dos primeros atributos siempre corresponden al eje X y al eje Y, podemos reescribir el código del gráfico anterior de forma más concisa.
Para estos parámetros tan comunes (data
,x
, y
), no necesitamos especificar su nombre cada vez.
ggplot(datos_peru, aes(year, lifeExp)) + geom_line()
ggplot(data = datos_peru, mapping = aes(x = year, y = lifeExp)) + geom_line()
ggplot(datos_peru, aes(year, lifeExp)) + geom_line()
Los gráficos creados con ggplot()
son un nuevo tipo de objeto. Como tal, puede usarse el operador de asignamiento (<-
) para almacenarlos en nuestro Environment. Por ejemplo, creamos el objeto gráfico
.
grafico <- ggplot(datos_peru, aes(year, lifeExp))
Ahora sólo haría falta agregarle una geometría. Para ello, hacemos uso del operador de adición (+
). Mira lo fácil que es cambiar entre un gráfico de líneas, de columnas y de puntos.
grafico + geom_line()
grafico + geom_col()
grafico + geom_point()
¿Cómo determinar el correcto tipo de gráficos según los datos que tengo?
¿En qué casos debo usar columnas?¿En qué casos debo usar puntos?
Con el fin de conseguir una explicación simple, nos limitamos a mostrar cinco tipos de gráfico que son de uso común y que además permiten entender los usos de la gramática en su forma básica.
El primer tipo de gráfico que veremos es el de barras. Resulta muy útil para mostrar estadísticas de resumen de nuestros datos categóricos. Por ejemplo, podemos ver cuántos países encontramos por continente en las observaciones de gapminder
correspondientes al año 2002 y su promedio de expectativa de vida. Podemos obtener esa información usando funciones de dplyr
.
Si queremos contar con columnas verticales, mapeamos nuestra variable discreta al eje X y nuestra variable numérica al eje Y.
(paises_por_continente <- gapminder %>% filter(year == 2002) %>% group_by(continent) %>% summarise( recuento = n(), promedio_exp = mean(lifeExp) ) %>% ungroup())
## # A tibble: 5 x 3 ## continent recuento promedio_exp ## <fct> <int> <dbl> ## 1 Africa 52 53.3 ## 2 Americas 25 72.4 ## 3 Asia 33 69.2 ## 4 Europe 30 76.7 ## 5 Oceania 2 79.7
Con esta información, podemos dibujar nuestro primer gráfico de barras haciendo uso de geom_col()
.
ggplot(paises_por_continente, aes(continent, recuento)) + geom_col()
El siguiente tipo de gráfico ya lo conocemos. Consiste en líneas que nos sirven generalmente para analizar la evolución en el tiempo de determinadas variables. Debido a ello, es muy común mapear en el exe X alguna variable de tiempo, y en el eje Y alguna variable continua, que sería nuestra variable de interés.
Con gapminder
podemos analizar la evolución del PBI per cápita peruano de 1952 a 2007. Para ello filtraremos sólo las observaciones pertenecientes a Perú. Para generar el gráfico de líneas usamos geom_line()
.
ggplot(datos_peru, aes(year, gdpPercap)) + geom_line()
¿En qué periodo se ve una gran caída? ¿Cuántos años fueron necesarios para recuperar la misma cifra? Este tipo de preguntas son las que un gráfico de líneas nos permite revisar.
Es posible hacer otro tipo de análisis usando una sola variable. El gráfico de columnas nos permitía ver cómo se distribuyen las observaciones de nuestras variables discretas. Podemos esperar que exista un gráfico que nos muestre la distribución de variables continuas.
Esto lo conseguimos con los histogramas. En lugar de mostrar la frecuencia de observaciones según categorías, nos permiten agrupar los datos por intervalos. Veamos cómo se distribuye el PBI per cápita de todos los países del mundo en el año 2007. Para generar el histograma usamos geom_histogram()
. Por defecto, ggplot()
divide nuestra data en 30 intervalos.
datos_2007 <- filter(gapminder, year == 2007)
En este caso, sólo indicaremos la variable del eje X, porque el eje Y se calcula en base a los intervalos automáticos.
ggplot(datos_2007, aes(gdpPercap)) + geom_histogram()
Con esto podemos responder alguna preguntas como:
Otra manera de ver la distribución de nuestros valores es haciendo uso de diagramas de caja o boxplot. En este caso, es más entenderlo si primero hemos visto alguno. Para dibujarlo, usamos geom_boxplot()
.
Para obtener una caja que represente a todo nuestro conjunto de datos, sólo necesitamos especificar el eje X.
ggplot(datos_2007, aes(gdpPercap)) + geom_boxplot()
Vemos una especie de “caja” que busca representar nuestros valores. La línea negra remarcada al centro de la caja nos indica dónde encontramos el punto medio de nuestros datos (la mediana). Esta representación nos permite ubicar nuestros datos en cuatro segmentos importantes:
Habrás podido notar que además aparecen algunos puntos dibujados fuera de nuestros cuatro segmentos. Estos representan valores extremos, también conocidos como outliers. Pueden aparecer tanto en el lado más alto como en el más bajo de nuestros datos. Para determinar su existencia se utiliza un cálculo usando el Rango Intercuartil. Si no entiendes esta parte por ahora, no te preocupes, con que entiendas que son valores extremos es suficiente.
Algo muy útil que nos permiten hacer los boxplot es comparar la distribución de nuestros valores entre diferentes categorías. Para ello, podemos mapear una variable discreta al eje Y. Por ejemplo, el PBI per cápita de los cinco continentes.
ggplot(datos_2007, aes(gdpPercap, continent)) + geom_boxplot()
De esta manera, podemos ver que incluso los valores más altos de PBI en África no alcanzan a los valores medianos de Europa y Oceanía. También podemos ver que aunque Asia tiene países con valores de PBI per cápita comparables con los más altos de Europa, al menos la mitad de sus países se ubica en los niveles de África.
Además de ver las características de una variable en particular, ya sea viendo su evolución en el tiempo o su distribución, podemos pensar en cómo analizar la relación entre nuestras variables. Por ejemplo, ¿qué relación existe entre el PBI per cápita y la expectativa de vida? Piensa un poco en esto y trata de responder la siguiente pregunta: ¿Existirá mayor expectativa de vida en países que tienen un PBI per cápita alto?
Para responder a esto podemos hacer uso de un diagrama de dispersión, también conocido como diagrama de puntos. Nos sirve para ver la relación existente entre dos variables continuas, también conocida como correlación.
A continuación, analizaremos la relación entre el PBI per cápita y la expectativa de vida de todos los países en el año 2007. Para dibujar nuestro diagrama de puntos, hacemos uso de geom_point()
. Las variables de interés van en cada uno de nuestros ejes. En este caso, como esperamos que el PBI per cápita influya en la epectativa de vida, lo colocamos en el eje X. Cada uno de los puntos de nuestro gráfico corresponde a un país.
ggplot(datos_2007, aes(gdpPercap, lifeExp)) + geom_point()
Algo que podemos notar rápidamente es que existen gran cantidad de países con un PBI per cápita bajo, esto hace que haya mucha aglomeración en esa parte del gráfico. Aunque esto nos dificulta un poco el análisis, podemos ir respondiendo la siguiente pregunta: ¿La expectativa de vida en los países con mayor PBI per cápita es alta o baja?
Para ver la distribución en los países con menor PBI per cápita podemos filtrar sólo los valores menores a 10000.
datos_2007_filtrado <- filter(datos_2007, gdpPercap < 10000)
ggplot(datos_2007_filtrado, aes(gdpPercap, lifeExp)) + geom_point()
Nuevamente, podemos ver que los países con mayor PBI per cápita tienen la expectativa de vida más alta. Sin embargo, ahora además podemos ver con mayo claridad que aunque en los países con menor PBI per cápita la expectativa de vida es variada, generalmente se encuentra en los valores más bajos.
getwd()
en la consola. Comparte el resultado en el chat de la llamada.datos_2007
de tal manera que puedas obtener los datos de 1952 y crear el objeto datos_1952
.datos_1952
Hasta el momento hemos conocido cómo cambiar en nuestras geometrías los atributos estéticos de posición en los ejes X y Y. Sin embargo, cuando pensamos tradicionalmente en atributos estéticos, hay otro tipo de características que también nos vienen a la mente.
Tres de ellas pueden ser el color, tamaño y forma de las figuras geométricas que utilizamos en nuestros gráficos. Con ggplot2
podemos mapear alguna variable de nuestro set de datos a estos atributos.
Pensemos en un gráfico de barras. Habíamos visto que es posible crearlo usando geom_bar()
. Por ejemplo, la cantidad de países en cada continente para el año 2007.
ggplot(datos_2007, aes(continent)) + geom_bar()
El gráfico nos permite identificar una columna con cada uno de los continentes, pero para ello es necesario leer las etiquetas en el eje X. Otra manera de saber que estamos refiriéndonos a continentes distintos es haciendo uso del atributo fill
, que se refiere al relleno de las barras.
ggplot(datos_2007, aes(continent, fill = continent)) + geom_bar()
Vemos que además de colorear cada una de nuestras barras, ggplot2
automáticamente le agrega una leyenda a nuestro gráfico para saber qué categoría representa cada color mostrado. En un gráfico de barras, esta información ya la presentaban las etiquetas del eje X.
Para poder apreciar cómo el color nos puede apreciar a explotar nuestros datos, agreguémosle color de relleno a un diagrama de puntos. Recordemos que para ello hacemos uso de geom_point()
. Por ejemplo, para ver la relación entre PBI per cápita y esperanza de vida en el año 2007. Haciendo uso del color, podemos ver cómo se posicionan los países según su continente.
ggplot(datos_2007, aes(gdpPercap, lifeExp, color = continent)) + geom_point()
Podemos seguir viendo que existe una relación positiva entre PBI per cápita y expectativa de vida, pero además ahora podemos ver a qué continente pertenecen los países con PBI per cápita más alto y más bajo.
Sin embargo, te habrás dado cuenta que para el código de barras hemos usado el argumento fill
pero en el diagrama de puntos hemos usado color
.
¿Por qué la diferencia? Tiene que ver con la figura geométrica que estamos utilizando. Por lo general debemos entenderlo de la siguiente manera:
fill
: permite modificar el relleno de la figura.color
: permite modificar los bordes o líneas de la figura.Del mismo, usar el atributo de tamaño nos permite identificar nueva información acerca de nuestros datos. Por ejemplo, podemos ver la población de los países en nuestro diagrama de puntos para hacernos una idea de a quiénes representa. Para ello, usamos el argumento size
y lo mapeamos a la variable pop
.
ggplot(datos_2007, aes(gdpPercap, lifeExp, size = pop)) + geom_point()
Nuevamente, ggplot2
nos proporciona una leyenda automática. Así podemos ver que para el año 2007, los países con los valores de población más extremos, tienen un PBI per cápita bajo. Podemos combinar al mismo tiempo el uso de tamaño con el color para ver también la distribución según continentes.
ggplot(datos_2007, aes(gdpPercap, lifeExp, size = pop, color = continent)) + geom_point()
Debes tener en cuenta que no todo el mundo percibe los colores de la misma manera. En casos como esos, usar una forma distinta para nuestras categorías permite mostrar con mayor claridad las diferencias. Para ello, usamos el atributo shape
.
ggplot(datos_2007, aes(gdpPercap, lifeExp, shape = continent, color = continent)) + geom_point()
Por último, usar etiquetas significativas hará que nuestros gráficos hablen por sí solos. Para ello, agregamos la función labs()
a nuestro gráfico. En ella, entre otras cosas, podemos modificar lo siguiente:
title
: el título principal de nuestro gráficosubtitle
: el subtítulo del gráficocaption
: la nota al pie de nuestro gráficox
: la etiqueta del eje Xy
: la etiqueta del eje YConservamos grafico_puntos
para usarlo como ejemplo.
grafico_dispersion <- ggplot(datos_2007, aes(gdpPercap, lifeExp, shape = continent, color = continent)) + geom_point()
grafico_dispersion
labs()
para títulosgrafico_dispersion + labs(title = "Relación entre PBI per cápita y expectativa de vida", subtitle = "Los cinco continentes en el año 2007")
labs()
para los ejesgrafico_dispersion + labs(x = "PBI per cápita", y = "Expectativa de Vida")
labs()
para caption y leyendagrafico_dispersion + labs(caption = "Fuente: Proyecto gapminder", color = "Continente", shape = "Continente")
Podemos juntar todas las etiquetas dentro de una misma llamada a labs()
. De paso, guardamos grafico_final()
para usarlo más adelante.
grafico_final <- grafico_dispersion + labs(title = "Relación entre PBI per cápita y expectativa de vida", subtitle = "Los cinco continentes en el año 2007", caption = "Fuente: Proyecto gapminder", x = "PBI per cápita", y = "Expectativa de Vida", color = "Continente", shape = "Continente")
grafico_final
Es probable que además de cambiar los colores, forma y etiquetas de un gráfico, busques modificar otros elementos estéticos que no corresponden a datos.
Lamentablemente, escapa de la finalidad de esta sesión llegar a enseñarte esto. Sin embargo, ggplot2
viene con temas predefinidos que te pueden permitir ahorrarte el trabajo de hacerlos por ti mismo.
A continuación, algunos ejemplos de estos modelos aplicados a grafico_final
.
theme_bw()
grafico_final + theme_bw()
theme_classic()
grafico_final + theme_classic()
theme_light()
grafico_final + theme_light()
theme_minimal()
grafico_final + theme_minimal()
theme_void()
grafico_final + theme_void()
ggthemes
También existen otros paquetes que incluyen temas para gráficos. Uno de los más conocidos es ggthemes
.
Para instalarlo.
install.packages("ggthemes")
Una vez instalado, no olvides llamarlo con library()
para usar sus temas.
library(ggthemes)
theme_base()
grafico_final + theme_base()
theme_calc()
grafico_final + theme_calc()
theme_clean()
grafico_final + theme_clean()
theme_economist()
grafico_final + theme_economist()
theme_wsj()
grafico_final + theme_wsj()
theme_stata()
grafico_final + theme_stata()
Si deseas conocer más sobre ggplot2
puedes revisar su libro oficial y su “Cookbook” oficial.
Gracias por tu participación en la sesión de hoy. Para terminar, llena la encuesta de retroalimentación.