Tutorial Tableau 02. Profundizar en Tableau Desktop
Herramientas: Tableau
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 (Making data visual. A Practical Guide to Using Visualization for Insight)
- Técnicas para facilitar el análisis
- Variables temporales
- Distintos tipos de gráficas
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.
EJEMPLO 1: Mantenimiento de bicicletas: tiempo de uso acumulado
Operacionalización
Ejemplo
Para realizar los siguientes ejercicios vamos a suponer que somos la empresa adjudicataria del servicio de bicicletas de LA, y que tenemos que organizar el mantenimiento de las bicicletas.
De cara a poder realizar un mantenimiento proactivo de las bicicletas (antes de que tengan averías por el uso continuado), tenemos que ser capaces de indentificar aquellas que puedan necesitar una revisión.
Pregunta ¿Qué bicicletas necesitan una revisión?
- Objeto: bicicletas
- Acción: identificar
- Medida: necesita revisión (sí/no)
- Agrupación: bicicletas que necesitan revisión frente a bicicletas que no la necesitan.
¿Podemos obtener esta métrica de los datos? No en nuestro dataset, por lo que necesitamos crear algún indicador que os permita acercarnos a esa realidad.
Pregunta ¿Cuándo necesita una bicicleta revisión?
- Objeto: bicicletas
- Acción:identificar
- Medida: acumulación de uso
- Agrupación: bicicletas que necesitan revisión frente a bicicletas que no la necesitan.
¿Podemos obtener esta métrica de los datos? Sí, podemos usar como indicador el tiempo de uso acumulado.
Con los datos de los que disponemos, podríamos redefinir la medida:
- Medida: acumulación de horas uso
Vídeo “Turning questions into answers with Tableau”
Añadir información estadística: pestaña Análisis
Observamos que tenemos demasiadas marcas (más de 750 bicicletas), por lo que necesitamos refinar la gráfica a fin de poder facilitar su análisis. De las técnicas que se han mencionado para facilitar el análisis, las que podrían aportar algo en este caso son:
- Añadir algún resumen estadístico, como la media de tiempo de uso por bicicleta. Tableau dispone de varias funcionalidades para añadir información estadística a una gráfica. En este caso, seleccionaremos
Línea de promedio
y la configuraremos para que muestre el promedio de la tabla completa.
La nueva gráfica muestra ahora las bicicletas que tienen un uso acumulado mayor o menor a la media.
Establecer un umbral para decidir si una bici ha de pasar por mantenimiento
En cualquier caso caso, la gráfica sigue mostrando todas las bicicletas, y nos interesa destacar y/o filtrar únicamente las que necesitan mantenimiento. Para ello, podemos establecer un umbral (threshold) en el tiempo de uso acumulado de las bicis. A la hora de definir dicho umbral, podemos utilizar la media como punto de comparación, de tal forma que las bicicletas que tengan un uso superior a la media sean marcadas para revisión.
// Revisar si uso mayor que la media
IF
SUM([DuracionCalculadaMinutos]) > AVG([DuracionCalculadaMinutos]) THEN "Revisar"
ELSE "No revisar"
END
Si aplicamos el la nueva dimensión al canal del color, veremos que algo no ha ido bien, ya que no distingue correctamente los valores por encima y por debajo de la media.
Combinar distintos niveles de agregación de datos: Expresiones de nivel de detalle
Ejemplo paso a paso
Esto se debe a que queremos utilizar medidas calculadas a partir de distintos grados de agregación en la vista. La fórmula, tal y como está definida, no indica ninguna dimensión, por lo que a la hora de hacer los cálculos Tableau utiliza el nivel de detalle de la vista, que viene dado por la dimensión Bike ID
.
Por tanto, lo que hace nuestra fórmula es sumar todas las duraciones de cada bicicleta, y dividirlas por la media de las duraciones de cada bicicleta, no de la media de uso acumulado por bicicleta. La duración media de trayecto de cada bicicleta va a ser siempre inferior a la suma de la duración de todos sus trayectos, y por eso aparecen todas marcadas como No revisar
.
Para poder obtener este valor, tendremos que ir más allá del nivel de detalle de la vista, para lo que necesitaremos una expresión de nivel de detalle
. Este tipo de fórmulas permiten combinar distintos niveles de detalle en una única vista.
Las expresiones de detalle tienen esta composición:
- Tipo de expresión:
Fixed
,Exclude
oInclude
Fixed
: el cálculo sólo toma en consideración las dimensiones explicitamente declaradas dentro de la expresión.Exclude
: el cálculo excluye las dimensiones declaradas en la expresión, si es que estám presentes en la vista (sirve para restar granularidad al cálculo).Include
: el cálculo incluye las dimensiones declaradas en la expresión, si es que no estám presentes en la vista (sirve para añadir granularidad al cálculo).
- Dimensiones a tener en consideración
- Agregación
Y tienen esta sintáxis:
{FIXED [dimension1],[dimension2] : SUM([medida])}
Las expresiones de nivel de detalle van envueltas por los signos {
y }
. En primer lugar, indicamos el tipo de expresión de la que se trata. En segundo lugar, la(s) dimensión(es) a tener en cuenta, separadas por comas en el caso de que usemos más de una; finalmente, y después del signo :
, indicamos la fórmula de agregación de medidas.
Para nuestro ejemplo, necesitamos una expresión de detalle que compute primero la suma de la duración de uso por cada bicicleta, y después obtenga la media del uso acumulado de todas bicletas, independientemente de las dimensiones que se estén usando en la vista.
// Media de uso por bicis (en minutos)
AVG({ fixed [Bike ID] : SUM([DuracionCalculadaMinutos])})
Sin embargo, como hemos indicado, necesitamos que el cálculo se realice independientemente de la dimensión Bike ID
, por lo que utilizaremos esta expresión anidada:
// Media de uso por bicis (en minutos)
MIN({ EXCLUDE [Bike ID] :
AVG({ fixed [Bike ID] : SUM([DuracionCalculadaMinutos])})
}
)
Una vez que tenemos la medida que nos interesa, podemos usarla para calcular si cada bicicleta excede o no el valor de dicha medida:
// Revisar (con LOD)
IF
SUM([DuracionCalculadaMinutos]) > ([Media de uso por bicis]) THEN "Revisar"
ELSE "No revisar"
END
En cualquier caso, todavía tenemos demasiadas bicicletas para revisar, por lo que podemos modificar el cálculo del úmbral para que sea más exigente:
// Revisar
IF
SUM([DuracionCalculadaMinutos]) > ([Media de uso por bicis]) * 2 THEN "Revisar"
ELSE "No revisar"
END
Vídeos de la TC18
Añadir interactividad: parámetros de usuario
En el paso anterior hemos indicado en el código una constante (2
) que nos permite poner el umbral de las bicis a revisar más alto. Sin embargo, lo adecuado sería permitir al usuario que indique dicha constante. Para ello tenemos que seguir estos pasos:
- Crear un parámetro que el usuario pueda modificar
- Añadir el parámetro a dla vista.
- Actualizar la fórmula para sustituir el
2
por el parámetro con el valor indicado por el usuario.
// Revisar
IF
SUM([DuracionCalculadaMinutos]) > ([Media de uso por bicis]) * [Media de uso por X] THEN "Revisar"
ELSE "No revisar"
END
En la siguiente animación podemos observar el parámetro en funcionamiento:
Simplificar la gráfica: filtrar resultados
Finalmente, y para simplificar la vista, podemos filtrar las marcas para mostrar únicamente las bicis que tienen que pasar por taller. Para ello, usaremos la pestaña Filtros
.
En nuestro ejemplo, llevaremos la píldora Revisar
al estante Filtros
, y lo configuraremos de tal forma que solo se muestren las bicicletas que tienen que pasar por revisión.
Para pensar: ¿qué pasa con la línea de promedio?
Si variamos el umbral de revisión una vez aplicado el filtro, observamos que la línea de promedio va cambiando. ¿A qué se debe esto? ¿Y cómo podríamos solucionarlo?
Colofón
Tableau tiene un inconveniente con respecto a otras herramientas como R/ggplot2. Y es que al ser una herramienta propietaria y con gran peso en la interacción a través de componentes gráficos, al terminar nuestro trabajo no disponemos de un script que podamos analizar paso a paso.
Sin embargo, podemos usar la funcionalidad Hoja de trabajo > Describir hoja
(atajo de teclado: Ctrl + E
) para saber cómo está configurada una vista.
Esta funcionalidad es muy útil a la hora de hacer ingeniería inversa de ejemplos de Tableau creados por otras personas.
Posibles mejoras
El Número de registros
suma todos los trayectos del año para cada biciclreta, pero a lo largo de un año puede haber muchos altibajos de uso. Quizá sería más adecuado tener en cuenta únicamente el uso acumulado durante un tiempo determinado, por ejemplo el último mes contando desde la fecha en la que se consultan los datos.
EJEMPLO 2: Mantenimiento de bicicletas: días sin ser usadas
Operacionalización
En este ejemplo vamos a utilizar otro indicador para detectar bicicletas que pueden necesitar pasar por revisión. En este caso, nos fijaremos en el tiempo que llevan sin ser usadas, ya que puede ser un indicador de que tienen algún problema, y por eso los usuarios no las utilizan para sus trayectos.
Pregunta ¿Cuándo necesita una bicicleta revisión?
- Objeto: bicicletas
- Acción:identificar
- Medida: no usada en los últimos X días
- Agrupación: bicicletas que necesitan revisión frente a bicicletas que no la necesitan.
Como en el ejemplo anterior, primero tenemos que calcular el último día en el que se usó cada bicicleta, y luego comparar esa fechs con una fecha concreta para obtener la métrica no usada en los últimos X días
.
Calcular métrica días sin usar
Para calcular esta métrica podemos usar la función datediff()
, a la que le tenemos que pasar dos fechas:
-
Último día en el que se ha usado cada bicicleta: podemos obtener este dato gracias a la variable
End Time
. Tenemos que obtener el valor mayor para esta variable. -
Día con el que comparar. En una base de datos que siguiera actualizándose, podríamos usar la función
now()
. En este caso, los datos solo llegan hasta abril de 2017, por lo que queremos obtener la fecha mayor de toda la base de datos en la variableEnd Date
. -
El último (en realidad primer) parámetro que le tenemos que pasar a
datediff()
es la unidad de fecha, que en nuestro caso seráday
.
Volvemos a tener un caso de distinto nivel de agregación en las fechas que hay que comparar (una por cada bici frente a la misma para todas las bicis), por lo que necesitamos usar expresiones de nivel de detalle.
// Días sin usar
DATEDIFF('day',
MIN({ FIXED [Bike ID] : MAX([End Time])}),
MAX({ EXCLUDE [Bike ID] : MAX([End Time])}))
Para comprobar que el cálculo es correcto, podemos mostrar cada una de las fechas en el tooltip, modificando la píldora End Time
con estas dos fórmulas:
// Para la última fecha en la que se ha usado una bici
MAX([End Time])
// Para la fecha más alta de toda la BD
max({exclude [Bike ID] : max([End Time])})
Colofón
Una vez llegados a este punto, podemos utilizar las técnicas trabajadas en el ejemplo anterior para permitir al usuario indicar el valor de la X de la métrica no usada en los últimos X días
que hemos definido en la operacionalización a través de un parámetro.
EJEMPLO 3: Movilidad municipal: estacionalidad del uso de la bicicleta
Operacionalización
Para este ejemplo, vamos a considerar que trabajamos para el departamento de movilidad de L.A. y que de cara a elaborar diversos planes de actuación (mantenimiento, campañas de fomento…) queremos detectar patrones de uso temporales a distintos niveles, para decidir qué momento es mejor para llevar a cabo cada plan. Por ejemplo:
- Meses del año
- Días de la semana
- Horas del día
Pregunta ¿Cuál es la mejor época del año para realizar un mantenimiento masivo?
- Objeto: trayectos en bicicleta
- Acción:identificar
- Medida: cantidad de trayectos
- Agrupación: meses de pocos trayectos
Como podemos acceder directamente tanto a la medida cantidad de trayectos
como al nivel de agrupación gracias a las variables de las que disponemos, vamos a empezar con una visualización simple para intentar detectar patrones temporales.
Visualización simple: timeline
Tiempo como valor discreto o como valor contínuo
Como ya se ha comentado en el curso, las variables de tipo fecha
o fecha y hora
reciben un tratamiento especial, ya que pueden ser tratadas como discretas o como contínuas.
Para comprender la diferencia entre los dos tratamientos, y cómo puede afectar este hecho a nuestro análisis, vamos a revisar dos gráficas en las que la única diferencia es que en la primera la unidad de tiempo mes
está tratada como valor discreto, mientras que en la segunda se considera que es un valor contínuo.
Podemos ver a simple vista que las líneas no coinciden. Si nos fijamos mejor, observamos que en la primera los meses van de Enero a Diciembre, mientras que en la segunda van de julio 2016 a abril 2017. Esto se debe a que cuando consideramos los meses como una variable discreta, los posibles valores son los que van de enero a diciembre, y no se tiene en cuenta ningún otro aspecto (en este caso, el año). Mientras que si consideramos los meses como una variable contínua, obtenemos el timeline que esperaríamos a priori.
En el caso de que tuvieramos datos tanto para enero 2016 como para enero 2017, al ver el mes como una variable discreta Tableau agregaría todos los datos para el mes de enero, que aparecería una única vez en la gráfica, mientras que si se considera cómo variable contínua, enero 2016 y enero 2017 jamás se agregarán, al tratarse de valores distintos.
En la primera gráfica, la representación con una línea contínua nos llevaría a pensar que tenemos datos de enero a febrero, pero esto no es del todo cierto, ya que en los datos de los que disponemos los meses están divididos en años distintos: de julio a diciembre tenemos datos para el año 2017, mientras que de enero a abril tenemos datos para 2017.
Más adelante veremos otros ejemplos en los que tiene sentido tratar la fecha como una variable discreta.
Valores faltantes
Si nos detenemos de nuevo a observar la segunda gráfica (meses contínuos), observamos también que no tenemos datos para los meses de mayo y junio (para ninguno de los años). Sin embargo, en la primera gráfica da la impresión de que sí que los hay, ya que la línea va ascendiendo de abril a agosto.
Para realizar un análisis correcto de estos datos, tenemos que marcar la opción Mostrar valores faltantes
para forzar a Tableau a que muestre todos los meses, incluso aunque no disponga de datos (en cuyo caso, se corta la línea; en abril SÍ que hay datos, aunque la suma de registros sea mínima comparándola con la de otros meses; por eso la línea desciende casi hasta cero).
Análisis
Al no poder hacer una comparativa interanual por falta de datos, usaremos la gráfica que muestra los meses como variable contínua para identificar los meses con menos trayectos. Dichos meses son diciembre, enero y febrero, por lo que nuestra recomendación sería realizar el mantenimiento masivo en esos meses.
Cruzar dos niveles temporales para detectar patrones más complejos: Heatmap
Pregunta ¿Cuál es la mejor época del año para realizar un mantenimiento masivo?
- Objeto: épocas
- Acción:identificar
- Medida: cantidad de trayectos
- Agrupación: épocas de pocos trayectos frente a épocas de muchos trayectos
Evidentemente, lo primero que deberíamos hacer es definir qué entendemos por épocas y por pocos trayectos. En este caso, concretaremos en detalle lo que consideramos época
a través de un porceso iterativo de EDA, en el que combinaremos distintos niveles de detalle temporal hasta quedarnos con el/los m+as útiles para detectar patrones.
Si recordamos el ejemplo de idiom de Munzner, sabemos que en una gráfica de tipo heatmap cruzamos dos variables categóricas y rellenamos las intersecciones de color a partir de una variable cuantitativa.
En el caso de las variables tipo fecha
o fecha y hora
podemos cruzar una variable consigo misma, si las consideramos como discretas y tenemos al menos dos niveles de detalle (si sólo contamos con el año, por ejemplo, no podemos usar esta técnica).
Si cruzamos End time
a nivel de mes con End time
a nivel de día del mes, y asignamos el número de registros (que equivale al número de trayectos) obtenemos la siguiente gráfica:
Sin embargo, como hemos indicado en el ejercicio anterior, esta gráfica tiene dos errores que ofuscarán nuestro análisis.
- No tenemos datos para todos los meses en más de un año
- Hay meses de los que no tenemos datos.
Si añadimos la dimensión End time
a nivel de año e indicamos a Tableau que tiene que mostrar los valores faltantes, obtenemos esta otra gráfica:
Mostrar valores faltantes
, aunque como medida preventiva conviene marcarlo siempre que trabajemos con fechas discretas.
Analizando la gráfica podemos sacar las siguientes conclusiones:
- No parece haber patrones claramente definidos (que tengan en cuenta los dos niveles temporales).
- Si nos fijamos solo en un nivel (mes), agosto es el mes con más trayectos, mientras diciembre o enero parecen ser los meses con menos trayectos (aunque hay algún outlier, como el 21 de enero). En cualquier caso, ya habíamos llegado a esta conclusión con una gráfica más simple en el ejercicio anterior.
Sin embargo, podemos considerar que una de las variables que hemos usado para crear esta visualización (que nos tiene que ayudar a detectar patrones), no es útil. A fin de cuentas, el día del mes no tiene un “significado” especial, ya que van variando con respecto al día de la semana, por ejemplo (esto no quiere decir que el día del més no sea un nivel de interés en el análisis de patrones temporales; si estuviéramos tratando con datos de banca o de nóminas de una empresa, los últimos días de mes, o los primeros, tienden a aglutinar movimientos específicos: pago de nóminas, pago de alquileres, pago de pensiones… que puede hacer que este nivel de fecha sí resulte interesante en el análisis de los datos).
Heatmap a otro nivel de detalle
En este paso vamos a usar la misma técnica que hemos utilizado en el ejemplo anterior pero cambiando el nivel de detalle temporal. Ahora nos vamos a fijar en los días de la semana
y en las horas del día
, para ver si hay horas que concentran más trayectos, y si estas horas de tráfico intenso se repiten a lo largo de los distintos días de la semana.
Pregunta ¿Existen diferencias en los patrones de uso horario a lo largo de los días de la semana?
- Objeto: trayectos en bicicleta
- Acción:identificar concentraciones
- Medida: cantidad de trayectos
- Agrupación: dias de la semana, horas del día
Las anotaciones manuales que hemos marcado destacan patrones de mayor número de trayectos en bicicleta. Podemos observar que de lunes a viernes hay tres franjas horarias que concentran más trayectos (y que coinciden con la entrada al trabajo, descanso y fin de la jornada laboral, grosso modo), mientras que los fines de semanas los trayectos se concentran entre el mediodía y media tarde.
En menor medida, también destacan las primeras y últimas horas de viernes a domingo.
Heatmaps avanzados: campos calculados y cálculos de tabla
Ejemplo paso a paso
Pregunta ¿Existen diferencias en los patrones de uso horario entre días laborales y fines de semana?
- Objeto: trayectos en bicicleta
- Acción:identificar concentraciones
- Medida: cantidad de trayectos
- Agrupación: dias laborales frente a fin de semana, horas del día
Tableau nos permite indicar fácilmente la hora del día de un campo fecha y hora
, pero no ocurre lo mismo con el caso de discriminar si una fecha es fin de semana o no. Sin embargo, este dato es fácil de obtener a través de un nuevo campo calculado:
// Fin de semana
IF DATEPART('iso-weekday',[End Time]) > 5 THEN "Fin de semana"
ELSE "Laboral" END
Una vez creado el campo calculado, crear el heatmap no tiene misterio a estas alturas.
Aunque el patrón que hemos detectado en iteraciones anteriores con respecto a los días laborales sigue siendo identificable (a saber, tres tramos de concentración de trayectos), no queda tan claro en el caso de los fines de semana.
Esto se debe a que al crear el campo calculado, clase Laboral
puede recibir 5/7 días, mientras que Fin de semana
solo recibe 2/7. Cuando Tableau asigna los colores, lo hace teniendo en cuenta dos parámetros:
- El rango de valores (que se puede apreciar en la leyenda de color: 89-8801).
- El cálculo de tabla: los cálculos de tablas son cálculos que Tableau realiza sobre los datos a partir de los datos que hay en la vista (una vez tenidos en cuenta estos elemento: dimensiones, medidas, filtros… ver ayuda de Tableau sobre el orden de las distintas operaciones que realiza Tableau sobre los datos). Podemos aplicar distintos cálculos de tabla a las medidas agregadas de la vista, para obtener un enfoque distinto en nuestro análisis (ver ayuda de Tableau sobre cálculos de tabla).
Para comprender mejor cómo afectan los cálculos de tabla a los datos que se muestran en la vista, vamos a duplicar la píldora Número de registros
en estos dos canales: color y texto. Vamos a dejar la píldora de color sin modificar, mientras que aplicaremos los nuevos cálculos de tabla a la pildora asignada al texto.
Para cambiar el cálculo de tabla que aplica Tableau por defecto, tenemos que acceder desde el desplegable de la píldora de la medida sobre la que queremos aplicar el nuevo cálculo de tabla.
Para empezar, vamos a aplicar el cálculo de tabla Porcentaje del total
. Si nos fijamos en las horas centrales del día, observaremos que los valores no coinciden con la intensidad de color. Por ejemplo, a las 12 y a las 13 los fines de semana suponen un mayor porcentaje del total, y sin embargo el color es menos intenso.
Para entender mejor el cálculo de tabla, vamos a echar un vistazo al editor (para facilitar esta tarea, conviene tener marcada la opción Mostrar ayuda de cálculo
, que nos muestra los efectos de la configuración sobre nuestra vista):
Las opciones de configuración son:
- Tipo de cálculo (dependiendo del tipo seleccionado pueden aparecer nuevas opciones de configuración).
- Calcular usando: indica la direccionalidad en la que se van aplicando los cálculos.
En nuestro ejemplo, aunque hemos indicado Porcentaje del total
, el porcentaje se calcula usando Tabla a lo largo
(valor por defecto), por lo que los cálculos se reinician en cada nueva fila de la tabla. Sin embargo, en nuestro caso es precisamente el tipo de cálculo que necesitamos, ya que de esa forma ponderamos los valores de Laboral
y Fin de semana
.
Para poder corregir nuestra gráfica, tenemos que aplicar este mismo cálculo de tabla a la píldora asignada al canal de color.
Vídeos de la TC18
Colofón
Podemos aprovechar la variable Fin de semana
que hemos creado a lo largo de estos ejemplos para crear una visualización complementaria y compararlas para verificar que las conclusiones del análisis son iguales en ambos casos.
EJEMPLO 4: predicciones temporales
Ejemplo paso a paso
Tableau nos ofrece la posibilidad de crear modelos de predicción a partir de datos temporales. Para probar esta funcionalidad vamos a crear un timeline sencillo.
- Llevamos
Start Time
(valor contínuo) a columnas. - Llevamos
Número de registros
a filas.
De esta forma, obtenemos un timeline que muestra el número de trayectos por día.
Una vez disponemos del timeline que servirá para hacer las predicciones, hacemos doble click sobre la función Pronóstico
de la pestaña Análisis
.
Si hacemos click en al línea de pronóstico y selecionamos la opción Editar
, Tableau nos mostrará la ventana Opciones de pronóstico
, en la que podremos configurar varios parámetros del modelo de predicción.
Además del modelo de predicción, podemos añadir información de otros modelos, como el modelo lineal (Línea de tendencia
).