7 Cuadros de mando (dashboards)

Instalación/carga librerías/datos utilizados

if (!require(shiny)) install.packages('shiny') 
library(shiny) 
if (!require(flexdashboard)) install.packages('flexdashboard') 
library(flexdashboard)

Los cuadros de mando (dashboards) son aplicaciones web que presentan de forma organizada un conjunto de gráficos. Pueden ser estáticas, donde los gráficos presentan siempre los mismos datos o dinámicas, donde el usuario, a través de menús, puede elegir que datos observar en los gráficos. En este curso vamos a usar la librería shiny para crear cuadros de mando dinámicos. Además usaremos la librería flexdashboard como una interfaz para crear aplicaciones Shiny.

Una vez instaladas las librerías se puede crear el esqueleto de un cuadro de mando usando las instrucciones que se detallan en flexdashboard. También se puede utilizar cualquiera de los ficheros Rmd de ejemplos de cuadros de mandos que se suministran en este curso.

7.1 Cuadro de mandos con hchart

Para ilustrar el concepto de cuadro de mando dinámico usaremos el ejemplo que se encuentra en Dashboard1.Rmd, cuya ejecución se visualiza a continuación (para poder interactuar con el gráfico hay que ejecutar el fichero Rmd desde Rstudio) :

Cuadro de mando asociado al fichero Dashboard1.Rmd
Cuadro de mando asociado al fichero Dashboard1.Rmd

En este cuadro de mando se presentan 4 gráficos comparativos, realizados con hchart, de la evolución de la población en 4 países o regiones del mundo. A la izquierda aparece menús desplegables para elegir el país/región de cada gráfico y los años de inicio y final para generar el gráfico. Para generar este cuadro de mando localmente, hay que cargar el fichero Dashboard1.Rmd en Rstudio y ejecutar run document (opción que reemplaza al knit en este tipo de ficheros Rmd). Observamos que este cuadro de mando se organiza en 3 columnas: en la primera columna aparecen los menús desplegables en la segunda columna aparecen dos gráficos generados con hchart y en la tercera columna otros 2 gráficos similares. Usando flexdashboard este cuadro de mando se organiza de la siguiente forma :

  • Lectura de los datos que usa el cuadro de mandos y creación de las etiquetas que utilizarán los menús desplegables

  • Creación de una primera columna para poner los menús desplegables. La columna se crea usando el código:

Column {.sidebar data-width=230}
--------------------------------------------------

cada menú desplegable se crea usando la función selectInput. Esta función asocia un nombre al campo de este menú desplegable, por ejemplo country1, en el interior de las funciones que dibujan, se accede al valor de este campo a través de input$country1.

  • Creación de una segunda columna para poner 2 gráficos apilados de la población de dos países/regiones. La columna la creamos de nuevo usando la instrucción
Column
--------------------------------------------------

Cada gráfico lo creamos con la función renderHighchart. Es decir para que aparezcan los dos gráficos el código seguiría el siguiente estilo

###

renderHighchart({
  .....
  código creación gráfico hchart con datos input$country1
  ....
})

###

renderHighchart({
  .....
  código creación gráfico hchart con datos input$country2
  ....
})
  • Creación de una tercera columna de forma idéntica a la segunda, pero usando los datos de input$country3 y input$country4

La función renderHighchart se usa porque es un gráfico generado con hchart. Si fuera un gráfico generado con plotly habría que usar la función renderPlotly, y si fuese un gráfico de datos geográficos de Leaflet habría que usar la función renderLeaflet. Es decir, cada tipo de gráfico tiene asociado una función diferente en flexdashboard. Para un gráfico estándar se utiliza la función renderPlot.

7.2 Cuadro de mandos con Leaflet

El segundo cuadro de mando que vamos a estudiar se encuentra en el fichero Dashboard2.Rmd, cuya ejecución se visualiza a continuación:

Cuadro de mando asociado al fichero Dashboard2.Rmd
Cuadro de mando asociado al fichero Dashboard2.Rmd

En este caso, el cuadro de mandos tiene dos columnas. En la primera columna aparece un menú desplegable para elegir el indicador de los países que vamos a usar y aparece también una tabla con los datos del indicador en orden descendente. Las tablas en flexdashboard, se generan usando la función renderTable. A la derecha aparece una columna con un mapa coroplético con los valores del indicador (para interactuar con el gráfico hay que ejecutar el fichero Rmd desde Rstudio)

