Press "Enter" to skip to content

Analizando las pinturas de Rafael con Google Spreadsheets

mfalcon 0

En un viaje a Italia tuve la posibilidad de visitar varios museos y me sorprendió la cantidad de “Vírgenes con el niño” que se pintaban en la época conocida como el “Renacimiento”. Mi percepción era que la mayoría de las pinturas del artista italiano Rafael eran de esta clase, se ve que eso me quedó dando vueltas hasta que decidí investigar si estaba en lo cierto o no.

Lo que vamos a hacer en este tutorial es partir de un artículo de Wikipedia donde se menciona la lista de pinturas del artista Rafael y, a través del uso de Google Spreadsheets, obtener un conjunto de datos que permita responder mi pregunta inicial.

Este es el link al spreadsheet con el resultado final.

Aclaro que no soy un experto en el mundo Excel ni mucho menos, quizás existan mejores formas de resolver los puntos que mencionaré a continuación:

Importar datos de una tabla de un sitio web:

En la primer celda (A1) escribir:

=IMPORTHTML("https://en.wikipedia.org/wiki/List_of_paintings_by_Raphael","table", 1)

El primer item es la url del sitio del cual queremos importar una tabla, el segundo indica a la función que lo que queremos extraer es una tabla y el tercero indica que tabla de ese sitio queremos, según el orden de aparición en el sitio. Si estás en un sitio con varias tablas y querés la cuarta, simplemente cambiá el 1 por el 4.

Esto es lo que deberías ver:

rafael_import

Se ve que la columna “Image” está vacía, no estoy 100% seguro, pero creo que es porque esa columna de la tabla no contiene texto, que es lo que la función “IMPORTHTML” busca a la hora de extraer la información. Así que bórrenla así hay más espacio para las otras.

¿La borraron? Bueno, entonces van a ver que al borrar esa columna desapareció todo el contenido (así que sería bueno que deshagan el cambio con ctrl+z). Esto es porque, además de borrar la columna “Image”, también borraron la función IMPORTHTML. Si estás en un día de vagancia podés simplemente dejar esa columna, pero sería más conveniente que hagas lo siguiente:

Copiá todas las columnas (excepto “Image”) y luego andá a la primer celda, hacé click derecho y seleccioná “Paste special”->”Paste values only”. Vas a ver que ahora sí tenemos lo que queríamos.

Lo primero que estaría bueno saber es, para cada item de la tabla, si se trata de una pintura donde se representa a la virgen con el niño o no. Para eso debemos definir cuales palabras que aparecen en “Title” indican que nos encontramos ante este tipo de pintura. Haciendo un rápido repaso de las imágenes de las pinturas en el link de Wikipedia, puedo concluir que si uno de los siguientess textos aparecen en la descripción, la pintura es de una virgen con el niño: “Holy Family”, “Madonna”, “Virgin and Child”.

Ahora que ya sabemos esto, en F1 nombrá la celda como “virgen_con_niño”. En F2 copiá la siguiente función:

=SUMPRODUCT(--ISNUMBER(SEARCH({"Madonna","Holy Family","Virgin and Child"},A2)))>0

=SEARCH({"Madonna","Holy Family","Virgin and Child"},A13)

Lo que hace la función SEARCH es indicar cuantas veces en una celda (el Title en este caso) aparecen las palabras dentro de las llaves. Si aplicamos esta función sobre A8, obtendremos un 1, porque existe sólo una coincidencia (Madonna). Si aplicamos esta función sobre una celda que no tiene coincidencias obtendremos el error “VALUE”.

A nosotros no nos interesa la cantidad de coincidencias, sólo nos sirve saber si hay alguna coincidencia o no, por lo que deberíamos agregarle otra función:

=--ISNUMBER(SEARCH({"Madonna","Holy Family","Virgin and Child"},A2))

La función ISNUMBER recibe el valor de una celda e indica si es un número (TRUE) o no (FALSE). Para que devuelva un valor numérico (que vamos a aplicar en la próxima función) en lugar de un booleano (TRUE/FALSE) le agregamos el “–“.

=SUMPRODUCT(--ISNUMBER(SEARCH({"Madonna","Holy Family","Virgin and Child"},A2)))>0

Finalmente aplicamos la función SUMPRODUCT que se va a encargar de sumar las coincidencias en cada celda y con el ">0" al final, concluimos sobre la existencia de alguna de las palabras que necesitábamos buscar.

