Extracto del curso: Python intermedio para ciencia de datos - Matplotlib
A continuación tienes un extracto —vídeo y transcripción— del primer capítulo del curso Intermediate Python for Data Science. Aquí puedes ver el capítulo completo, con ejercicios interactivos.
Gráficos básicos con matplotlib
Hola, me llamo Filip y soy científico de datos en DataCamp. En este curso intermedio de Python, vas a llevar tus habilidades de Python para ciencia de datos un paso más allá. Aprenderás a visualizar datos y a almacenarlos en nuevas estructuras. Por el camino, dominarás estructuras de control, que vas a necesitar para personalizar el flujo de tus scripts y algoritmos. Cerraremos este capítulo con un caso práctico, donde pondrás en juego todo lo aprendido para resolver un problema interesante.
Este primer capítulo trata sobre la visualización de datos, que es una parte clave del análisis de datos. Para empezar, la usarás continuamente para explorar tu conjunto de datos. Cuanto mejor entiendas tus datos, mejor podrás extraer conclusiones. Y cuando las tengas, de nuevo necesitarás la visualización para compartir esos insights con otras personas. Como ejemplo, fíjate en este gráfico tan bonito.
Lo creó el profesor sueco Hans Rosling. Sus charlas sobre desarrollo global han sido vistas millones de veces. Lo que las hace tan fascinantes es que, con gráficos atractivos, deja que los datos cuenten su propia historia. Aquí vemos un diagrama de burbujas, donde cada burbuja representa un país. Cuanto más grande es la burbuja, mayor es la población del país; así que las dos burbujas más grandes son China e India.
Hay 2 ejes. El eje horizontal muestra el PIB per cápita, en dólares estadounidenses. El eje vertical muestra la esperanza de vida. Se ve claramente que la gente vive más en países con un PIB per cápita más alto. Aun así, hay enormes diferencias de esperanza de vida entre países con niveles de ingresos similares.
¿Y por qué te cuento todo esto? Porque al final de este capítulo, tú mismo podrás construir un gráfico como este.
En Python hay muchas librerías de visualización, pero la madre de todas es matplotlib. Vas a necesitar su subpaquete pyplot. Por convención, se importa como plt, así.
Para el primer ejemplo, intentemos entender la evolución de la población mundial. Aquí tengo una lista con años, year, y otra con las poblaciones correspondientes, expresadas en miles de millones, pop. En el año 1970, por ejemplo, vivían 3,7 mil millones de personas en la Tierra.
Para dibujar estos datos como un gráfico de líneas, llamamos a plt.plot() y usamos nuestras dos listas como argumentos. El primer argumento corresponde al eje horizontal y el segundo al vertical. Podrías pensar que el gráfico aparecerá ya, pero Python es bastante perezoso. Esperará a la función show() para mostrar el gráfico. Esto es porque quizá quieras añadir algunos extras antes de visualizarlo, como títulos y etiquetas personalizadas. Hablaré de eso en un momento. Quédate con esta idea: la función plot() le dice a Python qué dibujar y cómo dibujarlo. show() es la que lo muestra en pantalla.
Al mirar el gráfico, vemos los años en el eje horizontal y las poblaciones en el vertical. Hay cuatro puntos de datos, y Python traza una línea entre ellos. En 1950, la población mundial rondaba los 2,5 mil millones. En 2010, unos 7 mil millones. Así que la población casi se ha triplicado en sesenta años; da un poco de vértigo. ¿Y si la población sigue creciendo a ese ritmo? ¿Se quedará el mundo superpoblado? Lo verás en los ejercicios.
Déjame presentarte ahora otro tipo de gráfico: el de dispersión. Para crearlo, podemos partir del código anterior. Esta vez, eso sí, cambia la función plot por scatter. El gráfico de dispersión representa simplemente todos los puntos; Python no une los puntos con una línea. Para muchos casos, suele ser mejor opción que el de líneas, así que recuerda bien scatter. También podrías decir que es una forma más honesta de representar tus datos, porque se ve claramente que el gráfico se basa solo en cuatro puntos.
Ahora que ya controlas lo básico de matplotlib, te toca a ti crear gráficos potentes.
# define a simple function
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.plot(year, pop)
plt.show()
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.scatter(year, pop)
plt.show()
El histograma
En este vídeo te presento el histograma. Es un tipo de visualización muy útil para explorar tus datos. Te ayuda a hacerte una idea de la distribución de tus variables. Para ver cómo funciona, imagina 12 valores entre 0 y 6. Los he colocado aquí sobre una recta numérica. Para construir un histograma con estos valores, puedes dividir la recta en segmentos iguales, llamados bins o contenedores. Supón que eliges 3 contenedores, cada uno con un ancho de 2. Después, cuentas cuántos puntos de datos caen en cada contenedor. Hay 4 en el primero, 6 en el segundo y 2 en el tercero. Por último, dibujas una barra por contenedor. La altura de la barra corresponde al número de puntos que caen en él. El resultado es un histograma, que nos da una buena panorámica de cómo se distribuyen esos 12 valores. La mayoría están en el medio, pero hay más valores por debajo de 2 que por encima de 4.
Por supuesto, matplotlib también puede construir histogramas. Como antes, empieza importando el paquete pyplot de matplotlib. Luego puedes usar la función hist(). Abramos su documentación. Hay varios argumentos que puedes especificar, pero los dos primeros son los más importantes. x debe ser la lista de valores para los que quieres crear el histograma. El segundo argumento, bins, sirve para indicar en cuántos contenedores debe dividirse la información. Con ese número, hist() calculará automáticamente los límites adecuados para cada contenedor y cuántos valores hay en cada uno. Si no especificas bins, por defecto será 10.
Para generar el histograma que viste antes, empecemos creando la lista con los 12 valores. Después, simplemente llama a hist() y pasa esta lista como entrada para el argumento x. También he fijado bins a 3, para dividir los valores en tres contenedores. Si finalmente llamas a show, obtienes un histograma muy claro. Los histogramas son geniales para ver el conjunto. Por ejemplo, mira esta llamada pirámide de población. Muestra la distribución por edades, para hombres y mujeres, en la Unión Europea. Fíjate en que los histogramas están girados 90 grados; los contenedores ahora son horizontales. Los más grandes son los de 40 a 44 años, con 20 millones de hombres y 20 millones de mujeres. Es la generación del baby boom.
Estas cifras son del año 2010. ¿Qué crees que habrá cambiado en 2050? Veámoslo. La distribución es más plana y la generación del baby boom ha envejecido. De un vistazo, puedes ver cómo cambian las tendencias demográficas con el tiempo. ¡Ese es el verdadero poder de los histogramas! Ahora pasa a los ejercicios para experimentar tú mismo con ellos.
values = [0,0.6,1.4,1.6,2.2,2.5,2.6,3.2,3.5,3.9,4.2,6]
import matplotlib.pyplot as plt
plt.hist(values,bins=3)
plt.show()
Personalización
Crear un gráfico es una cosa. Hacer el gráfico correcto, que transmita el mensaje con claridad, es el verdadero reto. Para cada visualización, tienes muchas opciones. Primero, los distintos tipos de gráficos. Y para cada uno, un sinfín de personalizaciones. Puedes cambiar colores, formas, etiquetas, ejes, y mucho más. La elección depende, por un lado, de los datos y, por otro, de la historia que quieras contar con ellos. Como hay tantas posibilidades, la mejor forma de aprender es con ejemplos.
Empecemos con el código de este script para crear un gráfico de líneas sencillo. Es parecido al que hicimos en el primer vídeo, pero esta vez las listas year y pop traen más datos, incluidas proyecciones hasta el año 2100, previstas por Naciones Unidas. Si ejecutamos el script, ya obtenemos un gráfico bastante claro: muestra que la explosión demográfica en curso se habrá frenado hacia final de siglo.
Pero se pueden mejorar algunas cosas. Primero, debería quedar más claro qué datos estamos mostrando, sobre todo para quien vea la gráfica por primera vez. Y segundo, el gráfico debería centrar la atención en la explosión demográfica. Lo primero que debes hacer siempre es etiquetar los ejes. Hagámoslo añadiendo las funciones xlabel y ylabel. Como entradas, pasamos las cadenas que queremos colocar junto a los ejes. Asegúrate de llamar a estas funciones antes de show(), o no se verán tus personalizaciones. Si ejecutamos de nuevo, esta vez los ejes aparecen anotados. También vamos a añadir un título con la función title. Pasamos el título, 'World Population Projections', como argumento. ¡Ahí está!
Así, con xlabel, ylabel y title, damos a quien lee más contexto sobre los datos del gráfico: ahora, al menos, se entiende de qué va. Para poner en perspectiva el crecimiento de la población, quiero que el eje y empiece en cero. Puedes hacerlo con la función . La primera entrada es una lista, en este ejemplo con los números de cero a diez en intervalos de 2. Si lo ejecutamos, el gráfico cambia: la curva se desplaza hacia arriba. Ahora se ve que ya en 1950 había unas 2,5 mil millones de personas en el planeta.yticks()
Después, para que quede claro que hablamos de miles de millones, podemos añadir un segundo argumento a yticks(), que es una lista con las etiquetas a mostrar en las marcas. Esta lista debe tener la misma longitud que la primera. La marca 0 recibe el nombre 0, la marca 2 el nombre 2B, la 4 el nombre 4B y así sucesivamente. Por cierto, aquí B significa billions (miles de millones). Si ejecutamos esta versión, las etiquetas cambian en consecuencia, perfecto.
Por último, añadamos más datos históricos para acentuar la explosión demográfica de los últimos 60 años. En Wikipedia encontré datos de población mundial para 1800, 1850 y 1900. Puedo escribirlos en forma de lista y añadirlos a las listas pop y year con el signo más. Si vuelvo a ejecutar el script, se añaden tres puntos al gráfico, dando una imagen más completa. ¡Así es como conviertes un gráfico de líneas promedio en una visual con una historia clara! Te toca: ve a los ejercicios, personaliza paso a paso el gráfico de desarrollo mundial y conviértete en el próximo Hans Rosling.
import matplotlib.pyplot as plt
import pandas as pd
year = list(range(1950, 2101))
pop = [2.53,2.57,2.62,2.67,2.71,2.76,2.81,2.86,2.92,2.97,3.03,3.08,3.14,3.2,3.26,3.33,3.4,3.47,3.54,3.62,3.69,3.77,3.84,3.92,4.,4.07,4.15,4.22,4.3,4.37,4.45,4.53,4.61,4.69,4.78,4.86,4.95,5.05,5.14,5.23,5.32,5.41,5.49,5.58,5.66,5.74,5.82,5.9,5.98,6.05,6.13,6.2,6.28,6.36,6.44,6.51,6.59,6.67,6.75,6.83,6.92,7.,7.08,7.16,7.24,7.32,7.4,7.48,7.56,7.64,7.72,7.79,7.87,7.94,8.01,8.08,8.15,8.22,8.29,8.36,8.42,8.49,8.56,8.62,8.68,8.74,8.8,8.86,8.92,8.98,9.04,9.09,9.15,9.2,9.26,9.31,9.36,9.41,9.46,9.5,9.55,9.6,9.64,9.68,9.73,9.77,9.81,9.85,9.88,9.92,9.96,9.99,10.03,10.06,10.09,10.13,10.16,10.19,10.22,10.25,10.28,10.31,10.33,10.36,10.38,10.41,10.43,10.46,10.48,10.5,10.52,10.55,10.57,10.59,10.61,10.63,10.65,10.66,10.68,10.7,10.72,10.73,10.75,10.77,10.78,10.79,10.81,10.82,10.83,10.84,10.85]
pop = [1,1.262,1.650] + pop
year = [1800,1850,1900] + year
plt.plot(year, pop)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('World Population Projections')
plt.yticks([0,2,4,6,8,10],['0','2B','4B','6B','8B','10B'])
plt.show()
