Tutorial-04 con Python.

Con un poco de suerte, la colección de tutoriales con Python va a ir tomando velocidad. Hoy añado el cuarto de la serie, y confío en poder completar los siguientes en breve. A riesgo de ser reiterativo, valen las mismas advertencias sobre el carácter experimental de estos tutoriales.

Anuncios

Tutorial-03 con Python.

Con algo de retraso (porque entre tanto me ha tocado volver al quirófano) publicamos hoy el Tutorial-03 con el lenguaje Python en la página del libro PostData. Aprovecho para recordar el carácter experimental de  estos tutoriales con Python (no se han probado en clase) y para agradecer de nuevo cualquier corrección o sugerencia que nos podáis hacer llegar.

Tutoriales con Python.

Hoy lanzamos el que para nosotros es el comienzo de un experimento largamente esperado.  Hemos dicho en la Introducción del libro PostData que queríamos plantearlo de una forma tan neutral desde el punto de vista del software como nos fuera posible. La primera colección de tutoriales que publicamos utilizaba de forma principal R como herramienta. Para demostrar en la práctica esa neutralidad hemos empezado a publicar una segunda colección de tutoriales con Python en el lugar que antes ocupaba R. De momento sólo están disponibles los dos primeros tutoriales. Avisaremos puntualmente aquí cuando aparezcan los restantes. Los correspondientes a la primera parte del curso están todos prácticamente listos para publicar y, en la medida en que la salud nos lo permita, trataremos de conseguir que vean la luz este mismo mes.

Queremos avisar, no obstante, de que estos tutoriales con Python tienen un carácter mucho más experimental que los que utilizan R. A diferencia de aquellos, estos no han sido probados en una clase real y por lo tanto no han sufrido el escrutinio de un grupo de alumnos y sus profesores. Pedimos disculpas por adelantado por los errores que sin duda contienen. Y rogamos encarecidamente que si al usarlos descubres uno de esos errores nos lo hagas saber.

Gracias.

Presentación de eBird España

Los que me conocen ya saben que tengo la cabeza a pájaros, y que cualquier excusa me sirve para salir al monte a buscar pajarillos. Este fin de semana todos los pajareros del mundo estamos de enhorabuena porque eBird, un gran proyecto de ciencia ciudadana de la Universidad de Cornell, ha organizado el Global Big Day: un evento mundial de observación de aves. Para los pajareros españoles la celebración es doble porque acaba de echar a andar eBird España. Y en este blog estamos triplemente contentos, porque eso nos permite disponer de datos sobre nuestros amigos con plumas. Datos y pájaros. ¿Se puede pedir más?

Actualización: como muestra de la visualización de esos datos, una curiosidad. En este enlace podéis ver un mapamundi en el que se puede seguir en tiempo real la subida de listas de observaciones de aves a eBird. Y que deja bien claro a las claras el sesgo y todo el trabajo que nos queda por hacer.

Programación literaria en R con knitr y markdown.

Esta entrada es la primera de una serie que quiero dedicar a describir algunas herramientas del ecosistema R que en los últimos tiempos he ido incorporando a mi forma de trabajar. Quiero escribir sobre los siguientes temas, con la intención confesa de estimular la curiosidad de quien pueda leer estas entradas:

  • Knitr y Markdown.
  • Programación literaria.
  • Shiny.
  • Reproducible Research.
  • El paquete exams de R.

Tiempo habrá, en otras entradas de esa serie, para adentrarse en los detalles y la historia. Lo que quiero hacer hoy es simplemente empezar. Y no hay mejor manera de empezar que con un ejemplo muy sencillo.

Las cosas serán más fáciles si ya eres usuario de RStudio. Si no lo eres: (a) te lo recomendamos una vez más y (b) puedes encontrar algo más de información e instrucciones de instalación en nuestro Tutorial00 (pdf). Primero explicaremos como proceder en RStudio, y luego daremos algunas indicaciones para quienes no lo usen.

Usando RStudio para crear un documento Rmarkdown.

En RStudio empieza por ir al menú Tools y dentro de ese menú selecciona Global Options. Se abrirá una ventana de opciones como esta:

options

