{"word_count": 798, "character_count": 8063}
Allez, un petit billet léger pour bien commencer les vacances de Noël. Toujours sur le projet R de la formation en Data Science pour l’Actuariat, Cyril Legrand a proposé de fusionner deux bases, une sur le revenu moyen par foyer (fiscal) par commune, et une sur le nom de licenciés dans les clubs sportifs. Il est faire un peu de retraitement des codes INSEE pour la jointure, car par exemple Marseille est codée sur les arrondissements dans une des bases, sur la ville dans l'autre.library(stringr)library(dplyr)Les données sont téléchargeables sur http://data.gouv.fr/ (j'ai laissé tous les codes, mais je mettrais juste la base finale en ligne)a &#60;- read.csv("data/impots_par_commune.csv", sep=";", encoding="UTF-8", colClasses=c("factor","factor","character","factor","numeric","numeric","numeric"),na.strings="n.d.")On élimine alors les stats par tranche d'impositiona &#60;- a[a$tranche == "Total",]Puis on crée à la main le code INSEE, formaté sur 5 caractèresa$code_insee &#60;- as.factor(paste(str_sub(a$departement,1,2), a$commune, sep=""))Pour notre études, les DOM et les TOM (codes 971 et 972) ainsi que les codes 'autres pays' (B31) ne seront pas exploitésa &#60;- a[, c("code_insee", "departement", "foyers", "revenu_fisc_ref")]Si on veut aller plus loin, on peut aussi géolocaliser les communes (voir si on joue plus aux sport d'extérieur dans le sud que dans le nord, si on veut)b &#60;- read.csv("data/Codes-INSEE-communes-geolocalisees.csv", sep=",", encoding="latin1", colClasses=c("factor","character","integer","factor","numeric","numeric","integer","numeric"))Là encore, il nous faut créer le code INSEEb[,"Insee"] &#60;- as.factor(gsub(" ", "0", sprintf("%5s", as.character(b$Insee))))b &#60;- b[, c("Insee", "Altitude", "longitude_radian", "latitude_radian", "surface")]Enfin, utilise le fichier des licences sportives, par communesc &#60;- read.csv("data/licences_2012.csv", sep=";", encoding="UTF-8", colClasses = c("factor","character","factor",rep("integer",63)), na.strings=".")c &#60;- c[, c(seq(1,14), 24, seq(37,47), 57)]On doit retraiter les villes avec des arrondissement, Marseille, Lyon et Paris. On commence par Marseillea_1 &#60;- a[as.numeric(as.character(a$code_insee)) &#62; 13300 &#38; as.numeric(as.character(a$code_insee)) &#60; 13399, ]a_1 &#60;- a_1[! is.na(a_1$code_insee), ]a_2 &#60;- data.frame("13055", "130", sum(a_1$foyers),  sum(a_1$revenu_fisc_ref))colnames(a_2) &#60;- colnames(a)a &#60;- rbind(a, a_2)puis Lyona_1 &#60;- a[as.numeric(as.character(a$code_insee)) &#62; 69300 &#38; as.numeric(as.character(a$code_insee)) &#60; 69399, ]a_1 &#60;- a_1[! is.na(a_1$code_insee), ]a_2 &#60;- data.frame("69123", "690", sum(a_1$foyers),  sum(a_1$revenu_fisc_ref))colnames(a_2) &#60;- colnames(a)a &#60;- rbind(a, a_2)et on finit avec Parisa_1 &#60;- a[as.numeric(as.character(a$code_insee)) &#62; 75000 &#38; as.numeric(as.character(a$code_insee)) &#60; 75999, ]a_1 &#60;- a_1[! is.na(a_1$code_insee), ]a_2 &#60;- data.frame("75056", "750", sum(a_1$foyers),  sum(a_1$revenu_fisc_ref))colnames(a_2) &#60;- colnames(a)a &#60;- rbind(a, a_2)par exemple pour Paris, on aa[a$code_insee == "75056", ]code_insee departement  foyers revenu_fisc_ref[,16]       75056       750 1420941     56943735807soit un total de 57 milliards d'euros, pour 1,4 millions de foyers. On fusionne alors les basesd &#60;- inner_join(c, a, by=c("cog2" = "code_insee"))d &#60;- inner_join(d, b, by=c("cog2" = "Insee"))ON peut sauver les bases dans un gros fichier,save(d, file="data/d.RData")Maintenant on peut commencer à visialiser des variables. On charge les packages dont on aura besoinlibrary(magrittr)library(stringr)library(dplyr)library(ggplot2)On peut charger les données avecload("http://freakonometrics.free.fr/d.RData")On peut maintenant se lancerd_rev_dep &#60;- d[! is.na(d$revenu_fisc_ref) &#38; ! is.na(d$foyers), c("revenu_fisc_ref", "foyers", "departement")]d_rev_dep &#60;- aggregate(d_rev_dep[,c("revenu_fisc_ref", "foyers")], FUN=sum, by=list(str_sub(d_rev_dep$departement,1,2)))colnames(d_rev_dep) &#60;- c("departement", "revenu_fisc_ref", "foyers")d_rev_dep["rev_ref_moy"] &#60;- d_rev_dep$revenu_fisc_ref / d_rev_dep$foyersd_rev_dep &#60;- d_rev_dep[, c("rev_ref_moy", "departement")]d_rev_dep &#60;- d_rev_dep[ do.call(order, c(d_rev_dep, decreasing=TRUE)), ]Histoire d'avoir une analyse un peu robuste, on élimine les communes à faible populationd &#60;- d[d$pop_2010 &#62; 1000,]d["rev_ref_moy"] &#60;- d$revenu_fisc_ref / d$foyersd["tx_licences"] &#60;- d$l_2012 / d$pop_2010on a pour les données de revenud_revenus &#60;- unique(d[! is.na(d$rev_ref_moy), c("rev_ref_moy", "LIBELLE", "departement", "longitude_radian", "latitude_radian")])d_revenus["long"] &#60;- d_revenus$longitude_radian / pi * 180d_revenus["lat"] &#60;- d_revenus$latitude_radian / pi * 180d_revenus &#60;- d_revenus[ do.call(order, c(d_revenus, decreasing=TRUE)), ]pour les données de sportd_sport &#60;- d[! is.na(d$l_2012), c("cog2", "LIBELLE", "revenu_fisc_ref", "pop_2010", "foyers", "l_2012")]d_sport &#60;- aggregate(d_sport$l_2012, FUN=sum, by=list(d_sport$cog2, d_sport$LIBELLE, d_sport$revenu_fisc_ref, d_sport$pop_2010, d_sport$foyers))colnames(d_sport) &#60;- c("cog2","LIBELLE", "revenu_fisc_ref", "pop_2010", "foyers", "l_2012")d_sport["rev_ref_moy"] &#60;- d_sport$revenu_fisc_ref / d_sport$foyersd_sport["tx_licences"] &#60;- d_sport$l_2012 / d_sport$pop_2010d_sport.first &#60;- d_sport[, c("tx_licences", "LIBELLE")]d_sport.first &#60;- d_sport.first[ do.call(order, c(d_sport.first, decreasing=TRUE)), ]d_sport.fit &#60;- lm(formula="tx_licences ~ rev_ref_moy", data=d_sport,weights=pop_2010)On peut maintenant faire un dessing &#60;- ggplot(d_sport.fit, aes(rev_ref_moy, tx_licences)) + geom_point() + geom_smooth()g &#60;- g + labs(title="Tous sports confondus", x="Revenu moyen", y="Taux de licenciés")g &#60;- g + theme(plot.title=element_text(size=12, face="bold", vjust=2, color="blue"))g &#60;- g + xlim(c(10000, 80000)) + ylim(c(0, 0.8))plot(g)mais on peut aussi mettre des poids, correspondant à la taille des communespop_2010 &#60;- d_sport$pop_2010soitg &#60;- ggplot(d_sport.fit, aes(rev_ref_moy, tx_licences, weight=pop_2010)) + geom_point() + geom_smooth()g &#60;- g + labs(title="Tous sports confondus", x="Revenu moyen", y="Taux de licenciés")g &#60;- g + theme(plot.title=element_text(size=12, face="bold", vjust=2, color="blue"))g &#60;- g + xlim(c(10000, 80000)) + ylim(c(0, 0.8))plot(g)xPour regarder par sport, on peut utiliser la fonction suivantetrace_graph &#60;- function(nom, num_fed, ymax) {extract &#60;- unique(d[! is.na(d$tx_licences) &#38; d$fed_2012 == num_fed, c("tx_licences", "LIBELLE", "rev_ref_moy")])g &#60;- ggplot(extract, aes(rev_ref_moy, tx_licences)) + geom_point() + geom_smooth()g &#60;- g + labs(title=nom, x="Revenu moyen", y="Taux de licenciés")g &#60;- g + theme(plot.title=element_text(size=12, face="bold", vjust=2, color="blue"))g &#60;- g + xlim(c(10000, 80000)) + ylim(c(0, ymax))plot(g)}soit, pour le footballtrace_graph_2("football", "111", 0.15)ou dans la version avec des poidstrace_graph_w &#60;- function(nom, num_fed, ymax) {extract &#60;- unique(d[! is.na(d$tx_licences) &#38; d$fed_2012 == num_fed, c("tx_licences", "LIBELLE", "rev_ref_moy","pop_2010")])g &#60;- ggplot(extract, aes(rev_ref_moy, tx_licences,weight=pop_2010)) + geom_point() + geom_smooth()g &#60;- g + labs(title=nom, x="Revenu moyen", y="Taux de licenciés")g &#60;- g + theme(plot.title=element_text(size=12, face="bold", vjust=2, color="blue"))g &#60;- g + xlim(c(10000, 80000)) + ylim(c(0, ymax))plot(g)}donc pour le football (toujours)trace_graph_w("football", "111", 0.15)A titre de comparaison, on peut regarder le tennistrace_graph("tennis", "123", 0.2)ou, dans la version avec des poidstrace_graph_w("tennis", "123", 0.2)Pour l'équitation,trace_graph("équitation", "109", 0.1)ou, pour la version avec des poidstrace_graph_w("équitation", "109", 0.1)Et pour le golftrace_graph("golf", "132", 0.06)ou pour la version avec des poidstrace_graph_w("golf", "132", 0.06)C'est cliché, non ?