Cartographie des formations en bioinformatique en France

L'origine du pro­jet :

Dans le cadre d'un pro­jet tuto­ré du mas­ter de Bio­in­for­ma­tique decarte Rennes, nous avons mis en place un pipe­line d'analyse des mails envoyés par la SFBI durant l'année 2014. Plu­sieurs modules ont été déve­lop­pés sous la forme de scripts Python, par un ou plu­sieurs étu­diants. Je me char­geais de déve­lop­per un module capable de géné­rer des cartes à par­tir des don­nées extraites des mails par d'autres modules. Au cours du déve­lop­pe­ment du module de car­to­gra­phie j'ai pu déve­lop­per un module capable à par­tir de fichiers tabu­lés de géné­rer deux cartes :

  • Une pre­mière affi­chant le nombre de labo­ra­toires dans nos ana­lyses par ville, en dis­tin­guant les labo­ra­toires publics des labo­ra­toires pri­vés.
  • Une autre carte affi­chant les thé­ma­tiques de recherche ville par ville.

Ayant pu déve­lop­per rapi­de­ment ce module, Oli­vier Dame­ron, l'un des deux tuteurs, m'a pro­po­sé de déve­lop­per un autre module capable de géné­rer une carte des for­ma­tions en bio­in­for­ma­tique, en France, en m'inspirant de ce que j'avais déve­lop­pé et en uti­li­sant les don­nées du site jebif​.fr.

La tech­nique :

Le script a été déve­lop­pé en Python 2.7, comme l'ensemble du pro­jet.

J'ai tes­té plu­sieurs biblio­thèques gra­tuites capables de géné­rer des cartes ; fina­le­ment mon choix s'est por­té sur Folium, un module gra­tuit capable de géné­rer des cartes inter­ac­tives en s'appuyant sur lea­flet, une librai­rie JavaS­cript. Folium s'est avé­ré très souple à l'usage car ne néces­si­tant pas d'autres modules. La carte géné­rée est sous la forme d'un fichier HTML qui contient toutes les don­nées affi­chées sans avoir besoin des fichiers sources.

carte.001
Le prin­ci­pal pro­blème est que le module a besoin des coor­don­nées GPS pour pla­cer un point. Or dans ce script comme dans le pro­jet, la seule indi­ca­tion géo­gra­phique à ma dis­po­si­tion est la ville. Pour pas­ser de l'un à l'autre, j'ai uti­li­sé une base de don­nées trou­vée sur le site Geo­Names, qui réper­to­rie les coor­don­nées GPS des villes de plus de 1000 habi­tants dans le monde. Un grand nombre d'autres don­nées sont four­nies mais ne m'ont pas été utiles ici. Un script Python m'a per­mis d'extraire les don­nées et de géné­rer un dic­tion­naire des coor­don­nées GPS. Pour cette carte j'ai uti­li­sé une ver­sion sim­pli­fiée en ne pre­nant en compte que la France. À par­tir du nom de la ville, le script a pu accé­der à la lati­tude et la lon­gi­tude. Dans le dic­tion­naire, le nom de la ville sert de clé pour retrou­ver les coor­don­nées. Le dic­tion­naire a été  enre­gis­tré dans un fichier via la librai­rie pickle et est dis­po­nible sur le gitHub sous le nom "DicoPosit.txt".

La source des don­nées pour le script est un fichier csv conte­nant le nom de la ville, le nom de la for­ma­tion et le lien html vers la page cor­res­pon­dante sur le site JeBiF​.fr. Ce fichier a été géné­ré à la main avec libreof­fice mais peut être géné­ré manuel­le­ment ou auto­ma­ti­que­ment. Le script a lu ce fichier et a ras­sem­blé les for­ma­tions par ville dans un dic­tion­naire puis par type de for­ma­tion dans des listes conte­nues dans le dic­tion­naire.

Ensuite le script a ité­ré ville par ville, et pour chaque ville sur chaque type de for­ma­tion. À chaque étape, le script a ajou­té un cercle de taille pro­por­tion­nelle au nombre de for­ma­tion, d'une cou­leur dif­fé­rente selon le type de for­ma­tion (Mas­ters en rouge, DUT en bleu et Licences en vert) et une éti­quette s'affichant en cli­quant sur le cercle. Le texte de l'étiquette est com­pa­tible avec les balises HTML, ce qui a per­mis ici de géné­rer des hyper­liens et de mettre les titres en gras.

for ville in listeVille:
ListeVilleLicence=[]
ListeVilleDUT=[]
ListeVilleMatser=[]
for formation in dicoFormationVille[ville]:
if "Master" in formation[0]:
ListeVilleMatser.append(formation)
elif "Licence" in formation[0]:
ListeVilleLicence.append(formation)
elif "DUT" in formation[0]:
ListeVilleMatser.append(formation)
tag="Matsers : <br>"

for master in ListeVilleMatser:
lien = creerLien(master[1], master[2])
tag=tag+lien + "<br>"
ajouterPoint(ville, "FR", 5000*len(ListeVilleMatser),tag,"#3ADF00")
Le principal inconvénient est la superposition des données. Si deux cercles sont sur la même ville, ils doivent avoir une taille différente. Pour pallier cela, le script crée un cercle de master plus gros s'il n'y a qu'un Master pour éviter qu'il ne soit recouvert par une autre formation. Si un cercle plus gros est posé sur un cercle de petite taille, alors le petit cercle ne peut pas être sélectionné. L'astuce a été de commencer par dessiner les cercles les plus gros ; ici ce sont systématiquement les Masters.

La carte sera disponible sur le site de JeBiF très prochainement pour illustrer l'annuaire des formations en cliquant sur ce lien.

-Le script est disponible à ce lien : https://github.com/jacklabelette/CartographieJeBif/tree/master

Merci aux nombreux relecteurs de cet article : Yoann M, Mathurin, Nico M, Nolwenn et Estel, merci aux administrateurs de ce blog de m'avoir permis de publier cet article et un grand merci à Olivier Dameron pour m'avoir conseillé de réaliser cette carte et de la publier.



Pour continuer la lecture :


Commentaires

Laisser un commentaire