En la que, como hemos indicado, debes seleccionar Sweave (más adelante, en otra entrada, hablaremos más de Sweave). Al hacerlo aparecerán las opciones de la siguiente figura:

options

Y como muestra la flecha debes asgurarte de que has seleccionado Knitr bajo la opción Weave Rnw files using. Puedes dejar el resto de las opciones como están por el momento. Haz click en Ok.

Ya estamos casi listos. Ahora, usando el menú File de RStudio, selecciona la entrada New File y, dentro de esta, elige R Markdown. Aparecerá esta ventana:

options

Elige un título para el documento, añade la información de autoría y pulsa en Ok. Yo he elegido como título Comenzando con Rmarkdown. ¡Pero cuidado! El título que has elegido es sólo eso: un título (en particular puede contener espacios, acentos, etc). Tu documento todavía no está guardado en disco. Enseguida lo guardaremos. Pero antes fíjate en que en la ventana del Editor de RStudio ha aparecido un documento con un texto inicial. Más abajo vamos a analizar la estructura de ese texto.

options

Pero si te fijas verás que el documento sigue siendo Untitled, inidcando que aún no lo hemos guardado. Hazlo ahora, usando el menú File/Save as y guarda el documento en una carpeta adecuada. Tendrás que elegir el nombre del fichero, que no tiene porque tener nada en común con el título que has elegido antes. Eso sí, como de costumbre, te recomiendo que no uses espacios, acentos o caracteres especiales en el nombre del fichero. No te preocupes por la extensión: RStudio añadirá de forma automática la extensión Rmd al fichero. Yo he elegido como nombre testRmarkdown01.

¿Ya lo has guardado? Estupendo. Pues ahora, antes de hacer nada más, vamos a ver hacia dónde nos encaminamos: pulsa el botón Knit HTML que aparece sobre el editor de RStudio, y que puedes ver en la siguiente figura:

options

Tras pulsarlo verás que, en el espacio que normalmente ocupa la consola de RStudio aparece fugazmente una nueva pestaña titulada R markdown que muestra mensajes con información sobre el proceso que RStudio está llevando a cabo con nuestro documento. Y digo fugazmente porque, con un documento tan breve, en apenas unos instantes verás aparecer una nueva ventana, el visor de RStudio, que muestra el resultado que hemos obtenido al procesar ese documento.

options

Por si tienes algún problema, este enlace muestra el resultado que deberías obtener.


¿Y si no uso RStudio?

En ese caso puedes descargarte el fichero de código para Knitr desde este enlace:
testRmarkdown01.Rmd
Guárdalo en tu directorio de trabajo con R y ábrelo con el editor de texto que uses habitualmente con ficheros de código R.

Para procesarlo (el equivalente del botón Knit de RStudio), ejecuta este código en la consola de R:

rmarkdown::render("testRmarkdown01.Rmd")

Al hacerlo, en tu directorio de trababjo aparecerá un fichero llamado testRmarkdown01.html. Ábrelo con tu navegador de internet para ver el resultado que ha producido Knitr. Debería ser parecido a este.

En lo que resta de esta entrada, cada vez que yo diga que hay que pulsar el botón Knit de RStudio, tú deberás ejecutar de nuevo esa instrucción para volver a generar el documento HTML.


El documento HTML producido por Knitr.

El documento que estás viendo es un documento HTML, como los que se usan en las páginas Web. Es un documento con un formato visual simple, pero que contiene elementos visuales como texto en cursiva, negrita, títulos con dierente tamaño de letra. Además, se incluyen enlaces reconocibles, como en cualquier página web. Pero, como puedes ver, lo más interesante es que en ese documento aparecen recuadros sombreados con código R y a continuación el resultado de la ejecución de ese código. El primero de esos bloques usa la función summary con el conjunto de datos cars y el resultado aparece justo debajo. Además aparece un gráfico, también realizado con R, aunque en este caso el código que se ha usado para fabricar el gráfico es invisible. De hecho, la última frase del documento hace referencia a esto y explica de forma sucinta cómo se ha conseguido.

