R, l’Open Source, les RUG et les meetups

L’histoire de notre logiciel favori est fortement ancrée dans celle du logiciel libre et de l’open source. Il s’agit d’ailleurs d’un argument qui en fait l’une de ses forces, et qui compte parmi les motivations d’adoption par de nombreux data lovers. Une philosophie du partage et du collectif qui a traversé les décennies, pour aujourd’hui se poursuivre dans les nombreux R User Groups (ou RUG) à travers le monde… et notamment sur Meetup !

Retrouvez l’histoire de R vue sous l’angle de l’open source et du collectif. Un billet que nous aurions pu appeler « des laboratoires Bells aux groupes meetups ».

R : une petite histoire de l’Open source

Depuis ses premiers jours, R a toujours été un projet open source, distribué sous licence GNU GPL. Licence encadrant le projet GNU de Richard Stallman (notamment fondateur de la Free Software Foundation), la GNU General Public License offre les droits suivants à un logiciel : droit d’exécution, droit d’accès au code source, et droit de distribution des copies. C’est aussi une licence qui impose l’obligation de faire bénéficier la communauté des versions modifiées, si ces dernières sont utilisées publiquement. Pour plus d’informations sur la question, n’hésitez pas à vous référez à la documentation GNU.

the gnu fatherUne philosophie du libre qui ne s’est pas essoufflée avec l’âge : aujourd’hui, alors que R a fêté ses 23 bougies cette année, le projet est soutenu par The R Foundation for Statistical Computing : une association à but non lucratif basée en Autriche, composée de membres actifs travaillant bénévolement sur le projet. Distribué dans le monde entier, R est accessible via un réseau de serveurs appelés le CRAN, regroupant 150 sites dans 48 régions du monde (à la date d’écriture de ce billet). Ces points d’entrées disposent de versions identiques et mises à jour de R, ainsi que des packages et de toute la documentation.

20 ans, l’âge de raison, et la philosophie du libre n’a pas quitté la communauté R. Avec un code source disponible gratuitement en ligne, le logiciel est développé et maintenu par un noyau de bénévoles, mais aussi par une communauté immense de développeurs à travers le monde, qui peuvent contribuer à l’amélioration et à l’extension du logiciel. Comment ? À la fois en pointant les bugs, mais aussi en créant leurs propres packages, que tout un chacun peut soumettre pour diffusion sur le CRAN.

C’est un fait, la communauté R se développe en ligne : par le partage de code (sur le CRAN ou encore sur Github), par des ouvrages disponibles librement (merci bookdown), ou encore par une forte communauté de bloggers. Mais le réseau R n’est pas qu’une belle histoire des internets : c’est aussi un vaste réseau de groupes de data nerds, qui se rencontrent régulièrement pour apprendre, partager, découvrir le monde meRveilleux de notre logiciel fétiche.

Un réseau que l’on nomme RUG, pour R User Groups, et qui connaît un fort développement grâce sur Meetup.

Aujourd’hui : R et les meetups

Difficile de quantifier de manière exhaustive l’étendue du network RUG… Mais puisqu’il nous faut un point d’entrée, faisons un tour du côté de Meetup, célèbre réseau social d’organisation d’événements.

Pour partir sur de bonnes bases, commençons par une requête sur l’api, afin d’obtenir un data.frame des groupes meetups listés dans le topic « r-project-for-statistical-computing ».

Note : ci-dessous, nous avons choisi de masquer la fin de l’url, qui contient une clé API personnelle. Mais vous pouvez obtenir le votre sur la console de l’API Meetup.

library(magrittr)
library(httr)
library(rjson)

url <- "https://api.meetup.com/2/groups?offset=0&format=json&topic=r-project-for-statistical-computing&photo-host=public&page=20&radius=25.0&fields=&order=id&desc=false&sig_id=XXXX" %>%
  GET()
  if (url$status_code == 200){
  meetup <- rawToChar(url$content) %>%
    fromJSON()
  meetupdata <- meetup$results
  if(!is.null(meetup$meta$`next`)){
    repeat{
      url <- (meetup$meta$`next`) %>%
        GET()
      meetup <- rawToChar(url$content) %>%
        fromJSON()
      meetupdata <- c(meetupdata, meetup$results)
      if(is.null(meetup$meta$`next`)){
        break
      }
    }
  }
}


meetupframe <- lapply(meetupdata, function(obj){
  data.frame(country = obj$country,
             city = obj$city,
             name = obj$name,
             who = obj$who,
             urlname = obj$urlname,
             created = as.POSIXct(obj$created/ 1000.0, origin="1970-01-01"),
             link = obj$link, 
             rating = obj$rating,
             join_mode = obj$join_mode,
             organizer = length(obj$organizer), 
             member = obj$member,
             lat = obj$lat, 
             long = obj$lon)
}) %>% do.call(rbind, .) %>% 
  unique()

Nous voilà donc avec un jeu de données qui contient les informations des 377 meetups référencés sur le topic « r-project-for-statistical-computing » (vous pouvez d’ailleurs le télécharger sur notre GitHub). Au total, 326 villes dans 239 pays sont représentées, avec une moyenne de 637 membres par groupe.

Répartition géographique des Meetups

library(ggplot2)
tkrtheme <- theme(plot.title=element_text(margin=margin(0,0,20,0), size=20, hjust = 0.5),
        plot.subtitle = element_text(margin=margin(0,0,20,0), size = 15, hjust = 0.5),
        panel.background = element_rect(fill = "white"), 
        panel.grid.major = element_line(colour = "grey"), 
        plot.margin = margin(20,50,20,50)) 
subtit <- paste0("Données extraites de l'API Meetup le ", format(Sys.Date(), "%d/%m/%Y"))
capt <- "www.thinkr.fr"

