Nous allons utiliser un jeu de données concernant les élections municipales de 2014 à Marseille. Le but est d’expliquer le vote FN en fonction des variables sociologiques des bureaux de vote.

Nous disposons des deux fichiers en format csv : bvINSEE2012.csv et complet_par_bureaux.csv.

Regarder tout d’abord le fichier bvINSEE2012.csv à l’aide de la fonction read_csv2 du package readr qui est djà dans le package tidyverse. Pour ce faire, executer les commandes suivantes :

library(tidyverse)
read_csv2("bvINSEE2012.csv")
## # A tibble: 4,995 x 46
##    BUREAU_ID COUNT P09_POP P09_POP0017 P09_POP1824 P09_POP2539 P09_POP4054
##    <chr>     <dbl>   <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
##  1 21231_015     4    1721         162         533         456         221
##  2 21231_056     2    1304         154         239         267         159
##  3 21231_066     2    1361         219         146         265         224
##  4 21231_067     6    2003         225         601         509         268
##  5 21231_029     5    1277         241          88         295         270
##  6 21231_022     3    2034         462         232         507         406
##  7 21231_078     3    1317         209         221         353         216
##  8 21231_040     2     688          75         156         165         119
##  9 21231_050     2    1344         364         137         261         258
## 10 21231_074     3    1118         198         138         229         220
## # ... with 4,985 more rows, and 39 more variables: P09_POP5564 <dbl>,
## #   P09_POP6579 <dbl>, P09_POP80P <dbl>, P09_POP_FR <dbl>,
## #   P09_POP_ETR <dbl>, P09_POP1564 <dbl>, P09_CHOM1564 <dbl>,
## #   P09_INACT1564 <dbl>, P09_ETUD1564 <dbl>, P09_RETR1564 <dbl>,
## #   C09_ACT1564_CS1 <dbl>, C09_ACT1564_CS2 <dbl>, C09_ACT1564_CS3 <dbl>,
## #   C09_ACT1564_CS4 <dbl>, C09_ACT1564_CS5 <dbl>, C09_ACT1564_CS6 <dbl>,
## #   P09_SAL15P_CDI <dbl>, P09_SAL15P_CDD <dbl>, P09_SAL15P_INTERIM <dbl>,
## #   P09_SAL15P_EMPAID <dbl>, P09_SAL15P_APPR <dbl>,
## #   P09_NSAL15P_INDEP <dbl>, P09_NSAL15P_EMPLOY <dbl>,
## #   P09_NSAL15P_AIDFAM <dbl>, P09_NSCOL15P_DIPL0 <dbl>,
## #   P09_NSCOL15P_CEP <dbl>, P09_NSCOL15P_BEPC <dbl>,
## #   P09_NSCOL15P_CAPBEP <dbl>, P09_NSCOL15P_BAC <dbl>,
## #   P09_NSCOL15P_BACP2 <dbl>, P09_NSCOL15P_SUP <dbl>,
## #   P09_MEN_ANEM0002 <dbl>, P09_MEN_ANEM0204 <dbl>,
## #   P09_MEN_ANEM0509 <dbl>, P09_MEN_ANEM10P <dbl>, P09_NPER_RP_PROP <dbl>,
## #   P09_NPER_RP_LOC <dbl>, P09_NPER_RP_LOCHLMV <dbl>,
## #   P09_NPER_RP_GRAT <dbl>

Liste de quelques variables du fichier bvINSEE2012.csv:

- P09_POP : Population en 2009
- P09_POP0017 : Nombre de personnes de 0 à 17 ans en 2009
- P09_POP1824 : Nombre de personnes de 18 à 24 ans en 2009
- ....
- P09_POPFR : Population francaise en 2009
- P09_POPETR : Population extrangere en 2009
- P09_CHOM1564 : Nombre de personnes de 15 à 64 ans en chomage en 2009
- P09_INACT1564 : Nombre de personnes de 15 à 64 ans inactive en 2009
- P09_ETUD1564 : Nombre de personnes de 15 à 64 ans etudients en 2009
- C09_ACT1564_CS1 : Nombre de personnes de 15 à 64 ans Agriculteurs exploitants en 2009
- ....

Pour plus d’information sur les variables voir les sites :

https://www.insee.fr/fr/statistiques/2044741#dictionnaire

https://www.insee.fr/fr/information/2383358

Lire maintenant le fichier csv

read_csv("complet_par_bureaux.csv", 
                      col_types = cols(
                        .default = col_integer(),
                        bdv = col_character()))
## # A tibble: 478 x 19
##    bdv   inscrits  Nuls `ALLIANCE ECOLO~ `CHANGER LA DON~ `LISTE D UNITE ~
##    <chr>    <int> <int>            <int>            <int>            <int>
##  1 101       1054    20                6               64                2
##  2 102        680    14                8               19                2
##  3 104        793    12                6               44                2
##  4 121       1068    19               13               46                1
##  5 122       1282    22               20               68                1
##  6 125        803    10                9               30                0
##  7 126        920     9               10               61                2
##  8 127        862     9                9               45                0
##  9 128       1016    10                9               66                1
## 10 141        829    13               11               35                2
## # ... with 468 more rows, and 13 more variables: `LUTTE OUVRIERE FAIRE
## #   ENTENDRE LE CAMP DES TRAVAILLEURS` <int>, `MARSEILLE A GAUCHE, L
## #   HUMAIN D ABORD DANS NOTRE VILLE` <int>, `MARSEILLE A VIVRE` <int>,
## #   `MARSEILLE BLEU MARINE` <int>, `MARSEILLE EN AVANT AVEC JEAN-CLAUDE
## #   GAUDIN` <int>, `MARSEILLE ENSEMBLE` <int>, `MARSEILLE J Y
## #   CROIS` <int>, `MARSEILLE POPULAIRE` <int>, `MARSEILLE UNIE` <int>, `UN
## #   NOUVEAU CAP POUR LES MARSEILLAIS AVEC PATRICK MENNUCCI` <int>, `UNE
## #   QUALITE DE VIE POUR TOUS` <int>, `UNION POUR MARSEILLE` <int>, `Total
## #   Résultat` <int>

Télecharger le fichier Donnees_bvINSEE2012_marseille.Rsur ma page web. Regarder le fichier. Dans ce fichier nous avons appliquer certains fonctions de R pour nettoyer la basse des données et le mettre en forme. N’hesitez pas à posser des questions sur cette partie.

Utiliser la fonction source pour “sourcer” le fichier (voir par exemple https://datactivist.coop/IntroR_ODF/index2.html#les-systemes-graphiques-dans-r).

 source('Donnees_bvINSEE2012_marseille.R', encoding = 'UTF-8')

Nous allons travailler avec les variables CS1, CS2, CS3, CS4, CS5, CS6, etrangers, chomage et HLM

marseille1 <- marseille %>% select(CS1,CS2,CS3,CS4,CS5,CS6,etrangers,chomage,HLM,Ravier)
summary(marseille1)
##       CS1               CS2               CS3              CS4        
##  Min.   :0.00000   Min.   :0.08646   Min.   : 0.000   Min.   : 2.337  
##  1st Qu.:0.00000   1st Qu.:2.69266   1st Qu.: 4.883   1st Qu.:13.758  
##  Median :0.00000   Median :3.36538   Median :11.034   Median :18.351  
##  Mean   :0.05326   Mean   :3.52885   Mean   :11.389   Mean   :17.390  
##  3rd Qu.:0.00000   3rd Qu.:4.19708   3rd Qu.:17.157   3rd Qu.:21.569  
##  Max.   :2.75862   Max.   :8.04020   Max.   :31.764   Max.   :28.653  
##  NA's   :1         NA's   :1         NA's   :1        NA's   :1       
##       CS5              CS6           etrangers          chomage      
##  Min.   : 7.435   Min.   : 2.008   Min.   : 0.3205   Min.   : 1.556  
##  1st Qu.:18.553   1st Qu.: 7.930   1st Qu.: 2.6397   1st Qu.: 7.035  
##  Median :21.286   Median :11.273   Median : 4.7354   Median :10.216  
##  Mean   :21.563   Mean   :11.811   Mean   : 6.7774   Mean   :10.900  
##  3rd Qu.:24.584   3rd Qu.:15.517   3rd Qu.: 8.4764   3rd Qu.:12.918  
##  Max.   :35.045   Max.   :25.049   Max.   :34.1844   Max.   :29.871  
##  NA's   :1        NA's   :1        NA's   :1         NA's   :1       
##       HLM             Ravier      
##  Min.   : 0.000   Min.   : 1.739  
##  1st Qu.: 2.634   1st Qu.: 8.657  
##  Median : 8.840   Median :11.711  
##  Mean   :17.828   Mean   :12.025  
##  3rd Qu.:26.997   3rd Qu.:14.918  
##  Max.   :96.221   Max.   :26.594  
##  NA's   :1
marseille <- marseille %>% filter(!is.na(HLM))

marseille1 <- marseille %>% select(CS1,CS2,CS3,CS4,CS5,CS6,etrangers,chomage,HLM,Ravier)
summary(marseille1)
##       CS1               CS2               CS3              CS4        
##  Min.   :0.00000   Min.   :0.08646   Min.   : 0.000   Min.   : 2.337  
##  1st Qu.:0.00000   1st Qu.:2.69266   1st Qu.: 4.883   1st Qu.:13.758  
##  Median :0.00000   Median :3.36538   Median :11.034   Median :18.351  
##  Mean   :0.05326   Mean   :3.52885   Mean   :11.389   Mean   :17.390  
##  3rd Qu.:0.00000   3rd Qu.:4.19708   3rd Qu.:17.157   3rd Qu.:21.569  
##  Max.   :2.75862   Max.   :8.04020   Max.   :31.764   Max.   :28.653  
##       CS5              CS6           etrangers          chomage      
##  Min.   : 7.435   Min.   : 2.008   Min.   : 0.3205   Min.   : 1.556  
##  1st Qu.:18.553   1st Qu.: 7.930   1st Qu.: 2.6397   1st Qu.: 7.035  
##  Median :21.286   Median :11.273   Median : 4.7354   Median :10.216  
##  Mean   :21.563   Mean   :11.811   Mean   : 6.7774   Mean   :10.900  
##  3rd Qu.:24.584   3rd Qu.:15.517   3rd Qu.: 8.4764   3rd Qu.:12.918  
##  Max.   :35.045   Max.   :25.049   Max.   :34.1844   Max.   :29.871  
##       HLM             Ravier      
##  Min.   : 0.000   Min.   : 1.739  
##  1st Qu.: 2.634   1st Qu.: 8.703  
##  Median : 8.840   Median :11.723  
##  Mean   :17.828   Mean   :12.035  
##  3rd Qu.:26.997   3rd Qu.:14.931  
##  Max.   :96.221   Max.   :26.594
set.seed(2019) 

#ind_train <- sample(1:nrow(marseille), floor(0.8*nrow(marseille)),replace = FALSE)

library(caret)
ind_train <- createDataPartition(marseille1$Ravier,p = 0.8,list = FALSE)

head(ind_train)
##      Resample1
## [1,]         1
## [2,]         2
## [3,]         3
## [4,]         4
## [5,]         5
## [6,]         6
marseille1_train <- marseille1[ind_train,]
marseille1_test <- marseille1[-ind_train,]

Régression linéaire

model1 <- lm(Ravier ~ ., data = marseille1_train)
coef(model1)
## (Intercept)         CS1         CS2         CS3         CS4         CS5 
## 16.82631488  0.87337088 -0.08501890 -0.32556923  0.12842377  0.03866321 
##         CS6   etrangers     chomage         HLM 
##  0.33080253 -0.28119874 -0.48381577 -0.03361263
pred1 <- predict(model1, newdata = marseille1_test)
head(pred1)
##        1        2        3        4        5        6 
## 4.062950 8.395486 5.415286 7.443949 7.306947 6.668153
head(marseille1_test$Ravier)
## [1] 4.921260 6.837607 7.121880 6.275720 5.159475 9.062980
err1 <- sqrt(mean((marseille1_test$Ravier -pred1)^2))
err1
## [1] 2.992865

Validation croisée avec caret

param_train <- trainControl(method="cv",number=5)
set.seed(100)
model1 <- train(Ravier ~ ., data = marseille1, method="lm",trControl=param_train)
model1
## Linear Regression 
## 
## 477 samples
##   9 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 381, 381, 382, 383, 381 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   3.376976  0.4965156  2.575337
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
model1$finalModel
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Coefficients:
## (Intercept)          CS1          CS2          CS3          CS4  
##    16.88587      1.00095      0.05315     -0.34420      0.11656  
##         CS5          CS6    etrangers      chomage          HLM  
##     0.02543      0.32166     -0.29488     -0.45701     -0.03175
param_train <- trainControl(method="cv",number=5)
set.seed(100)
model2 <- train(Ravier ~ ., data = marseille1, method="glmnet",trControl=param_train)
model2
## glmnet 
## 
## 477 samples
##   9 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 381, 381, 382, 383, 381 
## Resampling results across tuning parameters:
## 
##   alpha  lambda       RMSE      Rsquared   MAE     
##   0.10   0.004322212  3.375457  0.4967312  2.573370
##   0.10   0.043222119  3.373349  0.4970016  2.569942
##   0.10   0.432221190  3.395388  0.4943291  2.570108
##   0.55   0.004322212  3.376268  0.4964837  2.574140
##   0.55   0.043222119  3.374656  0.4962625  2.570300
##   0.55   0.432221190  3.484162  0.4747304  2.639416
##   1.00   0.004322212  3.376529  0.4964069  2.574334
##   1.00   0.043222119  3.375517  0.4957698  2.570302
##   1.00   0.432221190  3.582100  0.4565806  2.718912
## 
## RMSE was used to select the optimal model using the smallest value.
## The final values used for the model were alpha = 0.1 and lambda
##  = 0.04322212.
coef(model2$finalModel, model2$finalModel$lambdaOpt)
## 10 x 1 sparse Matrix of class "dgCMatrix"
##                       1
## (Intercept) 16.73388816
## CS1          0.96301527
## CS2          0.04896252
## CS3         -0.33435460
## CS4          0.10929610
## CS5          0.03456805
## CS6          0.30828424
## etrangers   -0.29202914
## chomage     -0.44766427
## HLM         -0.03047082

Cartes

library(sf)
marseille_sf <- readRDS("marseille_sf.RDS")
marseille_sf_vote <- marseille_sf %>% right_join(marseille_vote, by = c("ID"="BUREAU_ID"))
ggplot(marseille_sf_vote) +
  geom_sf(aes(fill = Ravier)) +
  scale_fill_viridis_c()

marseille_sf_vote2 <- marseille_sf_vote %>%
  gather("candidat", "vote", -ID, -NOM, -geometry, -Inscrits)

ggplot(marseille_sf_vote2 %>% filter(candidat %in% c("Ravier", "Mennucci", "Gaudin", "Abstention"))) +
  geom_sf(aes(fill = vote)) +
  facet_wrap(~candidat) +
  scale_fill_viridis_c()

ggplot(marseille_sf_vote2 %>% filter(candidat %in% c("Ravier", "Mennucci", "Gaudin"))) +
  geom_sf(aes(fill = vote)) +
  facet_wrap(~candidat) +
  scale_fill_viridis_c()

N’hésitez pas à regarder le site http://coulmont.com/blog/author/coulmont/page/4/

ACP

Pour finir, taper les commandes suivantes.

marseille_PCA <- marseille_vote %>% select(-Inscrits) %>% column_to_rownames("BUREAU_ID")
library(Factoshiny)
PCAshiny(marseille_PCA)

N’hésitez pas à regarder le site

http://factominer.free.fr/graphs/factoshiny.html

A vous de jouer!