Hay muchas cosas ocurriendo a la vez en esta ventana, ya lo sé. Pero tendremos ocasión de ir desgranando poco a poco los detalles técnicos. lo más importante en este momento del proceso es captar la idea general: tenemos un documento inicial (el fichero testRmarkdown01.Rmd) y RStudio lo ha procesado (usando Knitr) para dar como resultado esta página web que contiene código R y los resultados que produce ese mismo código. Como pronto verás, esas páginas web son un documento extremadamente flexible que nos va a permitir crear documentos muy sofisticados de forma muy productiva. No sólo eso, sino que al tratarse de documentos de texto muy sencillos, podemos escribir programas en R que se encarguen de crear y publicar de manera automática esas páginas web cuando, por ejemplo, los datos que nos interesan hayan cambiado.

Estructura del documento en Rmarkdown.

El documento testRmarkdown01.Rmd es nuestro primer ejemplo de documento Rmarkdown. Vamos a analizar la forma en la que está construido. A grandes rasgos el documento contiene tres tipos de elementos:


La cabecera.

Que aparece justo al principio del documento, comprendida entre las dos líneas que contienen ---. Ese bloque de cabecera es, en este documento de muestra:

title: "Comenzando con RMarkdown."
author: "www.postdata-statistics.com"
date: "4 de mayo de 2016"
output: "html_document"

Este bloque está escrito en su propio lenguaje, denominado YAML. Pero no te preocupes demasiado. Por el momento todo lo que necesitamos saber es esto:

  • La función de esas líneas es evidente. Aquí se determina el título, autor, fecha y, en la última línea, cuál es el tipo de documento que queremos producir. En este caso HTML para producir un documento para la web. Pero más adelante veremos cómo producir, por ejemplo, un pdf o un documento docx para Microsoft Word.
  • Además, este bloque es opcional. Si borras todo el bloque entre las dos líneas con --- (incluidas esas líneas), Knitr seguirá siendo capaz de procesar el documento resultante.
  • Si sabes algo sobre creación de documentos HTML es posible que el ejemplo anterior te haya parecido muy básico. Es cierto. Pero cuando aprendamos un poco más, podremos usar este bloque YAML de la cabecera para incluir, por ejemplo, nuestras propias hojas de estilo CSS. Se pueden llegar a hacer cosas bastante sofisticadas.


Texto en markdown.

Además, el documento contiene párrafos de texto escritos en markdown. El lenguaje markdown sirve para representar el formato de un documento de una forma muy sencilla. A menudo se dice que la sintaxis básica de markdown se aprende en un minuto. Por ejemplo, para escribir un texto en negrita basta con rodearlo con dos asteriscos a cada lado. En el documento testRmarkdown01.Rmd tienes un ejemplo. El segundo párrafo contiene esta frase:

When you click the **Knit** button a document will be generated ... 

Como ves, la palabra Knit aparece con dos asteriscos a cada lado. Al procesar el documento con Knitr, el resultado es que la palabra Knitr aparece en negrita, como puedes ver en esta figura:

ejemploNegrita

También puedes ver, en el primer párrafo de texto, lo fácil que resulta insertar un enlace a una página web. Basta con escribir

  <http://rmarkdown.rstudio.com>

para crear ese enlace. Si quisieras hacer lo mismo usando HTML tendrías que escribir:

  <a href="http://rmarkdown.rstudio.com">http://rmarkdown.rstudio.com</a>

Como ves, bastante más complicado. Esa simplificación es la clave que convierte a markdown en una herramienta extremadamente productiva. Porque puede sonar a exageración, pero te aseguro que el tiempo que dediques a aprender a usar markdown será una de las inversiones más rentables que puedes hacer en términos de productividad. Un buen ejemplo puede ser esta página:

http://www.markitdown.net/markdown

en la que puedes ver a la izquierda ejemplos de código markdown y a la derecha su traducción cuando se convierten en HTML para producir una página web. Además ese documento tiene la ventaja de que proporciona una demostración interactiva del funcionamiento de markdown. Haz un cambio a la izquierda y verás su efecto a la derecha. Es muy conveniente que dediques algún tiempo a hacer experimentos allí para familiarizarte con los ingredientes básicos del markdown. Tal vez no sea un minuto, pero tampoco vas a necesitar una hora, desde luego. A cambio, después podrás usar markdown en la creciente colección de sitios web y programas compatibles con su uso: WordPress, GitHub, los foros de StackOverflow y sus asociados, etc. Usar markdown no es la panacea universal, pero para muchos de nosotros se ha convertido en una de esas herramientas que te llevan a preguntarte cómo podías pasarte sin ellas antes.


