Capítulo 6 Transformaciones con Tableau Prep

Tableau Prep Builder es una herramienta de transformación de datos asociada a Tableau. Es una aplicación independiente (Tableau y Tableau Prep Builder se instalan por separado). Es una herramienta ETL de usuario final; es decir, pensada para poder ser usada solo con formación ofimática aunque requiere amplia base técnica para explotar todo su potencial. Implementa un entorno gráfico de desarrollo del componente ETL.

En primer lugar, importaremos los datos en Tableau Prep20. A continuación, estudiaremos las operaciones de transformación sobre tablas dinámicas21. Partiendo de los datos en formato de tabla plana, los transformaremos para generar las tablas de dimensiones y hechos.

Para ampliar información y aprender más sobre esta herramienta se puede utilizar el libro de Costello y Blackshear (2019).

Objetivos del capítulo

  • Conocer el funcionamiento de Tableau Prep y usarlo para:

    • Realizar operaciones de importación de datos.

    • Transformar una tabla dinámica en una tabla plana.

    • Transformar los datos.

    • Generar nuevas tablas.

    • Obtener un diseño en estrella.

  • Entender la estructura y la implementación de los cubos OLAP.

6.1 Transformar una tabla dinámica

El objetivo de este apartado es transformar una tabla dinámica almacenada en formato Excel en una tabla plana equivalente a la almacenada en formato CSV.

6.1.1 Importar los datos

En Tableau Prep se definen flujos de transformación de datos. Al iniciar Tableau Prep, lo primero que tenemos que hacer es conectarnos con una fuente de datos. En la pantalla de inicio, pulsando sobre Conectarse a datos, en la cabecera (figura 6.1), ofrece la posibilidad de conectarnos a diversas fuentes de datos.

Pantalla de inicio de Tableau Prep.

Figura 6.1: Pantalla de inicio de Tableau Prep.

Se abre la ventana Conexiones y, en el apartado Conectar, aparecen varias opciones para conectarse a datos en un archivo y muchísimas opciones apara conectarse a datos en un servidor. En este caso, pulsamos sobre la opción Microsoft Excel en el apartado En un archivo (figura 6.2).

Conectarse a un archivo Excel.

Figura 6.2: Conectarse a un archivo Excel.

Seleccionamos el archivo en la carpeta de trabajo. El resultado de la importación se muestra en la figura 6.3.

Resultado de importar a Tableau Prep un archivo Excel.

Figura 6.3: Resultado de importar a Tableau Prep un archivo Excel.

Ha creado el primer paso en el flujo de datos para acceder al archivo, como se muestra en la parte superior de la ventana. En la parte inferior nos muestra el resultado de la transformación. Estamos trabajando con tablas y trata de interpretar los datos de la tabla que hemos importado. Como la tabla dinámica contenida en el archivo tiene cabecera y pie de texto, no interpreta ninguna fila que contenga los nombres de los campos y les asigna nombres generados de la forma F1, F2, F3, …

Si seleccionamos la opción Usar el intérprete de datos22, que aparece en la zona de la izquierda de la ventana, detecta las celdas que componen una tabla estructurada y elimina el resto de celdas automáticamente, en este caso, la cabecera y el pie de la tabla. El resultado obtenido se muestra en la figura 6.4.

Resultado del intérprete de datos.

Figura 6.4: Resultado del intérprete de datos.

Ahora aparecen campos definidos con nombres de la forma Total 2019, Total 2018, Total 2017, … Es decir, ha localizado la tabla, ha determinado que la cabecera estaba compuesta por dos filas (las instancias de sexo y periodo), ha detectado que en la primera fila solo se indicaba el primer valor (las celdas vacías siguientes no lo incluían para no repetirlo) y las ha fusionado, añadiendo los valores que no se incluían, para obtener un solo valor que ha usado como nombre de la columna (sí, todo eso por seleccionar una opción…). La única columna que ha queda con el nombre F1 es la que contiene los datos de los municipios.

A la izquierda de la tabla resultado aparece la zona Entrada con una cabecera con varias opciones (figura 6.4). En la opción seleccionada, Varios archivos, nos ofrece la posibilidad de seleccionar Tabla individual o Unión de comodín. En este caso estamos trabajando solo con una tabla (tenemos seleccionada la opción adecuada) pero, en caso de necesitar trabajar con los datos de varias tablas con estructura similar, en este apartado podríamos seleccionarlos para tratarlos conjuntamente .

6.1.2 Transformar la tabla en tabla plana

Una vez tenemos la tabla dinámica perfectamente delimitada, vamos a añadir un nuevo paso al flujo para transformarla en una tabla plana. Pulsamos sobre el signo “+” anexo al paso de importación y, en el menú que se abre, seleccionamos la opción Tabla dinámica (figura 6.5).

Añadir paso para transformar una tabla dinámica.

Figura 6.5: Añadir paso para transformar una tabla dinámica.

Una vez añadido el paso, tenemos que definirlo. En la cabecera de la zona central de la ventana de definición (figura 6.6, aparece seleccionada la opción Columnas a filas que es la operación que necesitamos, este mismo paso permitiría la operación inversa, seleccionándola en ese apartado.

Posibilidades de transformación de una tabla dinámica.

Figura 6.6: Posibilidades de transformación de una tabla dinámica.

En la zona central nos indica la manera de proceder: Arrastre aquí los campos para crear su tabla dinámica. En este caso no queremos crear una tabla dinámica, justo lo contrario, pero lo que hay que hacer es arrastrar hasta esta zona los campos a transformar.

La lista de campos de la tabla aparece en la zona de la izquierda de la ventana de definición del paso, la tabla actual en la zona de la derecha.

Excepto el primer campo (F1), seleccionamos el resto de campos de la columna de la izquierda y pulsamos-arrastramos-soltamos hasta la zona central de la ventana (figura 6.7).

Selección de campos para transformar una tabla dinámica.

Figura 6.7: Selección de campos para transformar una tabla dinámica.

En la figura 6.8, se muestra el resultado de la transformación. Se puede ver más claramente en la zona de la derecha.

Resultado de transformar una tabla dinámica.

Figura 6.8: Resultado de transformar una tabla dinámica.

Se han añadido dos campos, Valores de tabla dinámica1 y Nombres de tabla dinámica1, que contienen los valores almacenados en las celdas definidas por las combinaciones de filas y columnas de la tabla dinámica, y los nombres de las anteriores columnas que hemos seleccionado para transformarlas, respectivamente. También tenemos el campo F1, que no se ha transformado. Es decir, tenemos los datos de la tabla dinámica en forma de tabla plana.

6.1.3 Definir las columnas de la tabla

Una vez tenemos los datos estructurados en forma de tabla plana, podemos dividir las columnas y definir sus nombres. Para añadir un nuevo paso de transformación, pulsamos sobre el signo “+” anexo al paso de tabla dinámica y, en el menú que se abre, seleccionamos la opción Limpiar paso (figura 6.9).

Añadir paso para limpiar una tabla.

Figura 6.9: Añadir paso para limpiar una tabla.

Una vez añadido el nuevo paso, en la ventana de definición podemos indicar las transformaciones a realizar.

En primer lugar, vamos a dividir el campo que había fusionado automáticamente para obtener la tabla dinámica. Seleccionamos el campo Nombres de tabla dinámica1 pulsando sobre él y, pulsando sobre “…” en su cabecera, se abre el menú con las operaciones que podemos realizar sobre él (figura 6.10). Seleccionamos la opción Dividir valores > División automática. También, una vez seleccionado el campo, se puede pulsar sobre División automática en la barra de herramientas de la zona de diseño.

Dividir un campo en una tabla.

Figura 6.10: Dividir un campo en una tabla.

El resultado obtenido se muestra en la figura (figura 6.11). Ha obtenido dos campos, añadiendo los sufijos “: división 1” y “: división 2” al nombre del campo original, y ha llevado a cabo correctamente la división de los valores.

Dividir un campo en una tabla.

Figura 6.11: Dividir un campo en una tabla.

Se conserva el campo original, que ya no es necesario. Podemos eliminarlo seleccionando la opción Eliminar de su menú de operaciones (figura 6.12).

Eliminar un campo en una tabla.

Figura 6.12: Eliminar un campo en una tabla.

Ya tenemos los mismos campos que tiene archivo CSV equivalente al Excel que estamos transformando. Vamos a renombrarlos. Para cambiar el nombre a una columna, seleccionamos la opción Cambiar nombre de campo de su menú de operaciones (figura 6.13).

Cambiar nombre de campo en una tabla.

Figura 6.13: Cambiar nombre de campo en una tabla.

Renombramos las columnas con los nombres: Sexo, Periodo, Total y Municipios. El resultado se muestra en la figura 6.14.

Resultado de los cambios de nombre de los campos en una tabla.

Figura 6.14: Resultado de los cambios de nombre de los campos en una tabla.

Por último, no es necesario pero, si queremos reordenar las columnas, seleccionamos la columna a mover, en este caso Municipios, y pulsamos-arrastramos-soltamos para ubicarla en su nueva posición figura 6.15.

Detalle de las transformaciones realizadas en una tabla.

Figura 6.15: Detalle de las transformaciones realizadas en una tabla.

Si pulsamos en la cabeza de flecha que aparece a la izquierda de la zona de diseño, junto al texto Cambios (7) orientado verticalmente (figura 6.14), se abre esa zona y podemos ver el detalle de los cambios realizados en este paso (figura 6.15). Si fuese necesario, podemos eliminar o modificar cualquiera de los cambios realizados, situando el cursor sobre la operación de cambio, aparecen iconos que permiten realizar las operaciones sobre él.

Ejercicio 6.1 Importa y transforma tus datos en forma de tabla dinámica para obtener una tabla plana a partir de ellos (captura una pantalla del resultado final donde se vean todos los cambios del paso Limpiar 1 y los nombres de los municipios).

6.2 Definir los datos a nivel de individuo

De acuerdo al contenido de apartado 1.2.1, el periodo y el municipio identifican a cada individuo (un municipio en un periodo); la cantidad de hombres y mujeres son medidas sobre cada uno de los individuos.

Vamos a transformar los datos de manera que cada fila de la tabla se corresponda con un individuo, es decir, un municipio de la provincia que tenemos asignada en un periodo concreto.

6.2.1 Eliminar datos agregados

Además de los datos a nivel básico, la tabla con la que trabajamos incluye datos agregados:

  • Suma de la cantidad de hombres y mujeres: valor “Total” en la columna Sexo.

  • Observaciones a nivel de provincia que se corresponden a la suma de observaciones a nivel de municipio: valor asociado al nombre de la provincia en la columna Municipios con un código numérico de dos posiciones.

Estos son valores agregados que debemos eliminar y quedarnos exclusivamente con los datos de granularidad más fina a partir de los que se obtienen.

Podemos filtrar los datos dentro del mismo paso Limpiar que acabamos de definir. En el menú asociado al campo cuyos valores queremos filtrar, seleccionamos la operación Filtrar > Valores seleccionados (figura 6.16).

Filtrar valores de una columna.

Figura 6.16: Filtrar valores de una columna.

Se abre una ventana para definir el filtro, similar en funcionalidad a la de definición de filtros en Tableau que utilizamos en el capítulo 5, se muestra en la figura 6.17.

Definición de un filtro excluyendo valores.

Figura 6.17: Definición de un filtro excluyendo valores.

Para el caso del campo Municipios, una posibilidad es eliminar el valor correspondiente a la provincia (p.e., en mi caso, el valor “18 Granada”). Lo seleccionamos y pulsamos sobre Excluir (en la zona superior derecha de la ventana), el resultado es el que se puede ver en la figura 6.17. Al pulsar sobre Hecho, el filtro queda definido.

De manera similar, definimos un filtro sobre el campo Sexo para eliminar el valor “Total” (o devolver el resto de valores).

El resultado obtenido se muestra en la figura 6.18.

Resultado de filtrar los datos de las columnas.

Figura 6.18: Resultado de filtrar los datos de las columnas.

Pulsando doble-clic sobre el nombre del paso podemos cambiarle el nombre. Si se le asigna un nombre largo, solo muestra el principio. El criterio que he seguido ha sido nombrar los pasos con los datos, la operación o el resultado más relevante y, si el nombre del tipo de paso es muy claro en el contexto, no cambiarlo. En este caso, lo he llamado sin agregados.

6.2.2 Agrupar los datos a nivel de individuo

Un individuo está definido por el periodo y el municipio, atributos que están en forma de columnas (Periodo y Municipios). Sin embargo, los atributos correspondientes a cantidad de hombres y cantidad de mujeres están definidos como combinación de las columnas Sexo y Total.

Para que cada fila de la tabla se corresponda a los datos de un individuo, deberíamos tener una columna para cada valor de Sexo y, en la celda del individuo, el valor del campo Total para ese valor de Sexo. Es decir, deberíamos realizar una operación para presentar los datos en forma de tabla dinámica considerando los valores de Sexo como cabecera de columnas.

Esta operación se puede hacer añadiendo un paso Tabla dinámica (figura 6.19).

Definición de una tabla dinámica.

Figura 6.19: Definición de una tabla dinámica.

En la zona Campos de tabla dinámica de la ventana de definición del paso (zona central), hemos de seleccionar la opción Filas a columnas porque, en este caso, lo que queremos es definir columnas a partir de los valores de filas (los valores del campo Sexo).

Una vez seleccionada esa opción, la zona central de la ventana se configura para indicar dos campos:

  • Campo que pivotará filas en columnas: el campo Sexo.

  • Campo para agregar nuevas columnas: el campo Total.

Para añadir los campos, pulsamos-arrastramos-soltamos los campos correspondientes a las zonas indicadas. Al añadir el primer campo, antes de añadir el segundo, nos avisa del error de que no está completa la definición de la tabla dinámica (figura 6.20).

Situación intermedia en la definición de una tabla dinámica.

Figura 6.20: Situación intermedia en la definición de una tabla dinámica.

El resultado obtenido se muestra en la figura 6.21. Podemos cambiar el nombre al paso, esta vez seleccionando la opción Cambiar nombre de su menú contextual. Le asignamos el nombre Nivel individuo.

Resultado de definir una columna dinámica y cambio de nombre del paso.

Figura 6.21: Resultado de definir una columna dinámica y cambio de nombre del paso.

Con esta transformación tenemos cada individuo representado en una fila de la tabla.

Conforme vamos llevando a cabo operaciones, la herramienta analiza los datos y realiza recomendaciones que hasta ahora no habíamos comentado. En este momento, tenemos una recomendación que podemos ver pulsando sobre la flecha a su derecha en la barra de herramientas del área de diseño (figura 6.22).

Ver recomendaciones realizadas por Tableau Prep.

Figura 6.22: Ver recomendaciones realizadas por Tableau Prep.

Nos hace la recomendación de dividir el campo Municipios. Si pulsamos sobre ella, se abre la ventana donde nos da más detalles de la operación que propone realizar (figura 6.23).

Detalles de la recomendación realizada por Tableau Prep.

Figura 6.23: Detalles de la recomendación realizada por Tableau Prep.

Pulsando sobre Aplicar la operación se lleva a cabo correctamente. Renombramos los campos como cod_municipio y municipio, y eliminamos el campo original Municipios. El resultado obtenido se muestra en la figura 6.24, con el detalle de las operaciones realizadas en la zona Cambios (a la izquierda).

Resultado de la división y cambio de nombre de los campos implicados.

Figura 6.24: Resultado de la división y cambio de nombre de los campos implicados.

Ejercicio 6.2 Define los datos de tu tabla a nivel de individuo y obtén los campos cod_municipio y municipio en lugar del campo original Municipios (captura una pantalla del resultado final donde se vean todos los pasos realizados y los nombres de los municipios).

6.2.3 Obtener medidas adicionales de los individuos

Tenemos disponibles datos adicionales de los municipios, en concreto el archivo municipios.csv obtenido inicialmente. En estos datos no hay una observación para cada periodo y municipio, en este caso son datos actuales, el individuo es el municipio. Sin embargo, pueden ser compatibles con los datos con los que trabajamos hasta ahora porque los datos de este archivo no son datos muy cambiantes (al contrario de lo que ocurre con la cantidad de habitantes). En principio, el único problema puede ser que los municipios en sí hayan cambiado a lo largo de los años (unos se hayan unido, otros se hayan segregado) y en este archivo solo tenemos la situación actual.

A pesar de esto, las posibilidades adicionales que pueden ofrecer estos datos para realizar consultas compensan los posibles problemas. Vamos a tratar de integrarlos con los datos originales.

Importar los datos

En primer lugar, tenemos que importar los datos a Tableau Prep, tal y como hemos hecho previamente en el apartado 6.1.1, pero seleccionando el tipo de archivo adecuado: Archivo de Texto. Para definir una nueva conexión, desplegamos la zona lateral de la pantalla (si no está desplegada) pulsando sobre la cabeza de flecha de la parte superior y, a continuación, pulsamos sobre Añadir conexión (figura 6.25).

Añadir conexión.

Figura 6.25: Añadir conexión.

Seleccionamos el archivo y se añade un paso en un flujo paralelo al que teníamos (figura 6.26). En la ventana de diseño del paso podemos configurar las características de la importación.

Importar datos adicionales de municipio.

Figura 6.26: Importar datos adicionales de municipio.

En particular, en la zona de la izquierda, tenemos que asegurarnos que, en el apartado Configuración regional, aparezca seleccionado Español (España) porque en caso contrario seguramente no interprete bien los datos con números decimales. También deberemos cambiar el tipo de algunos datos, pulsando sobre la representación en la columna Tipo en la zona inferior derecha de la ventana. En particular, para el campo COD_INE debemos seleccionar el tipo Cadena y, para el campo SUPERFICIE_HA, el tipo Número (decimal).

El resultado es un nuevo paso independiente del resto con el nombre del archivo que acabamos de importar: municipios.

Adaptar los campos para tener uno en común

Para definir una relación entre ambas consultas debemos encontrar algún campo o conjunto de campos en común. Actualmente no hay ninguno pero podemos obtenerlo: los 5 primeros dígitos del campo COD_INE de la consulta municipios coinciden con el prefijo numérico del campo Municipios en la tabla original, que obtuvimos en el campo cod_municipio. Vamos a extraer ese fragmento del campo COD_INE.

Para dividir un campo, Añadimos un nuevo paso Limpiar. En la ventana de diseño del paso, seleccionamos el campo a transformar y, en su menú asociado, pulsamos sobre la opción Crear campo calculado > Cálculo personalizado (figura 6.27).

Crear un cálculo personalizado a partir de un campo.

Figura 6.27: Crear un cálculo personalizado a partir de un campo.

Se abre una ventana para definir el campo calculado. Tenemos que extraer una parte de una cadena. Para ver las funciones disponibles para el tipo de datos, en el campo Referencia seleccionamos la opción Cadena, recorriendo las funciones, se puede ver que LEFT es la que necesitamos. Definimos como nombre del campo cod_municipio y definimos el cálculo a partir del campo original: LEFT([COD_INE], 5) (figura 6.28). Pulsamos sobre Aplicar y Guardar.

Definición del cálculo personalizado a partir de un campo.

Figura 6.28: Definición del cálculo personalizado a partir de un campo.

El resultado se muestra en la figura 6.29, donde también hemos cambiado el nombre del paso para que se llame como el campo que genera: cod_municipio.

Resultado del cálculo personalizado a partir de un campo.

Figura 6.29: Resultado del cálculo personalizado a partir de un campo.

Definir la unión entre tablas

Una vez tenemos al menos un campo en común entre las tablas, podemos definir una operación de unión entre ellas. Queremos añadir a la tabla original los campos de la tabla municipios. Para ello, pulsamos-arrastramos el signo “+” de la salida del paso que hemos llamado cod_municipio sobre el paso Nivel individuo. Al posicionar el cursor sobre este último paso, aparecen dos opciones Unión de filas y Unión de columnas (figura 6.30), en este caso la operación que necesitamos es Unión de columnas, por lo que soltamos sobre esa opción. Es decir, pulsamos-arrastramos-soltamos el paso cod_municipio sobre la opción Unión de columnas del paso Nivel individuo.

Unión entre dos tablas.

Figura 6.30: Unión entre dos tablas.

El resultado es que se define un paso de tipo Unir entre las tablas resultado de los pasos implicados (figura 6.31).

Definición de la unión entre dos tablas.

Figura 6.31: Definición de la unión entre dos tablas.

En la ventana de diseño del paso, podemos cambiar las opciones consideradas. En este caso, ha considerado automáticamente los dos campos cod_municipio para definir la unión. Por defecto define una unión de tipo inner pero se puede cambiar el tipo pulsando sobre la parte del diagrama de Venn, mediante el que representa la operación, que queramos incluir. En este caso, mediante la unión de tipo inner se obtiene el resultado correcto porque no quedan valores sin relacionar de la tabla original (esto se puede ver en el apartado Resumen de los resultados de la unión o marcando la opción Mostrar únicamente valores no coincidentes en la zona central de la ventana). Es recomendable definir una unión de tipo left para que se incluyan todas las filas de la tabla original.

En caso de no determinar automáticamente los campos por los que se define la unión, estos se deberían seleccionar en el apartado Cláusulas de unión aplicadas en la zona Configuración.

En el mismo paso, vamos a renombrar todos los campos de la tabla siguiendo un mismo criterio, el formato snake case, de manera que los nombres de las columnas sean los siguientes, eliminando el resto:

  • cod_municipio

  • municipio

  • mujeres

  • hombres

  • periodo

  • capital

  • cod_comarca

  • comarca

  • cod_provincia

  • provincia

  • cod_comunidad_autonoma

  • comunidad_autonoma

  • altitud_m

  • nivel_altitud

  • superficie_ha

Ejercicio 6.3 Obtén mediciones adicionales de los individuos a partir de los datos del archivo municipios.csv, selecciona y renombra los campos de la tabla resultante mediante el criterio snake case (captura una pantalla del resultado donde se muestre la definición de la última operación y los nombres de los municipios).

Definir niveles adicionales de campos

Si observamos los campos altitud_m y nivel_altitud podemos comprobar que nivel_altitud se ha definido a partir de altitud_m agrupando los datos en niveles. De esta forma el campo nivel_altitud se puede usar para consultas como una simplificación del campo original. También podríamos definir niveles similares para la cantidad de habitantes o la extensión del municipio. Es lo que vamos a hacer a continuación para la cantidad de habitantes.

Para definir niveles en función la cantidad de habitantes, contamos con el archivo cod-habitantes.csv donde tenemos definidos códigos asociados a tramos de cantidad de valores de este campo. Por otro lado tenemos las columnas mujeres y hombres a partir de las que podemos obtener la cantidad de habitantes como una nueva columna.

Vamos a comenzar definiendo un campo calculado habitantes como suma de las columnas mujeres y hombres. Añadimos un nuevo paso de tipo Limpiar y definimos un campo calculado a partir del campo mujeres u hombres (en el menú del campo, pulsamos sobre la opción Crear campo calculado > Cálculo personalizado) mediante la expresión [mujeres] + [hombres] (figura 6.32).

Definición de un campo calculado.

Figura 6.32: Definición de un campo calculado.

Dentro del mismo paso, a partir de la columna habitantes podemos definir una nueva columna con el código del nivel de la cantidad de habitantes, cod_cantidad_habitantes (figura 6.33).

Definición de un campo calculado a partir de una expresión condicional.

Figura 6.33: Definición de un campo calculado a partir de una expresión condicional.

Los elementos para definirla se encuentran seleccionando en el campo Referencia la opción Lógico. La expresión condicional es la siguiente: IF [habitantes] > 500000 THEN 9 ELSEIF [habitantes] > 100000 THEN 8 ELSEIF [habitantes] > 50000 THEN 7 ELSEIF [habitantes] > 10000 THEN 6 ELSEIF [habitantes] > 5000 THEN 5 ELSEIF [habitantes] > 1000 THEN 4 ELSEIF [habitantes] > 500 THEN 3 ELSEIF [habitantes] > 100 THEN 2 ELSE 1 END

Le damos al paso el mismo nombre de la columna de código: cod_cantidad_habitantes. El resultado obtenido se muestra en la figura 6.34.

Definición del campo cod_cantidad_habitantes.

Figura 6.34: Definición del campo cod_cantidad_habitantes.

A continuación, importamos la tabla de niveles del archivo cod-habitantes.csv (como hemos hecho antes con las otras tablas) y combinamos la tabla original con ella mediante un paso de tipo Unir, como se muestra en la figura 6.35.

Combinar la tabla original con la tabla de niveles.

Figura 6.35: Combinar la tabla original con la tabla de niveles.

En este caso, en la zona Configuración (a la izquierda), en el apartado Cláusulas de unión aplicadas, pulsando sobre “+”, definimos los campos que se corresponden de cada tabla. En concreto, en este caso la unión se ha de definir mediante el código que acabamos de generar, cod_cantidad_habitantes, y el campo Cod de la nueva tabla importada (figura 6.36). Asimismo, definimos en el apartado Tipo de unión el tipo left, el resultado se muestra en la figura figura 6.35.

Definición de la unión.

Figura 6.36: Definición de la unión.

Cuando tengamos campos de texto entre los que exista un orden que no coincida necesariamente con el orden alfabético, es conveniente añadir un código como prefijo de manera que el orden alfabético coincida con el orden implícito. Generalmente, las herramientas de consulta presentan los literales en orden alfabético, de esta forma es más fácil identificar la relación de orden existente entre ellos. En este caso, para conseguir esto, debemos combinar las columnas de código y descripción de los niveles.

Podemos definir esta operación en el paso de tipo Unir actual. Definimos un nuevo Cálculo personalizado llamado nivel_habitantes a partir de cualquiera de los campos Cod o Tamaño de Municipio mediante la expresión STR([Cod]) + " - " + [Tamaño de Municipio], es decir, transformamos el código en una cadena y lo concatenamos a la descripción incluyendo un separador (figura 6.37).

Definición del campo nivel_habitantes.

Figura 6.37: Definición del campo nivel_habitantes.

Como el objetivo de definir la unión era precisamente obtener este campo, renombramos el paso con el nombre del campo: nivel_habitantes. La situación actual del flujo de transformación se muestra en la figura 6.38.

Flujo de transformación de datos hasta la definición del campo nivel_habitantes.

Figura 6.38: Flujo de transformación de datos hasta la definición del campo nivel_habitantes.

Ejercicio 6.4 Define en la tabla original un campo llamado nivel_habitantes con los códigos y descripciones del archivo cod-habitantes.csv definido en función de la cantidad de habitantes de cada municipio (captura una pantalla del resultado final donde se vean los nombres de los municipios).

Ejercicio 6.5 Define en la tabla original un campo llamado nivel_superficie en función del campo superficie_ha, similar a los anteriores23, con 3 niveles, con los límites que consideres oportunos según tu criterio (captura una pantalla del resultado final donde se vean los nombres de los municipios y otra donde se vea la definición de los niveles).

6.3 Generar hechos y dimensiones

Una vez tenemos las observaciones a nivel individuo y tenemos asociado a cada individuo las mediciones disponibles, vamos a estructurar los datos en forma de dimensiones y hechos.

En ejemplos más sencillos este es el punto de partida. Tenemos una tabla plana de observaciones y, a partir de ella, vamos a generar un diseño multidimensional en forma de hechos y dimensiones. Previamente vamos a realizar una comprobación de los datos.

6.3.1 Comprobación de los datos

Deberemos comprobar:

  • Que todas las instancias corresponden al mismo nivel de detalle. Se trataría de conocer las instancias y definir la granularidad de los datos que tenemos.

  • Que todos los caracteres (columnas) están definidos para todas las instancias. En caso de encontrar instancias con campos que nos interese considerar en el diseño y se encuentren sin definir, deberemos aplicar alguna solución.

El primer paso ya lo hemos hecho: previamente hemos eliminado los agregados y hemos transformado los datos para que cada fila se corresponda con un individuo (un municipio en un periodo).

Para llevar a cabo esta segunda comprobación, podemos ir columna por columna en los resultados y comprobar si el valor nulo está incluido entre sus valores. Lo encontramos en las columna habitantes, mujeres y hombres (figura 6.39).

Comprobación de valores nulo en las columnas.

Figura 6.39: Comprobación de valores nulo en las columnas.

La solución depende de cada caso, en algunas situaciones la solución adecuada consiste en sustituir los valores nulo o vacíos por algún valor predefinido del estilo de “Desconocido”, “No disponible”, “No aplicable”, o similar.

En el caso de tratarse de valores numéricos correspondientes a medidas, como ocurre en nuestros datos, es poco probable que pueda ser apropiado reemplazar esos valores por algún valor concreto (podríamos pensar en 0). Si tenemos los medios, lo ideal es averiguar el motivo de esos valores y actuar en consecuencia.

En nuestros datos, la explicación la podemos encontrar en el archivo Excel. En las notas al pie de la tabla dinámica se indica: “No existen cifras a 1 de enero de 1997 porque no se realizó revisión del padrón para ese año”. En este caso, la solución más adecuada es eliminar los datos correspondientes a 1997 y comprobar si dejamos de tener valores nulo en esas columnas.

Puede haber valores nulo asociados a mediciones de municipios de nueva creación (segregaciones) o que hayan desaparecido (por fusionarse se con otros). Para evitar posibles problemas, podemos eliminarlos filtrando el campo habitantes (obtenido a partir de los campos mujeres y hombres).

Se podría hacer esta operación en el paso actual pero, para resaltar su relevancia, añadimos un nuevo paso de tipo Limpiar y lo llamaremos sin nulos. En el menú del campo habitantes, seleccionamos la opción Filtrar > Valores nulos (figura 6.40).

Filtrar valores nulos.

Figura 6.40: Filtrar valores nulos.

En la ventana de definición del filtro, en el apartado Mantener solamente, seleccionamos la opción Valores no nulos (figura 6.41).

Definición del filtro de valores nulos.

Figura 6.41: Definición del filtro de valores nulos.

6.3.2 Generar las dimensiones

Vamos a generar las dimensiones Cuándo y Dónde a partir de la tabla obtenida como resultado del paso sin nulos.

Dimensión Cuándo

La dimensión Cuándo solo contendrá el campo periodo por ser el único campo de la tabla que responde a la pregunta Cuándo: ha de contener todos los valores de este campo, sin repetir. Es decir, en primer lugar, debemos eliminar el resto de campos y después quedarnos solo con los valores únicos.

Podemos realizar estas operaciones mediante un paso de tipo Agregar que llamaremos cuándo. En el diseño del paso, debemos indicar que los datos se agruparán por el campo periodo. Inicialmente la herramienta clasifica cada campo como candidato a agruparse (GROUP) o a agregarse (SUM). Sin embargo, la operación a realizar sobre los campos es la que se indique incluyendo los campos seleccionados en las zonas Campos agrupados y Campos agregados. En este caso, solo tenemos que agrupar el campo periodo, por tanto, pulsamos-arrastramos-soltamos este campo desde la zona Campos adicionales hasta la zona Campos agrupados (figura 6.42).

Definición de la dimensión Cuándo.

Figura 6.42: Definición de la dimensión Cuándo.

El resultado es el esperado: tenemos una tabla con solo ese campo, sin valores repetidos.

Para añadir una llave generada, necesitamos añadir un nuevo paso de tipo Limpiar. El criterio que he seguido para renombrar las llaves generadas ha sido añadir el sufijo “key” al nombre de la tabla. Siguiendo con el criterio snake case, la llamaremos cuando_key. Al nuevo paso también le daremos el mismo nombre: cuando_key.

En el diseño del paso, definimos un nuevo campo calculado (pulsando sobre Crear campo calculado en la barra de herramientas o desde el menú del campo de la tabla). En la ventana de definición, indicamos el nombre, cuando_key, y la expresión de definición, {ORDERBY [periodo] ASC : ROW_NUMBER()} (figura 6.43).

Definición de una llave generada.

Figura 6.43: Definición de una llave generada.

Para definir la expresión usamos las operaciones disponibles seleccionando Análisis en el campo Referencia de la ventana de definición. Se ordenan los datos por el campo indicado y al resultado se le asigna un número consecutivo en el nuevo campo.

Usaremos esta dimensión para representar la evolución de la población a lo largo de los años o para mostrar la situación en un periodo concreto. Podemos facilitar las consultas en las que intervenga esta dimensión añadiendo nuevos campos que nos permitan seleccionar un grupo de periodos en lugar de tener que hacerlo de forma individual. Por ejemplo, si es frecuente presentar informes en los que aparezcan los periodos de un decenio, si tenemos los grupos predefinidos, la selección se puede realizar de forma inmediata.

Podemos añadir un campo decenio en el paso actual, definiendo un nuevo campo calculado a partir del campo periodo, mediante la expresión FLOOR([periodo]/10)*10 (figura 6.44).

Definición del campo decenio.

Figura 6.44: Definición del campo decenio.

No es relevante la posición de los campos en una tabla, hay herramientas que los ordenan alfabéticamente. En cualquier caso, es habitual que los campos que forman la llave primaria de la tabla se sitúen al principio de esta. Podemos mover los campos pulsando-arrastrando-soltando de manera que cuando_key esté ubicado principio de la tabla (figura 6.45).

Resultado de la definición de la dimensión Cuándo.

Figura 6.45: Resultado de la definición de la dimensión Cuándo.

Ejercicio 6.6 Genera la tabla de la dimensión Cuándo con los campos periodo, decenio y una llave generada (captura una pantalla del resultado final donde se vean todos los pasos aplicados).

Dimensión Dónde

Para la dimensión Dónde, actuamos de la misma forma: añadiremos un paso de tipo Agregar a partir del paso sin nulos, al que llamaremos dónde. Hay dos posibilidades para añadir un paso a partir de otro que ya está conectado:

  • Insertarlo entre el paso y el siguiente: pulsamos sobre el signo “+” que aparece al situar el cursor sobre la línea de unión entre los pasos (figura 6.46).
Insertar un paso.

Figura 6.46: Insertar un paso.

  • Hacer una bifurcación: pulsamos sobre el signo “+” que aparece al situar el cursor sobre el paso (figura 6.47).
Hacer una bifurcación.

Figura 6.47: Hacer una bifurcación.

En este caso, tenemos que hacer una bifurcación: partiendo de los mismos datos, seleccionamos los campos de la nueva dimensión. El resultado se muestra en la figura 6.48.

Bifurcación en el flujo de datos.

Figura 6.48: Bifurcación en el flujo de datos.

Para definir esta dimensión, incluimos los campos siguientes en el apartado Campos agrupados de la ventana de diseño del paso:

  • cod_municipio

  • municipio

  • capital

  • comarca

  • provincia

  • comunidad_autonoma

  • nivel_altitud

  • nivel_habitantes

  • nivel_superficie

El resultado de la definición se muestra en la figura 6.49.

Definición de la dimensión Dónde.

Figura 6.49: Definición de la dimensión Dónde.

Se ha reducido el número de filas de la tabla, conservándose exclusivamente las combinaciones de valores únicos. Para añadir una llave generada, procedemos como se hizo para la dimensión Cuándo. Siguiendo el mismo criterio que antes, la llamamos donde_key y al nuevo paso también le daremos el mismo nombre: donde_key. En la ventana de definición, indicamos el nombre y la expresión de definición, {ORDERBY [cod_municipio] ASC : ROW_NUMBER()} (figura 6.50).

Definición de una llave generada.

Figura 6.50: Definición de una llave generada.

El resultado se muestra en la figura 6.51. La llave generada se sitúa al principio de la tabla.

Resultado de añadir la llave generada.

Figura 6.51: Resultado de añadir la llave generada.

Ejercicio 6.7 Genera la tabla de la dimensión Dónde con los campos propios de esa dimensión (al menos los incluidos en este apartado) y una llave generada (captura una pantalla del resultado final donde se vean todos los pasos del apartado).

  • Observa si hay o no municipios duplicados en la dimensión obtenida. En caso de haberlos, razona el motivo por el que se produce este hecho y explica si es o no correcto que sea así.

  • Si los datos de un mismo municipio aparecen en más de una fila, ¿qué pasaría si la dimensión tuviera como llave primaria el nombre del municipio o su código del INE en lugar de la llave generada?

6.3.3 Generar los hechos

Una vez hemos generado las tablas de todas las dimensiones (en este caso solo son dos), vamos a generar la tabla de hechos, a partir de la tabla resultante del paso sin nulos, sustituyendo los datos de las dimensiones por las llaves generadas y, además de estas, seleccionando solo las medidas.

Tenemos que definir la unión entre la tabla resultado del paso sin nulos y una de las tablas de las dimensiones, por ejemplo, la que resulta del paso cuando_key: pulsamos-arrastramos-soltamos el paso cuando_key sobre la opción Unión de columnas del paso sin nulos (figura 6.52).

Definición de la unión con la tabla cuando_key.

Figura 6.52: Definición de la unión con la tabla cuando_key.

El resultado es la definición de un nuevo paso de tipo Unir entre ambas tablas (figura 6.53).

Unión con la tabla cuando_key.

Figura 6.53: Unión con la tabla cuando_key.

En este caso, como solo tienen un campo en común, periodo, la definición se realiza mediante ese campo. Podemos comprobar la definición en el apartado Configuración de la ventana de diseño del paso (figura 6.54), también el resultado. El tipo de unión inner es adecuado porque estamos extrayendo un subconjunto de los campos de la tabla inicial y todos los valores deberían coincidir y no perderse ningún registro al realizar la operación. Podemos comprobar que esto es así en el apartado Resumen de los resultados de la unión.

Configuración de la unión con la tabla cuando_key.

Figura 6.54: Configuración de la unión con la tabla cuando_key.

A continuación, podemos definir la unión con la tabla de la dimensión Dónde, el resultado del paso donde_key: pulsamos-arrastramos-soltamos el paso donde_key sobre la opción Unión de columnas del paso Unir 2 que acabábamos de definir, el resultado de la unión con la dimensión Cuándo (figura 6.55).

Definición de la unión con la tabla donde_key.

Figura 6.55: Definición de la unión con la tabla donde_key.

El resultado es la definición de otro paso de tipo Unir (figura 6.56), que hay que acabar de definir.

Unión con la tabla donde_key.

Figura 6.56: Unión con la tabla donde_key.

La definición inicial del nuevo paso se muestra en la figura 6.57. Entre las dos tablas hay varios campos en común pero, para definir la unión, ha considerado solo uno, el campo capital.

Inicio de la configuración de la unión con la tabla donde_key.

Figura 6.57: Inicio de la configuración de la unión con la tabla donde_key.

En el apartado Recomendaciones para la cláusula de unión, incluye otros emparejamientos de campos que podemos añadir pulsando sobre el signo “+” que aparece a la derecha de cada par, al situar el cursor sobre él.

Es importante comprobar que se ha establecido correctamente la relación, esto se muestra en la zona Resumen de los resultados de la unión (figura 6.58).

Configuración y resultado de la unión con la tabla donde_key.

Figura 6.58: Configuración y resultado de la unión con la tabla donde_key.

En la tabla resultado, seleccionamos exclusivamente las medidas mujeres, hombres, y superficie_ha, y las llaves externas donde_key y cuando_key. Los niveles de altitud los hemos incorporado a la dimensión y no nos interesa la altitud concreta. La cantidad de habitantes la podemos obtener a partir de las medidas seleccionadas.

En este caso no hemos cambiado la granularidad de los datos iniciales (definidos a nivel de municipio y periodo) y podríamos dar por acabado aquí el proceso de transformación. En otros casos, si se cambia la granularidad o sospechamos que pueda haber datos fragmentados por algún motivo, deberemos agrupar los datos de manera que la combinación de llaves externas formen la llave primaria de la tabla mediante un paso de tipo Agregar (figura 6.59).

Agregación de la tabla de hechos.

Figura 6.59: Agregación de la tabla de hechos.

Definimos las llaves externas como Campos agrupados y las medidas como Campos agregados. Es útil incluir el campo Cantidad de filas (agregadas), generado automáticamente, en la zona Campos agregados porque así podemos comprobar los valores que toma. En caso de tomar solo el valor 1, nos indica que no era necesario este paso. Podemos dejarlo pero sin incluir este campo en el resultado.

Ejercicio 6.8 Genera la tabla de hechos (captura una pantalla del resultado final).

  • En la definición de la unión entre la tabla con todos los datos y la tabla de la dimensión Dónde se han usado todos los campos en común. ¿Cuál sería el conjunto mínimo de campos a utilizar en la unión para obtener el mismo resultado y por qué?

6.4 Guardar las tablas como archivos

Con esto tenemos las tablas de dimensiones y hechos generadas, serán las que usaremos para realizar consultas. Para poder utilizarlas vamos a guardarlas como archivos en formato CSV.

Para ello, a la salida de cada paso donde se ha generado una dimensión y donde se han generado los hechos, hemos de añadir un nuevo paso de tipo Salida que llamaremos con el nombre de la tabla (cuando, donde, padron) y el sufijo del nombre de nuestra provincia (p.e., en mi caso "_granada"), al archivo que genere le daremos el mismo nombre que al paso. En la figura 6.60, se muestra la definición del paso correspondiente para la dimensión Cuándo.

Guardar el resultado en un archivo.

Figura 6.60: Guardar el resultado en un archivo.

En la ventana de diseño del paso, debemos indicar, en campo Tipo de salida, el formato del archivo y, pulsando sobre el botón Examinar, definimos su ubicación y nombre (p.e., en mi caso cuando_granada.csv). Ofrece la posibilidad de ejecutar el flujo de datos (al detectar que hemos definido una salida), pero lo ejecutaremos cuando las hayamos definido todas.

Una vez hemos definido todos los flujos de datos, para ejecutarlos, pulsamos sobre la operación Ejecutar todos los flujos en la barra de herramientas (figura 6.61).

Ejecutar todos los flujos de datos.

Figura 6.61: Ejecutar todos los flujos de datos.

El resultado se muestra a continuación, en la figura 6.62.

Resultado de ejecutar el flujo de datos.

Figura 6.62: Resultado de ejecutar el flujo de datos.

Podemos comprobar que los archivos se han generado en la carpeta de trabajo que hayamos indicado.

Ejercicio 6.9 Obtén la siguiente información:

  • Representación gráfica de todas transformaciones realizadas (captura la pantalla).

  • Guarda las tablas de dimensiones y hechos en formato CSV (captura una pantalla para cada tabla en la hoja de cálculo). Conserva estos archivos por si fuese necesario usarlos en prácticas posteriores.

Bibliografía

Tim Costello, Lori Blackshear. 2019. Prepare Your Data for Tableau: A Practical Guide to the Tableau Data Prep Tool. Apress.


  1. Aunque la aplicación se llama Tableau Prep Builder generalmente la llaman Tableau Prep y así lo haremos en el resto de este capítulo.↩︎

  2. En el ejemplo sobre el que estamos trabajando, hemos descargado los datos en dos formatos, Excel y CSV; los datos son los mismos pero en el caso de Excel tienen el formato de tabla dinámica. Por eso estas operaciones no serían necesarias en este caso. Se presentan porque en otras situaciones podemos encontrar los datos solo en formato de tabla dinámica.↩︎

  3. Es la misma opción que aparecía para importar datos en Tableau, en el capítulo 5.↩︎

  4. El resultado debe ser similar a los anteriores, pero no se trata de repetir los pasos que acabamos de hacer para este último.↩︎