Reportería dinámica y visualización con R

Cristian Benalcázar
02-04-2018

rusersgroup.com

Contenido

  1. Data products: Introducción y tipos.
  2. Investigación reproducible con Markdown.
  3. Aplicaciones web con shiny, shinydashboard y flexdashboard.
  4. Integración con bases de datos SQL.
  5. RStudio Server y Shiny Server.
  6. Limpieza, procesamiento, análisis y reportería automática (Windows y Linux).

    Bibliografía recomendada: Developing Data Products in R, Brian Caffo and Sean Kross

1. Data products:

Introducción y tipos.

Introducción

Productos de datos son el resultado de un análisis de datos.

  • Tabla
  • Gráfico
  • Informe
  • Presentación
  • Sitios web de análisis interactivo

Introducción

Ejemplo:

Un análisis de datos podría generar algoritmo que calcule un score para un grupo de posibles clientes.

Producto de datos:

  • Tabla con resultado
  • Reporte que muestre este resultado y su forma de cálculo
  • Aplicación que incorpore ese algoritmo en un sitio web para que los usuarios puedan introducir datos de nuevos clientes y obtengan su score.

Tipos

Estáticos

Productos que no permiten modificar tipo de visualización

  • Informe
  • Presentación
  • Tabla

Dinámicos

Productos que permiten modificar el tipo de visualización, además de cambiar el tipo de gráfico, permiten añadir nuevas variables, nuevos registros, realizar filtros, actualizar y consolidar los resultados, etc.

  • Aplicaciones de control, consulta, captura y visualización de información.

¿Por qué hacerlo con R?

Potencial y ventajas de R se incorporan directamente a nuestros productos de datos.

Facilidad, dentro de lo necesario para desarrollar productos de datos se incluye HTML, Javascript, D3, Web Services, etc. etc.

Con las herramientas que estudiaremos podemos generar productos finales o podemos usarlas como herramientas prototipo antes de construir un desarrollo más grande en dependencia de nuestras necesidades.

Ejemplos

Exportar tabla en excel - Formato personalizado

library(xlsx)
exportar <- function(datos, archivo){        
  wb <- createWorkbook(type="xlsx")
  # Estilos de celdas
  # Estilos de titulos y subtitulos
  titulo <- CellStyle(wb)+ Font(wb,  heightInPoints=16, isBold=TRUE)
  subtitulo <- CellStyle(wb) + Font(wb,  heightInPoints=12,
                                          isItalic=TRUE, isBold=FALSE)
  # Estilo de tablas
  filas <- CellStyle(wb) + Font(wb, isBold=TRUE)
  columnas <- CellStyle(wb) + Font(wb, isBold=TRUE) +
    Alignment(vertical="VERTICAL_CENTER",wrapText=TRUE, horizontal="ALIGN_CENTER") +
    Border(color="black", position=c("TOP", "BOTTOM"), 
           pen=c("BORDER_THICK", "BORDER_THICK"))+Fill(foregroundColor = "lightblue", pattern = "SOLID_FOREGROUND")
  # Crear una hoja
  sheet <- createSheet(wb, sheetName = "Información - R Users Group - Ecuador")
  # Funcion linea (agregar texto)
  linea<-function(sheet, rowIndex, title, titleStyle){
    rows <- createRow(sheet, rowIndex=rowIndex)
    sheetTitle <- createCell(rows, colIndex=1)
    setCellValue(sheetTitle[[1,1]], title)
    setCellStyle(sheetTitle[[1,1]], titleStyle)
  }
  # Agregamos titulos,  subtitulos, etc.
  linea(sheet, rowIndex=8, 
                title=paste("Fecha:", format(Sys.Date(), format="%Y/%m/%d")),
                titleStyle = subtitulo)
  linea(sheet, rowIndex=9, 
                title="Elaborado por: R Users Group - Ecuador",
                titleStyle = subtitulo)
  linea(sheet, rowIndex=11, 
                paste("Información de prueba"),
                titleStyle = titulo)
  # Tablas
  addDataFrame(datos,
               sheet, startRow=13, startColumn=1,
               colnamesStyle = columnas,
               rownamesStyle = filas,
               row.names = F)
  # Ancho de columnas
  setColumnWidth(sheet, colIndex=c(1:ncol(datos)), colWidth=15)
  # Imagen    Cambia la ruta por la que de tu imagen
  addPicture("C:/final5x5.png", sheet, scale=0.75, startRow = 1, startColumn = 1)
  # Guardar
  saveWorkbook(wb, archivo)
}
exportar(mtcars, "R Users Group - Ecuador - mtcars.xlsx")