Bloques de código R.

Pero hemos dejado para el final lo mejor. El documento contiene además bloques de codigo R (en inglés se habla de R code chunks). Por ejemplo, el primero de esos bloques es muy breve, y sólo contiene una llamada a una función de R:

summary(cars)

La siguiente figura muestra la manera de indicarle a Knitr los límites de uno de esos bloques de código:


bloqueCodigoR


Cuando Knitr procesa el fichero testRmarkdown01.Rmd va buscando estos bloques de código y los ejecuta secuencialmente, uno tras otro. Y a medida que los ejecuta va insertando las respuestas de R en el documento html que produce, dentro de unos bloques de resultados que aparecen recuadrados (ahora con fondo blanco) bajo el correspondiente bloque de código.


KnitrBloqueCodigoR


Prueba a ejecutar summary(cars) en tu consola de R y verás que obtienes el mismo resultado web que aparece en el documento elaborado por Knitr.


Un inciso sobre Programación Literaria.

Este ejemplo es tan sencillo que puede que no resulte obvio lo que acabamos de explicar. Por eso voy a insistir en el punto clave. Tradicionalmente, ejecutaríamos ese código en R y entonces copiaríamos y pegaríamos el resultado en algún documento, informe, página web, etc. Esa es la forma tradicional de incorporar los resultados de la ejecución del código a las publicaciones científicas o los informes técnicos. En particular, el código y nuestras explicaciones o argumentos basados en ese código vivirían en ficheros separados. Por supuesto, si el código cambia, es muy posible que esas explicaciones y argumentos ya no sean válidos, con lo que las ocasiones para el error aumentan. Pero con Knitr eso ya no es necesario: el código y el texto van unidos en un mismo documento. Esa es una de las ideas centrales de la Programación Literaria, de la que hablaremos más extensamente en alguna otra entrada.


Figuras y control del código que se muestra.

El segundo bloque de código R que aparece en testRmarkdown01.Rmd es también interesante, porque ilustra:

  • la forma de obtener un gráfico.
  • cómo podemos controlar qué partes del código R se muestran y cuáles se ocultan.

Ese bloque es:


bloqueGraficoR


Fíjate en que para obtener la figura simplemente hemos incluido la función plot de R que produce esa figura. Insisto otra vez en lo que no hemos hecho: no hemos fabricado la figura con R para después hacer un corta/pega. Si fuera así y más adelante cambiamos algo en nuestro código, la figura ya no se correspondería con el código y habría que volver a pasar por el ciclo completo de generar la figura correcta, copiarla y pegarla. Pero si la figura se genera e inserta automáticamente a partir del código… ¿te das cuenta del avance que supone esta forma de trabajar?
Enseguida vamos a ver otro ejemplo para abundar en esas ideas. Pero antes vamos con el segundo punto que ilustra este segundo bloque de código del ejemplo. Si vuelves a mirar el documento html que ha producido Knitr, verás que el código plot(cars) no aparece por ningún lado (a diferencia de lo que ocurría con summary(cars), que sí era visible en el documento final). Para hacer invisible ese código, la cabecera del segudo bloque de código incluye la instrucción echo = FALSE de Knitr. Hagamos un experimento. Cambia echo = FALSEpor echo = TRUE y vuelve a pulsar el botón Knit de RStudio.


Mostrando el codigo con echo = TRUE


Ahora, además de la figura, puedes ver el código que la produce en el documento final. Además de echo, hay muchas otras opciones que podemos introducir en la cabecera de un bloque de código para controlar el comportamiento de Knitr. Por ejemplo, con eval=TRUE o eval=FALSE puedes decidir si un bloque de código se ejecuta o no. ¿Y si no quiero que un bloque se ejecute, no es más fácil no incluirlo o comentarlo? Puede parecer que sí, a primera vista. Pero ¿y si tedigo que puedes usar algo como eval=x, donde x es una variable booleana de R y que por lo tanto puedes decidir programáticamente qué partes del código se ejecutan y cuáles no? Es decir, que si algo cambia en tus datos y ya no quieres mostrar un cierto tipo de gráfico, puedes usar eval y echo para encender/apagar partes de tu documento. Y no hemos hecho más que rozar la superficie. Las posibilidades con Knitr son inmensas.


