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 à produire
Pour ca, comme toujours, il faut pas mal de packages
> pkge=c('scrapeR', 'XML', 'RCurl', 'RJSONIO', 'ggplot2', 'ggmap', 'xlsx', 'corrgram', 'geojsonio',
'devtools', 'gridExtra', 'stringr', 'reshape', 'geojsonio')
> lapply(pkge, require, character.only = TRUE)
Pour scraper, à partir d’une adresse, le code est le suivant
> scrapping_webpage=function (URL){
out <- tryCatch(
expr= {
url <- paste0("https://",as.character(URL))
webpage <- getURL(url, ssl.verifypeer = FALSE)
webpage <- readLines(tc <- textConnection(webpage),ok=TRUE); close(tc)
pagetree <- htmlTreeParse(webpage, useInternalNodes = TRUE, encoding='UTF-8')
cleantxt <- xpathApply(pagetree, "//body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]", xmlValue)
cleantxt_1 <- gsub('\n|\t|\r|>more| ', '', cleantxt)
resulting_text <- 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
> change_characters <- function(vect){
vect <- gsub('ö','o',vect)
vect <- gsub('ä','a',vect)
vect <- gsub('ß','b',vect)
vect <- gsub('ü','u',vect)
vect <- gsub('Ö','O',vect)
vect <- gsub('é','e',vect)
vect <- gsub('è','e',vect)
vect <- gsub('â','a',vect)
vect <- gsub('ë','e',vect)
vect <- gsub('ê','e',vect)
vect <- gsub('°',' ',vect)
vect <- gsub('î','i',vect)
vect <- gsub('à','a',vect)
vect <- gsub('í','i',vect)
vect <- gsub('á','a',vect)
vect <- gsub('ý','y',vect)
vect <- gsub('s','s',vect)
vect <- gsub('z','z',vect)
vect <- gsub('S','S',vect)
vect <- gsub('Z','Z',vect)
vect <- gsub('ó','o',vect)
vect <- gsub('Ú','U',vect)
vect <- gsub('ú','u',vect)
vect <- gsub('Ü','U',vect)
vect <- gsub('Ä','A',vect)
vect <- gsub('æ','a',vect)
vect <- gsub('ø','o',vect)
vect <- gsub('å','a',vect)
vect <- gsub('Ø','o',vect)
vect <- gsub('Æ','A',vect)
vect <- gsub('Å','A',vect)
vect <- gsub('õ','o',vect)
vect <- gsub('Õ','O',vect)
vect <- gsub('ñ','n',vect)
vect <- gsub('º',' ',vect)
vect <- gsub('Á','A',vect)
vect <- gsub('Í','I',vect)
vect <- gsub('ª',' ',vect)
vect <- gsub('Ñ','N',vect)
vect <- gsub('´','',vect)
vect <- gsub('Ó','O',vect)
vect <- gsub('ï','i',vect)
vect <- gsub('É','E',vect)
vect <- gsub('ç','c',vect)
vect <- gsub('ô','o',vect)
vect <- gsub('û','u',vect)
vect <- gsub('ð','d',vect)
vect <- gsub('ì','i',vect)
vect <- gsub('þ','p',vect)
vect <- gsub('Ð','D',vect)
vect <- gsub('"',' ',vect)
vect <- gsub('ã','a',vect)
vect <- gsub('Ç','C',vect)
vect <- gsub('Ã','A',vect)
vect <- gsub(' ','+',vect)
vect <- gsub("\\(",'+',vect)
vect <- 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
> nombre_page <- 200
Liste_sites_a_scrapper<- 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")}
> Donnees_doc <- 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)
> medecin <- list()
> for (i in 1:length(Donnees_doc)) {
medecin[[i]] <- strsplit(Donnees_doc[[i]], "Dr | Prendre | Mme | Mr ")}
On va ensuite extraire quelques infos dans les pages
> Donnees_medecin=c()
> 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]," ")))>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,
> n=length(Donnees_medecin)
> 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)
> 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
> Liste_sites_par_medecin_a_scrapper <- as.data.frame(1:n)
> 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])}
> page_tarif_medecin<- mapply(scrapping_webpage,URL=Liste_sites_par_medecin_a_scrapper[,1])
> tarif_medecin<- list()
> for (i in 1:length(page_tarif_medecin)) {
tarif_medecin [[i]] <- 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
> 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]))>50&&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
> Data_medecin_paris_avant_arrondissement = Data_medecin_paris
> arrondissement=c(1:n)*0
> Liste_sites_par_medecin_a_scrapper_arrondissement = Liste_sites_par_medecin_a_scrapper
> 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"&&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
>page_tarif_medecin_final <- mapply(scrapping_webpage,URL=Liste_sites_par_medecin_a_scrapper_arrondissement[,1])
On extrait les tarifs
> tarif_medecin_final<- list()
> for (i in 1:length(page_tarif_medecin_final)) {
tarif_medecin_final [[i]] <- strsplit(page_tarif_medecin_final[[i]], "Tarif de la consultation | Voir plus de tarifs | Autres informations | Numéro de ") }
k1=0
k2=0
> 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]))>50&&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"&&Data_medecin_paris$tarif[i]!=0){k1=k1+1}
if (Data_medecin_paris_avant_arrondissement$tarif[i]!="Pas d'information"&&Data_medecin_paris_avant_arrondissement$tarif[i]!=0){k2=k2+1}}
On a ainsi des données pertinentes sur les prix.
> Data_medecin_paris_final=Data_medecin_paris
> liste=c(0)
> 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"&&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]=0
Data_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)))}}}
x
k=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)}
}
> Data_medecin_paris_final = Data_medecin_paris_final[-liste,]
x
> for (i in 1:length(Data_medecin_paris_final$nom)) {
lieu=Data_medecin_paris_final$adresse[i]
lieu=gsub("\\s+", "+", lieu)
requetes <- NULL
requetes <- paste("http://maps.googleapis.com/maps/api/geocode/xml?address=",Data_medecin_paris_final$adresse[i],",+France","&sensor=false",sep="")
#reponse.xml <- readLines(requetes)
reponse <- xmlTreeParse(requetes, useInternalNodes=TRUE)
latitude <- NA
latitude <- xmlValue(reponse[["//result[1]//geometry/location/lat"]])
longitude <- NA
longitude <- xmlValue(reponse[["//result[1]//geometry/location/lng"]])
adresse.recue <- NA
adresse.recue <- 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.recue
Sys.sleep(1)
}
On ne garde que les généralistes
Data_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 comptage
Population_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]=1
if (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"}
}
> Data_medecin_paris_final$departement="paris"
Ensuite on va créer les couleurs, en s’inspirant d’un billet chez les voisins de neocarto
> source_url("https://raw.githubusercontent.com/neocarto/R/master/colors/Palettes.R")
> library("RColorBrewer")
> library("devtools")
> source_url("https://raw.githubusercontent.com/neocarto/R/master/colors/BuildColors.R")
> blues <- buildpal("#8ECEE9","#146594","#DCF0F8","#0B2130","#368ECA",20)
> greens <- buildpal("#ADD39D","#1B7D34","#E5F0DA","#142F1B","#3FA136",20)
> reds <- buildpal("#EFA5A9","#991915","#FBDEE1","#1D0809","#DE4243",20)
> purples <- buildpal("#FFB6F1","#87036E","#FFD9FA","#3F0036","#FF00C3",20)
> oranges <- buildpal("#FFB888","#AA4500","#FFE1CC","#3D1900","#FF6700",20)
nicopal <- buildpal("#FCE37A","#FF0000","#FFEB97","#E50000","#FF6700",20)
> nicopal2 <- buildpal("#B6EFB6","#080E5B","#B6EFB6","#080E5B","#518996",20)
> colors <- c(blues=list(blues),reds=list(reds),greens=list(greens),purples=list(purples),oranges=list(oranges),nicopal=list(nicopal),nicopal2=list(nicopal2))
> save(colors, file = "colors.RData")
> couleur1=getpal("reds",20)
> couleur2=getpal("blues",20)
On peut maintenant calculer quelques statistiques (nombre de patients par médecin, tarif minimum moyen, maximum moyen, etc) par arrondissement,
> 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])
> colnames(Statistiques)<-c("Arrondissement","Nombre de medecin","Habitants",colnames(Statistiques[,4:(length(Statistiques[1,])-1)]),"Prix loyer m2")
> Statistiques=data.frame(Statistiques)
> Statistiques$nb_patient_par_medecin = Statistiques[,3]/Statistiques[,2]
> Statistiques$Tarif_min_moyen=c(1:20)*0
> Statistiques$Tarif_max_moyen=c(1:20)*0
> Temp=rep(0,20)
> 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])]+1
Statistiques$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]
}}
> Statistiques$Tarif_min_moyen = Statistiques$Tarif_min_moyen/Temp
> Statistiques$Tarif_max_moyen = Statistiques$Tarif_max_moyen/Temp
Pour faire des graphiques ggplot2, il faut des informations utiles pour les graphs, dans les bases
> Statistiques_tarif = Statistiques[order(Statistiques$Tarif_max_moyen,decreasing=FALSE), ]
> Statistiques_tarif$couleur=couleur1
> Statistiques_loyer = Statistiques[order(Statistiques$Prix.loyer.m2,decreasing=FALSE), ]
> Statistiques_loyer$couleur=couleur1
> Statistiques_nb_medecin = Statistiques[order(Statistiques$Nombre.de.medecin,decreasing=FALSE), ]
> Statistiques_nb_medecin$couleur=couleur2
> Statistiques_nb_patient_par_medecin = Statistiques[order(Statistiques$nb_patient_par_medecin,decreasing=FALSE), ]
> Statistiques_nb_patient_par_medecin$couleur = couleur2
On a aussi des informations sur les médecines non conventionnés, secteur 1 ou secteur 2
> Pasdinformation = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Pas d'information"),]
> Nonconventionne = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Non conventionné"),]
> Secteur1 = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Conventionné secteur 1"),]
> Secteur2 = Data_medecin_paris_final[which(Data_medecin_paris_final$secteur=="Conventionné secteur 2"),]
map_FR <- get_map(location = "Paris",zoom=12)
On peut faire notre premier graphique pour visualiser cette information
> 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")
> 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,
> url="http://data.insideairbnb.com/france/ile-de-france/paris/2017-04-04/visualisations/neighbourhoods.geojson"
> save(url,"neighbourhoods.geojson")
> airbnb.neigh = geojson_read("neighbourhoods.geojson",what="sp")
arrondissement =data.frame(read.csv("neighbourhoods.geojson"))
> airbnb.neigh.for = fortify(airbnb.neigh)
> airbnb.neigh.ord = data.frame(id = as.character(0:19),neighbourhood = unlist(lapply(geojson_read("neighbourhoods.geojson")$features, function(f) return(f$properties$neighbourhood))))
> airbnb.neigh.cen = merge(airbnb.neigh.ord, aggregate(cbind(long, lat) ~ id, airbnb.neigh.for,function (c) return(mean(range(c)))))
> 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)
> 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])),]$arrondissement
airbnb.neigh.for$couleur_prix[i]=Statistiques_tarif[which(Statistiques_tarif$Arrondissement==temp),]$couleur}
> 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])),]$arrondissement
airbnb.neigh.for$couleur_loyer[i]=Statistiques_loyer[which(Statistiques_loyer$Arrondissement==temp),]$couleur}
> 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])),]$arrondissement
airbnb.neigh.for$couleur_nb_medecin[i]=Statistiques_nb_medecin[which(Statistiques_nb_medecin$Arrondissement==temp),]$couleur}
> 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])),]$arrondissement
airbnb.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
> 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()
> 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()
> 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
> 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()
> 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()
> 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")
> 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…
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (October 8, 2017). Scraper pour avoir des infos sur les médecins sur Paris. Freakonometrics. Retrieved February 14, 2025 from https://doi.org/10.58079/ov8c
Très intéressant comme travail, j’aimerais tester votre code, pouvez-vous me donner en mp l’adresse du site ?
Pour enlever les accents :
# transliterate, using sub for safety
x <- iconv(x, to = "ASCII//TRANSLIT", sub = " ")
# remove anything but letters and numbers
x <- gsub("\\W", "", x)