Construyendo un calendarion con fechas resaltadas para el Workout Wednesday (2019-44)

Enlace con los requerimientos aquí

Mi resumen aquí
El reto de Ann Jackson es, en apariencia, sencillo, pero encierra alguna decisión relativamente compleja: Las decisiones fundamentales que hay que tomar son:
  1. Con o sin usar una fuente de datos adicional de andamiaje.
  2. Con o sin hojas transparentes.
El libro con el paso a paso está al final de este post y, en mi caso, he optado por usar una única hoja, sin superponer transparencias ni formas distintas en las marcas, y con un calendario adicional para completar todas las fechas disponibles. 

Scaffolding – fuente de datos con todas las fechas

El objetivo es mostrar un calendarion con todas las fechas del año seleccionado, haya habido ventas o no (usando Superstore). En Tableau, es difícil mostrar marcas cuando no hay datos: si no ha habido ventas un día, no habrá registro de ese día en los datos y, al representar las marcas de cada día, se creará un hueco.

Una opción para contrarrestar esta “deficiencia” es usar cálculos de tabla que tienden a “densificar” los datos. No obstante, esto tiene una serie de limitaciones:

  1. Hay que asumir que todos los días del año tendrán, al menos, un año con valores (p.ej., el 1 de Enero no tiene datos en 2016, 2017 o 2018, pero sí en 2019) –lo cual no tiene por qué cumplirse (y, de hecho, no se cumple el 29 de Febrero –aunque sólo se aplique, en este caso, a 2016).
  2. O, dependiendo de cómo se realice la densificación, que todos los meses tendrán al menos un día con datos en cada semana y al menos un día de la semana con datos en cada mes (cosa que, por ejemplo, no se cumple en Octubre de 2018, dado que ningún viernes presenta ventas).

La alternativa por la que he optado es incluir una fuente de datos adicional, que consta únicamente de una columna: fecha, con todos los días desde el 1 de Enero de 2017 hasta el 31 de Diciembre de 2019. Se puede obtener de diversas formas, yo he optado por un simple modelo de Alteryx con una única herramienta “Generate Rows” y exportando el resultado an un fichero de excel que, una vez en Tableau, he usado para combinarlo con “Superstore”.

 

Generar filas en Alteryx usando fechas
Crear el armazón de fechas necesario
"Right join" entre "Order Date" de Superstore y el campo de fecha generado en el paso anterior
"Right Join" en Tableau

La “right join” en Tableau asegura que tengamos todos los días del año para los años seleccionados. Una potencial limitación es, si en vez de trabajar con los datos del modelo de “Superstore” estuviésemos trabajando con datos “reales” que se fueran actualizando “en directo”. En ese caso, o bien nos aseguramos, desde el inicio, que el “armazón” de fechas se extiende hasta un futuro razonable, o bien usaríamos una fuente de datos que se actualizase continuamente (p.ej., en la base de datos probablemente exista una tabla con las fechas del año –en qué período fiscal se incluyen, si son vacaciones o no, etc.).

Fechas originales presentes en Superstore.
Las fechas ausentes en "Superstore" aparecen como "null".

Obtención del calendario

Una vez combinados el campo de fecha completo con la fuente de datos de superstore, y partiendo de la base de la visualización preparada por AnnUJackson, la estructura inicial es sencilla: basta con usar el mismo campo (“Scaffolded” es como he llamado yo al campo de fecha), simplemente cambiando la parte de la fecha que queremos mostrar:
  • Trimestre en las filas y
  • Mes y día de la semana en las columnas.

En este punto, los meses aparecen como columnas, mientras que en la visualización original aparecen agrupados de tres en tres en función de los trimestres. La forma más sencilla, creo, de obtener esta separación es mediante un campo calculado (se podría hacer con un cálculo de tabla (p.ej. “index”) pero sería tedioso de 1. poner a punto, 2. mantener a medida que introduzcamos más dimensiones en la vista).

Dado que, tras examinar la visualización original, vamos a necesitar la fecha real en algún punto más adelante, prefiero traerlo ya a la vista para ir solventando cualquier posible complicación. Esto hace que se subdividian las marcas en función del número de días presentes. Así, por ejemplo, los lunes de Enero de 2019 se dividen en cuatro marcas (hay cuatro lunes con ventas en Enero, pero sólo un viernes).

Fórmula para asignar un valor de 0 a 2 a cada mes. Month_Column = (DATEPART('month', [Scaffolded])+2)%3
Distribuye los meses en tres columnas
Días con ventas de cada mes

Para poder mostrar las “descripciones emergentes” en unas marcas sí (días con ventas), y en otras no (días sin ventas) voy a optar por un eje doble con dos medidas irrelevantes (Min(0)). Pero no quiero haya ningún tipo de relación entre las marcas, así que duplico el campo de “día de la semana”. A continuación, añado la semana para que empiece a tomar forma la visualización:

Añade una medida irrelevante como "Min(0)" para poder crear un eje doble
Duplica "Día de la semana" para crear una partición adicional y destruir vínculos entre marcas
Incluyendo la semana para que el "calendario" vaya tomando forma

Añadiendo el color

Los requerimientos son: en gris todas las marcas, excepto aquellas que sean las “top 3 en ventas” en función de un parámetro que permite cambiar entre “días”, “semanas” y “meses”.  Lo he modificado levemente añadiendo un segundo parámetro que permite variar el número de períodos seleccionados.

Creo que una de las formas más sencillas de obtener este “color” es usando “sets”. He creado tres sets siguiendo la misma lógica, variando únicamente el período:

Sets creados como Top \by field\top\sales
Definición de los sets

El color se asigna con una combinación de campos calculados, para excluir días sin ventas (por ejemplo, la semana con más ventas puede tener un día sin ventas y, en ese caso, ese día debe permancer con el mismo color base, sin resaltado, conforme a los requerimientos originales).

Case statement que asigna el set en función del parámetro
Selección del set
Uso del color calculado en función del set sólo si ha datos para ese día
NOT ISNULL([Order Date])
Cualquiera de las dos formas es válida para decidir si hay o no datos para ese día

Tras duplicar el “Min(0)” ya estamos a punto para convertir la vista en “un calendario”.

El paso para cambiar a la vista de calendario consiste de dos componentes: transferir la “semana” de la fila al detalle, y sustituir esa “semana” en la fila por un “índice de semana”. Básicamente, qué semana es esta dentro de cada mes. Se puede calcular con LoD o, en mi caso, con un cálculo de tabla:

Cálculo del número de semana dentro del mes

Una vez realizada la sustitución y seleccionado el eje doble, basta con eliminar los “nulls” de la vista para tener la estructura lista:

Estructura de calendario tradicional

Basta ya simplemente con ajustar el formato de las líneas de separación, los bandeados y ocultar las cabeceras para tener la estructura definitiva:

Estructura de calendario

Para las etiquetas con distintos colores he optado por dos campos calculados que, a su vez, dependen del color y de la presencia/ausencia de datos.

Dos campos calculados para el rótulo
Dos campos calculados para el rótulo

Combinandolo todo, obtenemos la visualización requerida.

Animación con todos los pasos necesarios

Calendario Paso a Paso

Todos los pasos que he seguido, a continuación. Mi solución final, en Tableau Public.