7.3 Cuadro de mandos con Plotly

El tercer cuadro de mando que vamos a estudiar se encuentra en el fichero Dashboard3.Rmd, cuya ejecución se visualiza a continuación:

Cuadro de mando asociado al fichero Dashboard3.Rmd Presentamos, a continuación, un cuadro de mandos dentro del ámbito del análisis de atributos que se verá en más detalle en el siguiente tema. El cuadro de mando se organiza en 3 columnas. En la primera columna se muestran algunos menús desplegables y una tabla de resultados, en la segunda columna un diagrama de puntos usando plotly y en la tercera columna una tabla con datos.

El objetivo de este cuadro de mando es estudiar la relación entre cualquier par de indicadores sobre los países publicados por la OWID. Al primer indicador lo llamaremos \(x\) y al segundo \(y\). Por ejemplo, en la imagen anterior se muestra la comparación entre \(x=\)PIB/habitante e \(y=\)la esperanza de vida. El modelo que usaremos es la conocida regresión lineal, es decir, buscamos una relación lineal entre \(x\), \(y\), dada por

\[y=ax+b\]

donde \(a\) es la pendiente (slope) y \(b\) es el término independiente (independent). Usaremos el factor de correlación (correlation) como criterio de calidad del ajuste, cuanto más cerca de 1 esté este valor, mejor será el ajuste. Además, antes de calcular la regresión lineal damos la opción al usuario de escalar \(x\) o \(y\). Escalar \(x\) significa que sustituimos \(x\) por \(s_x(x)\), donde \(s_x()\) es la transformada utilizada, que en nuestro caso, damos como opciones \(s_x(x)=log(x)\), o \(s_x(x)=sqrt(x)\). Este tipo de escalado ya lo hemos usado en ggplot a efectos de visualización. De la misma forma, opcionalmente, escalamos \(y\) con \(s_y(y)\), permitiendo elegir \(s_y(y)=log(y)\) o \(s_y(y)\) dada por la transformada de Box-Cox, que para \(y>0\) se define como:

\[ s_y(y)=\left\{ \begin{array} [c]{ccc}% \frac{y^{\lambda}-1}{\lambda} & si & \lambda\neq0\\ \log(y) & si & \lambda=0 \end{array} \right. \] Esta transformación es continua respecto a \(\lambda\) porque se puede demostrar fácilmente que si \(y>0\), entonces

\[Lim_{\lambda\rightarrow0}\frac{y^{\lambda}-1}{\lambda}=\log(y)\] en la práctica, el valor de \(\lambda\) se calcula automáticamente para optimizar la regresión lineal entre \(s_x(x)\) y \(s_y(y)\). Como la regresión lineal se aplica después de escalar, al final la relación entre las variables queda como

\[ s_y(y)=a\cdot s_x(x)+b \] Para cada par de indicadores elegidos, consideraremos que la mejor elección de escalados es la que maximiza la correlación. En el ejemplo que se visualiza en la imagen anterior, observamos una correlación máxima de \(0.83\) con \(s_x(x)=log(x)\) e \(s_y(y)\) la transformación de Box-Cox con \(\lambda=2\). Es decir, la relación entre \(x\) e \(y\) sería

\[ \frac{y^2-1}{2}=365.71 \cdot log(x)-707.54 \] Visualmente, en el diagrama de puntos del cuadro de mandos, cuanto mejor se ajuste la nube puntos a la recta de regresión, mejor explicará el modelo la relación entre los dos indicadores.

7.4 Publicar un cuadro de mando

Para publicar un cuadro de mando realizado por flexdashboard hay diversas formas (ver shiny.rstudio.com). Lo más sencillo es usar el servidor de shinyapps.io. Para ello hay que darse de alta en el citado sitio web y seguir las siguientes instrucciones. La versión gratuita de uso del servidor permite 5 aplicaciones y 25 horas mensuales de ejecución. Otra opción más compleja, pero también gratuita, es alojar en un servidor LINUX propio el software completo.

Referencias

[BoCo64] Box, G. E., and D. R. Cox.. An analysis of transformations, Journal of the Royal Statistical Society. Series B (Methodological), 211–52, 1964.

[Shinyapps] Shinyapps

[SIAB23] Sievert, Carson, Richard Iannone, JJ Allaire, and Barbara Borges. 2023. flexdashboard: R Markdown Format for Flexible Dashboards, 2023.