= ['Iceland', 'Norway', 'United Kingdom', 'Japan', 'Canada',
lista_paises 'Germany', 'New Zealand', 'France', 'Israel', 'Argentina', 'United States',
'Chile', 'Italy', 'Brazil', 'Mexico', 'South Africa', 'China', 'Algeria',
'India', 'Kenia']
UNIDAD 4 - Parte 2
Una serie temporal es una secuencia de observaciones de una variable registradas en puntos específicos en el tiempo.
Para visualizar este tipo de datos, se suelen utilizar gráficos de líneas, en los que se conectan las observaciones individuales entre sí para resaltar el orden temporal.
Las líneas no representan datos en sí, sino que actúan como una guía visual que facilita la identificación de tendencias, estacionalidades y cambios significativos a lo largo del tiempo.
Para ejemplificar, trabajaremos con el dataset data_internet.csv
, del Banco Mundial, que contiene información acerca del porcentaje de personas con acceso a Internet a lo largo del tiempo en una serie de países.
Previamente, realizaremos tareas de limpieza y un filtrado de información (ver notebook) para considerar sólo los años a partir de 1990 y los datos correspondientes a los países que se encuentran en lista_paises
:
Luego de realizadas las tareas de limpieza y adecuación, las primeras filas del dataset lucen de la siguiente manera:
1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | ... | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Country Name | |||||||||||||||||||||
Argentina | 0.000 | 0.000000 | 0.002993 | 0.029527 | 0.043706 | 0.086277 | 0.141955 | 0.280340 | 0.830767 | 3.284482 | ... | 55.80 | 59.90 | 64.700000 | 68.043064 | 70.968981 | 74.294907 | 77.700000 | 79.946952 | 85.514386 | 87.150707 |
Brazil | 0.000 | 0.003288 | 0.012946 | 0.025498 | 0.037673 | 0.105138 | 0.450789 | 0.786079 | 1.477875 | 2.038732 | ... | 48.56 | 51.04 | 54.551002 | 58.327952 | 60.872540 | 67.471285 | 70.434283 | 73.912440 | 81.342694 | 80.689893 |
Canada | 0.361 | 0.570386 | 0.915981 | 1.184558 | 2.378694 | 4.163525 | 6.760240 | 15.072357 | 24.897400 | 36.186440 | ... | 83.00 | 85.80 | 87.120000 | 90.000000 | 91.160000 | 92.701372 | 94.640000 | 91.912897 | 92.300000 | 92.834017 |
3 rows × 32 columns
Como primer ejemplo, supongamos que queremos construir un gráfico para visualizar la evolución del porcentaje de acceso a Internet de la población argentina en el periodo 1990-2021. Lo primero es filtrar esa información y darle forma de DataFrame
.
Atendiendo a que la columna anio
es de tipo object
, la transformamos en int64
para poder realizar luego algunas modificaciones de escala en el gráfico:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32 entries, 0 to 31
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 anio 32 non-null int64
1 porcentaje 32 non-null float64
dtypes: float64(1), int64(1)
memory usage: 644.0 bytes
Luego, utilizamos la función lineplot()
de Seaborn
para representar estos datos en la forma de un gráfico de líneas:
Sobre el gráfico anterior, podemos agregar los datos individuales en la forma de puntos seteando el parámetro marker = 'o'
:
Supongamos ahora que queremos construir un gráfico para comparar la evolución del porcentaje de acceso a Internet en Argentina, India y Estados Unidos en el periodo 1990-2021. Lo primero es filtrar esa información y darle forma de DataFrame
en formato largo:
Podemos representar las observaciones correspondientes a cada país, seteando el parámetro hue = 'Country Name'
dentro de sns.lineplot()
:
Para modificar características de la leyenda, como el título y las etiquetas, podemos agregar las siguientes líneas de código:
¿Qué es lo que hace este código?
plt.gca()
devuelve el objeto Axes
de los ejes actuales del gráfico (“get current axes”), es decir, el “área de dibujo” donde se colocan todos los elementos visuales como líneas, barras, etiquetas, leyendas, etc.
En Matplotlib, handles
son los objetos gráficos que representan los elementos que aparecen en la leyenda de un gráfico. Estos pueden ser líneas, barras, o cualquier otro tipo de marcador visual que aparece en el gráfico y que luego se incluye en la leyenda para identificar los distintos elementos.
Por su parte, los labels
son las etiquetas asociadas a cada uno de esos objetos (handles
) que aparecen en la leyenda.
Veamos el gráfico con estas modificaciones:
Si quisiéramos incluir a todos los países en una única visualización, realizar un gráfico como el anterior podría volverse poco práctico, ya que implicaría mostrar información para 20 países simultáneamente, lo cual puede dificultar la lectura y la interpretación del gráfico:
['Iceland', 'Norway', 'United Kingdom', 'Japan', 'Canada', 'Germany', 'New Zealand', 'France', 'Israel', 'Argentina', 'United States', 'Chile', 'Italy', 'Brazil', 'Mexico', 'South Africa', 'China', 'Algeria', 'India', 'Kenia']
El total de países filtrados es: 20
El heatmap consiste en la representación gráfica bidimensisonal de una matriz de datos, en la que se utiliza una escala de colores para mostrar la magnitud de los valores/observaciones de una variable.
Su nombre deriva del uso tradicional de una paleta que recorre el espectro de colores cálidos a fríos.
Aunque esta visualización dificulta determinar los valores exactos que se muestran, hace un excelente trabajo al resaltar tendencias generales.
Para construir un heatmap con los datos del porcentaje de acceso a Internet de los 20 países entre los años 1990 y 2021, utilizaremos la función heatmap()
de la librería Seaborn
. Esta función representa gráficamente la matriz de datos, asignando colores a cada celda según el valor del porcentaje de acceso a Internet correspondiente a cada país y año.
Así luce el heatmap construido a partir de la matriz de datos:
Este es el código que se utilizó para construir el gráfico de la slide anterior, que incluye el uso de la paleta magma (cmap = 'magma'
) y modificaciones en los títulos de los ejes y de la escala de colores.
Una posible mejora del gráfico anterior consiste en ordenar los países según cuán temprano comenzaron a registrar un uso significativo de Internet.
🤓 Como ejercicio, modificar el heatmap construido para que los países se ordenen según el año en que al menos el 20% de su población accedió a Internet. Si bien este valor es arbitrario, permite realizar una mejor comparación del ritmo de adopción de Internet entre países.
Este debería ser el resultado:
Algunas clases atrás, utilizamos un Scatterplot para representar, en forma conjunta, las observaciones de las variables flipper_length y body_mass del dataset de los pingüinos del archipiélago Palmer:
El dataset incluye varias variables cuantitativas, por lo que deberíamos realizar un scatterplot diferente por cada par de variables que quisiéramos estudiar.
Afortunadamente, Seaborn
ofrece la función pairplot()
, que facilita la creación de una matriz de gráficos. Con un solo comando, podemos visualizar tanto la distribución individual de cada variable como las asociaciones entre pares, todo en un único gráfico.
El resultado es una matriz de scatterplots, uno para cada combinación posible de las variables cuantitativas seleccionadas. En la diagonal, se muestra un histograma para visualizar la distribución individual de las observaciones de cada una de ellas.
Si seteamos el parámetro hue = 'species'
hacemos visible el hecho de que, en ciertos casos, existen diferencias marcadas entre las especies Adelie, Chinstrap y Gentoo.
La diagonal muestra ahora gráficos de densidad para cada variable individual según la especie.
Un correlograma es una representación gráfica que muestra las correlaciones entre todas las combinaciones posibles de variables en un conjunto de datos (es la versión gráfica de una matriz de correlación de Pearson).
Podemos construirlo generando la matriz de correlación de nuestros datos y luego ploteándola con la función heatmap()
de la librería seaborn
.
El gráfico anterior es la base de un correlograma, pero todavía tenemos algunas modificaciones importantes para hacerle para que sea adecuado.
En primer lugar, es fundamental utilizar una escala de colores divergente, la cual resulta de la combinación de dos escalas secuenciales unidas en un punto medio común, que generalmente se representa con un color claro. Este tipo de escala es ideal cuando necesitamos visualizar la desviación de los valores de los datos en una de dos direcciones con respecto a un punto medio neutral (en nuestro caso, r = 0).
EJEMPLOS DE ESCALAS DIVERGENTES
vlag
coolwarm
BrBG
RdYlGn
EJEMPLOS DE ESCALAS DIVERGENTES
seismic
bwr
Podemos configurar la paleta dentro del parámetro cmap
de sns.heatmap()
y setear sus límites incluyendo vmin = -1
y vmax = 1
. Por ejemplo, con BrBG:
La última modificación importante es agregar un título a la escala de colores para indicar qué representan los valores.
En el gráfico anterior, los colores verdes más fuertes se asocian con correlaciones lineales positivas más intensas, mientras que las tonalidades marrones más fuertes indican correlaciones lineales inversas más intensas.
¡IMPORTANTE! Si bien los correlogramas muestran información relevante sobre las asociaciones entre variables cuantitativas, al mismo tiempo ocultan la existencia de patrones importantes en los datos y pueden llevarnos a sacar conclusiones incorrectas. Por este motivo, siempre es conveniente complementarlos con una matriz de scatterplots y analizar si tiene sentido informar coeficientes de correlación lineales.