Y luego arrastrá ese valor para completar todas las filas y deberías ver algo como lo siguiente:

rafael_sumprod

Estaría bueno usar la columna “Year” para saber cuantas virgenes con el niño (o no) Rafael pintó por año y así poder identificar ciertos eventos en la vida de Rafael que nos permitan llegar a alguna conclusión.

En la columna “Year” aparecen cosas como la duración de la obra “1499-1502” y también algo más aproximado “c. 1502”. Por una cuestión de simplicidad vamos a tomar únicamente el primer año que aparece en esa columna, por lo que serán los años que inició cada obra.

Seleccioná todos las filas de la columna “año_trimmed” y luego hacé click en -> Edit -> Find and replace… -> en la caja “Find” agregar “c.” y dejar vacío el “Replace with” -> -> Replace all

replace_c

Cuando hacen el replace van a ver que en la fila 73 sigue apareciendo un “с. 1510”, esto se debe a que probablemente ese caracter sea distinto al c que pusimos anteriormente. Esto es algo medio complejo de explicar, así que lo dejamos para otro episodio. En este caso simplemente lo pueden borrar manualmente y sólo dejar 1510.

Ahora eliminemos los espacios en blanco de la columna Year para evitar problemas al aplicar funciones. Nombrá la celda G1 como “año_trimmed”. En G2 copiá la siguiente función (y luego arrastrá hacia abajo):

=TRIM(B2)

Lo que hace la función TRIM es simplemente remover los espacios en blanco de la celda deseada, muy útil cuando luego se van a aplicar funciones que utilizan texto.

Esto es lo que verás:

Selection_045

Ahora que tenemos un conjunto de datos más limpio, en H1 nombrá la celda como “año_filtrado”. En H2 copiá la siguiente función:

=IFERROR(LEFT(G2,(FIND("-",G2)-1)),G2)

=FIND("-",G2)

La función FIND sirve para encontrar una secuencia de caracteres en una celda, en este caso el guión. Lo que devuelve es el número donde encuentra esa secuencia en la celda. Por ejemplo en “1499-1501”, esta función devolverá un 5, el primer caracter es 1, el segundo es 4 y así sucesivamente. Si no encuentra nada devuelve “#VALUE!”, ya veremos como solucionarlo.

=LEFT(G2,(FIND("-",G2)-1))

LEFT es una función que devuelve el contenido de la celda que esté a la izquierda del número que le indiquemos como corte. En el caso de “1499-1501”, lo que queremos es quedarnos con los primeros 4 caracteres. Como la función FIND anterior devuelve la primer coincidencia del “-“, nosotros nos queremos quedar con los caracteres anteriores. Por eso a la función FIND le restamos el número 1.

=IFERROR(LEFT(G2,(FIND("-",G2)-1)),G2)

¿Recuerdan que si la función FIND no encontraba coincidencias devolvía “#VALUE!”? Para solucionar este inconveniente usamos la función IFERROR. A esta función le pasamos primero la función anterior y, si esta falla, le pasamos como segundo valor la celda original, por lo que si FIND no encuentra nada y devuelve un error, la celda contendrá el valor original.

Ya tenemos todos los datos y falta que agrupemos, por año, la cantidad de obras clasificadas como virgen con el niño y las restantes. Para esto existen las famosas “tablas pivot”.

Para crear una, primero seleccioná toda la planilla y luego tenés hacer click en Data -> Pivot Table…

Una vez en la tabla pivot habrá que seleccionar como queremos agrupar y mostrar los datos. Observá que a la derecha aparece algo llamado “Report Editor”, donde se seleccionan los valores a filtrar y la forma de hacerlo. En este caso haremos lo siguiente:

  • Rows -> Add field -> año_filtrado
  • Columns -> Add field -> virgen_con_niño
  • Values -> Add field -> virgen_con_niño
  • Summarize by: COUNTA

Si seguiste estos pasos vas a ver algo como esto:

pivot

Ya que estamos, démosle un toque final pasando estos datos a un gráfico:

Hacé click en Insert -> Chart y seleccioná el que te guste.

Imagen final:

final_grafico

Ya con esto podemos empezar a analizar la pregunta inicial, que queda para una próxima publicación.

Dejá un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *