Introducción a la visualización mediante dashboards
Máster Universitario en Análisis de Datos Deportivos, Universidad Rey Juan Carlos
Data Science
Unión, no intersección
R for Data Science
CRISP-DM
Despliegue puede incluir muchas cosas distintas
El uso de los modelos
La Visualización de resultados
MLOps: como DevOps en informática
Explicabilidad de modelos
Dashboards
Informes estáticos
Cuadro de mando integral: ejemplo clásico en la empresa
Informes estadísticos: Normalmente resultados clave con gráficos, tablas e interpretación. Seleccionados por analista
Por diseño, pensados para ser impresos en papel, formato pdf
Dashboards estáticos
Más compactos, diseñado para pantalla
Dashboards interactivos
Informe estático con elementos interactivos (widgets)
Limitaciones y alternativas
Limitados a lo que el estadístico quiere mostrar
No solo lo van a usar personas expertas en estadística
Toma de decisiones a distintos niveles
Aplicaciones Reactivas guían a las partes interesadas en la obtención e interpretación de resultados
Los interfaces bien diseñados para modelos avanzados favorecen la explicabilidad
Aplicaciones reactivas
Reactive programming
The key idea of reactive programming is to specify a graph of dependencies so that when an input changes, all related outputs are automatically updated.
library(shiny)library(bslib)ui <-page_navbar(title ="Control Estadístico de procesos ACME",sidebar =sidebar(title ="Selección"),nav_panel(title ="Gráfico de Control"),nav_panel(title ="Análisis de la capacidad del proceso"))server <-function(input, output, session) {}shinyApp(ui, server)
Añadiendo inputs y outputs al ui
library(shiny)library(bslib)library(qcc)ui <-page_navbar(title ="Control Estadístico de procesos ACME",sidebar =sidebar(title ="Selección",selectInput("tipo", "Tipo de gráfico", c("xbar", "R", "S" )),numericInput("fase1", "Fase 1 hasta muestra", value =25),sliderInput("limites", "Límites de especificación",min =73.90, max =74.15,value =c(73.95, 74.05), step =0.01),selectInput("datos", "Datos (fake)", data(package ="qcc")$results[,3]) ),nav_panel(title ="Gráfico de Control",plotOutput("grafico_control"),verbatimTextOutput("salida_control")),nav_panel(title ="Análisis de la capacidad del proceso",plotOutput("grafico_capacidad")))server <-function(input, output, session) {}shinyApp(ui, server)
Añadiendo objetos reactivos
library(shiny)library(bslib)library(qcc)ui <-page_navbar(title ="Control Estadístico de procesos ACME",sidebar =sidebar(title ="Selección",selectInput("tipo", "Tipo de gráfico", c("xbar", "R", "S" )),numericInput("fase1", "Fase 1 hasta muestra", value =25),sliderInput("limites", "Límites de especificación",min =73.90, max =74.15,value =c(73.95, 74.05), step =0.01),selectInput("datos", "Datos", data(package ="qcc")$results[,3])),nav_panel(title ="Gráfico de Control",plotOutput("grafico_control"),verbatimTextOutput("salida_control")),nav_panel(title ="Análisis de la capacidad del proceso",plotOutput("grafico_capacidad") ))server <-function(input, output, session) { gc <-reactive({req(input$tipo, input$fase1)data("pistonrings") diameter <-qcc.groups(pistonrings$diameter, pistonrings$sample)qcc(diameter[1:as.numeric(input$fase1),], type = input$tipo, plot =FALSE) }) }shinyApp(ui, server)
Renderizando outputs
library(shiny)library(bslib)library(qcc)ui <-page_navbar(title ="Control Estadístico de procesos ACME",sidebar =sidebar(title ="Selección",selectInput("tipo", "Tipo de gráfico", c("xbar", "R", "S" )),numericInput("fase1", "Fase 1 hasta muestra", value =25),sliderInput("limites", "Límites de especificación",min =73.90, max =74.15,value =c(73.95, 74.05), step =0.01),selectInput("datos", "Datos", data(package ="qcc")$results[,3])),nav_panel(title ="Gráfico de Control",card(plotOutput("grafico_control"),verbatimTextOutput("salida_control"),fill =FALSE)),nav_panel(title ="Análisis de la capacidad del proceso",plotOutput("grafico_capacidad")))server <-function(input, output, session) { gc <-reactive({req(input$fase1)data("pistonrings") diameter <-qcc.groups(pistonrings$diameter, pistonrings$sample)qcc(diameter[1:as.numeric(input$fase1),], type = input$tipo, plot =FALSE) }) output$grafico_control <-renderPlot({plot(gc()) }) output$salida_control <-renderText({paste(capture.output(summary(gc())), collapse ="\n") }) output$grafico_capacidad <-renderPlot({req(input$tipo =="xbar")process.capability(gc(), input$limites) })}shinyApp(ui, server)
Dale color - ver cómo queda un tema
library(shiny)library(bslib)library(qcc)ui <-page_navbar(title ="Control Estadístico de procesos ACME",sidebar =sidebar(title ="Selección",selectInput("tipo", "Tipo de gráfico", c("xbar", "R", "S" )),numericInput("fase1", "Fase 1 hasta muestra", value =25),sliderInput("limites", "Límites de especificación",min =73.90, max =74.15,value =c(73.95, 74.05), step =0.01),selectInput("datos", "Datos", data(package ="qcc")$results[,3])),nav_panel(title ="Gráfico de Control",card(plotOutput("grafico_control"),verbatimTextOutput("salida_control"),fill =FALSE)),nav_panel(title ="Análisis de la capacidad del proceso",plotOutput("grafico_capacidad")))server <-function(input, output, session) {bs_themer() gc <-reactive({req(input$fase1)data("pistonrings") diameter <-qcc.groups(pistonrings$diameter, pistonrings$sample)qcc(diameter[1:as.numeric(input$fase1),], type = input$tipo, plot =FALSE) }) output$grafico_control <-renderPlot({plot(gc()) }) output$salida_control <-renderText({paste(capture.output(summary(gc())), collapse ="\n") }) output$grafico_capacidad <-renderPlot({req(input$tipo =="xbar")process.capability(gc(), input$limites) })}shinyApp(ui, server)
Dale color - configura el tema
library(shiny)library(bslib)library(qcc)ui <-page_navbar(theme =bs_theme(bootswatch ="minty"),title ="Control Estadístico de procesos ACME",sidebar =sidebar(title ="Selección",selectInput("tipo", "Tipo de gráfico", c("xbar", "R", "S" )),numericInput("fase1", "Fase 1 hasta muestra", value =25),sliderInput("limites", "Límites de especificación",min =73.90, max =74.15,value =c(73.95, 74.05), step =0.01),selectInput("datos", "Datos", data(package ="qcc")$results[,3])),nav_panel(title ="Gráfico de Control",card(plotOutput("grafico_control"),verbatimTextOutput("salida_control"),fill =FALSE)),nav_panel(title ="Análisis de la capacidad del proceso",plotOutput("grafico_capacidad")))server <-function(input, output, session) { gc <-reactive({req(input$fase1)data("pistonrings") diameter <-qcc.groups(pistonrings$diameter, pistonrings$sample)qcc(diameter[1:as.numeric(input$fase1),], type = input$tipo, plot =FALSE) }) output$grafico_control <-renderPlot({plot(gc()) }) output$salida_control <-renderText({paste(capture.output(summary(gc())), collapse ="\n") }) output$grafico_capacidad <-renderPlot({req(input$tipo =="xbar")process.capability(gc(), input$limites) })}shinyApp(ui, server)
Implentación real
Lectura de datos del proceso en tiempo real
Monitorizar proceso en fase II
Añadir análisis exploratorio
Añadir modelos
Mejorar interfaz
Complejidad de la app
Ejercicio
Modifica el código de la aplicación para hacer el análisis en fase 2 tomando el resto de datos como en el ejemplo de la ayuda de la función qcc()