02 de Octubre del 2022 | Jhonatan Montilla
La visualización de datos es la forma más cómoda e intuitiva para que el cerebro humano comprenda de manera efectiva cualquier información. Para cualquier persona que trabaje con datos, la capacidad de crear hermosas visualizaciones intuitivas es una habilidad muy importante para poder transmitir los hallazgos e impulsar acciones de manera efectiva.
R proporciona excelentes paquetes de visualización de datos (ggplot2, folleto) y tableros (usando R Shiny) con los que puede crear hermosas visualizaciones. Python, por otro lado, se queda un poco atrás en este aspecto ya que matplotlib no es un gran paquete de visualización.
Seaborn es una buena alternativa para crear gráficos estáticos en Python, pero no tiene la capacidad de hacerlos interactivos. Con el gráfico estático, no podemos hacer zoom en las secciones interesantes de los gráficos, pasar el cursor sobre los gráficos para ver la información específica y más.
Plotly es una biblioteca de Python para crear visualizaciones interactivas con calidad de publicación. Plotly no solo hace que los gráficos sean interactivos, una funcionalidad que falta en matplotlib o seaborn, sino que también proporciona una variedad de gráficos más, como:
En la siguiente sección, utilizaremos datos de gapminder para visualizar cómo India y China progresaron social y económicamente a lo largo de los años. Haremos la selección y manipulación de datos en el marco de datos de pandas, si es nuevo en pandas, entonces puede aprender Python para el análisis de datos.
Puede abrir el cuaderno jupyter y usar los códigos directamente sin ninguna modificación. Comencemos instalando el paquete plotly e importando los paquetes necesarios.
import plotly.graph_objects as go
import plotly.express as px
Usando el módulo graph_objects, crearemos los diferentes tipos de gráficos y el módulo express se usará para leer los datos de gapminder.
Ahora, leamos los datos de gapminder usando plotly express y observemos las 5 filas superiores.
df = px.data.gapminder()
df.head()
country | continent | year | lifeExp | pop | gdpPercap | iso_alpha | iso_num | |
---|---|---|---|---|---|---|---|---|
0 | Afghanistan | Asia | 1952 | 28.801 | 8425333 | 779.445314 | AFG | 4 |
1 | Afghanistan | Asia | 1957 | 30.332 | 9240934 | 820.853030 | AFG | 4 |
2 | Afghanistan | Asia | 1962 | 31.997 | 10267083 | 853.100710 | AFG | 4 |
3 | Afghanistan | Asia | 1967 | 34.020 | 11537966 | 836.197138 | AFG | 4 |
4 | Afghanistan | Asia | 1972 | 36.088 | 13079460 | 739.981106 | AFG | 4 |
En la tabla anterior, podemos ver que los datos contienen información sobre la esperanza de vida, la población, el PIB per cápita de diferentes países en diferentes años.
Ahora, filtraremos el marco de datos para India y China.
df_india = df[df['country'] == 'India']
df_china = df[df['country'] == 'China']
df_india
country | continent | year | lifeExp | pop | gdpPercap | iso_alpha | iso_num | |
---|---|---|---|---|---|---|---|---|
696 | India | Asia | 1952 | 37.373 | 372000000 | 546.565749 | IND | 356 |
697 | India | Asia | 1957 | 40.249 | 409000000 | 590.061996 | IND | 356 |
698 | India | Asia | 1962 | 43.605 | 454000000 | 658.347151 | IND | 356 |
699 | India | Asia | 1967 | 47.193 | 506000000 | 700.770611 | IND | 356 |
700 | India | Asia | 1972 | 50.651 | 567000000 | 724.032527 | IND | 356 |
701 | India | Asia | 1977 | 54.208 | 634000000 | 813.337323 | IND | 356 |
702 | India | Asia | 1982 | 56.596 | 708000000 | 855.723538 | IND | 356 |
703 | India | Asia | 1987 | 58.553 | 788000000 | 976.512676 | IND | 356 |
704 | India | Asia | 1992 | 60.223 | 872000000 | 1164.406809 | IND | 356 |
705 | India | Asia | 1997 | 61.765 | 959000000 | 1458.817442 | IND | 356 |
706 | India | Asia | 2002 | 62.879 | 1034172547 | 1746.769454 | IND | 356 |
707 | India | Asia | 2007 | 64.698 | 1110396331 | 2452.210407 | IND | 356 |
La siguiente tabla muestra los datos de la India. Los datos van desde el año 1952 hasta el 2007.
Ahora, crearemos un gráfico de barras que muestre la población de India y China a lo largo de los años.
La creación de parcelas utilizando el módulo de objeto de gráfico plotly es un proceso de 2 pasos:
fig = go.Figure(data = [go.Bar(x = df_india['year'],
y = df_india['pop'],
marker_color = 'indianred',
name = 'India'),
go.Bar(x = df_china['year'],
y = df_china['pop'],
marker_color = 'blue',
name = 'China')
])
fig.update_layout(title = 'Población de India y China a lo largo de los años.',
xaxis_title='Años',
yaxis_title='Población'
)
fig
Siempre que tengamos una serie de datos de tiempo (medidas durante años/meses/semanas, etc.), el gráfico de líneas es la mejor opción para mostrar la tendencia.
Con el siguiente código, mostramos cómo cambió la esperanza de vida a lo largo de los años en India y China.
fig = go.Figure(data = [go.Scatter(x = df_india['year'],
y = df_india['lifeExp'],\
line = dict(color = 'firebrick',
width = 4),
text = df_india['country'],
name = 'India'),
go.Scatter(x = df_china['year'],
y = df_china['lifeExp'],\
line = dict(color = 'blue',
width = 4),
text = df_china['country'],
name = 'China')])
fig.update_layout(title = 'Esperanza de vida a lo largo de los años.',
xaxis_title = 'Años',
yaxis_title = 'Esperanza de vida (años)'
)
fig
Cuando queremos ver la interacción entre 2 características continuas (numéricas), el gráfico de dispersión es el gráfico de referencia.
En el siguiente código, estamos creando el diagrama de dispersión entre la esperanza de vida y el pib per cápita de los 2 países.
fig = go.Figure(data = [go.Scatter(y = df_india['lifeExp'],
x = df_india['gdpPercap'],\
mode = 'markers',
name = 'India'),
go.Scatter(y = df_china['lifeExp'],
x = df_china['gdpPercap'],\
mode = 'markers',
name = 'China')
])
fig.update_layout(title = 'Esperanza de vida vs PIB per cápita',
yaxis_title = 'Esperanza de vida (años)',
xaxis_title = 'PIB Percapita (USD)'
)
fig
Usando el gráfico de burbujas, podemos mostrar 3 dimensiones (eje x, eje y y tamaño de la burbuja) sobre un gráfico 2D.
Usando el siguiente código, podemos crear un gráfico de burbujas usando la función de dispersión del módulo plotly express.
df = px.data.gapminder()
fig = px.scatter(df, x = 'gdpPercap',
y = 'lifeExp',
size = 'pop',
color = 'continent',
hover_name='country',
log_x = True,
size_max = 50,
title = 'Desarrollo mundial desde 1952 a 2007',
animation_frame = "year",
animation_group = "country",
range_y = [25,90])
fig.update_layout(xaxis = dict(showgrid = False),
yaxis = dict(showgrid = False))
fig
Entendamos algunos argumentos importantes de la función: