{"word_count": 886, "character_count": 10939}
Je voulais profiter de la rentree pour mettre en ligne quelques billets sur la data science (comme on dit), en particulier en me basant sur des projets R de la formation en Data Science pour l’Actuariat. L'an passe, j'avais déjà mis en ligne un billet sur le sport ("le sport, une activité de riches"). Cette fois, en m'inspirant de ce qu'a proposé Benoit, on va regarder qui sont les licenciés des différentes fédérations sportives, et ou ils vivent. Comme toujours en R, on charge les librairies qu'on va utiliser...library(rgdal)library(sp)library(reshape2)library(data.table)library(ggplot2)library(gridExtra)library(ggmap)library(RColorBrewer)library(classInt)library(backports)library(OpenStreetMap)J'ouvre une parenthèse rapide, mais en pratique on sait rarement ce qui va servir... ex-post, on va les ramener ce chargement de librairies au début. Je pense que ça serait mieux de les charger juste quand on les utilise. Bon, ensuite, il faut les donneesUrl_Licences = "https://www.data.gouv.fr/s/resources/recensement-des-licences-et-clubs-aupres-des-federations-sportives-agreees-par-le-ministere-charge-d/20180131-163516/Licences_2015.csv"Licences_2015 = read.csv(file=Url_licences, header=TRUE, sep=",",stringsAsFactors = FALSE) Url_Federation = "http://freakonometrics.free.fr/Projet_R/Code_federation.csv"Code_Fede = read.csv(Url_Federation, sep=";",header=FALSE, skip=3)colnames(Code_Fede) = c("Code_Federation","Libelle_Federation")On change ici le nom des variables, ça sera plus simple ensuite, et on retient juste quelques lignes interessantesCode_Fede = Code_Fede[c(1:31,33:92),c(1:2)]Il faut ensuite les coordonnées des villes pour faire une carteCommune = read.csv(file="https://www.data.gouv.fr/fr/datasets/r/554590ab-ae62-40ac-8353-ee75162c05ee", sep=";", header=TRUE)En fait, juste la latitude de la longitude nous interesseGeocod = colsplit(Commune$coordonnees_gps, ",", c("Latitude", "Longitude"))Commune = data.frame(Commune,Geocod)Un peu de menage ne fera pas de malCommune$Ligne_5 = NULLCommune$coordonnees_gps = NULLdoublons = which(duplicated(Commune$Code_commune_INSEE)) #détecte les lignes où il y a doublonCommune_Indiv = Commune[-doublons,]On rajoute maintenant un libelle pour chaque sportLicences_2015 = merge(x=Licences_2015, y=Code_Fede, by.x="fed_2014", by.y="Code_Federation", all.y=TRUE)Et on supprime également les lignes ou les codes commune ne sont pas renseignés (car les données ne seront pas exploitables)Licences_2015 = Licences_2015[!is.na(Licences_2015$newcog2),]On a besoin de faire un peu attention a Paris et Marseille, car on a des données par arrondissement,for (i in 1:nrow(Licences_2015)){  if (Licences_2015[i,c("newcog2")]=="75056") {    (Licences_2015[i,c("newcog2")] = "75101")}  if (Licences_2015[i,c("newcog2")]=="13055") {    (Licences_2015[i,c("newcog2")] = "13101")}}Licences_2015 = merge(x=Licences_2015, y=Commune_Indiv, by.x="newcog2", by.y="Code_commune_INSEE", all.x=TRUE)On y est presque. On va créer la variable taux de licenciés (nombre de licences rapporté a la population) pour chaque communeLicences_2015$Taux_Licencies = ifelse(Licences_2015$pop_2014 != 0,Licences_2015$l_2015/Licences_2015$pop_2014,0)Maintenant, on peut jouer ! Ou presque... reste a faire quelques regroupements en fonction de ce qu'on veut représenter.df_Nb_Lic_Agg_Fed = aggregate(data.frame(Nb_Licence = Licences_2015$l_2015,Nb_hommes = Licences_2015$l_h_2015,Nb_femmes = Licences_2015$l_f_2015,NbLicences_0_4_Ans=Licences_2015$l_0_4_2015,NbLicences_5_9_Ans=Licences_2015$l_5_9_2015,NbLicences_10_14_Ans=Licences_2015$l_10_14_2015,NbLicences_15_19_Ans=Licences_2015$l_15_19_2015,NbLicences_20_29_Ans=Licences_2015$l_20_29_2015,NbLicences_30_44_Ans=Licences_2015$l_30_44_2015,NbLicences_45_59_Ans=Licences_2015$l_45_59_2015,NbLicences_60_74_Ans=Licences_2015$l_60_74_2015,NbLicences_75_Ans=Licences_2015$l_75_2015,Nb_0_4_Ans=Licences_2015$pop_0_4_2014,Nb_5_9_Ans=Licences_2015$pop_5_9_2014,Nb_10_14_Ans=Licences_2015$pop_10_14_2014,Nb_15_19_Ans=Licences_2015$pop_15_19_2014,Nb_20_29_Ans=Licences_2015$pop_20_29_2014,Nb_30_44_Ans=Licences_2015$pop_30_44_2014,Nb_45_59_Ans=Licences_2015$pop_45_59_2014,Nb_60_74_Ans=Licences_2015$pop_60_74_2014,Nb_75_Ans=Licences_2015$pop_75_2014,Pop_femmes=Licences_2015$popf_2014,Pop_hommes=Licences_2015$poph_2014,Pop_Totale=Licences_2015$pop_2014), by = list(Federation = Licences_2015$Libelle_Federation), sum, na.rm = TRUE)On peut ainsi calculer le "taux de féminisation" de chaque sportdf_Nb_Lic_Agg_Fed$tx_femmes = ifelse(df_Nb_Lic_Agg_Fed$Nb_Licence!=0,df_Nb_Lic_Agg_Fed$Nb_femmes/df_Nb_Lic_Agg_Fed$Nb_Licence,0)ou la répartition par classe d'âge du nombre de licenciés par fédérationdf_Nb_Lic_Agg_Fed$Nb_Licence_Norme =   df_Nb_Lic_Agg_Fed$NbLicences_0_4_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_5_9_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_10_14_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_15_19_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_20_29_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_30_44_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_45_59_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_60_74_Ans+  df_Nb_Lic_Agg_Fed$NbLicences_75_AnsPour la classe d'age 0-14 ans, on pose alorsdf_Nb_Lic_Agg_Fed$Tx_Licences_0_14_Ans = ifelse(df_Nb_Lic_Agg_Fed$Nb_Licence_Norme != 0,      (df_Nb_Lic_Agg_Fed$NbLicences_0_4_Ans+df_Nb_Lic_Agg_Fed$NbLicences_5_9_Ans+df_Nb_Lic_Agg_Fed$NbLicences_10_14_Ans)/df_Nb_Lic_Agg_Fed$Nb_Licence_Norme,0)et pour la classe d'age 15-29 ansdf_Nb_Lic_Agg_Fed$Tx_Licences_15_29_Ans = ifelse(df_Nb_Lic_Agg_Fed$Nb_Licence_Norme != 0,(df_Nb_Lic_Agg_Fed$NbLicences_15_19_Ans+df_Nb_Lic_Agg_Fed$NbLicences_20_29_Ans)/df_Nb_Lic_Agg_Fed$Nb_Licence_Norme,0)pour la classe d'age 30-44 ansdf_Nb_Lic_Agg_Fed$Tx_Licences_30_44_Ans = ifelse(df_Nb_Lic_Agg_Fed$Nb_Licence_Norme != 0,(df_Nb_Lic_Agg_Fed$NbLicences_30_44_Ans)/df_Nb_Lic_Agg_Fed$Nb_Licence_Norme,0)pour la classe d'age 45-59 ansdf_Nb_Lic_Agg_Fed$Tx_Licences_45_59_Ans = ifelse(df_Nb_Lic_Agg_Fed$Nb_Licence_Norme != 0,                                        (df_Nb_Lic_Agg_Fed$NbLicences_45_59_Ans)/df_Nb_Lic_Agg_Fed$Nb_Licence_Norme,0)pour la classe d'age 60 ans et plus (on a compris le truc)df_Nb_Lic_Agg_Fed$Tx_Licences_60_Ans = ifelse(df_Nb_Lic_Agg_Fed$Nb_Licence_Norme != 0, (df_Nb_Lic_Agg_Fed$NbLicences_60_74_Ans+ df_Nb_Lic_Agg_Fed$NbLicences_75_Ans)/df_Nb_Lic_Agg_Fed$Nb_Licence_Norme,0)On passe a la détermination des 25 premières fédérations en nombre de licenciésdt_Nb_Lic_Agg_Fed = data.table(df_Nb_Lic_Agg_Fed)setorder(dt_Nb_Lic_Agg_Fed,-Nb_Licence,na.last=TRUE)dt_Nb_Lic_Agg_Main_Fed = dt_Nb_Lic_Agg_Fed[1:25,]graph1 = ggplot(data=dt_Nb_Lic_Agg_Main_Fed, aes(x=reorder(Federation,Nb_Licence), y=Nb_Licence)) +   geom_bar(stat="Identity",fill = "blue")+  geom_text(aes(label=Nb_Licence),check_overlap = TRUE, vjust=0.5, hjust=0, color="blue")+  ggtitle("TOP 25 des fédérations sportives en termes de licenciés")+  ylim(0, 2500000)+  xlab("Fédérations") + ylab("Nombre de licences")graph1+coord_flip()On ordonne ensuite par taux de femmes,setorder(dt_Nb_Lic_Agg_Main_Fed,-tx_femmes,na.last=TRUE)graph2 = ggplot(data=dt_Nb_Lic_Agg_Main_Fed) +  aes(x =reorder(Federation,tx_femmes), y = tx_femmes) + geom_bar(stat="Identity",fill = "pink")+geom_text(aes(label=paste(round(100*tx_femmes, 0), "%", sep="")),check_overlap = TRUE, vjust=0.5, hjust=0.5, color="black")+xlab("Fédération") + ylab("part des licenciées femmes")+ggtitle("la pratique sportive féminine par fédération")  graph2+coord_flip()Et finalement on va regarder par classe d'agedf_Nb_Lic_Agg_Main_Fed = data.frame(dt_Nb_Lic_Agg_Main_Fed)Licence_Age = melt(df_Nb_Lic_Agg_Main_Fed, id=c("Federation"), measured=c("Tx_Licences_0_14_Ans","Tx_Licences_15_29_Ans", "Tx_Licences_30_44_Ans", "Tx_Licences_45_59_Ans","Tx_Licences_60_Ans"))Licence_Age_Clean = Licence_Age[(Licence_Age$variable=="Tx_Licences_0_14_Ans" |       Licence_Age$variable=="Tx_Licences_15_29_Ans" | Licence_Age$variable=="Tx_Licences_30_44_Ans" |Licence_Age$variable=="Tx_Licences_45_59_Ans" |Licence_Age$variable=="Tx_Licences_60_Ans"),]  dt_Licence_Age_Clean = data.table(Licence_Age_Clean)setorder(dt_Licence_Age_Clean,-variable,na.last=TRUE)setorder(Licence_Age_Clean,variable,na.last=TRUE)graph3 = ggplot(data=Licence_Age_Clean, aes(x=Federation, y=value, fill=variable)) +geom_bar(stat="identity")+xlab("Fédération") + ylab("répartition par classe d'âge")+ggtitle("Répartition des licenciés par classe d'âge")  graph3+coord_flip()+scale_fill_brewer(palette="Paired")A la lecture du graphique ci-dessus, les sports pourraient être classés en 3 catégories : les “sports de jeunes” : ceux-ci ont plus de la motié de leurs licenciés âgés de moins de 15 ans : il s’agit de la gymnastique, du judo, du handball, de la natation, ou encore de la voile. les “sports de vieux” : on retrouve ici sans surprise la randonnée, le cyclotourisme, le golf, la pétanque, le tir ou encore les sports sous-marins. Ceux-ci voient leurs licenciés avoir plus de 45 ans pour tois quart d’entre eux. les “sports pour tous” qui correspondent à ceux qui n’ont pas encore été cités et pour lesquels classes d’âge apparaissent plus équilibrésFinallement, on peut regarder quelques sports, sur une cartemap.France = get_map(location = c(lon=1.75, lat=46.70), zoom = 6)Rugby_2015 = Licence_Max_2015[Licence_Max_2015$fed_2014=="133",]Voile_2015 = Licence_Max_2015[Licence_Max_2015$fed_2014=="128",]Ski_2015 = Licence_Max_2015[Licence_Max_2015$fed_2014=="121",]PetanQ_2015 = Licence_Max_2015[Licence_Max_2015$fed_2014=="242",]Rugby = ggmap(map.France, extent = "normal") +  geom_point(aes(x = Longitude, y = Latitude), data = Rugby_2015, colour="red", alpha = 0.5, size=2.0, na.rm=TRUE)+  theme_nothing(legend = TRUE) +  theme(legend.position = "bottom")+  ggtitle("Rugby")+  theme(plot.title = element_text(size = 10, face = "bold", hjust=0.5, color="red"))Voile = ggmap(map.France, extent = "normal") +  geom_point(aes(x = Longitude, y = Latitude), data = Voile_2015, colour="blue", alpha = 0.5, size=2.0, na.rm=TRUE)+  theme_nothing(legend = TRUE) +  theme(legend.position = "bottom")+  ggtitle("Voile")+  theme(plot.title = element_text(size = 10, face = "bold", hjust=0.5, color="blue"))Ski = ggmap(map.France, extent = "normal") +  geom_point(aes(x = Longitude, y = Latitude), data = Ski_2015, colour="grey", alpha = 0.5, size=2.0, na.rm=TRUE)+  theme_nothing(legend = TRUE) +  theme(legend.position = "bottom")+  ggtitle("Ski")+  theme(plot.title = element_text(size = 10, face = "bold", hjust=0.5, color="grey"))Petanque = ggmap(map.France, extent = "normal") +  geom_point(aes(x = Longitude, y = Latitude), data = PetanQ_2015, colour="chocolate3", alpha = 0.5, size=2.0, na.rm=TRUE)+  theme_nothing(legend = TRUE) +  theme(legend.position = "bottom")+  ggtitle("pétanque et jeu provençal")+  theme(plot.title = element_text(size = 10, face = "bold", hjust=0.5, color="chocolate3"))grid.arrange(Rugby,Voile,Ski,Petanque, ncol=2, nrow = 2,top="visualisation géographique de sports \n à fort ancrage régional")Amusant, non?