pays <- table(meetupframe$country) %>% 
  as.data.frame() %>%
  dplyr::arrange(desc(Freq))
ggplot(pays[1:10,], aes(reorder(Var1, Freq), Freq)) + 
  geom_bar(stat = "identity", fill = "#E3693E") +
  geom_text(aes(label= as.character(Freq)), check_overlap = TRUE, size = 4) + 
  coord_flip() + 
  xlab("Pays") + 
  ylab("Volume") + 
  labs(title = "Pays accueillant le plus de Meetups R",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

Meetup R par pays

Au total, 139 pays sont recensés dans notre jeu de données, avec une belle part faite aux États-Unis, qui accueillent 158 Meetups. La France, quant à elle, reçoit 13 meetups.

Quant aux villes les plus représentées, nous retrouvons :

villes <- table(meetupframe$city) %>% 
  as.data.frame() %>%
  dplyr::arrange(desc(Freq))
ggplot(villes[1:15,], aes(reorder(Var1, Freq), Freq)) + 
  geom_bar(stat = "identity", fill = "#E3693E") +
  geom_text(aes(label= as.character(Freq)), check_overlap = TRUE, size = 4) + 
  coord_flip() + 
  xlab("Villes") + 
  ylab("Volume") + 
  labs(title = "Villes accueillant le plus de Meetups R",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

Ville accueillant les meetup R

Eh oui… Paris est en 4e place, avec 7 meetups ! Cocorico 😉

La popularité des meetups R est elle croissante ?

Intéressons-nous un instant au volume de création par an, sur ces 8 dernières années :

meetupframe$created_year <- format(meetupframe$created, "%Y")
ggplot(meetupframe, aes(created_year)) + 
  geom_bar(fill = "#E3693E") +
  xlab("Année de création") + 
  ylab("Volume") + 
  labs(title = "Nombre de création de Meetups R dans l'année",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

Création de meetups R par an

Ce qui donne, en fréquence cumulée croissante :

ggplot(meetupframe, aes(as.numeric(created_year))) + 
  stat_ecdf(col = "#E3693E", size = 2, geom = "line") +
  xlab("Année de création") + 
  ylab("") + 
  labs(title = "Villes accueillant le plus de Meetups R",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

Fréquence cumulée croissante

Cela ne fait pas de doute, la popularité des meetups R est en plein boom depuis 2013 !

Comment se répartissent les membres ?

ggplot(meetupframe, aes(member)) + 
  geom_histogram(fill = "#E5673C", binwidth = 100) +
  geom_vline(xintercept = median(meetupframe$member), colour="black") +
  xlab("") + 
  ylab("") + 
  labs(title = "Nombre de membres par Meetup",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

Membres par groupes

Et donc… quel est le meetup le plus « peuplé » ?

ggplot(dplyr::arrange(meetupframe, desc(member))[1:15,], aes(reorder(name,member), member, fill = country)) + 
  geom_bar(stat = "identity") +
  scale_fill_manual(values = c("#E5673C", "#15B7D6", "#A9A9AB")) +
  coord_flip() + 
  geom_text(aes(label= as.character(member)), check_overlap = TRUE, size = 4) +
  xlab("") + 
  ylab("") + 
  labs(title = "Meetups comptant le plus de membres",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

Groupes les plus peuplés

Presque sans surprise, 13 des Meetups les plus peuplés sont sur le continent américain… avec… Woaw… 7500 membres pour le meetup de New York ! Il faut avouer que ce RUG existe depuis 2009, ça aide ! Mais… le nombre de membres dépend-il de la date de création ?

ggplot(meetupframe, aes(created,member)) + 
  geom_point(col = "#E16538", size = 2) +
  geom_smooth() +
  xlab("") + 
  ylab("") + 
  labs(title = "Nombre de membres en fonction de la date de création",
       subtitle = subtit,
       caption = capt) + 
  tkrtheme

nombre de membres en fonction de la date de création

Ici, on constate que le volume de membres présents dans les RUG est bel et bien lié à l’anciennenté : le groupe le plus fréquenté est aussi le deuxième plus ancien, et tous les groupes de plus de 4000 membres ont été créés avant 2014.

Carte du monde des groupes Meetup R

Et pour finir… visualisons ces groupes sur une carte du monde !

library(ggalt)
world <- map_data("world")
ggplot() + 
  geom_map(data=world, map=world, aes(x=long, y=lat, map_id=region), fill="#ABABAD") +
  geom_point(data = meetupframe, aes(x = long, y = lat), col = "#E16538", size = 2) +
  labs(title = "Localisation des groupes Meetup R à travers le monde",
       subtitle = paste0("Données extraites de l'API Meetup le ", format(Sys.Date(), "%d/%m/%Y")), 
       caption = "www.thinkr.fr") + 
    theme(plot.title=element_text(margin=margin(0,0,20,0), size=20, hjust = 0.5),
        plot.subtitle = element_text(margin=margin(0,0,20,0), size = 15, hjust = 0.5),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.x=element_blank(), 
        axis.title.y=element_blank(), 
        panel.background= element_blank()) 

Meetups dans le monde

Tout ce data mining vous a donné envie de participer à un Meetup R ? Ça tombe bien : il y en a sûrement un près de chez vous ! D’ailleurs, n’hésitez pas : rejoignez-nous sur Paris R-Addicts… Nos prochains meetups risquent de vous plaire 😉 Et si vous êtes un peu loin, rendez-vous aussi sur Twitter : vous pourrez suivre les directs, et retrouvez toutes nos actualités.


À propos de l'auteur

Colin Fay

Colin Fay

Data scientist & R Hacker


Commentaires


À lire également