Con lo cual vamos a obtener un archivo excel como este:

R Users Group - Ecuador

Gráficos estáticos

Gráficos dinámicos

Highcharter, rCharts, etc.

Gráficos dinámicos

Mapas dinámicos

R Presenter

Presentación actual

Slidify

Presentación BI - R Users Group - Ecuador

rusersgroup BI

Shinyapp

Dashboard reactivos - R Users Group - Ecuador

app demo reactivos rusersgroup

Githubpages

Web oficial - R Users Group - Ecuador

rusersgroup.com

2. Investigación reproducible con Markdown.

Investigación reproducible

Estudio, análisis completamente replicable -captura de datos, limpieza, procesamiento y resultados-.

Debe incluir descripción, objetivos, etc.

Ejemplos:

rpubs.com

¿Qué es Markdown?

Markdown es un lenguaje de marcado ligero que trata de conseguir la máxima legibilidad y facilidad de publicación tanto en su forma de entrada como de salida, inspirándose en muchas convenciones existentes para marcar mensajes de correo electrónico usando texto plano.

La clave del diseño de Markdown es la facilidad de su lectura que hace que el lenguaje sea fácilmente interpretado, sin lucir como si hubiera sido marcado con etiquetas o instrucciones de estilo, como RTF o HTML, los cuales tienen etiquetas que hacen mas difícil su lectura e interpretación.

Fundamental para la web semántica

Integración con R

Markdown ofrece integración con varios lenguajes de programación, dentro de estos R, la manera más sencilla de escribir un informe rápido, mezclando un poco de R, es usar rmarkdown, una variante de Markdown desarrollada por la gente de Rstudio.

R Markdown es una variante de Markdown basada en pandoc que tiene incrustados trozos de código R, que se utiliza con knitr para facilitar la creación de informes basados en web reproducibles.

install.packages("rmarkdown")
library(rmarkdown)

Integración con R

La sintaxis de Markdown tiene algunas mejoras;

  • Permite generar documentos HTML, PDF y MS Word, así como presentaciones Beamer, ioslides y Slidy.
  • Permite incluir ecuaciones de LaTeX sin procesar dentro de la reducción para la personalización avanzada de la salida de PDF.
  • Incluyendo soporte ampliado para tablas, listas de definiciones y bibliografías.
  • Permite incluir ganchos para personalizar la salida HTML y PDF (incluye CSS, encabezados y pies de página).
  • Permite definir fácilmente nuevos formatos para los requisitos de publicación personalizada.
  • Permite crear documentos interactivos de R Markdown utilizando Shiny.

Trozos de código Chunks

La clave para integración con R son los trozos de código, que se incluyen en cualquier parte del código rmarkdown, dentro del trozo se puede incluir cualquier función o paquete de R:

`` `{r}
    head(iris)
`` `
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Opciones de Chunks

R Users Group - Ecuador

Archivos .R .Rmd .md - Diferenciación

File >> New File >> R Markdown >> OK >> Knit

R Users Group - Ecuador

Sintaxis Markdown

This browser does not support PDFs. Please download the PDF to view it: Download PDF.

Sintaxis Markdown

Herramientas para usar Markdown

Stackedit.io

dillinger

Comprensión y práctica

Taller 1

Desarrollar un informe en rmarkdown

Desarrollar una presentación en rpresenter o slidify con el mismo contenido del informe

Publicarlos en rpubs y subir el código a github

3. Aplicaciones web con shiny, shinydashboard y flexdashboard.

¿Qué es Shiny?

Shiny es una paquete de R con el cual podemos crear aplicaciones web interactivas (apps) que permiten a los usuarios interactuar con sus datos sin tener que manipular el código.

No hace falta conocimiento de HTML o JavaScript, solo conocer R.

install.packages("shiny")
library(shiny)

La aplicación tiene 3 componentes:

UI : Interfaz de usuario, controla el diseño, entradas y salidas de la aplicación.
SERVER : Funciones, cálculos, resultados, etc., contiene las instrucciones necesarias para el funcionamiento de la aplicación.
GLOBAL : Data - puede omitirse y colocarse antes del resto de componentes.

APP : Combina las anteriores

Comprensión y práctica

Layout - Diseño

Las aplicaciones shiny tienen 2 layouts(tipos de diseño):

  • Sidebar Layout

    • Sidebar
    • Mainpanel
  • Grid Layout

    • Fluidrow
    • Fixedrow

Layout - Diseño

Fluidrow

Default 12

shinyUI(fluidPage(
  fluidRow(
    column(2,
      "sidebar"
    ),
    column(10,
      "main"
    )
  )
))

Layout - Diseño

Fluidrow

Personalizable

shinyUI(fluidPage(
  fluidRow(
    column(4,
      "4"
    ),
    column(4, offset = 4,
      "4 offset 4"
    )      
  ),
  fluidRow(
    column(3, offset = 3,
      "3 offset 3"
    ),
    column(3, offset = 3,
      "3 offset 3"
    )  
  )
))

Layout - Diseño

Fixedrow

fixedRow(
  column(9,
    "Level 1 column",
    fixedRow(
      column(6,
        "Level 2"
      ),
      column(3,
        "Level 2"
      )
    )
  )
)

Comprensión y práctica

Paneles, subpaneles, listas de navegación, etc.

Independientemente del layout podemos agregar paneles, subpaneles, entre otros.

Tabsets

shinyUI(fluidPage(
  ...

  titlePanel("Tabsets"),
  tabsetPanel(
        tabPanel("Plot", plotOutput("plot")), 
        tabPanel("Summary", verbatimTextOutput("summary")), 
        tabPanel("Table", tableOutput("table"))
        )
    )
)

Paneles, subpaneles, listas de navegación, etc.

Navlists

shinyUI(fluidPage(
  ...

  navlistPanel(
    "Header A",
    tabPanel("Component 1"),
    tabPanel("Component 2"),
    "Header B",
    tabPanel("Component 3"),
    tabPanel("Component 4"),
    "-----",
    tabPanel("Component 5")
  )
))

Paneles, subpaneles, listas de navegación, etc.

NavbarPages

shinyUI(navbarPage("My Application",
  tabPanel("Component 1"),
  tabPanel("Component 2"),
  navbarMenu("More",
    tabPanel("Sub-Component A"),
    tabPanel("Sub-Component B"))
))

Comprensión y práctica

Funcionamiento: Entradas y salidas

  • Entrada ui >> input

    sliderInput(“bins”, “Number of bins:”, min = 1, max = 50, value = 30)

input$bins

  • Procesimento server >> output

    output$distPlot <- renderPlot({ x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = 'darkgray', border = 'white') })

output$distPlot

  • Visualización ui >> input & output

    plotOutput(“distPlot”)

Comprensión y práctica

Tipos de entradas

Tipos de salidas

Tipos de render y salidas

Botones e introducción a reactivos

actionButton(“boton”, “Buscar”)

actionLink(“link”, “Enlace”)

downloadButton('descarga', 'Descargar')

Demostración

Resumen shiny

This browser does not support PDFs. Please download the PDF to view it: Download PDF.

Ejemplos

Comprensión y práctica

runExample("01_hello")

“01_hello”
“02_text”
“03_reactivity”
“04_mpg”
“05_sliders”
“06_tabsets”
“07_widgets”
“08_html”
“09_upload”
“10_download”
“11_timer”

Shiny

Taller 2

Desarrollar un aplicación en shiny y publicarla en shinyapps.io

Shinydashboard

install.packages("shinydashboard")

## app.R ##
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody()
)
server <- function(input, output) { }
shinyApp(ui, server)

Shinydashboard

Sidebar content

dashboardSidebar(
  sidebarMenu(
    menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
    menuItem("Widgets", tabName = "widgets", icon = icon("th"))
  )
)

Body content

dashboardBody(
  tabItems(
    # First tab content
    tabItem(tabName = "dashboard",
      fluidRow(
        box(plotOutput("plot1", height = 250)),

        box(
          title = "Controls",
          sliderInput("slider", "Number of observations:", 1, 100, 50)
        )
      )
    ),

    # Second tab content
    tabItem(tabName = "widgets",
      h2("Widgets tab content")
    )
  )
)

Shinydashboard

Flexdashboard

install.packages("flexdashboard")

Flexydashboard

4. Reactivos y condicionales

Reactividad

#### ui

    selectInput("variable1", "Selecciones la variable a visualizar:", choices = c("Cooperativa","Marca", "Sector")
                                         )
#### server

    resumen <- reactive({
    data <- data %>% group_by(data[,grep(input$variable1, colnames(data))]) %>% summarize(N=n())
    data <- as.data.frame(data)
    colnames(data) <- c("variable", "N")
    data
  })

  output$graf <- renderHighchart({
    hchart(resumen(), "pie", hcaes(x=variable , y = N))
  })

  output$tab <- renderTable({
    resumen()
  })

acctionbutton

ui

actionButton("gen_tabla", "Generar resumen SIE NO SIE")

server

tabla <- eventReactive(input$gen_tabla, {
        funcion_tabla(buscado())
})

Paneles condicionales

#### ui

ui <- fluidPage(
  tabsetPanel(
    tabPanel("Evolución",
             fluidRow(column(2,
                             wellPanel(
                               conditionalPanel(condition = "input.conditionedPanels_matriz == 'Evolución' | input.conditionedPanels_matriz == 'Seguimiento'",
                                                ................
                                                )),
                      column(10,
                             navbarPage("",collapsible=T,
                                        tabPanel("Ranking",
                                                ................
                                        ),
                                        tabPanel("Perfil",
                                            selectInput("grupo","Selección de grupo", choices=c("Público", "Privado")),
                                            conditionalPanel(condition="input.grupo=='Privado'",
                                            ......................
                                            ),
                                            conditionalPanel(condition="input.grupo=='Público'",
                                            ......................
                                            )
                                        ),id="conditionedPanels_matriz"
                             )
                        )
                    )
             )
    ),
    tabPanel("Consolidado",
    .....................
    ),
    tabPanel("Metodología",
    .....................
    ),
    tabPanel("Twitter",
             navbarPage("",collapsible=T,
                        tabPanel("Buscar tema",
                                 ..............
                        ),
                        tabPanel("Buscar tweets de usuario",
                                 ..............
                        )
             )
    ),id="conditionedPanels_matriz"
  )
)

5. Integración con bases de datos SQL

Integración con bases de datos SQL

R Permite integración con bases de datos relacionales Postgres, MySql, Oracle, etc.

En dependencia del tipo de base podemos utilizar un determinado paquuete o función.

Postgres

library(sqldf)

    options(sqldf.RPostgreSQL.user ="user", 
            sqldf.RPostgreSQL.password ="pass",
            sqldf.RPostgreSQL.dbname ="base",
            sqldf.RPostgreSQL.host ="ip", 
            sqldf.RPostgreSQL.port =5432)

            sqldf("select * from tabla_x")

Integración con bases de datos SQL

library(RPostgreSQL)

db  <- dbConnect(PostgreSQL(), dbname = "base", host = "localhost", port = 5432, user = "postgres", password = "pass")

query <- "select * from tabla_x"
data  <- dbGetQuery(db, query)
dbDisconnect(db)
data

Integración con bases de datos SQL

Oracle

drv <- JDBC(driverClass="oracle.jdbc.driver.OracleDriver",
            classPath="/ojdbc6.jar",
            identifier.quote="`")
conn <- dbConnect(drv=drv,
                 url="jdbc:oracle:thin:@//192.168.1.132:1521/ORAI",
                 user="user",
                 password="pass")

dbGetQuery(conn, "select * from tabla_x")

5. RStudio Server y Shiny Server

RStudio Server

RStudio Server

Demostración

Shiny Server

Shiny Server

Demostración

6. Limpieza, procesamiento, análisis y reportería automática (Windows y Linux).

Tareas automáticas

Ejecución programada de scripts R.

Rscript.exe --vanilla --slave script.r

Windows - batch y tareas automáticas

"C:\Program Files\R\R-3.4.1\bin\Rscript.exe"     --vanilla --slave "C:\automaticos\script.r"

-vanilla (no save, no restore, quick startup) and –slave (makes R run quiet).

Linux - crontab

  30 20 * * * R CMD BATCH /automaticos/script.r

Los asteriscos de izquierda a derecha representan:

Minutos: de 0 a 59.

Horas: de 0 a 23.

Día del mes: de 1 a 31.

Mes: de 1 a 12.

Día de la semana: de 0 a 6, siendo 0 el domingo.

Si se deja un asterisco, quiere decir “cada” (minuto, hora, día de mes, mes o día de la semana)