{"word_count": 1240, "character_count": 23720}
Allez, quelques codes R pour s'amuser un peu... Je me suis inspiré du projet de Marine pour la formation Data Science pour l'Actuariat. L'idée était de scraper un site qui permet de prendre un rendez-vous chez un médecin, pour voir où se trouvent les médecins (sur Paris) et de voir leurs prix. Histoire de donner un avant goût, voilà les graphiques qu'on cherche à produirePour ca, comme toujours, il faut pas mal de packages&#62; pkge=c('scrapeR', 'XML', 'RCurl', 'RJSONIO', 'ggplot2', 'ggmap', 'xlsx', 'corrgram', 'geojsonio','devtools', 'gridExtra', 'stringr', 'reshape', 'geojsonio')&#62; lapply(pkge, require, character.only = TRUE)Pour scraper, à partir d'une adresse, le code est le suivant&#62; scrapping_webpage=function (URL){out &#60;- tryCatch(expr= {url &#60;- paste0("https://",as.character(URL))webpage &#60;- getURL(url, ssl.verifypeer = FALSE)webpage &#60;- readLines(tc &#60;- textConnection(webpage),ok=TRUE); close(tc)pagetree &#60;- htmlTreeParse(webpage, useInternalNodes = TRUE, encoding='UTF-8')cleantxt &#60;- xpathApply(pagetree, "//body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]", xmlValue)cleantxt_1 &#60;- gsub('\n|\t|\r|&#62;more|  ', '', cleantxt)resulting_text &#60;- paste(as.character(cleantxt_1),collapse =' ')return(resulting_text)},error=function(cond) {return(NA)})return(out)}Histoire d'éviter les problèmes d'encodage, on va supprimer tous les caractères particuliers (les accents)  pour faire plus simple&#62; change_characters &#60;- function(vect){vect &#60;- gsub('ö','o',vect)vect &#60;- gsub('ä','a',vect)vect &#60;- gsub('ß','b',vect)vect &#60;- gsub('ü','u',vect)vect &#60;- gsub('Ö','O',vect)vect &#60;- gsub('é','e',vect)vect &#60;- gsub('è','e',vect)vect &#60;- gsub('â','a',vect)vect &#60;- gsub('ë','e',vect)vect &#60;- gsub('ê','e',vect)vect &#60;- gsub('°',' ',vect)vect &#60;- gsub('î','i',vect)vect &#60;- gsub('à','a',vect)vect &#60;- gsub('í','i',vect)vect &#60;- gsub('á','a',vect)vect &#60;- gsub('ý','y',vect)vect &#60;- gsub('s','s',vect)vect &#60;- gsub('z','z',vect)vect &#60;- gsub('S','S',vect)vect &#60;- gsub('Z','Z',vect)vect &#60;- gsub('ó','o',vect)vect &#60;- gsub('Ú','U',vect)vect &#60;- gsub('ú','u',vect)vect &#60;- gsub('Ü','U',vect)vect &#60;- gsub('Ä','A',vect)vect &#60;- gsub('æ','a',vect)vect &#60;- gsub('ø','o',vect)vect &#60;- gsub('å','a',vect)vect &#60;- gsub('Ø','o',vect)vect &#60;- gsub('Æ','A',vect)vect &#60;- gsub('Å','A',vect)vect &#60;- gsub('õ','o',vect)vect &#60;- gsub('Õ','O',vect)vect &#60;- gsub('ñ','n',vect)vect &#60;- gsub('º',' ',vect)vect &#60;- gsub('Á','A',vect)vect &#60;- gsub('Í','I',vect)vect &#60;- gsub('ª',' ',vect)vect &#60;- gsub('Ñ','N',vect)vect &#60;- gsub('´','',vect)vect &#60;- gsub('Ó','O',vect)vect &#60;- gsub('ï','i',vect)vect &#60;- gsub('É','E',vect)vect &#60;- gsub('ç','c',vect)vect &#60;- gsub('ô','o',vect)vect &#60;- gsub('û','u',vect)vect &#60;- gsub('ð','d',vect)vect &#60;- gsub('ì','i',vect)vect &#60;- gsub('þ','p',vect)vect &#60;- gsub('Ð','D',vect)vect &#60;- gsub('"',' ',vect)vect &#60;- gsub('ã','a',vect)vect &#60;- gsub('Ç','C',vect)vect &#60;- gsub('Ã','A',vect)vect &#60;- gsub(' ','+',vect)vect &#60;- gsub("\\(",'+',vect)vect &#60;- gsub(")",'+',vect)return(vect)}(c'est un peu long mais c'est bien pratique). Ensuite, on va balayer toutes les pages qui pourraient nous intéresser (enfin, juste les 200 premières). Pour éviter tout soucis légal, on va masquer le nom du site, et prendre une syntaxe générique pour l'adresse url&#62; nombre_page &#60;- 200Liste_sites_a_scrapper&#60;- as.data.frame(1:nombre_page)for (i in 1:nombre_page) {Liste_sites_a_scrapper[i,1] = paste0("www.xxxxxxxxxxx.fr/medecin-generaliste/paris?page=",i,"")Liste_sites_a_scrapper[1,1] = paste0("www.xxxxxxxxxxx.fr/medecin-generaliste/paris")} &#62; Donnees_doc &#60;- mapply(scrapping_webpage,URL=Liste_sites_a_scrapper[,1])Comme il y a un peu trop d'info, on fait un peu le ménage (pour récupérer juste le nom du médecin)&#62; medecin &#60;- list()&#62; for (i in 1:length(Donnees_doc)) {medecin[[i]]  &#60;- strsplit(Donnees_doc[[i]], "Dr | Prendre | Mme | Mr ")}On va ensuite extraire quelques infos dans les pages&#62; Donnees_medecin=c()&#62; for (i in 1:length(medecin)) {for (j in 1:21) {if (is.na(medecin[[i]][[1]][j])){}else{if (substring(medecin[[i]][[1]][j],1,4)=="Vous"||substring(medecin[[i]][[1]][j],1,4)=="rend"){}else if ( length(unlist(strsplit(medecin[[i]][[1]][j]," ")))&#62;100){}else{Donnees_medecin=cbind(Donnees_medecin,medecin[[i]][[1]][j])}}}}On met ensuite tout dans une base de données, qui est le format le plus usuel pour faire des statistiques et des graphiques, ensuite,&#62; n=length(Donnees_medecin)&#62; Data_medecin_paris = data.frame(nom=c(1:n)*0,adresse=c(1:n)*0,secteur=c(1:n)*0,type=c(1:n)*0,tarif=c(1:n)*0,ensemble_donnee=c(1:n)*0)&#62; for (i in 1:length(Donnees_medecin)) {Data_medecin_paris$ensemble_donnee[i]=unlist(Donnees_medecin[i])Donnees_medecin[i]=str_replace(Donnees_medecin[i]," Cardiologue"," Médecin Cardiologue")Donnees_medecin[i]=str_replace(Donnees_medecin[i]," acupuncteur"," Médecin Acupuncteur")Donnees_medecin[i]=str_replace(Donnees_medecin[i]," Acupuncteur"," Médecin Acupuncteur")Donnees_medecin[i]=str_replace(Donnees_medecin[i]," homeopathe"," Médecin homeopathe")Donnees_medecin[i]=str_replace(Donnees_medecin[i]," Homéopathe"," Médecin Homéopathe")Donnees_medecin[i]=str_replace(Donnees_medecin[i]," Médecin du sport"," Médecin Sport")Data_medecin_paris$nom[i]=unlist(strsplit(Donnees_medecin[i]," Médecin"))[1]Data_medecin_paris$type[i]=unlist(strsplit(unlist(strsplit(Donnees_medecin[i]," Médecin"))[2]," "))[2]Data_medecin_paris$adresse[i]=unlist(strsplit(unlist(strsplit(unlist(strsplit(Donnees_medecin[i]," Médecin"))[2],Data_medecin_paris$type[i] ))," Conventionné | Non"))[2]Data_medecin_paris$secteur[i]=unlist(strsplit(Donnees_medecin[i],Data_medecin_paris$adresse[i] ))[2]Data_medecin_paris$nom[i]=sub("  ", "-",Data_medecin_paris$nom[i])Data_medecin_paris$nom[i]=sub(" ", "-",Data_medecin_paris$nom[i])Data_medecin_paris$nom[i]=sub(" ", "-",Data_medecin_paris$nom[i])Data_medecin_paris$nom[i]=tolower(Data_medecin_paris$nom[i])Data_medecin_paris$nom[i]=change_characters(Data_medecin_paris$nom[i])}On a ainsi l'adress par exemple (ce qui sera utile pour les mettre sur une carte). Ensuite on voudrait bien avoir les tarifs&#62; Liste_sites_par_medecin_a_scrapper &#60;- as.data.frame(1:n)&#62; for (i in 1:n) {Liste_sites_par_medecin_a_scrapper[i,1] = paste0("www.xxxxxxxx.fr/medecin-generaliste/paris/",Data_medecin_paris$nom[i])}&#62; page_tarif_medecin&#60;- mapply(scrapping_webpage,URL=Liste_sites_par_medecin_a_scrapper[,1])&#62; tarif_medecin&#60;- list()&#62; for (i in 1:length(page_tarif_medecin)) {tarif_medecin [[i]]  &#60;- strsplit(page_tarif_medecin[[i]], "Tarif de la consultation | Voir plus de tarifs | Autres informations | Numéro de ")}Là encore, un format de base de données sera plus pratique&#62; for (i in 1:length(Data_medecin_paris$nom)) {if(is.na(tarif_medecin [[i]][[1]][2])){}else{Data_medecin_paris$tarif[i]=unlist(strsplit(tarif_medecin [[i]][[1]][2],Data_medecin_paris$secteur[i]))[1]}if(str_length(unlist(Data_medecin_paris$tarif[i]))&#62;50&#38;&#38;is.na(Data_medecin_paris$tarif[i])!="TRUE"){Data_medecin_paris$tarif[i]="Pas d'information"}Data_medecin_paris$tarif[i] = sub("\u0080","euros",Data_medecin_paris$tarif[i])Data_medecin_paris$tarif[i] = sub("\u0080","euros",Data_medecin_paris$tarif[i])}On va ensuite agréger&#62; Data_medecin_paris_avant_arrondissement = Data_medecin_paris&#62; arrondissement=c(1:n)*0&#62; Liste_sites_par_medecin_a_scrapper_arrondissement = Liste_sites_par_medecin_a_scrapper&#62; for (i in 1:n){if (Data_medecin_paris$tarif[i]=="0"){if (is.na(Data_medecin_paris$adresse[i])){}else{for (j in 1:(str_length(Data_medecin_paris$adresse[i])-1)){if (substring(Data_medecin_paris$adresse[i],j,j)=="7"&#38;&#38;substring(Data_medecin_paris$adresse[i],j+1,j+1)=="5"){arrondissement[i]=c(unlist(substring(Data_medecin_paris$adresse[i],j+3,j+4)))if(substring(arrondissement[i],1,1)==0){arrondissement[i]=(substring(arrondissement[i],2,2))}}}}Liste_sites_par_medecin_a_scrapper_arrondissement[i,1] = paste0("www.xxxxxxxxxx.fr/medecin-generaliste/paris-",arrondissement[i],"e-arrondissement/",Data_medecin_paris$nom[i])}}On peut maintenant tout balayer&#62;page_tarif_medecin_final &#60;- mapply(scrapping_webpage,URL=Liste_sites_par_medecin_a_scrapper_arrondissement[,1])On extrait les tarifs&#62; tarif_medecin_final&#60;- list()&#62; for (i in 1:length(page_tarif_medecin_final)) {tarif_medecin_final [[i]]  &#60;- strsplit(page_tarif_medecin_final[[i]], "Tarif de la consultation | Voir plus de tarifs | Autres informations | Numéro de ") }k1=0k2=0&#62; for (i in 1:length(Data_medecin_paris$nom)) { if(is.na(tarif_medecin_final [[i]][[1]][2])){}else{ Data_medecin_paris$tarif[i]=unlist(strsplit(tarif_medecin_final [[i]][[1]][2],Data_medecin_paris$secteur[i]))[1] } if(str_length(unlist(Data_medecin_paris$tarif[i]))&#62;50&#38;&#38;is.na(Data_medecin_paris$tarif[i])!="TRUE"){Data_medecin_paris$tarif[i]="Pas d'information"}Data_medecin_paris$tarif[i]=sub("\u0080","euros",Data_medecin_paris$tarif[i])Data_medecin_paris$tarif[i]=sub("\u0080","euros",Data_medecin_paris$tarif[i])if (Data_medecin_paris$tarif[i]!="Pas d'information"&#38;&#38;Data_medecin_paris$tarif[i]!=0){k1=k1+1}if (Data_medecin_paris_avant_arrondissement$tarif[i]!="Pas d'information"&#38;&#38;Data_medecin_paris_avant_arrondissement$tarif[i]!=0){k2=k2+1}}On a ainsi des données pertinentes sur les prix.&#62; Data_medecin_paris_final=Data_medecin_paris&#62; liste=c(0)&#62; for (i in 1:length(Data_medecin_paris$nom)){if (is.na(Data_medecin_paris$adresse[i])){liste=cbind(liste,i)}else{if (substring(Data_medecin_paris$adresse[i],str_length(Data_medecin_paris$adresse[i])-4,str_length(Data_medecin_paris$adresse[i]))=="Paris"){}else {liste=cbind(liste,i)}}if (is.na(Data_medecin_paris$secteur[i])){Data_medecin_paris_final$secteur[i]="Secteur non renseigné"}else{if (is.na(str_match(Data_medecin_paris$tarif[i],"Non conventionné"))){Data_medecin_paris_final$secteur[i]=substring(Data_medecin_paris_final$secteur[i],2,23)}else{}}}Data_medecin_paris_final=Data_medecin_paris_final[-liste,]On a fait un peu le ménage parmi les médecins en île de france.for (i in 1:length(Data_medecin_paris_final$nom)){Data_medecin_paris_final$ville_medecin[i]="Paris"for (j in 1:(str_length(Data_medecin_paris_final$adresse[i])-1)){if (substring(Data_medecin_paris_final$adresse[i],j,j)=="7"&#38;&#38;substring(Data_medecin_paris_final$adresse[i],j+1,j+1)=="5"){Data_medecin_paris_final$arrondissement[i]=c(unlist(substring(Data_medecin_paris_final$adresse[i],j+3,j+4)))}}if(is.na(str_match(Data_medecin_paris_final$tarif[i],"€"))){Data_medecin_paris_final$tarif_min[i]=0Data_medecin_paris_final$tarif_max[i]=0}else{if(is.na(str_match(Data_medecin_paris_final$tarif[i],"à"))){Data_medecin_paris_final$tarif_min[i]=as.integer(unlist(substr(Data_medecin_paris_final$tarif[i],1,2)))Data_medecin_paris_final$tarif_max[i]=as.integer(unlist(substr(Data_medecin_paris_final$tarif[i],1,2)))}else{Data_medecin_paris_final$tarif_min[i]=as.integer(unlist(substr(Data_medecin_paris_final$tarif[i],1,2)))Data_medecin_paris_final$tarif_max[i]=as.integer(unlist(substr(Data_medecin_paris_final$tarif[i],7,9)))}}}xk=length(Data_medecin_paris_final$nom)for (i in 1:length(Data_medecin_paris_final$nom)){Data_medecin_paris_final$cle[i]=paste0(Data_medecin_paris_final$nom[i],Data_medecin_paris_final$ville_medecin[i])}liste=c()Data_medecin_paris_final$cleunique=duplicated(Data_medecin_paris_final$cle)for (i in 1:length(Data_medecin_paris_final$nom)){if (Data_medecin_paris_final$cleunique[i]){liste=cbind(liste,i)}}&#62; Data_medecin_paris_final = Data_medecin_paris_final[-liste,]x&#62; for (i in 1:length(Data_medecin_paris_final$nom)) {lieu=Data_medecin_paris_final$adresse[i]lieu=gsub("\\s+", "+", lieu)requetes &#60;- NULLrequetes &#60;- paste("http://maps.googleapis.com/maps/api/geocode/xml?address=",Data_medecin_paris_final$adresse[i],",+France","&#38;sensor=false",sep="")#reponse.xml &#60;- readLines(requetes)reponse &#60;- xmlTreeParse(requetes, useInternalNodes=TRUE)latitude &#60;- NAlatitude &#60;- xmlValue(reponse[["//result[1]//geometry/location/lat"]])longitude &#60;- NAlongitude &#60;- xmlValue(reponse[["//result[1]//geometry/location/lng"]])adresse.recue &#60;- NAadresse.recue &#60;- xmlValue(reponse[["//result[1]//formatted_address"]])Data_medecin_paris_final$latitude[i]=as.double(latitude)Data_medecin_paris_final$longitude[i]=as.double(longitude)Data_medecin_paris_final$adresse_google[i]=adresse.recueSys.sleep(1)}On ne garde que les généralistesData_medecin_paris_final=Data_medecin_paris_final[which(Data_medecin_paris_final$type=="généraliste"),]On ajoute la population à l'aide d'un fichier externe et une mesure de comptagePopulation_paris=data.frame(read.csv ("http://freakonometrics.free.fr/Population_Paris.csv",sep=";"))for (i in 1:length(Data_medecin_paris_final$nom)){Data_medecin_paris_final$population[i]=Population_paris$Population[as.integer(Data_medecin_paris_final$arrondissement[i])]Data_medecin_paris_final$comptage[i]=1if (substring(Data_medecin_paris_final$secteur[i],1,16)=="Non conventionné"){Data_medecin_paris_final$secteur[i]="Non conventionné"}if (substring(Data_medecin_paris_final$secteur[i],1,20)=="Conventionné carte"){Data_medecin_paris_final$secteur[i]="Conventionné secteur 1"}}&#62; Data_medecin_paris_final$departement="paris"Ensuite on va créer les couleurs, en s'inspirant d'un billet chez les voisins de neocarto&#62; source_url("https://raw.githubusercontent.com/neocarto/R/master/colors/Palettes.R")&#62; library("RColorBrewer")&#62; library("devtools")&#62; source_url("https://raw.githubusercontent.com/neocarto/R/master/colors/BuildColors.R")&#62; blues &#60;- buildpal("#8ECEE9","#146594","#DCF0F8","#0B2130","#368ECA",20)&#62; greens &#60;- buildpal("#ADD39D","#1B7D34","#E5F0DA","#142F1B","#3FA136",20)&#62; reds &#60;- buildpal("#EFA5A9","#991915","#FBDEE1","#1D0809","#DE4243",20)&#62; purples &#60;- buildpal("#FFB6F1","#87036E","#FFD9FA","#3F0036","#FF00C3",20)&#62; oranges &#60;- buildpal("#FFB888","#AA4500","#FFE1CC","#3D1900","#FF6700",20)nicopal &#60;- buildpal("#FCE37A","#FF0000","#FFEB97","#E50000","#FF6700",20)&#62; nicopal2 &#60;- buildpal("#B6EFB6","#080E5B","#B6EFB6","#080E5B","#518996",20)&#62; colors &#60;- c(blues=list(blues),reds=list(reds),greens=list(greens),purples=list(purples),oranges=list(oranges),nicopal=list(nicopal),nicopal2=list(nicopal2))&#62; save(colors, file = "colors.RData")&#62; couleur1=getpal("reds",20)&#62; couleur2=getpal("blues",20)On peut maintenant calculer quelques statistiques (nombre de patients par médecin, tarif minimum moyen, maximum moyen, etc) par arrondissement,&#62; Statistiques = cbind(c(1:20),table(Data_medecin_paris_final$arrondissement,Data_medecin_paris_final$comptage),Population_paris$Population[1:20],table(Data_medecin_paris_final$arrondissement,Data_medecin_paris_final$secteur),Population_paris$Prix_loyer_m2[1:20])&#62; colnames(Statistiques)&#60;-c("Arrondissement","Nombre de medecin","Habitants",colnames(Statistiques[,4:(length(Statistiques[1,])-1)]),"Prix loyer m2")&#62; Statistiques=data.frame(Statistiques)&#62; Statistiques$nb_patient_par_medecin = Statistiques[,3]/Statistiques[,2]&#62; Statistiques$Tarif_min_moyen=c(1:20)*0&#62; Statistiques$Tarif_max_moyen=c(1:20)*0&#62; Temp=rep(0,20)&#62; for (i in 1:length(Data_medecin_paris_final$nom)){if (Data_medecin_paris_final$tarif_min[i]==0){}else{Temp[as.integer(Data_medecin_paris_final$arrondissement[i])]=Temp[as.integer(Data_medecin_paris_final$arrondissement[i])]+1Statistiques$Tarif_min_moyen[as.integer(Data_medecin_paris_final$arrondissement[i])]=Statistiques$Tarif_min_moyen[as.integer(Data_medecin_paris_final$arrondissement[i])]+Data_medecin_paris_final$tarif_min[i]Statistiques$Tarif_max_moyen[as.integer(Data_medecin_paris_final$arrondissement[i])]=Statistiques$Tarif_max_moyen[as.integer(Data_medecin_paris_final$arrondissement[i])]+Data_medecin_paris_final$tarif_max[i]}}&#62; Statistiques$Tarif_min_moyen = Statistiques$Tarif_min_moyen/Temp&#62; Statistiques$Tarif_max_moyen = Statistiques$Tarif_max_moyen/TempPour faire des graphiques ggplot2, il faut des informations utiles pour les graphs, dans les bases&#62; Statistiques_tarif = Statistiques[order(Statistiques$Tarif_max_moyen,decreasing=FALSE), ]&#62; Statistiques_tarif$couleur=couleur1&#62; Statistiques_loyer = Statistiques[order(Statistiques$Prix.loyer.m2,decreasing=FALSE), ]&#62; Statistiques_loyer$couleur=couleur1&#62; Statistiques_nb_medecin = Statistiques[order(Statistiques$Nombre.de.medecin,decreasing=FALSE), ]&#62; Statistiques_nb_medecin$couleur=couleur2&#62; Statistiques_nb_patient_par_medecin = Statistiques[order(Statistiques$nb_patient_par_medecin,decreasing=FALSE), ]&#62; Statistiques_nb_patient_par_medecin$couleur = couleur2On a aussi des informations sur les médecines non conventionnés, secteur 1 ou secteur 2&#62; Pasdinformation = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Pas d'information"),]&#62; Nonconventionne = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Non conventionné"),]&#62; Secteur1 = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Conventionné secteur 1"),]&#62; Secteur2 = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Conventionné secteur 2"),]map_FR &#60;- get_map(location = "Paris",zoom=12)On peut faire notre premier graphique pour visualiser cette information&#62; graphe1=ggmap(map_FR)+ geom_point(aes(x =c(as.double(Secteur1$longitude)),y = c(as.double(Secteur1$latitude))), data=data.frame(secteur=Secteur1$secteur),size = 1,alpha = 1, colour= "black") +geom_point(aes(x =c(as.double(Secteur2$longitude)),y = c(as.double(Secteur2$latitude))), data=data.frame(secteur=Secteur2$secteur),size = 1,alpha = 1, colour= "black") +geom_point(aes(x =c(as.double(Nonconventionne$longitude)),y = c(as.double(Nonconventionne$latitude))), data=data.frame(Nonconventionne$secteur),size = 1,alpha = 1, colour= "black")+xlab("Longitude") + ylab("Latitude") +ggtitle("Ensemble des médecins")&#62; graphe2=ggmap(map_FR)+ geom_point(aes(x =c(as.double(Secteur1$longitude)),y = c(as.double(Secteur1$latitude))), data=data.frame(secteur=Secteur1$secteur),size = 1,alpha = 1, colour= "black") +xlab("Longitude") + ylab("Latitude") +ggtitle("Conventionné Secteur 1")graphe3=ggmap(map_FR)+ geom_point(aes(x =c(as.double(Secteur2$longitude)),y = c(as.double(Secteur2$latitude))), data=data.frame(secteur=Secteur2$secteur),size = 1,alpha = 1, colour= "black") +xlab("Longitude") + ylab("Latitude") +ggtitle("Conventionné Secteur 2")graphe4=ggmap(map_FR)+ geom_point(aes(x =c(as.double(Nonconventionne$longitude)),y = c(as.double(Nonconventionne$latitude))), data=data.frame(secteur=Nonconventionne$secteur),size = 1,alpha = 1, colour= "black") +xlab("Longitude") + ylab("Latitude") +ggtitle("Non conventionné")grid.arrange(graphe1, graphe2, graphe3, graphe4, ncol=2, nrow = 2)On va ensuite récupérer les quartiers parisiens sur le site de Airbnb,&#62; url="http://data.insideairbnb.com/france/ile-de-france/paris/2017-04-04/visualisations/neighbourhoods.geojson"&#62; save(url,"neighbourhoods.geojson")&#62; airbnb.neigh = geojson_read("neighbourhoods.geojson",what="sp")arrondissement =data.frame(read.csv("neighbourhoods.geojson"))&#62; airbnb.neigh.for = fortify(airbnb.neigh)&#62; airbnb.neigh.ord = data.frame(id = as.character(0:19),neighbourhood = unlist(lapply(geojson_read("neighbourhoods.geojson")$features, function(f) return(f$properties$neighbourhood))))&#62; airbnb.neigh.cen = merge(airbnb.neigh.ord, aggregate(cbind(long, lat) ~ id, airbnb.neigh.for,function (c) return(mean(range(c)))))&#62; airbnb.neigh.cen$arrondissement = c(17,7,8,3,20,5,16,14,11,2,18,4,19,9,11,13,15,12,1,6)&#62; for (i in 1:length(airbnb.neigh.for$long)){temp=airbnb.neigh.cen[which(airbnb.neigh.cen$id==as.numeric(airbnb.neigh.for$id[i])),]$arrondissementairbnb.neigh.for$couleur_prix[i]=Statistiques_tarif[which(Statistiques_tarif$Arrondissement==temp),]$couleur}&#62; for (i in 1:length(airbnb.neigh.for$long)){temp=airbnb.neigh.cen[which(airbnb.neigh.cen$id==as.numeric(airbnb.neigh.for$id[i])),]$arrondissementairbnb.neigh.for$couleur_loyer[i]=Statistiques_loyer[which(Statistiques_loyer$Arrondissement==temp),]$couleur}&#62; for (i in 1:length(airbnb.neigh.for$long)){temp=airbnb.neigh.cen[which(airbnb.neigh.cen$id==as.numeric(airbnb.neigh.for$id[i])),]$arrondissementairbnb.neigh.for$couleur_nb_medecin[i]=Statistiques_nb_medecin[which(Statistiques_nb_medecin$Arrondissement==temp),]$couleur}&#62; for (i in 1:length(airbnb.neigh.for$long)){temp=airbnb.neigh.cen[which(airbnb.neigh.cen$id==as.numeric(airbnb.neigh.for$id[i])),]$arrondissementairbnb.neigh.for$couleur_nb_patient_par_medecin[i]=Statistiques_nb_medecin[which(Statistiques_nb_patient_par_medecin$Arrondissement==temp),]$couleur}On peut visualiser sur une carte par quartier les tarifs des médecins&#62; graphe_prix=ggplot(airbnb.neigh.for, aes(long, lat, group=group)) +  geom_polygon(color = "gray70", fill =airbnb.neigh.for$couleur_prix) +  geom_text(data = airbnb.neigh.cen, aes(label = neighbourhood, group=id)) + theme_void()graphe_loyer=ggplot(airbnb.neigh.for, aes(long, lat, group=group)) +  geom_polygon(color = "gray70", fill =airbnb.neigh.for$couleur_loyer) +  geom_text(data = airbnb.neigh.cen, aes(label = neighbourhood, group=id)) + theme_void()&#62; barre1=ggplot(Statistiques_tarif, aes(x=Tarif_max_moyen, y=Tarif_max_moyen,color=Tarif_max_moyen)) + geom_point()+scale_color_gradient2(midpoint=mean(Statistiques_tarif$Tarif_max_moyen),  low="snow", mid="darkred",high="black",space = "Lab")+ theme(legend.position = c(0, 0))+ theme_void()&#62; barre2=ggplot(Statistiques_loyer, aes(x=Prix.loyer.m2, y=Prix.loyer.m2,color=Prix.loyer.m2)) + geom_point()+scale_color_gradient2(midpoint=mean(Statistiques_loyer$Prix.loyer.m2),  low="snow", mid="darkred",high="black",space = "Lab")+ theme(legend.position = c(0, 0))+ theme_void()grid.arrange(graphe_prix, barre1,graphe_loyer,barre2,ncol=2, nrow = 2,widths=c(10, 1),heights=c(2,2))Ou encore&#62; barre3=ggplot(Statistiques_nb_medecin, aes(x=Nombre.de.medecin, y=Nombre.de.medecin,color=Nombre.de.medecin)) + geom_point()+scale_color_gradient2(midpoint=mean(Statistiques_nb_medecin$Nombre.de.medecin),  low="snow", mid="#87BEE0",high="black",space = "Lab")+ theme(legend.position = c(0, 0))+ theme_void()&#62; barre4=ggplot(Statistiques_nb_patient_par_medecin, aes(x=nb_patient_par_medecin, y=nb_patient_par_medecin,color=nb_patient_par_medecin)) + geom_point()+scale_color_gradient2(midpoint=mean(Statistiques_nb_patient_par_medecin$nb_patient_par_medecin),  low="snow", mid="#87BEE0",high="black",space = "Lab")+ theme(legend.position = c(0, 0))+ theme_void()&#62; graphe_nb_medecin=ggplot(airbnb.neigh.for, aes(long, lat, group=group)) +  geom_polygon(fill = airbnb.neigh.for$couleur_nb_medecin, color = "gray50") +  geom_text(data = airbnb.neigh.cen, aes(label = neighbourhood, group=id)) + theme_void()+ggtitle("Nombre de médecins")&#62; graphe_nb_patient=ggplot(airbnb.neigh.for, aes(long, lat, group=group)) +  geom_polygon(fill = airbnb.neigh.for$couleur_nb_patient_par_medecin, color = "gray50") +  geom_text(data = airbnb.neigh.cen, aes(label = neighbourhood, group=id)) + theme_void()+ggtitle("Nombre de patients par médecins")grid.arrange(graphe_nb_medecin, barre3,graphe_nb_patient,barre4,ncol=2, nrow = 2,widths=c(10, 2),heights=c(2,2))Amusant non... Je laisse imaginer le nombre d'informations qu'on peut extraire avec ce genre de site...&#160;