Tutorial Tableau 03. Análisis espacial con Tableau
Herramientas: Tableau
Última actualización: octubre de 2019.
Aviso: Este documento es un complemento a las sesiones que imparto sobre visualización de datos y analítica visual, y en ningún caso pretende ser un manual comprehensivo sobre Tableau.
Por otra parte, cada nueva iteración de los cursos suelo aprovechar para actualizar los datos, documentar nuevas funcioanlidades, introducir nuevos ejemplos, etc, por lo que puede haber discrepancias entre distintas secciones del tutorial.
Introducción
Este ejercicio es una continuación del ejercicio de introducción a Tableau. Para profundizar en las tripas y funcionalidades de Tableau, partiremos de los conceptos analizados en las sesiones teóricas:
- Operacionalización de preguntas en tareas
- Técnicas para facilitar el análisis
- Variables temporales
- Distintos tipos de gráficas
Antes de ponernos a trabajar directamente con Tableau, hemos de tener en cuenta dos aspectos principales a la hora de trabajar con mapas:
¿Qué marcas queremos dibujar?
Tenemos tres opciones:
- Puntos: necesitaremos una latitud y una longitud para cada punto. Podemos usar los tipos de marca
Cuadrado
,Círculo
oForma
, dependiendo de nuestras necesidades. - Líneas: necesitaremos latitud/longitud para cada punto de la línea. Además, si vamos a trabajar con más de una línea, necesitaremos un campo que sirva para identificar cada una de las líneas. Y en cualquier caso, necesitaremos otro campo que indique el orden en el que se tienen que unir los puntos. Habitualmente suele ser un campo de tipo
fecha/hora
, pero no es necesario que sea así. Usaremos el tipo de marcaLínea
para crear las líneas y el canalRuta
para indicar el orden. - Áreas (polígonos): los datos que necesitamos son los mismos que para crear líneas, simplemente usaremos el tipo de marca
Polígono
para que Tableau cierre las formas.
¿Cómo están organizados nuestros datos?
- Datasets sin datos grográficos propiamente dichos (coordenadas), pero con campos con algún tipo de segnificado geográfico: países, municipios… Tableau intentará encontrar la información geográfica necesaria para poder dibujarlas en el mapa.
- Datasets con coordenadas incluidas. En este caso, podemos encontrarnos con dos casos generales:
- Recorridos de A a B, con las coordenadas de cada uno de los dos puntos. Desde la versión 2019.2, esos datos pueden estar en una misma fila de la fuente de datos.
- Recorridos con más de dos puntos. En este caso, vamos a necesitar que cada punto de coordenadas esté en una fila distinta del dataset. Además, necesitaremos un campo que permita identificar los puntos de un elemento concreto, así como otro campo para indicar el orden en el que han de unirse los puntos (habitualmente un campo de tipo
fecha/hora
, aunque no es necesario que sea así).
- Datasets codificados como archivos espaciales:
.shp
,.kml
,geojson
… (lista de formatos grográficos soportados por Tableau)
Lo que vamos a aprender
- Puntos y/o áreas sin coordenadas
- Puntos con coordenadas
- Directamente
- Función
MAKEPOINT()
- Líneas A-B
- En la misma fila: función
MAKELINE()
- En la misma fila: función
- Polilíneas
- Áreas (polígonos)
- Combinar distintos tipos de marcas (puntos y áreas, puntos y líneas)
Una vez que conozcamos los rudimentos para poder trabajar con información espacial, podremos pasar a unir dos archivos espaciales, en concreto archivos de puntos y uno de áreas. En estos casos, podremos además crear nuevos indicadores a partir de la información espacial, como por ejemplo la densidad de algo en una zona determinada.
Finalmente, veremos otras posibilidades que usan la misma lógica espacial, pero sin necesidad de tener los datos georreferenciados: podremos dibujar sobre planos, o directamente crear dibujos a partir de X e Y.
Fuente de datos
Para este ejercicio vamos a utilizar un conjunto de datos sobre el uso de Bicicletas en Los Ángeles, disponible en Kaggle.com.
La versión del archivo utilizada en este ejercicio fue descargada el 06/09/2018, y contiene los Trip ID
s de 1912818 (07/07/2016) a 2379418 (31/03/2017). Si a la hora de seguir los pasos indicados en tu ordenador obtienes resultados distintos, puede deberse a que estés usando una versión distinta del dataset.
NOTA: este ejercicio parte de las acciones de ETL ya explicadas y aplicadas en el ejercicio 1. Además, y para ampliar los datos ya disponibles, usaremos estas otras fuentes de datos:
- Lista de paises:
lista_paises.csv
- Lista de barrios de LA:
LA_nehighborhoods.csv
- Áreas de los barrios de LA:
l.a. county neighborhoods (v5).shp
- El dataset original pivotado:
puntos.csv
Puntos y/o áreas sin coordenadas
Este sería el peor de los casos ante los que nos podemos encontrar, desde el punto de vista de los datos geográficos, ¡ya que carecemos de ellos!
Sin embargo, Tableau intenta detectar posibles campos con un mínimo de vinculación a la geográfia; estos campos suelen ser algún tipo de orgranización administrativa, como países, provincias, municipios, unidades territoriales NUTS de Europa… Tableau intentará realizar estas conexiones a partir de los nombres de las variables, pero en caso de que no las detecte automáticamente, podemos indicarlas nosotros manualmente.
Al cargar el fichero 00_provincias_y_capitales.xls
en Tableau observamos que la variable Provincia
tiene el icono del globo terráqueo, mientras que el campo Capital
aparece como un campo de tipo cadena.
Si hacemos click en el icono de tipo de dato, veremos que Tableau ha asignado la función geográfica Estado/Provincia
al campo Provincia
, mientras que el campo Capital
no tiene ninguna función geográfica.
Tableau tiene dos funciones geográficas que podrían concordar con nuestro campo Capital
, Provincias/Municipio
y Ciudad
. Como la segunda opción parece más concreta, vamos a asignarla al campo Capital
(si más adelante observamos que Tableau no devuelve ningún dato geográfico a partir de esta función, podremos volver a cambiarla a Provincias/Municipios
y comprobar si esa asignación ofrece mejores resultados).
Una vez que tenemos los dos campos georreferenciados, vamos a crear los mapas.
1 Creamos una nueva hoja de trabajo y la nombramos PuntosSinCoordenadas
.
2 Dado que existe una jerarquía entre los dos campos, vamos a reflejarla en Tableau creando una jerarquía. Para ello, basta con arrastrar el campo Capital
al campo Provincia
.
3 Si seleccionamos cualquiera de los dos campos, la pestaña Muéstrame
activará las opciones Mapa de símbolos
y Mapa
. Empezando por la opción de Mapa de símbolos
, encontramos fallos para los dos campos:
- Si usamos el campo
Provincia
, Tableau nos muestra un plano con todos los países del mundo, cuando solo tenemos información de las tres provincias de la CAPV. - Si usamos el campo
Capital
, solo aparecen dos de las tres ciudades que tenemos en el dataset.
En este caso nos encontramos ante dos problemas:
- El campo
Provincia
no está mapeado a la función geográfica correcta. Si intentamos indicar los nombres a mano (porque tenemos la sospecha de que al estar los nombres en euskera no los encontrará en su base de datos), observamos que al empezar a escribirVizcaya
no nos aparece como opción, pero síPaís Vasco
. Esto nos lleva a pensar que efectivamente, la función geográfica que tenemos que asignar al campo esProvincias/Municipio
. Al cambiar la función, Tableau muestra las tres provincias correctamente (sin necesidad de usar los nombres en castellano). - El campo
Capital
sólo muestra dos de las tres ciudades que tenemos en nuestro dataset. En este caso, las dos ciudades que sí aparecen están correctamente geolocalizadas, por lo que la función geográfica parece correcta. Si usamos la funcionalidad para corregir los datos desconocidos, en este caso sí que parece haber un problema con la cadena utilizada. Si la cambiamos porVitoria/Gasteiz
, aparecerá correctamente en el mapa.
¿Por qué no vemos las ciudades como áreas?
Recordemos que nosotros no hemos aportado ningún dato espacial, por lo que Tableau ha tenido que recurrir a sus propias bases de datos. Y esas bases de datos pueden no contener todos los datos que nosotros necesitamos, como es el caso.
Dependiendo del país y de la función geográfica, es posible que para algunos niveles tengamos áreas (provincia) y para otros no (municipios), pero sí al menos unas coordenadas. Si necesitamos el mapa de las ciudades, tendremos que buscar alguna fuente que nos los sirva como archivo espacial (ver punto bla).
Combinar mapas de puntos y de áreas
En nuestro ejemplo podemos crear mapas de área para las provincias, y de puntos para ambos campos. Lo que vamos a hacer a continuación es crear un mapa que muestra los dos niveles, las provincias como áreas, y las ciudades como puntos.
Sin embargo, para hacer este tipo de mapa no podemos desagregar la variable Provincia
sin más.
- Primero, tenemos que duplicar la latitud o longitud del mapa de origen.
- Segundo, configuramos el nuevo mapa para mostrar los datos que nos interese. Eliminamos todos las variables mapeadas a canales y llevamos las que nos interesan; en este caso, llevamos
Capital
aDetalle
oColor
. - Finalmente, combinamos los dos mapas con la opcioón
Eje doble
.
NOTA: si seguimos los pasos mencionados arriba, no podremos crear círculos de tamaño distinto, ya que el tipo de marca automático se habrá puesto en Mapa
. Para poder tener círculos de tamaños distintos, primero tenemos que cambiar el tipo de marca a Círculo
, y luego mapear alguna variable numérica al canal tamaño (en el ejemplo, y a falta de una variable numérica, se mapea una categórica, cosa que aunque no tenga sentido sirve para mostrar la diferencia entre tener la marca Mapa
o la marca Círculo
).
Agrupaciones y jerarquías de dimensiones Lista de paises
Para este ejemplo vamos a trabajar otra vez con un dataset muy simple, que únicamente cuenta con un campo de texto con el nombre de cada país (Fuente), pero que cuenta con más registros.
Al cargar los datos, Tableau detecta automáticamente que el campo Countries
puede tener una rol geográfico, y se lo asigna (si la asignación fuera incorrecta, o no se hiciera automáticamente, siempre podríamos indicarla manualmente).
En una nueva vista, creamos un mapa de coropleta usando la opción de la pestaña Show me
.
Como se puede observar, Tableau ha reconocido prácticamente todos los países, pero tiene problemas para identificar algunos de ellos en su base de datos. Estos problemas pueden deberse a varios motivos:
- La cadena de texto en la que se basa el reconocimiento. En este caso, los nombres de los países están en inglés, que suele ser el idioma menos problemático a la hora de reconocer valores en la BD de Tableau.
- Limitaciones en la base de datos de Tableau: Tableau no dispone del mismo nivel de detalle de información geográfica para las distintas administraciones del mundo. En el caso de España, por ejemplo, es capaz de dibujar puntos de latitud y longitud para provincias, pero no puede dibujar el área de esas mismas provincias (si queremos crear un mapa que dibuje el área de las provincias españolas, tendremos que obtener esos datos de otra fuente.) (Lo que Tableau reconoce automáticamente)
En cualquier caso, Tableau nos ofrece algunas herramientas para tratar de paliar el problema. Si hacemos click en el la nota que dice 14 desconocidos
, accederemos a un cuadro de diálogo con estas tres opciones:
- Editar ubicaciones
- Filtrar resultados
- Mostrar datos en posición predeterminada (lat:0;long:0)
Al hacer click en Editar ubicaciones
Tableau despliega una lista con todos los valores, tanto los que se han mapeado correctamente con su BD, como los que no. En el caso de estos últimos, podemos intentar mapearlos manualmente (aún y así puede que no siempre sea posible).
Funcionalidad grupos
de Tableau
En el ejemplo de los países tenemos una única variable country
, que funciona como dimensión. Con la funcionalidad grupos
podemos reducir la dimensionalidad de esta variable agrupando los paises en entidades supranacionales (continente, OTAN / Pacto de Varsovia…).
La forma más directa de crear un grupo consiste en seleccionar una o más marcas de la vista y hacer click en el icono de grupo de la ventana contextual (si dicha ventana nos desaparece de la vista, basta con dejar el ratón encima de la marca sin mover unos pocos segundos para que vuelva a aparecer).
En la pestaña datos nos aparecerá una nueva dimensión, que tiene el icono del clip asociado al icono de la dimensión original (en este ejemplo, el del globo terráqueo, al tratarse de una variable con rol geográfico.)
Si editamos el grupo, podemos cambiar los nombres de los grupos, reordenar los elementos de cada grupo, etc.
Podemos utilizar los grupos como cualquier otra dimensión para crear nuevos cálculos a un nivel de agregación superior al que teníamos hasta el momento. Por ejemplo, una vez creado un grupo con los contienentes, podemos contar el número de paises de cada continente:
Jerarquía de dimensiones
Tableau nos permite indicar si entre dos (o más) dimensiones existe algún tipo de jerarquía, como puede ser el caso de categoría
/ subcategoría
, o el ejemplo que acabamos de crear de continente
/ país
.
Para crear una jerarquía de dimensiones basta con arrastar una dimensión encima de la otra en el panel datos
.
Las dimensiones jerarquizadas funcionan como las fechas; es decir, si usamos en la vista la dimensión superior, aparecerá un +
a su izquierda, indicando que podemos desagregar ese nivel de detalle. Por ejemplo, en el caso del mapa, si la dimensión country (grupo)
para colorear el mapa y hacemos click en el +
, obtendremos además el perfil de cada pais.
Mapa de símbolos teniendo las coordenadas
Usando latitud y longitud
Para este ejemplo vamos a usar el dataset de L.A. Metro Bike Share, que tiene dos pares de coordenadas en cada registro, uno para la estación de salida y otro para la estación de llegada. En los ejemplos vamos a trabajar con las coordenadas de las estaciones de llegada.
Pero antes de nada, vamos a recapitular:
-
El dataset tiene miles de registros, cada uno con sus coordenadas
-
En total hay algo más de 200 estaciones distintas
-
Tableau agrega al mácimo cualquier medida que llevemos a la Vista
-
Llevamos
End Lon
a columnas. Vemos que la función de agregación no esSUM()
, sinoPROM()
. Esto se debe a que el sistema de coordenadas es un sistema acotado. En el caso de la longitud, entre [-180,180]. -
Llevamos
End Lat
a filas.
Como ya hemos dicho, Tableau agrega las medidas al máximo nivel. Como todavía no hemos añadido una dimensión a la vista, Tableau resume los casi 800.000 puntos a uno solo.
Lo lógico sería añadir la dimensión End Station
a la vista, ya que las coordenadas corresponden a las distintas estaciones. De esta forma, obtendremos un punto para cada estación (podemos filtrar la estación con ID 4108, ya que se trata de una estación virtual).
NOTA: realmente no es imprescindible llevar End Station
a la vista; en principio podemos llevar cualquier combinación de dimensiones, tal y como veremos en el punto ### (siempre que nos ayude en las tareas analíticas).
Una vez que tenemos la base de nuestro mapa de símbolos, podemos añadir otras variables a las marcas, como por ejemplo el número de registros al tamaño de las marcas. Asimismo, podemos configurar las marcas para aclarar el mapa.
Creando un campo de tipo objeto espacial a partir de latitud y longitud
Desde la versión 2019.2, podemos usar la función MAKEPOINT()
para crear un objeto espacial. Si bien seguimos necesitando los valores de latitud y longitud, al dibujar los puntos sobre el mapa con este tipo de campo espacial los puntos se comportan de forma distinta a como hemos visto en el punto “Usando latitud y longitud”.
- Creamos un nuevo campo calculado con esta configuración:
// CoordFin
MAKEPOINT([End Lat], [End Lon])
- Llevamos el nuevo campo a
Detalle
. Al llevar un campo con información espacial Tableau hace los siguiente:- Dibuja cada objeto como corresponda (en este caso, puntos, pero pueden ser líneas o polígonos).
- Las marcas siguen estando agregadas al máximo nivel, ya que no hemos añadido ninguna dimensión.
Para desagregar los puntos, tenemos que llevar alguna dimensión a la vista. Por ejemplo, si llevamos End Station
a Detalle
, cada punto pasará a ser una marca individual. Al pasar el ratón por uno de los puntos ya no se comporta como una única marca, y si nos fijamos en el tooltip, veremos que cada punto tiene su propio ID.
Por otra parte, al usar este tipo de campo Tableau ha aplicado automáticamente el tipo de marca Mapa
. Sin embargo, este tipo de marca no permite cambiar el tamaño de las marcas (por ejemplo, para reflejar el número de viajes). Si queremos mapear una variable continua a las marcas, primero tenemos que cambiar el tipo de marca a Círculo
, Cuadrado
o Forma
.
Mapas de líneas entre dos puntos
En el caso de que queramos ver líneas que unan trayectos entre dos puntos, A y B, y tengamos todos los datos recogidos en el mismo registro, podemos usar la función MAKELINE()
disponible desde la versión 2019.2. A esta función hay que pasarle dos puntos en forma de objeto espacial, por lo que en este caso podemos crearlos con la función MAKEPOINT()
que ya hemos visto en el punto anterior.
// Recorridos
MAKELINE(
MAKEPOINT([Start Lat],[Start Lon]),
MAKEPOINT([End Lat], [End Lon])
)
Cuando llevamos el nuevo campo a Detalle
volvemos a obtener una línea agregada al máximo detalle. Como el dataset contiene algunos registros con valores nulos o mal codificados para latitud y longitud, varios de los recorridos acaban en el mar (concretamente, en las coordenadas 0,0
). Filtramos los viajes que tengan alguno de estos campos con valor nulo.
A diferencia de los puntos obtenidos con MAKEPOINT()
, si cambiamos el tipo de marca a Línea
, no vamos a poder utilizarla correctamente, ya que no tenemos un campo que poder usar para ordenar los puntos (ya que el orden se establece a partir de datos que están repartidos en varios registros del dataset, no de uno solo). Lo que hace Tableau es lo que haría con un gráfico de línea normal, es decir, ir uniendo los puntos de izquierda a derecha.
Versiones anteriores a 2019.2
ETL
Nuestro dataset no tiene la estructura de datos adecuada para dibujar este tipo de mapa, ya que cada línea del dataset no contiene información de un solo punto, sino de dos (estación de inicio y de final). Antes de poder dibujar el mapa, vamos a tener que reestructurar los datos.
ej_tableau_bicis_LA_05_ETL.html
recoge las transformaciones realizadas al archivo de datos original con Tableau Prep.
Dibujar el mapa
- Cargamos el archivo
puntos.csv
en Tableau y asignamos los roles geográficos pertinentes a los camposLatitud
yLongitud
. - Llevamos el campo
Longitud
aColumnas
y el campoLatitud
aFilas
. - El nivel de detalle que necesitamos es el de cada uno de los trayectos, así que llevamos
Trip ID
a la marcaDetalle
; de esta forma obtenemos todos los puntos, tanto los de salida como los de llegada. Filtramos los puntos que están mal geolocalizados. - Cambiamos el tipo de marca de
Automático
aLínea
. Lo que hace Tableau (hasta que lo corrijamos) es unir todos los puntos con una línea tal y como aparecen de izquierda a derecha (como si fuera una gráfica de timeline). Tenemos que indicarle qué variable es la que rige la partición de las líneas. . - Para poder pasar de esta línea contínua a los puntos que corresponden a las estaciones (y las líneas que dibujarán los trayectos) tenemos que eliminar la agregación de las píldoras de latitud y longitud, para lo que indicamos en el menú desplegable que tienen que ser tratadas como dimensiones.
El mapa de trayectos ya está correctamente creado, pero nos encontramos ante un claro caso de overplotting, por lo que no resulta nada fácil detectar posibles patrones.
Mejoras gráficas
A fin de facilitar el análisis, vamos a realizar ciertas modificaciones que aligerarán la gráfica y añadirán contexto.
- Llevamos la variable categórica
Passholder type
al canalColor
. - Llevamos la variable
Duracion real
a la marcaTamaño
. Al tratarse de una gráfica de líneas, el tamaño se refleja como el grosor de la línea (a fin de cuentas, la longitud de la línea viene dada por la distancia entre los puntos que la conforman). - Accedemos desde el menú principal a
Mapa > Capas de mapas...
y activamos la capa deCalles y carreteras
(sólo se motrastrán dependiendo del grado de zoom que estemos aplicando al mapa).
Vista de eje doble
Una técnica muy útil para añadir contexto a una vista consiste en crear una vista de eje doble (que, en el caso de los mapas, permite suporponer una capa de datos sobre otra). Como la red de trayectos es muy tupida, hemos perdido de vista muchas estaciones, particularmente las que están en la zona central. Vamos a dibujar las estaciones sobre la red.
- Llevar la píldora
Longitude
de nuevo aColumnas
para que esté duplicada. Al hacer esto, conseguimos que aparezcan unos nuevos subestantes en el estanteMarcas
. Uno cómun (Todo
) en el que cualquier configuración se aplicará a todas las marcas; y un subestante para cada píldoraLongitude
, para poder configurar las marcas de forma distinta (las líneas de los trayectos de una forma y los puntos de las estaciones por otra). - En el segundo subestante
Longitude
, eliminar cualquier píldora que pueda haber. - En el segundo subestante
Longitude
llevamosNúmero de registros
aTamaño
. De esta forma, el tamaño del punto de cada estación refleja el número de trayectos. - En la segunda píldora
Longitude
que tenemos enFilas
, seleccionamos la opciónEje doble
del menú secundario.
De esta forma, obtenemos el mapa con las dos capas de datos.
Animación basada en el tiempo
Ejemplo paso a paso
Otra técnica que nos permite aligerar el mapa y facilitar el análisis consiste en crear las llamadas small multiples; la gráfica principal se faceta o subdivide a partir de una variable discreta.
Por ejemplo, podemos crear un mapa para cada mes añadiendo la dimensión Start Time
a nivelde mes (discreto) a columnas o a filas.
Sin embargo, una mejor opción consiste en animar esta partición y cargar un mapa cada ciertos segundos. En Tableau podemos usar el estante Páginas
para crear este tipo de animaciones.
- Movemos la píldora
Start Time
de filas o columnas al estantePáginas
y la cambiamos de tipo discreto a contínuo; la píldora no cambia de color como debería, pero los meses se ordenan correctamente a la hora de crear la animación.
En la parte derecha aparece un nuevo estante que nos permite configurar la animación. Podemos cambiar la velocidad de la reproducción, cambiar paso a paso…
Gracias a la animación mes a mes detectamos algunos patrones que hasta ahora eran más difíciles de asimilar.
Vídeo TC18
Colofón: vídeo con todos los pasos.
Calcular distancia entre dos puntos
Desde la versión 2019.2, podemos usar la función DISTANCE()
para calcular la distancia entre dos puntos (que tenemos almacenados en un mismo registro.)
// Distancia entre Inicio y Final
DISTANCE(
MAKEPOINT([Start Lat],[Start Lon]),
MAKEPOINT([End Lat], [End Lon])
)
Para versiones anteriores de Tableau que no tengan la función DISTANCE()
implementada, podemos crear un campo calculado con esta fórmula (fuente del cálculo —NOTA: en el artículo se da por supuesto que en el dataset hay una línea por cada par latitud/longitud, no dos como en nuestro caso, por lo que en este caso concreto no es necesario realizar las consultas Custom SQL
que se mencionan.—):
// Distancia (KM)
6371 * ACOS
(
SIN(RADIANS([Starting Station Latitude])) * SIN(RADIANS([Ending Station Latitude])) +
COS(RADIANS([Starting Station Latitude])) * COS(RADIANS([Ending Station Latitude])) * COS(RADIANS([Ending Station Longitude]) -
RADIANS([Starting Station Longitude]))
)
Mapas de líneas entre dos o más puntos (en registros distintos)
Para poder hacer mapas de líneas de dos o más puntos, tenemos que tener una estructura de datos con la siguiente estructura:
- Campo para identificar cada una de las Líneas
- Campo para ordenar los puntos dentro de la líneas
- Latitud del punto de inicio/paso/final
- Longitud del punto de inicio/paso/final
Para este ejemplo, vamos a utilizar el dataset de tifones que podemos descargar de la web de Tableau, Storm_Map_Sheet_data.csv
. Dado que el archivo está codificado como un CSV en inglés, para poder cargar los datos correctamente tenemos que indicar que el separador es la coma, y la configuración regional a inglés.
Una vez que tenemos el conjunto de datos correctamente configurado, podemos proceder a crear el gráfico.
- Llevamos
Latitude
aFilas
yLongitude
a columnas. Como es habitual, obtenemos un único punto sobre el mapa. - Llevamos
Storm Date
aDetalle
oColor
. Ahora, tenemos un punto por cada tifón. - Cuando cambiamos el tipo de marca a
Línea
, obtenemos una única línea que une los puntos de izquierda a derecha. - Para poder crear las líneas correctamente, tenemos que llevar algún campo que sirva para a) desagregar los datos y b) ordenarlos dentro de cada tifón. En este caso, usaremos el campo
Date
. Sin embargo, Tableau vuelve a agregar el campo al máximo nivel (al tratarse de un campo de tipo fecha y hora, a nivel de año). Para ver las líneas correctamente, tenemos que marcar la opciónFecha exacta
.
NOTA: en las versiones anteriores a la 2019.2, si queremos obtener un mapa de líneas a partir del dataset de ejemplo, primero tendremos que reestructurar los datos para que cada punto de coordenadas esté en un único registro (lo que duplicará el tamaño del dataset). Ver Ejemplo.
Calcular distancia de cada tramo
En el punto ### hemos visto una fórmula para calcular la distancia entre dos puntos. Para calcular la distancia de cada tramo, vamos a usar la misma fórmula básica, pero con algunos matices:
- Los dos puntos no están en una sola fila, sino repartidos en dos filas. Por eso, vamos a tener que usar fórmulas de cálculo de tablas para poder comparar el valor de una fila con el de otra fila distinta (con la función
LOOKUP()
). - Los cálculos de tabla requieren que los campos estén agregados, de lo contrario obtendremos un mensaje de error.
Dado que el primer tramo se delimita cuando obtenemos el segundo punto, vamos a tomar como coordenada final la del segundo punto, y como coordenada inicial la del primer punto. Es decir, la primera parte de la fórmula quedaría así: SIN(RADIANS(LOOKUP(AVG([Latitude]), -1))) * SIN(RADIANS(AVG([Latitude])))
.
La fórmula completa para el campo calculado quedaría así:
// Distancia de tramo
6371 * ACOS
(
SIN(RADIANS(LOOKUP(AVG([Latitude]), -1))) * SIN(RADIANS(AVG([Latitude])))
+ COS(RADIANS(LOOKUP(AVG([Latitude]), -1))) * COS(RADIANS(AVG([Latitude])))
* COS(RADIANS(AVG([Longitude])) - RADIANS(LOOKUP(AVG([Longitude]), -1)))
)
Además, y dado que se trata de un cálculo de tabla, tenemos que indicar a Tableau el particionamiento y direccionamiento de la tabla. Para ello:
- Hacemos click en el enlace
Cálculo de tablas predeterminadas
. - En la opción
Calcular usando
seleccionamosAvanzado
. - En la nueva ventana, usamos el campo
Storm Name
para particionar los cálculos, y el campoDate
para direccionarlas (dado que vamos a usar la funciónLOOKUP()
, es realmente importante que indiquemos correctamente el orden de los cálculos).
Una vez que tenemos el campo calculado, podemos añadirlo a la vista. Hemos de tener en cuenta que el cálculo no afecta a los tramos propiamente dichos (las líneas del gráfico), sino a los puntos de tramo (salvo el primero, que no se puede calcular por carecer de un valor anterior).
Calcular distancia total de cada línea
Una vez que hemos calculado la distancia de cada tramo podemos calcular la distancia total recorrida por cada tifón. Sin embargo, no podemos usar una función de agregación normal sobre nuestro campo calculado (por ejemplo, SUMA([Distancia de tramo])
), ya que Tableau nos mostrará el siguiente error: El argumento para SUM() (una función de agregación) ya es una agregación, y no puede volver a añadirse
.
Para poder realizar una agregación sobre datos ya agregados, debemos usar una función de ventana. Habitualmente, este tipo de funciones se utilizan para calcular totales acumulados, medias móviles, etc.
En vez de usar referencias relativas, usaremos las funciones FIRST()
y LAST()
para hacer todos los cálculos sobre el mismo rango de celdas. Y nuevamente, vamos a editar el particionamiento y el direccionamiento del campo de cálculo para que la suma de tramos se reinicie con cada tifón.
// Distancia total
WINDOW_SUM([Distancia de tramo], FIRST(), LAST())
NOTA: si usamos esta técnica para calcular la distancia total acumulada por cada línea, necesitaremos que los el campo que hemos usado para direccionar los cálculos ([Date]
) esté particionando la vista, por lo que no podremos crear un gráfico agregado.
Calcular distancia entre puntos (otra variante)
En este ejemplo, basado en el vídeo de Lorna Eden “#TableauTipTuesday Week 43 – How to use the Distance calculation”, vamos a ver otra técnica para calcular la distancia entre dos puntos. El método mostrado en el vídeo crea un punto de referencia con respecto al que se calculan las distancias del resto de los puntos. Además, el usuario puede cambiar el punto de referencia simplemente haciendo click sobre un punto de interés. Para ello, utiliza una funcionalidad disponible desde la versión 2019.2, las acciones de parámetro.
Para agilizar los cálculos, en lugar de trabajar con todo el dataset de los recorridos de las bicis, vamos a exportar los códigos de las estaciones de fin de recorrido, y sus coordenadas. Para ello, llevamos End Station
a filas, y End lat
y End long
a texto.
Seleccionamos todas las filas y hacemos click en el icono de Ver datos
.
Exportamos la pestaña Resumen
a .csv
.
Cargamos el fichero generado en el paso anterior como una nueva fuente de datos.
Hasta ahora, para modificar el valor de un parámetro, el usuario tenía que acceder al control de parámetro y hacer su selección. Gracias a las acciones de parámetro, la modificación se puede realizar directamente desde la vista: el usuario selecciona una marca, y el valor del parámetro se actualiza acorde con la marca seleccionada.
- Creamos un parámetro de texto con nombre
Seleccionar una estación
, y lo dejamos sin configurar. - Creamos una acción de parámetro con la siguiente configuración.
- Nombre:
Estación seleccionada
- Hojas de origen: Seleccionamos la hoja con la que estamos trabajando
- Ejecutar acción con:
Seleccionar
- Parámetro de destino:
Seleccionar una estación
- Valor > Campo:
End Station (estaciones)
- Nombre:
- Creamos un campo calculado con esta fórmula. Para cada estación, Tableau revisará si es la que aparece en el parámetro
Seleccionar una estación
y devolverá los valoresTRUE/FALSE
según corresponda.
// Estacion seleccionada TF
[End Station] = [Seleccionar una estacion]
Usaremos las coordenadas de la estación seleccionada como punto de origen para el cálculo de la función DISTANCE()
. Para ello, necesitamos crear tres campos calculados más:
// LatSeleccionada
{ MIN(IF [Estacion seleccionada TF] THEN [End Lat] END) }
Esta expresión de nivel de detalle comprueba para cada fila si es la estación seleccionada, y si lo es devuelve la latitud. Dado que es de tipo FIXED
y no hay ningún particionamiento (ya que no hay ninguna dimensión en juego), propaga ese valor a todas las filas. Duplicamos el campo calculado y lo editamos para obtener la longitud de la estación seleccionada.
Una vez que hemos calculado estos dos datos, podemos pasar a calcular la distancia:
// Distancia estaciones
DISTANCE(
MAKEPOINT([LatSeleccionada], [LongSeleccionada]),
MAKEPOINT([End Lat], [End Lon]),
'km'
)
Gracias a la acción de parámetro, cada vez que seleccionemos una estación distinta, ésta pasará a ser la estación de referencia, y todas las distancias serán recalculadas.
Con los nuevos campos calculados a nuestra disposición, vamos a crear un mapa de símbolos en el que las marcas se adaptarán de alguna forma a la selección del usuario.
Dado que la distancia calculada es una medida continua, para facilitar su interpretación vamos a crear primero unas agrupaciones
(bins) a partir de esta variable. Para el ejemplo, podemos usar un tamaño de agrupaciones de 4
.
Configuramos la vista de esta forma:
- Columnas:
End Lon
- Filas:
End Lat
- Detalle:
End station
- Forma:
Estacion seleccionada TF
- Color:
Distancia estaciones (agrupación)
Mapas de áreas
Para este ejemplo vamos a usar de nuevo el archivo, al que le hemos añadido nuevas variables.
- Latitud y Longitud
- Comunidad
- Orden
También hemos añadido cuatro nuevos registros con datos de municipios navarros, para entender mejor cómo particiona Tableau los datos.
Configuramos la vista de esta forma:
- Filas:
Latitud
- Columnas:
Longitud
- Color:
Comunidad
- Tipo de marca:
Polígono
- Ruta:
Orden
(si tenemos problemas a la hora de dibujar los polígonos, podemos convertirOrden
el campo a discreto).
Uniones espaciales: Spatial join
Desde su versión 2018.2, Tableau permite unir archivos espaciales, de tal forma que podemos realizar este tipo de análisis:
Pregunta ¿Cuántas estaciones hay en cada condado de L.A.?
- Objeto: estaciones de bicicletas
- Acción:identificar
- Medida: frecuencia de estaciones
- Agrupación: condados de L.A.
Para poder hacer este tipo de análisis necesitamos un archivo espacial que define los puntos (en nuestro ejemplo, las estaciones de bicicletas), y otro que define las áreas (en nuestro caso, los barrios de L.A.).
makepoint()
permite crear la información espacial necesaria a partir de latitud y longitud.
Cargar y combinar fuentes de datos en la versión 2019.2
Para el archivo de puntos (en este caso, nuestro archivo original), podemos crear la información espacial necesaria haciendo click en Editar cálculo de unión
.
Ahora solo queda usar la función makepoint()
; en este caso nos fijaremos en los puntos de llegada.
El resto de la configuración es igual que en el caso de las uniones espaciales con dos archivos espaciales:
- Seleccionar el campo
geometría
de la segunda fuente de datos - Seleccionar el operador
intersects
Cargar y combinar las fuentes de datos en versiones anteriores a 2019.2
A diferencia de otras técnicas para combinar fuentes de datos, en las que establecemos una clave común en las dos fuentes, en las uniones espaciales no hace falta que haya una variables que podamos equiparar.
Por otra parte, esta técnica requiere que los dos archivos sean de tipo espacial, por lo que el CSV con el que hemos venido trabajando hasta ahora no permite hacer una unión espacial. Para solucionar este problema, hemos importado el archivo CSV a un programa SIG (Sistema de información geográfica
; o GIS por sus iniciales en inglés) y desde ahí lo hemos exportado como archivo .shp
(Shape de ESRI). Para ello hemos usado la aplicación SIG QGIS (vídeo que enseña el proceso).
Una vez que tenemos los dos archivos espaciales, podemos proceder a realizar la unión espacial, en la pestaña de fuentes de datos.
- Importamos uno de los dos archivos (da igual el orden).
- Añadimos la segunda fuente (enlace
Añadir
a la derecha delConexiones
.) - Llevamos la segunda fuente de datos al área de trabajo y editamos la conexión. Para ello, tenemos que seleccionar los campos espaciales (Tableau les asigna el nombre
Geometría
y seleccionar el tipo de unión -dependerá de los datos y la información que queramos mostrar- y marcar la opciónintersects
).
Como observamos en la zona de previsualización de datos, tenemos variables procedentes de dos fuentes.
Elaborar un mapa
Para combinar puntos y áreas en un solo mapa tenemos que seguir este procedimiento:
- Crear un mapa de áreas a partir del campo
Geometría (l.a. county neighborhood (v5).shp)
(dependiendo del tipo de unión que hayamos usado nos aparecerán todos los barrios o solo los que intersectan con la otra fuente de datos, es decir, los que tienen al menos una estación de bicicletas).
- Duplicar la píldora
Longitud (generado)
enColumnas
(seleccionar y arrastrar con la teclaCtrl
). Obtenemos el mismo mapa duplicado. Por otra parte, en el estante marcas tenemos ahora tres subestantes: uno para aplicar cambios a todos los datos, uno para aplicar modificaciones a la primera gráfica (la de la izquierda) y otro para la segunda gráfica (la de la derecha).
- Eliminar todas las pildoras que pueda haber en el último subestante (el correspondiente a la segunda gráfica). Como resultado, obtenemos un mapa mudo.
- Llevar la pastilla con datos geográficos de la segunda fuente (latitud y longitud de las estaciones) a la marca
Detalle
del último subestante. En el mapa de la derecha aparecerán los puntos de las estaciones. - Finalmente, crear una gráfica de eje doble marcando esa opción en la segunda pastilla
Longitud (generado)
deColumnas
.
A partir de aquí deberíamos poder usar las técnicas mencionadas anteriormente para crear una visualización más informativa, aunque parece ser que a día de hoy ciertas técnicas no funcionan (por ejemplo, asignar Número de registros
al canal Tamaño
de los puntos).
Cálculos posibles
Ahora que hemos intersectado las dos fuentes espaciales, podemos crear nuevos cálculos para obtener indicadores que nos puedan resultar de interés.
Para poder aprovechar todo el potencial, vamos a usar la versión del archivo original transformada para que cada línea contenga un solo punto de latitud y longitud (convertido al formato .shp
).
Combinar variables de las dos fuentes.
Podemos combinar variables de las dos fuentes para crear todo tipo de visualizaciones. Por ejemplo, podemos obtener el número de trayectos por barrio, combinando las variables Name
del dataset con las áreas de los barrios, con el Número de registros
de la fuente original.
SUM([Número de registros])/2
.
Calcular si un trayecto a cruzado de barrio o no
Para calcular si un trayecto a salido de un barrio o no tenemos que fijarnos en si el barrio de la estación de salida es el mismo (o no) del de la estación de llegada. En esta versión del archivo original esa información está separada en dos filas (para cada trayecto). Y el campo común que usaremos para hacer el cálculo es el identificador del trayecto.
Para poder hacer el cálculo usaremos una expresión de nivel de detalle para fijar la dimensión Trip ID
; en la parte del cálculo comparamos los valores máximo y mínimo para el campo Name
(solo hay dos valores, uno por cada fila), de tal forma que si coinciden podemos suponer que el trayecto no ha salido del barrio (nunca tendremos la certeza total, ya que no disponemos más que de dos puntos de control).
// Interbarrio
{FIXED [Trip.ID] :
IF MIN([Name]) = MAX([Name]) THEN "Dentro del barrio"
ELSE "Entre barrios"
END
}
Ahora podemos usar esta nueva dimensión en cualquier vista:
Densidad de estaciones por milla cuadrada (por condado)
Gracias a la unión espacial, podemos crear nuevos indicadores espaciales para nuestro análisis. Por ejemplo, podemos calcular la densidad de estaciones por distintos condados creando el siguiente campo calculado:
// Densidad de estaciones por milla cuadrada (por condado)
{ FIXED [Name] : COUNTD([End Station]) / MIN([Sqmi]) }
Debido a la unión a la izquierda que hemos utilizado para unir las dos fuentes espaciales, el valor del campo [Sqmi]
está replicado en todos aquellos trayectos en los que una estación de final coincida con un determinado condado; por eso tenemos que usar la función MIN()
.
Opciones de personalización de los mapas
Tableau ofrece varias vías para personalizar la apariencia de los mapas o de datos que podemos dibujar sobre otro tipo de planos.
Mapas en segundo plano
Ejemplo paso a paso
Cuando creamos un mapa con Tableau se cargan los mapas por defecto, que a su vez tienen tres estilos (Claro
, Normal
y Oscuro
). Sin embargo, podemos cargar mapas de otros servidores WMS o Mapbox.
Servidores WMS / Mapbox
Existen multitud de servidores WMS (Web Map Service) que nos permiten cambiar las imágenes que crean los mapas de fondo. Algunos de estos servidores cuentan con información para todo el mundo (OpenStreetMap), mientras que otros ofrecen información más específica de ciertas zonas (por ejemplo, ortofotos para la CAPV).
Spatineo tiene un amplísimo directorio de servidores WMS
Por ejemplo:
Para añadir un servidor WMS a Tableau tenemos que ir a la opción Mapa > Mapas en segundo plano > Servicios de mapa
. En la ventana de configuración aparecen los servidores que ya hemos configurado con anterioridad (si es que lo hemos hecho), así como un botón para añadir nuevos servidores.
Para configurar un nuevo servidor, tenemos que indicar la URL (normalmente el nombre se carga desde el servidor, aunque podemos darle el nombre que más nos convenga).
Por su parte, podemos usar Mapbox para cargar un mapa de fondo.
Mapbox is the location data platform for mobile and web applications. We provide building blocks to add location features like maps, search, and navigation into any experience you create.
Para poder usar Mapbox tenemos que crear una cuenta gratuita (o de pago, por supuesto) y obtener un token de acceso a la API en introducirla en Añadir mapa de Mapbox > Clásico
.
Capas
Dependiendo del mapa en segundo plano que hayamos seleccionado, tendremos a nuestra disposición una o más capas con distinta información espacial, que podemos activar o desactivar. Además, ciertos detalles espaciales aparecerán o desaparecerán dependiendo del nivel de zoom con el que estemos visualizando el mapa (por ejemplo, si marcamos la capa Calles y carreteras
del mapa por defecto de Tableau, las carreteras secundarias aparecerán dependiendo del nivel de zoom).
Vídeo de la TC18
Imágenes en segundo plano
Una opción que permite Tableau consiste en usar una imagen personalizada de fondo a modo de plano y utilizar los ejes X e Y para situar elementos (sin coordenadas geográficas propiamente dichas).
En el ejemplo, usamos el plano de una residencia, sobre el que añadimos una capa de datos (archivo datos_plano.xls
, Hoja1
). El mapa es una imagen, con unas dimensiones X
e Y
, que son los píxeles de la imagen sobre los que queremos añadir nuestros datos.
Una vez que añadimos medidas a filas y columnas, podemos indicar una imagen de fondo: Mapas > Imágenes en segundo plano > (Fuente de datos en la que queremos usar la imagen de fondo)
. Al añadir la imagen, tenemos que indicar qué medidas servirán para localizar los datos, así como la anchura y la altura de la imagen (si no conocemos el tamaño de la imagen, podemos utilizar cualquier programa que nos indique la altura y la anchura de la imagen).
Un problema muy habitual al calcular la posición correcta de los puntos usando un software de edición consiste en que estos programas suelen situar el punto 0 del eje Y arriba, mientras que Tableau lo situa abajo. Por eso, creamos un campo calculado que corrige este dato, y actualizamos la configuración de la imagen de fondo.
// Y Corregido
448 - [Y]
Para que la corrección se aplique correctamente tenemos que dar dos pasos:
- Sustituir la variable
Y
porY corregido
en la gráfica. - Actualizar la configuración de la imagen en segundo plano para mapear Y a
Y corregido
.
Finalmente, podemos ocultar la información de los ejes para que el plano se muestre solo.
Este tipo de gráficas no son más que gráficas de dispersión, por lo que podemos utilizar otros campos para aportar más contexto al plano; por ejemplo, podemos llevar la variable Numérico
a la marca Tamaño
.
EJEMPLO 3: Polígonos personalizados
De la misma forma que podemos utilizar archivos .shp
de área para crear mapas más allá de las bases de datos de Tableau (por ejemplo, para obtener coropletas de municipios de España), también podemos crear nuestros propios datasets con los datos para crear nuestros propios polígonos, sin necesidad de que sea información geocodificada.
La estructura de un dataset para generar polígonos es muy similar a la necesaria para generar líneas, aunque puede ser un poco más compleja si tenemos que crear “agujeros” de un polígono (sustraerle un polígono interior) o contabilizar varios polígonos como uno solo (por ejemplo, todas las islas de Grecia como un únic conjunto).
Una vez cargado el dataset en Tableau (archivo plano_vectorial.csv
) la única diferencia consiste en seleccionar el tipo de marca polígono
en lugar de línea
, lo que obliga a Tableau a crear una línea entre el primer y el último punto para cerrar el polígono.
Para este ejemplo hemos creado un dataset basado en el plano de la casa que ya hemos utilizado anteriormente para ejemplifcar el uso de imágenes personalizadas en segundo plano.
Hemos generado el dataset manualmente usando una hoja de cálculo y un porgrama de edición de vídeo con nos diera la información de las coordenadas X/Y de los puntos que nos interesan.
- Filas:
Corrección Y vectorial
(campo calculado para sustraerle Y a 448, la altura de la imagen) - Columnas:
X
(del datasetplano_vectorial.csv
) - Marcas: polígono
- Detalle:
estancia
- Detalle:
punto
- Ruta:
posicion
(campo que indica el orden de cada punto dentro de cada polígono, identificado enestancia
).
Una vez tenemos la configuración básica, podemos pasar una variable categórica o una cuantitativa a la marca color
realizar el análisis que nos interese: