XinCTO/dataviz avec R et shiny

Ecrit le 3 Nov 2018

dataviz avec R et shiny

🇬🇧

Dans les sujets autour de la gestion de la donnĂ©e on trouve bien entendu tous ceux en rapport avec le traitement, le stockage des donnĂ©es dans des entrepĂŽts mais ce qui m’intĂ©resse ici c’est la prĂ©sentation ou la dataviz.

Introduction

On peut faire des choses compliquĂ©es avec des outils spĂ©cialisĂ©s, des solutions du marchĂ©, tenter de rapprocher traitement et prĂ©sentation ou sĂ©parer le premier du second. On peut faire Ă©galement des choses assez simples en matiĂšre de prĂ©sentation, sur le web, des rĂ©sultats de ses travaux de traitement. Ce qui est plus sympa encore c’est de donner un peu la main Ă  l’utilisateur en lui permettant d’explorer les donnĂ©es prĂ©sentĂ©es, via des filtres, des facettes et des reprĂ©sentations adaptĂ©es Ă  l’exploration.

Parmi les solutions s’offrant Ă  nous, je vous prĂ©sente ici la solution adossĂ©e au langage R et qui permet de monter des petits sites web simples : R shiny. Vous trouverez plein de documentation Ă  ce sujet et notamment sur le site de l’éditeur des jolies reprĂ©sentations. Je vous propose en quelques articles de vous prĂ©senter comment cela fonctionne, ce que l’on peut faire simplement avec cette solution et comment l’intĂ©grer dans un Ă©cosystĂšme un peu plus vaste, notamment dans des conteneurs pour l’hĂ©bergement et avec des libraires graphiques plus Ă©voluĂ©es pour disposer de prĂ©sentations plus agrĂ©ables.

On dĂ©marre dans ce billet par les principes de base, l’outillage pour travailler, construire et tester ses premiĂšres dataviz.

Exemple présenté

PlutĂŽt que de partir sur une rĂ©alisation dĂ©jĂ  existante, je vous propose une approche pas Ă  pas Ă  partir de R, de donnĂ©es dĂ©jĂ  prĂ©sentes en standard dans la solution et d’outils disponibles sans investissement.

Si vous souhaitez voir directement le rĂ©sultat final, je vous invite Ă  consulter la premiĂšre dataviz directement sur un site web montĂ© Ă  cet effet et dĂ©diĂ© Ă  la qualitĂ© de l’air : airqual 1. Vous trouverez Ă©galement les sources sur mon git.

Outillage

Pour rĂ©aliser cette premiĂšre dataviz, il n’est nĂ©cessaire que de disposer sur son poste de travail d’une installation de R et de Rstudio, Ă  adapter en fonction de votre plate-forme. RStudio dispose d’un mode de construction d’une dataviz directement lors de la crĂ©ation d’un nouveau projet : Shiny web application.

Pour dĂ©marrer, je vous conseille de n’utiliser qu’un seul fichier (nommĂ© app.R), c’est plus simple Ă  gĂ©rer, mĂȘme si moins lisible.

Si vous avez cloné les fichiers depuis le repo git, vous pouvez directement ouvrir le répertoire 01-airqual dans RStudio, le fichier app.R est autoporteur.

A partir du fichier app.R dans l’éditeur, vous pouvez directement lancer l’application avec le bouton Run App en haut de la fenĂȘtre, ce sera plus simple pour suivre.

Principe de fonctionnement

La construction

Une application shiny est dĂ©coupĂ©e en deux modules principaux : l’interface utilisateur et le serveur de calcul. La partie UI permet de dĂ©crire l’interface web qui sera prĂ©sentĂ©e Ă  l’utilisateur, d’y positionner les objets (input et output) au sein de composants d’interface (layout).

Le langage est du R tout simplement, si vous ne connaissez pas dĂ©jĂ , c’est l’occasion d’apprendre Ă  faire quelques manipulations de donnĂ©es simplement, vous pouvez Ă  partir de maintenant oublier les opĂ©rations manuelles avec votre tableur prĂ©fĂ©rĂ©. Ce n’est pas la seule solution simple pour manipuler de la donnĂ©e via un langage de programmation assez simple, on trouve Ă©galement beaucoup de choses disponibles dans la galaxie python.

Ce que va présenter notre dataviz est trÚs simpliste :

  • une zone de filtrage sur la base du mois de mesure
  • un affichage des paires de valeurs sur l’ensemble des donnĂ©es Ă  l’exception du jour de mesure
  • un tableau avec les premiĂšres valeurs

Le but étant de montrer les 2 modules (input et output), leur interaction et la simplicité de présentation sur des objets simples.

Le traitement

Pour cet exemple trivial j’utilise les donnĂ©es dans le data set airquality qui reprĂ©sentent des mesures effectuĂ©es Ă  New York en 1973 de quelques valeurs comme l’ozone, la vitesse du vent, la tempĂ©rature et l’ensoleillement. Cet Ă©chantillon est composĂ© de 153 lignes de 6 donnĂ©es. Ce n’est pas lĂ  que R est le plus Ă©vident, mais qui peut le plus


Si vous ne connaissez pas déjà R, voici les quelques outils nécessaires à la compréhension de la partie serveur du code.

Les données

Dans l’interprĂ©teur R du RStudio :

1> d <- airquality
2> head(d)
3  Ozone Solar.R Wind Temp Month Day
41    41     190  7.4   67     5   1
52    36     118  8.0   72     5   2
63    12     149 12.6   74     5   3
74    18     313 11.5   62     5   4
85    NA      NA 14.3   56     5   5
96    28      NA 14.9   66     5   6
  • ligne 1 : chargement des donnĂ©es du data set airquality dans la variable d, on pourrait directement utiliser airquality, mais c’est bien plus long Ă  manipuler
  • ligne 2 : on affiche les premiĂšres lignes du data set

Les donnĂ©es seront affichĂ©es sur la base du filtrage sur les mois proposĂ© dans la partie input de notre outil de dataviz. Le filtrage s’effectue sur la colonne proposant le mois et sur la base des 2 bornes du filtre (a et b ici) :

d <- d[d$Month >= a & d$Month <= b, ]

Le data set est à 2 dimensions, ici on filtre sur le contenu de la colonne Month pour l’ensemble des lignes en appliquant le filtre.

Le tableau

Le tableau des donnĂ©es sera affichĂ© en l’état, on ne prendra en revanche que les premiĂšres donnĂ©es (avec head).

Le graphique

Pour le graphique, on filtre les données pour supprimer les jours puis on affiche. Les jours de mesure étant positionnés dans la derniÚre colonne, on la supprime simplement.

d <- airquality[,1:5]

L’affichage du comparateur des paires de donnĂ©es est basĂ© sur l’outil pairs qui construit automatiquement une matrice de graphes de dispersion, ceci permet rapidement de constater (ou pas) des corrĂ©lations entre des variables de notre ensemble de donnĂ©es.

> pairs(d,
        panel = panel.smooth,
        pch=".", lwd = 2,
        col = "blue",
        main = "airquality data")

Le code

L’interface utilisateur

Puisque l’on souhaite une interface proposant une zone de manipulation des donnĂ©es et une zone d’affichage, le modĂšle simple est celui proposĂ© par sidebarLayout avec une panneau pour les inputs et un autre pour la partie principale. Le nom des objets input et output est important car il servira de clĂ© Ă  la partie serveur.

 1sidebarLayout(
 2      sidebarPanel(
 3         sliderInput("month",
 4                     "Month:",
 5                     min = 5,
 6                     max = 9,
 7                     value = c(5,9))
 8      ),
 9
10      # Show a plot of the generated distribution
11      mainPanel(
12         plotOutput("pairs"),
13         tableOutput("values")
14      )
15   )
  • ligne 3 : mise en place du sĂ©lectionneur de mois, ici, on connait les donnĂ©es on peut donc positionner les bornes et les valeurs par dĂ©faut : 5 et 9. Le slider est nommĂ© month
  • ligne 11 : le panneau principal propose les 2 reprĂ©sentations : le graphique nommĂ© pairs et la zone de tableau nommĂ©e values.

Les deux zones de reprĂ©sentation utilisent des objets output dĂ©diĂ©s Ă  l’usage souhaitĂ©, on trouvera en complĂ©ment de quoi afficher du html, du texte brut, un bouton pour tĂ©lĂ©charger des donnĂ©es.

Le serveur

La partie serveur sera utilisĂ©e lorsque des donnĂ©es sont chargĂ©es ou modifiĂ©es par le biais d’une zone input. Seul le code utilisant la partie input modifiĂ©e sera exĂ©cutĂ©, c’est donc plutĂŽt frugal et bien pensĂ©.

Dans la partie serveur on trouve de quoi peupler les 2 zones output dĂ©crites dans l’UI, chacune des fonctions retournant le contenu Ă  afficher, dans notre cas une image et des donnĂ©es pour un tableau.

Affichage de la partie graphique dans la zone pairs de l’output, le filtrage s’effectue en rĂ©cupĂ©rant les valeurs min et max du slider (dans input) :

   output$pairs <- renderPlot({
     d <- airquality[,1:5]
     d <- d[d$Month >= input$month[1] & d$Month <= input$month[2], ]
     pairs(d, panel = panel.smooth,
           pch=".", lwd = 2, col = "blue",
           main = "airquality data")
   })

Affichage de la partie tableau (values) avec les 10 premiĂšres lignes de notre data set :

   output$values <- renderTable({
     d <- airquality
     d <- d[d$Month >= input$month[1] & d$Month <= input$month[2], ]

     head(d[order(d$Month, d$Day),], n=10)
   })

Conclusion

VoilĂ  en quelques lignes de code R de quoi faire une petite interface graphique simple, disponible sur votre intranet par exemple et permettant de prĂ©senter et de manipuler les donnĂ©es. Ce qu’il faut garder Ă  l’esprit est que l’on peut donc simplement combiner la puissance du langage R dans le domaine de la manipulation des donnĂ©es et un procĂ©dĂ© trĂšs simple de reprĂ©sentation. Nous verrons dans un prochain billet comment hĂ©berger ceci pour son intranet ou le rendre disponible au plus grand nombre.

Photo from rawpixel


  1. l’hĂ©bergement sur shinyapps dĂ©pend de l’usage et des crĂ©dits sur le compte, j’utilise la version free et ais positionnĂ© les paramĂštres au plus bas (temps de mise en veille et dimensionnement) â†©ïžŽ