Un ejemplo más.

Vamos a añadir algunos ingredientes más al fichero testRmarkdown01.Rmd para ilustrar las ideas anteriores. Para empezar, añade estas líneas al final del documento (exactamente como aparecen aquí, puedes copiarlas y pegarlas):

## Un ejemplo adicional de gráfica con Knitr.

Vamos a mostrar una gráfica que podremos cambiar **simplemente** 
cambiando el valor de la variable `n`.

De momento se trata simplemente de un poco más de markdown, sin código R. Cuando hayas añadido esas líneas pulsa de nuevo el botón Knit para ver el resultado. La siguiente figura muestra los cambios que deberías ver en la parte final del documento html procesado.


Añadiendo markdown al documento


Vamos con un bloque de código. El código es este:

```{r }
n = 1
x = 1:100
plot(x, x^n, type="l", lwd=4, col="red")
```

De nuevo, puedes copiarlo y pegarlo al final del documento. Tras hacer esto pulsa una vez más Knit. EL resultado debería ser cómo el de la siguiente figura:


Añadiendo más código R al documento


Como ves, Knitr ha procesado el código y ha incorporado al documento la figura que se obtiene, que con n = 1 es una recta. Para insistir en la idea central de Knitr, cambia ahora ese valor por n = 2 y vuelve a pulsar Knit. Sin necesidad de ningún cambio adicional por tu parte, sólo con cambiar ese número, el resultado será el de la siguiente figura.


Ahora con n=2 es una parábola


Como puedes ver, ahora con n=2 el gráfico es una parábola. Y déjame que insista, a riesgo de ser pesado: no hemos tenido que hacer nada más que cambiar ese número para que todo se actualice en el documento final.


Comentarios finales y enlaces recomendados.

Esta entrada sólo pretende presentar Knitr (y markdown) a quienes no los conozcan todavía y, con suerte, animaros a continuar indagando. En próximas entradas profundizaremos un poco más en el funcionamiento de Knitr. Pero para quien quiera empezar ya, hay dos enlaces que le pueden servir de puerta de entrada.

  • La gente de RStudio ha publicado una página de introducción a la combinación de markdown y knitr que denominan Rmarkdown:
    http://rmarkdown.rstudio.com/
    Recomiendo encarecidamente el Quick Tour y la R Markdown Cheat Sheet.
  • La página oficial de Knitr, que sirve de carta de presentación a su creador Yihui Xie, es http://yihui.name/knitr/. En ella encontraréis además un enlace al libro de Knitr, que os recomiendo si queréis profundizar en esta herramienta.

Ambos en inglés, me temo. No me convencen demasiado las (escasas) presentaciones de Knitr que he encontrado en español. Aunque, naturalmente, me encantaría que hubiera alguna mucho mejor (me ahorraría el trabajo de escribir estas entradas) y estoy abierto a cualquier sugerencia que los lectores quieran hacerme llegar.

Muchas gracias por la atención.

Break a leg!

Ha pasado sin duda demasiado tiempo desde la última actividad del blog. Ya dijimos en su momento que el trabajo en el libro iba a ralentizar nuestro ritmo de publicación. Pero no esperábamos que se cruzaran otras cosas por el camino y al final ha pasado más de un año desde la última entrada. Por eso, antes de retomar la actividad, siento la necesidad de hacer un breve ejercicio de justificación de las razones de, al menos, la última parte de este largo periodo de inactividad.

