Pablo Cobelli - Departamento de Física, FCEN-UBA, Argentina.
Laboratorios Básicos de Enseñanza - Última actualización: Agosto de 2017.
Este apunte tiene licencia Creative Commons Attribution 4.0 International License.
%pylab inline
from IPython.display import Image
Populating the interactive namespace from numpy and matplotlib
A partir de los contenidos de este documento el lector aprenderá a:
Python es un lenguaje de programación muy popular que se caracteriza por su filosofía muy particular, en la cual la simplicidad de programación y la facilidad para leer e interpretar lo que el código hace son aspectos muy importantes. Es un lenguaje muy popular cuyo uso abarca un gran número de aplicaciones.
Desde hace varios años el lenguaje ha ido estableciéndose como una alternativa completa para el cómputo científico “convencional” y para el de alto desempeño. Así, se ha creado una amplia colección de software numérico y científico con base en dos extensiones: Numpy y Scipy, la cual incluye paquetes como Matplotlib (para la creación de gráficos especializados) e IPython (para el uso interactivo del lenguaje y el análisis de datos on-the-fly), entre muchos otros.
Con el paso de los años han surgido múltiples distribuciones de Python que incluyen una gran variedad de paquetes orientados al cómputo científico y que vienen “listas para usar”. Siempre incluyen paquetes como Numpy, Scipy y Matplotlib, e integran ambientes de programación como Spyder. Algunas de estas distribuciones son: Pythonxy, Enthought Canopy, WinPython y Anaconda, entre otras.
En el marco de los laboratorios de enseñanza básica, mi recomendación es utilizar Anaconda ya que resulta muy sencillo instalar paquetes adicionales (si fuese necesario), como así también realizar actualizaciones (updates) o mejoras (upgrades).
La distribución Anaconda de Continuum Analytics es relativamente reciente, pero muy útil en tres aspectos fundamentales:
Enumeremos algunas de sus características más importantes:
Es gratuita tanto en su versión de 32 bits como en la de 64 bits, para uso personal y comercial. Más aún: las herramientas más avanzadas (incluidas en lo que se denomina "Anaconda Pro") están disponibles en forma gratuita para uso académico.
Tiene versiones para los tres sistemas operativos más importantes: Windows, Linux y Mac.
Es una distribución no invasiva. Esto significa que se puede instalar junto a otras versiones o distribuciones de Python sin mayor problema y sin generar incompatibilidades. Tampoco necesita permisos de administrador para ser instalada.
Tiene un administrador de paquetes, llamado "conda", para instalar, crear y actualizar paquetes y bibliotecas adicionales.
A partir de ella es posible instalar y utilizar cualquiera de las versiones más difundidas actualmente de Python: tanto la version 2.7, la 3.3 ó la 3.4 (última disponible al momento de la escritura de este documento).
Así, la distribución Anaconda es excelente para adentrarse por primera vez en el cómputo científico empleando un lenguaje limpio y expresivo como lo es Python.
El primer paso para instalar la distribución Anaconda de Python es descargar el archivo instalador. Para ello, hagan click siguiente link:
La descarga del instalador puede demorar varios minutos, dependiendo de la velocidad de conexión que posean.
Una vez que el instalador se haya descargado, deberan seguir los pasos de instalacion descriptos en el sitio web de Continuum.
Para el cálculo científico y el análisis de dados de laboratorio, emplearemos unas librerías (también llamadas "paquetes") particulares que forman parte de la instalación de Anaconda. Estas librerías nos permitirán, por ejemplo, construir gráficos, emplear estadística descriptiva, hacer cálculos simbólicos, etc. En general, utilizaremos los siguientes paquetes:
Estos paquetes contienen las funciones más importantes para el análisis, el modelado, la representación gráfica y el ajuste de los datos experimentales que se realiza en los Laboratorios de Enseñanza Básica.
Existe una amplia variedad de formas en la que se puede abordar el trabajo diario con Python. En particular, nosotros vamos a optar por trabajar con la interfaz denominada "Spyder". El nombre Spyder es un acronismo que proviene del inglés "Scientific Python Development EnviRonment" y que podríamos traducir como "entorno Python de desarrollo científico".
La ventaja principal de utilizar Spyder consiste en disponer de un entorno de trabajo amigable y fácilmente navegable. Asimismo Spyder permite:
Por estas razones, Spyder resulta el útil más adecuado al trabajo que realizaremos diariamente en el laboratorio.
Para iniciar Spyder es necesario hacer click sobre el icono "Launcher" (el icono es un disco azul con una "A" verde), que en Windows encontrarán dentro del menu de Aplicaciones.
Una vez iniciado el "Launcher", les aparecerá en pantalla una ventana como la siguiente:
Image(url='http://docs.continuum.io/_images/Anaconda_Launcher.png')
Ahora, para iniciar Spyder, solo hace falta hacer click en el botón azul ubicado a la derecha, en la misma línea del texto "spyder-app".
Si el botón fuese de color verde, esto significa que Spyder no está instalado aún. En ese caso, un primer click en el botón verde será suficiente para iniciar la instalación. Cuando la misma termine, el botón verde de "install" se convertirá en un botón azul de "launch"; clickeándolo podrán entonces iniciar Spyder.
Una vez que Spyder se inicie, verán una ventana parecida a la que se muestra bajo estas líneas.
Image(url='http://upload.wikimedia.org/wikipedia/commons/1/1b/Spyder-windows-screenshot.png')
En la imagen es posible visualizar el entorno de Spyder, en donde aparecen en pantalla cuatro secciones (o pequeñas ventanas).
La consola (console):
Abajo a la izquierda encontramos la "consola". En esa ventana es que, como usuarios, ingresamos los comandos en lenguaje Python con los que realizamos cálculos, analizamos datos, construímos gráficos, etc. Es fácil reconocer la consola porque es la sección en donde vemos la expresión "In [1]:" al pie cuando Spyder recién se inicia.
El explorador de variables (variable explorer):
Arriba a la derecha tenemos el explorador de variables. En él se listan todas las variables que fuimos creando a medida que analizamos los datos.
El inspector de objetos (object inspector):
Ubicado abajo a la derecha en la imagen, esta sección ofrece ayuda acerca tanto de las variables que tenemos, de las funciones que usamos como así también podemos tener acceso a la documentación completa de Python.
El editor (editor):
Arriba a la izquierda en la imagen vemos el editor. Se trata de un editor de texto simple al cuál podemos ir volcando las instrucciones Python con las que buscamos construir nuestro programa (o script) de análisis de datos. Una de las ventajas de usar este editor integrado es que Spyder irá señalando visualmente con advertencias los posibles errores en nuestro código, y nos dará sugerencias para resolverlos. Asimismo, usando el editor integrado podremos testear nuestro código, ejecutándolo línea por línea para verificar que su funcionamiento sea el esperado.
En esta sección les mostraré cómo crear en Python una serie de datos con distribución dada, cómo analizar sus características en términos de estimadores estadísticos tales como la media, la mediana y la moda, y cómo representar dicha serie mediante un histograma.
Para aquellos que quieran seguir de cerca este tutorial, ingresando ellos mismos el código a cada paso, les aclaro que sólo trabajaremos -por ahora- en la consola. Es decir que, para repetir las instrucciones que les iré mostrando, bastará tipear las líneas de código veremos en la consola de Spyder. Les recomiendo fuertemente evitar hacer "copy-paste" de las líneas de código de este documento, es siempre mejor para retener las instrucciones tomarse el trabajo de tipear uno mismo su código.
A fin de aprender a utilizar Python para el análisis de datos, necesitamos contar con un conjunto de datos con el que trabajar. En el trabajo diario en el laboratorio, dichos datos provendrán de las experiencias que realicen. Para este tutorial, vamos a crear nuestros propios datos "simulados" o, más propiamente dicho, "sintéticos".
Supongamos entonces que buscamos crear una serie de datos compuesta de (digamos) ** 10000 datos individuales cuya distribución es normal (gaussiana)**.
En Python, esto se logra muy sencillamente.
Por un lado, la función para crear series de datos de distribución gaussiana se llama "random.randn". Esta función forma parte de un paquete de análisis numérico que se llama NUMPY, que mencionamos anteriormente. Entonces, utilizamos las siguientes instrucciones:
import numpy as np
x = np.random.randn(10000)
La primera línea le dice a Python que cargue el paquete "numpy" de análisis numérico (es la parte que corresponde a "import numpy"). La segunda parte de esa primera línea (la que corresponde a "as np") le dice a Python que cada vez que querramos utilizar una función del paquete NUMPY la vamos a estar llamando con el pseudónimo "np" en lugar de escribir "numpy" cada vez.
La segunda línea le pide a Python que genere un conjunto compuesto de $10000$ datos distribuidos gaussianamente y que guarde esa lista de datos en la variable "x".
Observen que una vez que hayan ingresado esas dos líneas de instrucciones, Python no les devuelve ningún resultado a cambio. Para observar los valores de la variable "x", podemos hacer lo siguiente. Si ingresamos:
x
array([-0.84828964, 0.14618484, 0.89443725, ..., -0.54429903, 0.96530825, 0.66976308])
Python nos devuelve una vista resumida en pantalla de la serie de los datos. Fíjense que la respuesta de Python comienza por "array", lo que nos indica que se trata de un conjunto de datos. Luego, separados por comas, Python nos da algunos valores del conjunto. Como se trata de un conjunto de 10000 datos, Python no lista todos y nos agrega unos puntos suspensivos ("...") en el centro de la lista para hacernos notar que no estamos viendo la totalidad de los datos.
Si quisiésemos ver el valor de alguno en particular, por ejemplo del primero de ellos, hariamos:
x[0]
-0.8482896360660982
y si quisiéramos ver los primeros 10 datos, escribiríamos:
x[0:10]
array([-0.84828964, 0.14618484, 0.89443725, 1.00246335, 1.73025018, 0.19588852, -1.112536 , 0.26849866, -1.90379557, 0.72625877])
Supongamos ahora que buscamos determinar la media, la mediana y la desviación estándar de nuestro conjunto de datos. Para lograr esto, sólo basta con saber cómo se denominan las funciones que calculan cada uno de dichos estimadores en Python.
En Python, la media se calcula usando "mean", la mediana mediante "median" y la desviación estándar empleando "std". Estas tres funciones son parte de la librería NUMPY, lo que implica que debemos anteponer "np." cada vez que las utilicemos.
Entonces, para calcular la media de la distribución de datos, hacemos:
np.mean(x)
-0.0033411942072785854
y Python nos da como respuesta en la consola el resultado para la media de nuestra distribución.
Similarmente, para determinar la mediana:
np.median(x)
-0.0058024977652625428
Y finalmente, para calcular la desviación estándar,
np.std(x)
0.99896267163335262
Para crear cualquier tipo de gráfico debemos, antes que nada, cargar la librería gráfica que se encargará de construir el gráfico y mostrarlo en pantalla. La librería que nosotros utilizaremos es MATPLOTLIB, paquete que ya mencionamos con anterioridad. Para ello, hacemos:
import matplotlib.pyplot as plt
plt.ion()
La primera de estas dos líneas carga la librería gráfica MATPLOTLIB, y le dice a Python que, en adelante, nos estaremos refiriendo a ella simplemente como "plt".
Por otro lado, la segunda línea le dice a Python que utilizaremos la librería MATPLOTLIB en forma interactiva; la expresión "ion" equivale a "Interactive ON". Cuando decimos que utilizaremos interactivamente la librería nos referimos a que buscamos que los gráficos que creemos permanezcan abiertos en pantalla mientras que, en forma simultánea, seguimos ingresando instrucciones en la consola de Spyder sin tener que cerrar el gráfico para continuar trabajando.
Hasta aquí sólo hemos cargado la librería gráfica.
Vamos ahora a construir el histograma de nuestra serie de datos. En particular, vamos a pedirle a Python que emplee un total de -digamos- $20$ columnas (o "bins") para construir el histograma. Esto es sencillo si sabemos que la instrucción para construir histogramas es "hist", y que toma dos argumentos: el primero de ellos es el conjunto de datos sobre el cuál calcular el histograma, y el segundo es la cantidad de bins a emplear. Ahora bien, como la función "hist" es parte de MATPLOTLIB, debemos anteponer la expresión "plt." al emplearla. Entonces hacemos:
plt.hist(x,20)
(array([ 1.00000000e+00, 4.00000000e+00, 8.00000000e+00, 3.80000000e+01, 1.07000000e+02, 2.74000000e+02, 5.88000000e+02, 9.77000000e+02, 1.42700000e+03, 1.64100000e+03, 1.66900000e+03, 1.37600000e+03, 9.19000000e+02, 5.21000000e+02, 2.64000000e+02, 1.20000000e+02, 4.50000000e+01, 1.60000000e+01, 2.00000000e+00, 3.00000000e+00]), array([-4.24964168, -3.82376856, -3.39789544, -2.97202232, -2.54614919, -2.12027607, -1.69440295, -1.26852982, -0.8426567 , -0.41678358, 0.00908955, 0.43496267, 0.86083579, 1.28670892, 1.71258204, 2.13845516, 2.56432829, 2.99020141, 3.41607453, 3.84194766, 4.26782078]), <a list of 20 Patch objects>)
Y habremos logrado construir el histograma de nuestro conjunto de datos.
Finalmente, conviene quizás agregar un título al gráfico y a los ejes, e incorporar una grilla para poder visualizar más fácilmente los datos. Esto lo hacemos mediante las siguientes líneas de código:
plt.hist(x,20)
plt.title('Histograma')
plt.xlabel('eje x [unidades de x]')
plt.ylabel('eje y [unidades de y]')
plt.grid('on')
Este documento les mostró a vista de pájaro las capacidades de Python, cómo utilizar una interfaz de desarrollo como Spyder y les dió ejemplos del uso concreto para analizar una serie de datos en términos de su estadística descriptiva y de la construcción de gráficos.
En el curso de Laboratorio continuaremos construyendo a partir de esta base, incorporando nuevas herramientas de análisis y de representación gráfica.