En inglés se usa la frase Break a leg!  (¡Rómpete una pierna!) para desear suerte ante una prueba difícil; por ejemplo, a los actores de una obra teatral el día del estreno (en España usamos la frase mucha mierda con el mismo propósito). La razón por la que traigo a colación esto es que en octubre del año pasado me rompí una pierna (concretamente la rótula de la pierna izquierda). Desde entonces he tenido muchas oportunidades para acordarme de la dichosa frase y siempre he pensado que esta es una de esas cosas que no le deseas a nadie, ni en broma. Han sido unos meses difíciles, en los que la recuperación ha ocupado casi todo mi tiempo. Todavía arrastro algunas secuelas y cojeo un poco, pero ya ha pasado la peor parte. Así que retomamos la actividad y esperamos, esta vez sí, tener mejor suerte (sin necesidad de frasecitas poco afortunadas). Y aunque la vida nos ha enseñado que hacer planes es la mejor manera de provocar a los dioses, también hemos aprendido que no tenemos enmienda.

Haciendo planes.

Tenemos muchas ideas y muchas ganas de contarlas aquí. Por enumerar sólo algunas de las más inmediatas:

  • En nuestra práctica docente en la Universidad de Alcalá el libro PostData se complementa con lo que hemos dado en llamar el proyecto ExamineR: un repositorio de cuestionarios de Estadística, concebidos para usarse con el paquete exams de R. El objetivo es crear cuestionarios, con preguntas de respuesta múltiple, cuyas soluciones se generan automáticamente de manera aleatoria. Esos cuestionarios nos han servido para facilitar el entrenamiento de nuestros alumnos en las tareas más mecánicas de un curso de Introducción a la Estadística. Una de nuestras próximas entradas tratará sobre este proyecto con más detalle.
  • Desde el principio, al afrontar la escritura del libro nos propusimos evitar la tentación de escribir un libro de Estadística con R. Nos hemos esforzado en escribir un libro que sea tan neutral desde el punto de vista del software como nos fuera posible. Y para demostrar (en primer lugar a nosotros  mismos) que el libro cumple ese objetivo, nos impusimos la tarea de crear una segunda colección de tutoriales en los que Python ocupa el lugar de R en los ya publicados. Ese proyecto avanza a buen ritmo y en breve publicaremos la primera colección de tutoriales, que cubrirán las dos primeras partes del libro.
  • Una de las ventajas de trabajar con R es que podemos aprovechar todas las herramientas del ecosistema R. Por ejemplo, con RStudio disponemos de un entorno de trabajo muy satisfactorio y extremadamente productivo. Además, la comunidad R incluye a algunos de los promotores más activos del movimiento de Reproducible Research (el vídeo de presentación de este curso en Coursera puede servir de introducción).  Y para darle un vehículo a esas ideas la comunidad R recuperó la idea de Programación Literaria (Literate Programming) de D.E.Knuth. A mi juicio, una de las contibuciones más originales e interesantes  sobre la tarea de escribir programas, que no había recibido mucha atención por parte de ninguna de las comunidades de desarrolladores de los grandes lenguajes de programación. En R, afortunadamente, disponemos de Knitr, creado por Yihui Xie. La combinación de Knitr con Rmarkdown proporciona una herramienta extraordinariamente flexible y productiva para el análisis de datos, con una curva de aprendizaje mucho más suave que la de otras opciones. Para hacer un mínimo de justicia a todos estos temas necesitaremos varias entradas del blog.
  • Dentro del ecosistema R, Shiny es otra criatura del equipo de RStudio que también merece atención. Shiny nos permite crear aplicaciones web fácilmente desde el propio R. Quizá lo mejor sea echar un vistazo a esta galería de ejemplos para empezar a apreciar las posibilidades que ofrece Shiny. Por su parte Rpubs es una herramienta de publicación mucho más modesta, pero que compensa esa simplicidad con su agilidad. Es una herramienta muy interesante para la docencia, por ejemplo.
  • Me gustaría además incorporar al blog la crítica de algunos de los libros de Estadística y Análisis de Datos que van pasando por mis manos.  Quien dice libros, puede decir también cursos, páginas web, otros blogs, etc.

Y todo esto sin descuidar la tarea de continuar el trabajo que hemos iniciado con el libro. Como decimos en el prólogo, el libro es un proyecto abierto y queremos extenderlo en varias direcciones. Posiblemente en forma de capítulos adicionales disponibles para descargar en la web del libro.

Como puede verse, tenemos mucha faena por delante. ¡Manos a la obra!