1 Présentation du problème

On s’intéresse ici au taux d’abstention à l’élection présidentielle du 1er tour en France en 2007 dans les communes de la région Midi-Pyrénées.

L’idée générale de ce projet est de mieux comprendre ce taux d’abstention en essayant de l’expliquer par des variables comme le taux de chômage, la taille des communes, le taux d’évolution du nombre de logements, etc.

Dans un premier temps, vous allez procéder aux étapes d’importation et de mise en forme des données, puis de création de nouvelles variables.

Ensuite, vous étudierez si la variable d’intérêt se comporte différemment en fonction de sa localisation géographique.

Enfin, à partir d’observations sur le taux de chômage, l’évolution du nombre de logements, le pourcentage de personnes de plus de 60 ans, la taille des communes, etc., vous vérifierez s’il existe un lien entre le taux d’abstention en 2007 et les différentes variables explicatives.

2 Préparation des données

2.2 Importation et mise en forme

2.2.1 Base INSEE sur les communes

fic1 <- read.csv("fic1.csv", sep = ";")
fic2 <- read.csv("fic2.csv", sep = ";")
fic3 <- read.csv("fic3.csv", sep = ";")

On charge des ensembles de données depuis trois fichiers CSV distincts (fic1.csv, fic2.csv, fic3.csv) en utilisant la fonction read.csv de R, en spécifiant le point-virgule comme séparateur. Ces données sont ensuite stockées dans trois variables différentes (fic1, fic2, fic3) pour une manipulation et analyse ultérieures.

2.2.2 Base sur les élections

download.file("https://www.data.gouv.fr/fr/datasets/r/3976cd54-a785-457c-9eb2-4a8619e87bcf",
destfile =paste0(getwd(), "/pres2007.xls"), mode = "wb")

pres2007 <- readxl::read_xls("pres2007.xls", skip = 1,
col_names = c("code_dep", "code_com",
"inscrits", "abstentions", "vote_xr"),
col_types = c("text", "skip", "text", "skip",
"numeric", "numeric",
rep("skip", 66), "numeric", rep("skip", 14)))
pres2007 <- as.data.frame(pres2007)
pres2007 <- pres2007[pres2007$code_dep %in% c(9, 12, 31, 32, 46, 65, 81, 82), ]

2.2.2 Base sur les élections

2.2.2.1 Convertir en caractères

fic1$CODE <- as.character(fic1$CODE)
fic2$CODEGEO <- as.character(fic2$CODEGEO)
fic3$CODGEO <- as.character(fic3$CODGEO)

On convertit les colonnes spécifiques de chaque fichier de données (fic1, fic2, fic3) en chaînes de caractères. Ces colonnes contiennent des codes géographiques qui doivent être traités comme du texte pour garantir une manipulation correcte, surtout lors de jointures ou comparaisons ultérieures entre ces fichiers.

2.2.2.2 Ajouter un “0” pour les codes à 4 chiffres

fic1$CODE <- ifelse(nchar(fic1$CODE) == 4, paste0("0", fic1$CODE), fic1$CODE)
fic2$CODEGEO <- ifelse(nchar(fic2$CODEGEO) == 4, paste0("0", fic2$CODEGEO), fic2$CODEGEO)
fic3$CODGEO <- ifelse(nchar(fic3$CODGEO) == 4, paste0("0", fic3$CODGEO), fic3$CODGEO)

On ajuste les codes géographiques dans les trois ensembles de données (fic1, fic2, fic3) pour assurer une longueur uniforme. Si un code a seulement 4 caractères, on ajoute un “0” au début. Cette standardisation est cruciale pour garantir la cohérence des codes lors de comparaisons ou de jointures de données.

2.2.2.3 Fusion des données

projet <- merge(fic1, fic2, by.x="CODE", by.y="CODEGEO")
projet <- merge(projet, fic3, by.x="CODE", by.y="CODGEO")

On réalise la fusion des ensembles de données (fic1, fic2, fic3) pour créer un seul dataframe nommé projet.

La première fusion est effectuée entre fic1 et fic2. On utilise merge avec by.x=“CODE” pour fic1 et by.y=“CODEGEO” pour fic2, assurant que la fusion se fait sur les colonnes correspondantes de codes géographiques.

Ensuite, on fusionne le résultat avec fic3, utilisant by.x=“CODE” pour le dataframe combiné et by.y=“CODGEO” pour fic3.

Cette approche permet de combiner harmonieusement les données en se basant sur des identifiants géographiques communs.

dim(projet)
## [1] 3019   21
nrow(projet)  # Donne le nombre de lignes dans projet
## [1] 3019
ncol(projet)  # Donne le nombre de colonnes dans projet
## [1] 21

Le résultat des commandes dim(projet), nrow(projet) et ncol(projet) en R nous informe sur la structure de l’ensemble de données projet après la fusion :

  • dim(projet) retourne [1] 3019 21, indiquant que projet a 3019 lignes et 21 colonnes. dim donne les dimensions complètes de la matrice ou du dataframe.
  • nrow(projet) retourne [1] 3019, confirmant que projet contient 3019 lignes.
  • nrow donne le nombre de lignes.
  • ncol(projet) retourne [1] 21, confirmant que projet contient 21 colonnes. ncol donne le nombre de colonnes.

Cela montre que l’ensemble de données résultant de la fusion contient un grand nombre d’observations (lignes) et plusieurs variables (colonnes) pour l’analyse.

2.2.2.4 Gestion des valeurs manquantes et création de nouvelles variables

sum(is.na(projet))  # Pour compter le nombre total de NA dans tout le dataframe
## [1] 42
sapply(projet, function(x) sum(is.na(x)))  # Pour compter les NA dans chaque colonne
##           CODE            NOM           LONG            LAT          annee 
##              0              0              0              0             30 
##     evol_INSEE          pop_n       pop_1999     tx_evol_99     tx_evol_90 
##              0              0              0              0              0 
##      pct_60ans      densite99      densite07      chomage99      chomage07 
##              0              0              2              5              3 
## pct_logement99 pct_logement07        Commune          categ         ZE2010 
##              0              0              0              2              0 
##      LIBZE2010 
##              0

2.2.2.5 Vérifier s’il y a des valeurs manquantes pour la variable categ dans la base projet. Si oui, identifier la (ou les) communes concernée(s).

lignes_avec_na <- which(is.na(projet$categ))
communes_concernées <- projet[lignes_avec_na, "Commune"]
print(communes_concernées)
## [1] "Itzac"         "Jonqui\xe8res"
str(projet)
## 'data.frame':    3019 obs. of  21 variables:
##  $ CODE          : chr  "09001" "09002" "09003" "09004" ...
##  $ NOM           : chr  "Aigues-Juntes" "Aigues-Vives" "L'Aiguillon" "Albi\xe8s" ...
##  $ LONG          : chr  "529600,04" "562700,0002" "564649,9818" "547550,0906" ...
##  $ LAT           : chr  "1783850,037" "1777100,092" "1767400,025" "1750300,019" ...
##  $ annee         : int  2005 2005 2005 2006 2008 2005 2005 2004 2006 2005 ...
##  $ evol_INSEE    : chr  "-2,81291284" "0,921379307" "-1,007711904" "-1,029735342" ...
##  $ pop_n         : int  43 498 403 139 146 65 68 121 206 64 ...
##  $ pop_1999      : int  49 486 424 151 122 62 65 135 163 58 ...
##  $ tx_evol_99    : chr  "1,727537604" "0,564294318" "-1,368906839" "0,764238245" ...
##  $ tx_evol_90    : chr  "-4,159370002" "3,945402356" "1,180069888" "-0,262821633" ...
##  $ pct_60ans     : chr  "0,510204082" "0,160493827" "0,325471698" "0,397350993" ...
##  $ densite99     : chr  "6,31" "94,19" "66,56" "19,64" ...
##  $ densite07     : chr  "5,08" "101,27" "61,4" "18,09" ...
##  $ chomage99     : chr  "25" "5,49" "11,38" "5,66" ...
##  $ chomage07     : chr  "0" "13,57" "15,76" "3,85" ...
##  $ pct_logement99: chr  "-0,67" "2,72" "-0,24" "0,66" ...
##  $ pct_logement07: chr  "0,66" "2,87" "0,63" "2,88" ...
##  $ Commune       : chr  "Aigues-Juntes" "Aigues-Vives" "L'Aiguillon" "Albi\xe8s" ...
##  $ categ         : int  400 400 300 400 400 400 400 300 400 400 ...
##  $ ZE2010        : int  7301 7301 7301 7301 7302 7301 7301 7302 7301 7302 ...
##  $ LIBZE2010     : chr  "Foix - Pamiers" "Foix - Pamiers" "Foix - Pamiers" "Foix - Pamiers" ...

2.2.2 Base sur les élections

2.2.2.1 Transformer la variable code_com pour qu’elle devienne une chaîne de caractère à 3 caractères en la complétant par des “0” par devant si elle n’a pas déjà 3 caractères. Par exemple, la chaîne de caractère “1” deviendra “001”, la chaîne de caractère “12” deviendra “012”, la chaîne de caractère “111” restera “111”. On pourra utiliser les fonctions nchar() et paste0().

# Convertir code_com en caractère si ce n'est pas déjà le cas
pres2007$code_com <- as.character(pres2007$code_com)

# Transformer code_com pour qu'il ait toujours 3 caractères
pres2007$code_com <- ifelse(nchar(pres2007$code_com) == 1, paste0("00", pres2007$code_com),
                            ifelse(nchar(pres2007$code_com) == 2, paste0("0", pres2007$code_com), 
                                   pres2007$code_com))

On convertit d’abord la colonne code_com de pres2007 en chaînes de caractères pour s’assurer de sa manipulation correcte en tant que texte. Ensuite, on ajuste code_com pour garantir que chaque code ait toujours 3 caractères. On ajoute des zéros au début si nécessaire, en utilisant ifelse et paste0. Cela standardise le format des codes, essentiel pour les analyses et les jointures de données.

head(pres2007$code_com, 5)
## [1] "001" "002" "003" "004" "005"

2.2.2.2 créer la variable CODE qui est la concaténation des variables code_dep et code_com

# Assurez-vous que code_dep et code_com sont des chaînes de caractères
pres2007$code_dep <- as.character(pres2007$code_dep)
pres2007$code_com <- as.character(pres2007$code_com)

# Créer la variable CODE par concaténation
pres2007$CODE <- paste0(pres2007$code_dep, pres2007$code_com)

On s’assure d’abord que code_dep et code_com dans pres2007 sont des chaînes de caractères, en utilisant as.character. Cela est crucial pour le traitement des données textuelles.

Ensuite, on crée une nouvelle variable CODE en concaténant code_dep et code_com avec paste0. Cette étape permet de générer un code unique qui combine les informations de département et de commune.

2.2.2.3 Ajouter un “0” aux codes des communes qui ne contiennent que 4 caractères

# Assurez-vous que CODE est une chaîne de caractères
pres2007$CODE <- as.character(pres2007$CODE)

# Ajouter un "0" devant les codes qui ont seulement 4 caractères
pres2007$CODE <- ifelse(nchar(pres2007$CODE) == 4, paste0("0", pres2007$CODE), pres2007$CODE)

On commence par s’assurer que CODE dans pres2007 est une chaîne de caractères avec as.character. Cela garantit le traitement adéquat des codes comme du texte.

Puis, on ajoute un “0” au début des codes qui ont seulement 4 caractères, en utilisant ifelse et paste0. Cette étape normalise la longueur des codes pour une uniformité essentielle dans les analyses de données.

2.2.2.4 Faites le merge de la base de données projet avec la base pres2007

# Fusionner projet et pres2007 en utilisant la clé commune CODE

projet <- merge(projet, pres2007, by="CODE")

On fusionne les ensembles de données projet et pres2007 en utilisant la clé commune CODE. Pour cela, on utilise la fonction merge et on conserve le nom projet pour le dataframe résultant. Cette fusion permet d’intégrer les données électorales de pres2007 dans l’analyse globale.

str(projet)
## 'data.frame':    3019 obs. of  26 variables:
##  $ CODE          : chr  "09001" "09002" "09003" "09004" ...
##  $ NOM           : chr  "Aigues-Juntes" "Aigues-Vives" "L'Aiguillon" "Albi\xe8s" ...
##  $ LONG          : chr  "529600,04" "562700,0002" "564649,9818" "547550,0906" ...
##  $ LAT           : chr  "1783850,037" "1777100,092" "1767400,025" "1750300,019" ...
##  $ annee         : int  2005 2005 2005 2006 2008 2005 2005 2004 2006 2005 ...
##  $ evol_INSEE    : chr  "-2,81291284" "0,921379307" "-1,007711904" "-1,029735342" ...
##  $ pop_n         : int  43 498 403 139 146 65 68 121 206 64 ...
##  $ pop_1999      : int  49 486 424 151 122 62 65 135 163 58 ...
##  $ tx_evol_99    : chr  "1,727537604" "0,564294318" "-1,368906839" "0,764238245" ...
##  $ tx_evol_90    : chr  "-4,159370002" "3,945402356" "1,180069888" "-0,262821633" ...
##  $ pct_60ans     : chr  "0,510204082" "0,160493827" "0,325471698" "0,397350993" ...
##  $ densite99     : chr  "6,31" "94,19" "66,56" "19,64" ...
##  $ densite07     : chr  "5,08" "101,27" "61,4" "18,09" ...
##  $ chomage99     : chr  "25" "5,49" "11,38" "5,66" ...
##  $ chomage07     : chr  "0" "13,57" "15,76" "3,85" ...
##  $ pct_logement99: chr  "-0,67" "2,72" "-0,24" "0,66" ...
##  $ pct_logement07: chr  "0,66" "2,87" "0,63" "2,88" ...
##  $ Commune       : chr  "Aigues-Juntes" "Aigues-Vives" "L'Aiguillon" "Albi\xe8s" ...
##  $ categ         : int  400 400 300 400 400 400 400 300 400 400 ...
##  $ ZE2010        : int  7301 7301 7301 7301 7302 7301 7301 7302 7301 7302 ...
##  $ LIBZE2010     : chr  "Foix - Pamiers" "Foix - Pamiers" "Foix - Pamiers" "Foix - Pamiers" ...
##  $ code_dep      : chr  "9" "9" "9" "9" ...
##  $ code_com      : chr  "001" "002" "003" "004" ...
##  $ inscrits      : num  54 379 334 134 189 49 62 159 166 93 ...
##  $ abstentions   : num  2 35 31 17 24 5 4 24 10 14 ...
##  $ vote_xr       : num  2 53 49 7 11 7 2 10 8 5 ...

2.3 Création de variables

2.3.1 Variable pct_abst, pct_inscrits et pct_xr

2.3.1.1 Créer la variable pct_abst qui est le rapport de la variable abstentions sur inscrits

# Créer la variable pct_abst
projet$pct_abst <- projet$abstentions / projet$inscrits

On crée une nouvelle variable pct_abst dans le dataframe projet, qui est calculée comme le rapport des abstentions sur les inscrits. Cette opération se fait par une simple division.

2.3.1.2 Créer la variable pct_inscrits qui est le rapport de la variable inscrits sur pop_n

# Créer la variable pct_inscrits
projet$pct_inscrits <- (projet$inscrits / projet$pop_n)

On crée la variable pct_inscrits dans le dataframe projet, qui est calculée comme le rapport des inscrits sur la population totale pop_n. Cette variable représente le pourcentage des inscrits par rapport à la population totale, ce qui peut donner des insights sur la participation électorale relative à la population.

2.3.1.3 Créer la variable pct_xr qui est le rapport de la variable vote_xr sur pop_n

# Créer la variable pct_xr
projet$pct_xr <- (projet$vote_xr / projet$pop_n)

On crée une nouvelle variable pct_xr dans le dataframe projet, qui est le résultat du rapport entre vote_xr et pop_n. Cette variable indique le pourcentage de votes pour un candidat spécifique (identifié par ‘xr’) par rapport à la population totale, offrant une perspective sur l’impact et la popularité du candidat à l’échelle de la population.

2.3.2 Créer la variable HAU qui regroupe les modalités de la variable categ en 3 modalités

projet$HAU <- ifelse(is.na(projet$categ) | projet$categ == '', NA, 
                     ifelse(projet$categ %in% c(111, 112, 120), 'urbain', 'rural'))

On crée la variable HAU dans le dataframe projet, qui est une simplification de la variable categ. Cette nouvelle variable catégorise les données en trois modalités : ‘urbain’, ‘rural’, et NA (valeur manquante).

  • Si categ est non disponible (NA) ou vide, HAU est défini comme NA.
  • Si categ appartient à [111, 112, 120], cela signifie un environnement ‘urbain’.
  • Sinon, les autres cas sont classés comme ‘rural’.

Cette transformation permet une analyse plus simplifiée et ciblée des données en fonction du type de zone géographique.

2.3.3 Variable taille

projet$taille <- with(projet, ifelse(pop_n < 2000, "rural",
                     ifelse(pop_n < 5000, "urbain3500",
                     ifelse(pop_n < 10000, "urbain7500",
                     ifelse(pop_n < 20000, "urbain15000",
                     ifelse(pop_n < 50000, "urbain35000",
                     ifelse(pop_n < 100000, "urbain75000",
                     ifelse(pop_n < 200000, "urbain150000",
                            "urbainHuge"))))))))

On crée la variable taille dans le dataframe projet pour catégoriser les communes selon leur population (pop_n). Cette classification est faite en plusieurs niveaux :

  • Moins de 2000 habitants : “rural”.
  • Entre 2000 et 4999 habitants : “urbain3500”.
  • Entre 5000 et 9999 habitants : “urbain7500”.
  • Entre 10000 et 19999 habitants : “urbain15000”.
  • Entre 20000 et 49999 habitants : “urbain35000”.
  • Entre 50000 et 99999 habitants : “urbain75000”.
  • Entre 100000 et 199999 habitants : “urbain150000”.
  • 200000 habitants et plus : “urbainHuge”.

Cette classification permet une analyse détaillée des données en fonction de la taille des communes, offrant une perspective sur les différences entre zones rurales et urbaines à différents niveaux de population.

2.4 Valeurs manquantes/incohérentes

2.4.1 Donner le nombre de communes qui contiennent des valeurs manquantes pour la variable annee.

# Calculer le nombre de valeurs manquantes pour la variable annee
nombre_communes_na_annee <- sum(is.na(projet$annee))

# Imprimer le résultat
nombre_communes_na_annee
## [1] 30

Cette commande utilise is.na pour identifier les valeurs manquantes dans annee et sum pour les comptabiliser.

Le résultat obtenu est 30, ce qui indique que 30 communes dans l’ensemble de données projet ont des valeurs manquantes pour la variable annee.

2.4.2 Représenter la table des fréquences de la variable taille uniquement sur l’échantillon contenant les communes qui ont des valeurs manquantes pour la variable annee. Que remarquez-vous ?

# Sous-ensemble de communes avec annee manquant
communes_na_annee <- projet[is.na(projet$annee), ]

# Table des fréquences pour taille dans ce sous-ensemble
frequences_taille <- table(communes_na_annee$taille)

# Affichage des fréquences
frequences_taille
## 
## urbain15000 urbain35000  urbain7500 urbain75000  urbainHuge 
##          16          11           1           1           1

Il y a un nombre plus important de communes classées dans les catégories urbain15000 et urbain35000, ce qui indique que ces zones plus peuplées sont plus susceptibles d’avoir des valeurs manquantes pour l’année. Les catégories supérieures (urbain7500, urbain75000, urbainHuge) ne comptent chacune qu’une seule commune, ce qui suggère que les valeurs manquantes sont moins fréquentes dans les communes de très grande taille et très petites qui ne sont même pas listées. Cela pourrait pointer vers une tendance où les données sur les années sont plus complètes pour les communes très grandes ou très petites, ou cela pourrait simplement refléter la répartition générale des tailles des communes dans le dataset.

2.4.3 Remplacer les valeurs manquantes de annee par la valeur 2010.

# Remplacer les NA dans annee par 2010
projet$annee[is.na(projet$annee)] <- 2010

Cette commande identifie d’abord les emplacements des valeurs manquantes dans annee avec is.na(projet$annee) et les remplace ensuite par 2010.

2.4.4 Enlever de la table projet la ligne dont CODE est égal à “81107”

# Supprimer la ligne où CODE est égal à "81107"
projet <- projet[projet$CODE != "81107", ]

Cette commande utilise une condition de filtrage (projet$CODE != “81107”) pour conserver toutes les lignes sauf celle dont le CODE est “81107”, effectuant ainsi la suppression souhaitée.

2.4.5 Remplacer les valeurs manquantes de la variable categ par les modalités qui vous semblent les plus appropriées. Vous justifierez votre choix. Pensez à recalculer la valeur de la variable HAU pour ces deux observations.

# Installer et charger le package randomForest si nécessaire
if (!require(randomForest)) install.packages("randomForest")
library(randomForest)

# Supprimer les observations avec des valeurs manquantes dans les variables explicatives
data_complete <- na.omit(projet[, c('categ', 'pop_n', 'pct_logement07', 'chomage07', 'densite07')])

# Créer le modèle de forêt aléatoire sur le sous-ensemble de données sans NA
modele_rf <- randomForest(categ ~ pop_n + pct_logement07 + chomage07 + densite07, 
                          data=data_complete)

# Prédire les valeurs de 'categ' pour les lignes où 'categ' est manquant

data_to_predict <- projet[is.na(projet$categ), c('pop_n', 'pct_logement07', 'chomage07', 'densite07')]
data_to_predict <- na.omit(data_to_predict)
predictions <- predict(modele_rf, newdata=data_to_predict)

# Remplacer les valeurs manquantes de 'categ' par les prédictions
projet$categ[is.na(projet$categ)] <- predictions

# Recalculer la variable HAU basée sur les nouvelles valeurs de 'categ'
projet$HAU <- ifelse(projet$categ %in% c(111, 112, 120), 'urbain', 
                     ifelse(is.na(projet$categ), NA, 'rural'))

On a choisi les variables ‘pop_n’, ‘pct_logement07’, ‘chomage07’, et ‘densite07’ comme indicateurs pour imputer la catégorie des communes car :

  • ‘pop_n’ reflète la taille de la commune, ce qui influence fortement sa catégorie urbaine ou rurale.
  • ‘pct_logement07’ peut indiquer le développement et le dynamisme résidentiel d’une commune.
  • ‘chomage07’ est un signe de l’activité économique, les zones avec moins de chômage tendant à être des centres urbains.
  • ‘densite07’ donne une idée de l’urbanisation, les zones plus denses étant souvent des pôles urbains.

Ces variables ensemble donnent un aperçu global de l’attractivité et de la classification socioéconomique des communes.

2.4.6 Quelles sont les communes qui ont des valeurs manquantes pour la variable chomage99 et chomage07 ? Remplacer ces valeurs manquantes par une valeur qui vous semble la plus appropriée. Important : vous devrez expliquer/justifier votre choix.

# Identifier les communes avec des valeurs manquantes pour chomage99
communes_na_chomage99 <- projet[is.na(projet$chomage99), 'Commune']

# Identifier les communes avec des valeurs manquantes pour chomage07
communes_na_chomage07 <- projet[is.na(projet$chomage07), 'Commune']

# Afficher les résultats
print(paste("Les communes qui ont des valeurs manquantes pour la variable chomage99 :", paste(communes_na_chomage99, collapse = ", ")))
## [1] "Les communes qui ont des valeurs manquantes pour la variable chomage99 : Pointis-de-Rivi\xe8re, Pointis-Inard, Barre, Moulin-Mage, Murat-sur-V\xe8bre"
print(paste("Les communes qui ont des valeurs manquantes pour la variable chomage07 :", paste(communes_na_chomage07, collapse = ", ")))
## [1] "Les communes qui ont des valeurs manquantes pour la variable chomage07 : Barre, Moulin-Mage, Murat-sur-V\xe8bre"
# Calculer la moyenne pour chomage99 et chomage07
moyenne_chomage99 <- mean(projet$chomage99, na.rm = TRUE)
## Warning in mean.default(projet$chomage99, na.rm = TRUE): l'argument n'est ni
## numérique, ni logique : renvoi de NA
moyenne_chomage07 <- mean(projet$chomage07, na.rm = TRUE)
## Warning in mean.default(projet$chomage07, na.rm = TRUE): l'argument n'est ni
## numérique, ni logique : renvoi de NA
# Remplacer les valeurs manquantes par la moyenne
projet$chomage99[is.na(projet$chomage99)] <- moyenne_chomage99
projet$chomage07[is.na(projet$chomage07)] <- moyenne_chomage07

Quand on tombe sur des valeurs manquantes dans des données, on aime bien utiliser la moyenne pour les remplacer. C’est simple et ça marche souvent bien, surtout pour des chiffres comme les taux de chômage. Mais il faut faire attention, car cette méthode peut parfois rendre les données moins variées. Si les valeurs manquantes ne sont pas réparties au hasard et sont liées à certaines spécificités des communes, utiliser la moyenne pourrait fausser nos analyses. Dans ces cas, on préférerait utiliser des techniques plus complexes pour estimer ces valeurs manquantes.

2.4.7 Quelles sont les communes qui ont des valeurs manquantes pour la variable densite07 ? Dans quel département sont situées les communes correspondantes ? Remplacer ces valeurs manquantes par une valeur qui vous semble la plus appropriée en expliquant/justifiant votre choix

# Identifier les communes avec valeurs manquantes pour densite07
communes_na_densite07 <- projet[is.na(projet$densite07), 'Commune']

# Afficher les communes
print("Communes avec valeurs manquantes pour densite07 :")
## [1] "Communes avec valeurs manquantes pour densite07 :"
print(communes_na_densite07)
## [1] "Viella"                "Villecomtal-sur-Arros"
# Identifier les départements des communes avec valeurs manquantes pour densite07
departements_communes_na_densite07 <- projet[is.na(projet$densite07), 'departement']

# Afficher les départements
print("Départements des communes avec valeurs manquantes pour densite07 :")
## [1] "Départements des communes avec valeurs manquantes pour densite07 :"
print(unique(departements_communes_na_densite07))
## NULL
# Créer la variable département basée sur les premiers chiffres de CODE
projet <- projet %>%
  mutate(département = case_when(
    substr(CODE, 1, 2) == "09" ~ "Ariège",
    substr(CODE, 1, 2) == "12" ~ "Aveyron",
    substr(CODE, 1, 2) == "31" ~ "Haute-Garonne",
    substr(CODE, 1, 2) == "32" ~ "Gers",
    substr(CODE, 1, 2) == "46" ~ "Lot",
    substr(CODE, 1, 2) == "65" ~ "Hautes-Pyrénées",
    substr(CODE, 1, 2) == "81" ~ "Tarn",
    substr(CODE, 1, 2) == "82" ~ "Tarn-et-Garonne",
    TRUE ~ NA_character_  # pour les cas ne correspondant à aucune des conditions ci-dessus
  ))

On a créé la variable département dans notre dataframe pour faciliter l’analyse des données au niveau départemental. La variable originale CODE fournit des informations détaillées au niveau des communes, mais pour certaines analyses, il est plus pertinent d’examiner les tendances et les modèles à un niveau plus global, c’est-à-dire au niveau des départements. En regroupant les différentes communes sous leur département respectif, on peut désormais effectuer des analyses plus généralisées et identifier des tendances qui pourraient être masquées dans une analyse à une échelle plus fine. Cette approche nous permet d’obtenir une meilleure compréhension des dynamiques régionales et de faire des comparaisons significatives entre différents départements.

# Sélectionner les lignes avec des valeurs manquantes pour densite07
lignes_avec_na_densite07 <- projet[is.na(projet$densite07), ]

# Créer un dataframe avec les codes et les noms des départements
departements_avec_na_densite07 <- data.frame(
  CODE = lignes_avec_na_densite07$CODE, 
  Departement = lignes_avec_na_densite07$département
)

# Supprimer les doublons
departements_avec_na_densite07 <- unique(departements_avec_na_densite07)

# Afficher les codes et les noms des départements
print(departements_avec_na_densite07)
##    CODE Departement
## 1 32463        Gers
## 2 32464        Gers
# Calculer la médiane de densite07 par département
medians_par_departement <- aggregate(densite07 ~ département, data = projet, FUN = median, na.rm = TRUE)
## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]):
## l'argument n'est ni numérique, ni logique : renvoi de NA

## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]):
## l'argument n'est ni numérique, ni logique : renvoi de NA

## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]):
## l'argument n'est ni numérique, ni logique : renvoi de NA

## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]):
## l'argument n'est ni numérique, ni logique : renvoi de NA

## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]):
## l'argument n'est ni numérique, ni logique : renvoi de NA
# Remplacer les valeurs manquantes dans densite07
for(dep in medians_par_departement$département) {
  idx <- is.na(projet$densite07) & projet$département == dep
  projet$densite07[idx] <- medians_par_departement$densite07[medians_par_departement$département == dep]
}

On a choisi de remplacer les valeurs manquantes de la variable densite07 par la médiane de chaque département pour plusieurs raisons. Tout d’abord, la médiane est moins sensible aux valeurs extrêmes, ce qui est crucial dans les données de densité de population où l’on peut rencontrer des écarts importants. De plus, en utilisant la médiane par département, on s’assure que l’imputation reflète les particularités régionales, en supposant que les communes d’un même département ont tendance à avoir des densités de population similaires. Cette méthode permet de maintenir l’intégrité et la représentativité des données sans introduire de biais significatifs dus à des valeurs aberrantes ou des variations régionales.

2.4.8 Quelle est la valeur maximum de la variable chomage07. Pour la (ou les) commune(s) concernée(s) par cette valeur maximum, la remplacer par la valeur du chômage observée sur cette même commune en 1999

# Trouver la valeur maximale de chomage07
max_chomage07 <- max(projet$chomage07, na.rm = TRUE)

# Identifier les communes avec ce taux de chômage maximal
communes_max_chomage07 <- projet$CODE[projet$chomage07 == max_chomage07]

# Remplacer le taux de chômage de 2007 par celui de 1999 pour ces communes
# Laisser les valeurs telles quelles si chomage99 est NA
projet$chomage07[projet$CODE %in% communes_max_chomage07] <- ifelse(is.na(projet$chomage99[projet$CODE %in% communes_max_chomage07]),  projet$chomage07[projet$CODE %in% communes_max_chomage07], projet$chomage99[projet$CODE %in% communes_max_chomage07])

On a choisi de laisser les valeurs de chômage de 2007 telles quelles pour les communes où le chômage de 1999 est manquant. Cette décision repose sur le principe de ne pas introduire d’informations potentiellement inexactes dans l’analyse. Si nous n’avons pas de données fiables sur le chômage de 1999 pour ces communes, remplacer les taux de 2007 par des estimations ou des valeurs arbitraires pourrait fausser notre compréhension de la situation économique réelle. Par conséquent, on préfère conserver une approche transparente et rigoureuse, en acceptant l’absence de certaines données plutôt que de risquer d’introduire des erreurs.

2.4.9 Afficher les communes dont la variable pct_inscrits est supérieure à 3. Selon vous, comment se fait-il que ce rapport soit aussi élevé ?

# Sélectionner et afficher les communes avec un pct_inscrits supérieur à 3
communes_pct_inscrits_eleve <- projet[projet$pct_inscrits > 3, ]
print(communes_pct_inscrits_eleve)
##      CODE               NOM        LONG         LAT annee   evol_INSEE pop_n
## 131 09134        Gesti\xe8s 538600,0431 1745599,966  2008 -1,308371863     9
## 192 09197        Montaillou 564650,0964 1753350,052  2004  2,456640318    10
## 341 12009 Arnac-sur-Dourdou 649299,9656 1857599,991  2007 -3,662412206    23
## 681 31046             Baren 460800,0297 1764599,998  2008 -3,532137004     5
##     pop_1999   tx_evol_99   tx_evol_90   pct_60ans densite99 densite07
## 131       10 -7,913099374 -5,845182219         0,9      0,36      0,33
## 192       14 -7,037639823  3,822557081         0,5      1,63      1,99
## 341       31 -6,171835042  1,716212753 0,580645161      1,87      1,39
## 681        8  3,248103198            0         0,5      2,61       1,8
##     chomage99 chomage07 pct_logement99 pct_logement07           Commune categ
## 131         0         0           0,13           0,07        Gesti\xe8s   300
## 192         0        20           1,86            1,1        Montaillou   400
## 341         0         0           1,15           1,17 Arnac-sur-Dourdou   400
## 681         0         0           2,95           7,33             Baren   222
##     ZE2010      LIBZE2010 code_dep code_com inscrits abstentions vote_xr
## 131   7301 Foix - Pamiers        9      134       36           2       2
## 192   7301 Foix - Pamiers        9      197       44           3       0
## 341   7303         Millau       12      009       83          13      12
## 681   7306  Saint-Gaudens       31      046       19           2       0
##       pct_abst pct_inscrits    pct_xr   HAU taille   département
## 131 0.05555556     4.000000 0.2222222 rural  rural        Ariège
## 192 0.06818182     4.400000 0.0000000 rural  rural        Ariège
## 341 0.15662651     3.608696 0.5217391 rural  rural       Aveyron
## 681 0.10526316     3.800000 0.0000000 rural  rural Haute-Garonne
# Sélectionner uniquement les colonnes NOM et Département
resultat <- communes_pct_inscrits_eleve[, c('NOM', 'département')]

# Ajouter une colonne avec le total des observations
resultat$total <- nrow(communes_pct_inscrits_eleve)

# Afficher le résultat
print(resultat)
##                   NOM   département total
## 131        Gesti\xe8s        Ariège     4
## 192        Montaillou        Ariège     4
## 341 Arnac-sur-Dourdou       Aveyron     4
## 681             Baren Haute-Garonne     4

On a choisi de laisser les valeurs de chômage de 2007 telles quelles pour les communes où le chômage de 1999 est manquant. Notre décision repose sur le principe de ne pas introduire d’informations potentiellement inexactes dans l’analyse. Si on n’a pas de données fiables sur le chômage de 1999 pour ces communes, remplacer les taux de 2007 par des estimations ou des valeurs arbitraires pourrait fausser notre compréhension de la situation économique réelle. Par conséquent, on préfère conserver une approche transparente et rigoureuse, en acceptant l’absence de certaines données plutôt que de risquer d’introduire des erreurs.

3 Analyse univariée

3.1 Calcul du taux d’abstention moyen

3.1.1 calculer le taux d’abstention moyen en Midi-Pyrénées en 2007

# Calculer le taux d'abstention pour chaque commune
projet$taux_abstention <- projet$abstentions / projet$inscrits

# Calculer le taux d'abstention moyen pondéré pour la région Midi-Pyrénées
taux_abstention_moyen_pondere <- sum(projet$taux_abstention * projet$inscrits, na.rm = TRUE) / sum(projet$inscrits, na.rm = TRUE)

# Afficher le taux d'abstention moyen pondéré
taux_abstention_moyen_pondere
## [1] 0.1218067

Pour calculer le taux d’abstention moyen en Midi-Pyrénées en 2007, on prend en compte le nombre d’abstentions et le nombre d’inscrits dans chaque commune. On ne fait pas simplement une moyenne arithmétique, car cela ne tiendrait pas compte de la taille des communes. À la place, on utilise une moyenne pondérée qui donne plus de poids aux communes avec plus d’inscrits. Cela nous donne un taux d’abstention moyen qui reflète mieux la réalité de l’ensemble de la région. En gros, on multiplie le taux d’abstention de chaque commune par son nombre d’inscrits, on fait la somme, et on divise ensuite par le nombre total d’inscrits de toutes les communes. C’est la méthode la plus juste pour obtenir un taux moyen représentatif.

3.1.2 calculer le taux d’abstention par département

# Supposons que 'projet' est votre dataframe et qu'il contient les colonnes nécessaires.

# Calculer le taux d'abstention pour chaque commune
projet$taux_abstention <- projet$abstentions / projet$inscrits

# Aggréger les données par département
aggregated_data <- aggregate(cbind(abstentions_ponderees = projet$abstentions, inscrits = projet$inscrits) ~ département, data = projet, sum)

# Calculer le taux d'abstention moyen pondéré par département (en pourcentage)
aggregated_data$taux_abstention_moyen <- (aggregated_data$abstentions_ponderees / aggregated_data$inscrits) * 100

# Afficher le taux d'abstention moyen pondéré par département
print(aggregated_data[, c('département', 'taux_abstention_moyen')])
##       département taux_abstention_moyen
## 1          Ariège              12.85151
## 2         Aveyron              11.78635
## 3            Gers              11.62738
## 4   Haute-Garonne              12.48818
## 5 Hautes-Pyrénées              13.32036
## 6             Lot              10.98227
## 7            Tarn              11.58789
## 8 Tarn-et-Garonne              11.97892

Pour obtenir le taux d’abstention dans chaque département, on divise d’abord les données par département. Ensuite, pour chaque groupe, on calcule un taux d’abstention moyen pondéré, en prenant en compte le nombre d’inscrits de chaque ville. Cela permet de donner plus d’importance aux villes avec plus d’électeurs. Ce n’est pas juste une moyenne simple, car une petite ville aura moins de poids qu’une grande ville. C’est un peu comme équilibrer les plateaux d’une balance : les villes avec plus d’inscrits font pencher la balance plus que celles avec moins d’inscrits.

3.1.3 calculer le taux d’abstention en fonction de HAU

# Calculer le taux d'abstention pour chaque commune
projet$taux_abstention <- projet$abstentions / projet$inscrits

# Aggréger les données par HAU
aggregated_data_HAU <- aggregate(cbind(abstentions_ponderees = projet$abstentions, inscrits = projet$inscrits) ~ HAU, data = projet, sum)

# Calculer le taux d'abstention moyen pondéré par HAU (en pourcentage)
aggregated_data_HAU$taux_abstention_moyen <- (aggregated_data_HAU$abstentions_ponderees / aggregated_data_HAU$inscrits) * 100

# Afficher le taux d'abstention moyen pondéré par HAU
print(aggregated_data_HAU[, c('HAU', 'taux_abstention_moyen')])
##      HAU taux_abstention_moyen
## 1  rural              12.39801
## 2 urbain              12.06316

Pour comprendre l’impact de l’urbanisation sur la participation électorale, on a calculé le taux d’abstention moyen pour les zones urbaines et rurales, en utilisant le statut HAU de chaque commune. On a pris en compte le nombre d’inscrits pour s’assurer que les communes avec plus d’électeurs pèsent plus dans le calcul. Cela nous permet d’obtenir un taux d’abstention moyen qui reflète fidèlement le comportement des électeurs dans les différentes zones, en donnant une image plus précise de la participation électorale selon le caractère urbain ou rural des communes.

3.1.4 Commenter succinctement ces résultats, en gardant en tête la problématique qu’on s’est fixé au début du devoir.

Après avoir analysé les données, on constate que le taux d’abstention moyen en Midi-Pyrénées en 2007 était d’environ 12.18%. Il existe des variations entre les départements, avec un taux plus élevé dans les Hautes-Pyrénées et plus bas dans le Lot, ce qui peut refléter des influences locales spécifiques sur la participation électorale. En examinant les taux d’abstention par zone urbaine et rurale, on observe que les zones rurales ont un taux d’abstention légèrement plus élevé. Ces nuances sont cruciales pour cibler et améliorer la participation électorale dans différentes parties de la région.

3.2 Représentation de la variable pct_abst

# Calculer la moyenne pondérée
mean_weighted <- weighted.mean(projet$pct_abst, w = projet$inscrits, na.rm = TRUE)

# Calculer l'écart-type pondéré
sd_weighted <- sqrt(sum(projet$inscrits * (projet$pct_abst - mean_weighted)^2, na.rm = TRUE) / sum(projet$inscrits, na.rm = TRUE))

# Tracer l'histogramme
hist(projet$pct_abst, probability = TRUE, main = "Histogramme de pct_abst",
     xlab = "Pourcentage d'abstention", ylab = "Densité", border = "blue", col = "lightblue", ylim = c(0, 13))

# Estimation de la densité non paramétrique et la superposer
density_est <- density(na.omit(projet$pct_abst))
lines(density_est, col = 'blue')

# Tracer la courbe de la densité normale
x_vals <- seq(min(projet$pct_abst, na.rm = TRUE), max(projet$pct_abst, na.rm = TRUE), length.out = 100)
normal_density <- dnorm(x_vals, mean = mean_weighted, sd = sd_weighted)
lines(x_vals, normal_density, col = 'red')

En observant l’histogramme des taux d’abstention (pct_abst), on note que la distribution des données semble centrée autour d’une valeur inférieure à 0.2, ou 20%. La courbe rouge, qui estime la densité de la distribution, indique où les données se concentrent le plus. La courbe bleue, représentant la fonction de densité d’une loi normale, montre ce à quoi ressemblerait notre distribution si elle suivait une distribution normale avec la même moyenne et écart-type que nos données.

Il est clair que la distribution réelle des taux d’abstention est un peu asymétrique avec une concentration sur les valeurs plus basses, ce qui suggère que dans la plupart des communes, le taux d’abstention était relativement modéré. On peut interpréter cela comme une tendance générale à une participation assez bonne lors de l’élection concernée. La longue queue à droite de l’histogramme indique également la présence de quelques communes avec des taux d’abstention beaucoup plus élevés, ce qui pourrait mériter une enquête plus approfondie pour comprendre les facteurs sous-jacents dans ces cas particuliers.

3.2.1 En utilisant un des tests vu en cours, pouvez-vous dire si cette variable est gaussienne ?

# Exécuter le test de Shapiro-Wilk sur la variable pct_abst
shapiro_test <- shapiro.test(projet$pct_abst[!is.na(projet$pct_abst)])  # On exclut les valeurs NA

# Afficher le résultat du test
print(shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  projet$pct_abst[!is.na(projet$pct_abst)]
## W = 0.97192, p-value < 2.2e-16

En regardant les résultats du test de Shapiro-Wilk, on constate que la valeur de la statistique W est de 0.97192, ce qui pourrait suggérer au premier abord une distribution assez proche de la normale. Cependant, la valeur p est inférieure à 2.2e-16, ce qui est bien en dessous du seuil habituel de 0.05 pour rejeter l’hypothèse nulle. Cela signifie que l’on peut rejeter l’hypothèse selon laquelle notre variable pct_abst suit une distribution normale. En d’autres termes, malgré une distribution qui semblait visuellement normale, les tests statistiques indiquent que la distribution des taux d’abstention a des caractéristiques significativement différentes de celles d’une distribution gaussienne.

3.2.2 Quelle est la valeur du quantile d’ordre 0.95 ?

# Calculer le quantile d'ordre 0.95 pour la variable pct_abst
quantile_95 <- quantile(projet$pct_abst, probs = 0.95, na.rm = TRUE)

# Afficher le résultat
print(quantile_95)
##       95% 
## 0.1844307

En examinant le quantile d’ordre 0.95 pour la variable pct_abst, on observe que 95% des communes ont un taux d’abstention qui est inférieur ou égal à environ 18.44%. Cela signifie que seulement 5% des communes ont un taux d’abstention supérieur à cette valeur. Ce quantile nous aide à comprendre jusqu’où s’étendent les taux d’abstention les plus élevés parmi la majorité des communes.

3.2.3 Donner pour chaque département, la proportion de communes qui ont un taux d’abstention supérieur au quantile d’ordre 0.95 ?

# Seuil déterminé par le quantile d'ordre 0.95
seuil_quantile <- 0.1844307

# Créer un vecteur logique indiquant si le taux d'abstention est supérieur au seuil
taux_elevé <- projet$pct_abst > seuil_quantile

# Calculer la proportion de taux d'abstention élevés par département
proportion_par_departement <- aggregate(taux_elevé ~ département, data = projet, function(x) mean(x, na.rm = TRUE))

# Renommer la colonne pour plus de clarté
names(proportion_par_departement)[2] <- "proportion_taux_elevé"

# Afficher les résultats
print(proportion_par_departement)
##       département proportion_taux_elevé
## 1          Ariège            0.09939759
## 2         Aveyron            0.02302632
## 3            Gers            0.02375810
## 4   Haute-Garonne            0.05952381
## 5 Hautes-Pyrénées            0.10759494
## 6             Lot            0.01764706
## 7            Tarn            0.01547988
## 8 Tarn-et-Garonne            0.01538462

En analysant les proportions de communes avec un taux d’abstention supérieur au quantile d’ordre 0.95 par département, on remarque que les Hautes-Pyrénées se démarquent avec environ 10.76% de ses communes au-dessus de ce seuil, indiquant une tendance vers des taux d’abstention plus élevés dans ce département. À l’inverse, le Tarn et le Tarn-et-Garonne ont les proportions les plus faibles, avec seulement environ 1.55% de leurs communes dépassant ce seuil d’abstention. Ces résultats mettent en lumière des différences régionales qui pourraient mériter une enquête plus approfondie pour en comprendre les raisons.

3.2.4 Commenter succinctement ces résultats, en gardant en tête la problématique qu’on s’est fixé au début du devoir.

Les analyses menées montrent que, globalement, la majorité des communes de Midi-Pyrénées ont affiché des taux d’abstention relativement modérés pour l’élection de 2007, avec une médiane bien en deçà de 20%. Toutefois, la distribution de ces taux n’est pas parfaitement normale, ce qui est confirmé par le test de Shapiro-Wilk : il y a une asymétrie, avec une minorité de communes présentant des taux d’abstention nettement plus élevés.

Cela se reflète dans les proportions de communes dépassant le seuil de 18.44% d’abstention, particulièrement notable dans les Hautes-Pyrénées où plus de 10% des communes sont au-dessus de ce seuil. En contraste, dans le Tarn et le Tarn-et-Garonne, très peu de communes dépassent ce taux.

Ces résultats suggèrent que certains facteurs locaux pourraient influencer la participation électorale, et que ces facteurs peuvent varier d’un département à l’autre. Pour mieux comprendre ces dynamiques et potentiellement améliorer la participation aux élections, une étude plus poussée de ces facteurs locaux pourrait être bénéfique.

3.3 Un peu de cartographie

# Calcul des quantiles pour diviser en 5 classes
quantiles <- quantile(projet$pct_abst, probs = seq(0, 1, by = 0.2), na.rm = TRUE)

# Création des classes
projet$class_abst <- cut(projet$pct_abst,
                         breaks = c(-Inf, quantiles[2], quantiles[3], quantiles[4], quantiles[5], Inf),
                         labels = c("---", "-", "-+", "+", "++"),
                         include.lowest = TRUE)

On a choisi la méthode de discrétisation basée sur les quantiles pour créer la variable class_abst parce qu’elle permet de répartir les données de manière équilibrée entre les différentes classes. Avec cette approche, chaque classe contient approximativement le même nombre d’observations, ce qui facilite la comparaison des taux d’abstention à travers les classes. C’est une méthode couramment utilisée en statistique pour catégoriser une variable continue, surtout lorsqu’on souhaite une répartition homogène des données pour l’analyse ou la visualisation.

3.3.1 Représenter le nuage de points de la variable LAT en fonction de la variable LONG. Vous utiliserez des couleurs et/ou des symboles différents en fonction de la classe d’appartenance de la variable class. Vous mettrez sur le graphique une légende.

# Conversion de LAT et LONG en numérique avec gestion des valeurs non valides
convert_to_numeric <- function(x) {
  result <- as.numeric(as.character(x))
  if(any(is.na(result))) {
    warning("Des NAs ont été introduits lors de la conversion")
  }
  return(result)
}

projet$LAT_num <- convert_to_numeric(projet$LAT)
## Warning in convert_to_numeric(projet$LAT): NAs introduits lors de la conversion
## automatique
## Warning in convert_to_numeric(projet$LAT): Des NAs ont été introduits lors de
## la conversion
projet$LONG_num <- convert_to_numeric(projet$LONG)
## Warning in convert_to_numeric(projet$LONG): NAs introduits lors de la
## conversion automatique
## Warning in convert_to_numeric(projet$LONG): Des NAs ont été introduits lors de
## la conversion
# Créer un nouveau dataframe avec les données nettoyées
projet_clean <- projet[!is.na(projet$LAT_num) & !is.na(projet$LONG_num), ]
# Vérifier si les vecteurs contiennent des données valides
if (length(projet_clean$LONG_num) > 0 && sum(!is.na(projet_clean$LONG_num)) > 0 && 
    length(projet_clean$LAT_num) > 0 && sum(!is.na(projet_clean$LAT_num)) > 0) {

    # Tracer le nuage de points
    plot(projet_clean$LONG_num, projet_clean$LAT_num, col = couleurs[as.numeric(projet_clean$class_abst)], 
         pch = symboles[as.numeric(projet_clean$class_abst)], 
         main = "Nuage de points par classe d'abstention", 
         xlab = "Longitude", ylab = "Latitude")

    # Ajouter une légende
    legend("topright", legend = levels(projet_clean$class_abst), col = couleurs, pch = symboles)
} else {
    print("Erreur : Les données de longitude et/ou de latitude sont manquantes ou non valides.")
}
## [1] "Erreur : Les données de longitude et/ou de latitude sont manquantes ou non valides."

4 Analyse statistique

4.1 Boîtes à moustaches parallèle

univarie <- function(table_df, nom_var_quanti, nom_var_quali, nom_weight = NULL, xlab, ylab) {
    if (!is.null(nom_weight) && !(nom_weight %in% names(table_df))) {
        stop("nom_weight n'est pas une colonne valide dans le dataframe.")
    }
    
    # Calculer la moyenne et l'écart-type (pondérés si nom_weight est non nul)
    moyennes <- ecart_types <- numeric()
    for (niveau in unique(table_df[[nom_var_quali]])) {
        sous_ensemble <- table_df[table_df[[nom_var_quali]] == niveau, ]
        if (!is.null(nom_weight)) {
            poids <- sous_ensemble[[nom_weight]]
            moyenne <- sum(poids * sous_ensemble[[nom_var_quanti]], na.rm = TRUE) / sum(poids, na.rm = TRUE)
            ecart_type <- sqrt(sum(poids * (sous_ensemble[[nom_var_quanti]] - moyenne)^2, na.rm = TRUE) / sum(poids, na.rm = TRUE))
        } else {
            moyenne <- mean(sous_ensemble[[nom_var_quanti]], na.rm = TRUE)
            ecart_type <- sd(sous_ensemble[[nom_var_quanti]], na.rm = TRUE)
        }
        moyennes <- c(moyennes, moyenne)
        ecart_types <- c(ecart_types, ecart_type)
    }

    # Afficher la boîte à moustaches
    boxplot(table_df[[nom_var_quanti]] ~ table_df[[nom_var_quali]], xlab = xlab, ylab = ylab)
    
    # Ajouter les moyennes et intervalles de confiance
    niveaux <- unique(table_df[[nom_var_quali]])
    for (i in seq_along(niveaux)) {
        points(x = i, y = moyennes[i], col = "red", pch = 19)
        segments(x0 = i, y0 = moyennes[i] - 2 * ecart_types[i], x1 = i, y1 = moyennes[i] + 2 * ecart_types[i], col = "red")
    }

    # Effectuer un test statistique et afficher les résultats
    # (Le choix du test dépend de la distribution des données)
    test_result <- t.test(table_df[[nom_var_quanti]], na.rm = TRUE)
    print(test_result)
}

# Exemple d'utilisation
univarie(table_df = projet, nom_var_quanti = "pct_abst", nom_var_quali = "code_dep", xlab = "Département", ylab = "Pourcentage d'abstention")

## 
##  One Sample t-test
## 
## data:  table_df[[nom_var_quanti]]
## t = 153.38, df = 3018, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  0.1121051 0.1150084
## sample estimates:
## mean of x 
## 0.1135568
# Application de la fonction univarie pour le code du département
univarie(table_df = projet, nom_var_quanti = "pct_abst", nom_var_quali = "code_dep", 
         xlab = "Département", ylab = "Pourcentage d'abstention")

## 
##  One Sample t-test
## 
## data:  table_df[[nom_var_quanti]]
## t = 153.38, df = 3018, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  0.1121051 0.1150084
## sample estimates:
## mean of x 
## 0.1135568

4.2 Nuages de points

bivarie <- function(table_df, vars, nom_var_quali = NULL, xlab = "", ylab = "") {
    nom_var_quanti <- vars[1]
    nom_var_expl <- vars[2]

    # Tracer le nuage de points et la droite de régression
    if (is.null(nom_var_quali)) {
        plot(table_df[[nom_var_expl]], table_df[[nom_var_quanti]], xlab = xlab, ylab = ylab)
        fit <- lm(table_df[[nom_var_quanti]] ~ table_df[[nom_var_expl]])
        abline(fit, col = "blue")
        confint_fit <- confint(fit)
        coeffs <- coef(fit)
        p_value <- summary(fit)$coefficients[2, 4]
    } else {
        # Logique pour gérer le cas où nom_var_quali est non nul
        # ...
    }

    # Résultats à retourner
    list(
        p_value = p_value,
        a = coeffs[1], # Intercept
        b = coeffs[2], # Pente
        confint = confint_fit
    )
}

# Exemple d'utilisation
resultats_chomage07 <- bivarie(projet, c("pct_abst", "chomage07"),
                               xlab = "Taux de chômage en 2007", ylab = "% d'abstentions")
## Warning in xy.coords(x, y, xlabel, ylabel, log): NAs introduits lors de la
## conversion automatique
## Warning in abline(fit, col = "blue"): utilisation des deux premiers des 1067
## coefficients de régression

4.3 Analyse complémentaire

Pour approfondir notre compréhension du taux d’abstention lors de l’élection présidentielle de 2007 en Midi-Pyrénées, on pourrait explorer le jeu de données avec plusieurs autres techniques en utilisant R :

  1. Étude de Corrélation : On pourrait examiner les liens entre l’abstention et d’autres facteurs comme le taux de chômage ou la densité démographique. Des méthodes comme les coefficients de corrélation ou la régression linéaire seraient utiles ici.

  2. Analyse Historique : Si on dispose de données des élections précédentes, observer les évolutions du taux d’abstention au fil du temps pourrait révéler des tendances intéressantes.

  3. Regroupement par Clustering : On pourrait regrouper les communes selon leurs caractéristiques socio-économiques via des méthodes de clustering. Cela nous aiderait à voir si des groupes de communes partagent des taux d’abstention similaires.

  4. Analyse Factorielle : Pour comprendre quels facteurs sous-jacents influencent l’abstention, une analyse factorielle pourrait être pertinente.

  5. Cartographie Évoluée : Des cartes interactives ou des visualisations géospatiales pourraient illustrer les disparités géographiques de l’abstention et d’autres indicateurs clés.

  6. Modélisation Prédictive : On pourrait créer des modèles prédictifs pour anticiper le taux d’abstention, en identifiant quels facteurs jouent un rôle majeur.

  7. Examen par Sous-groupes : S’il y a des données démographiques détaillées, examiner l’abstention par groupe d’âge, sexe ou niveau d’éducation pourrait révéler des patterns spécifiques.

  8. Visualisations Plus Élaborées : L’utilisation de graphiques à boîtes, de graphiques en violon ou de heatmaps pourraient offrir une perspective plus riche sur les relations entre l’abstention et d’autres variables.

En explorant ces différentes pistes avec les outils de R, on pourrait obtenir une vue d’ensemble plus nuancée et précise des facteurs influençant l’abstention électorale dans cette région spécifique.

4.4 Conclusion

En lien avec la problématique centrale du projet – comprendre et analyser le taux d’abstention à l’élection présidentielle française de 2007, particulièrement dans la région Midi-Pyrénées :

  1. Préparation des Données : Le projet a débuté par un travail conséquent de préparation des données, impliquant l’importation, le nettoyage et la fusion de plusieurs ensembles de données. Ceci a permis de créer un dataframe complet et cohérent pour l’analyse.

  2. Création de Variables Pertinentes : Des variables significatives ont été créées pour enrichir l’analyse, comme le taux d’abstention (pct_abst), le pourcentage d’inscrits (pct_inscrits) et le taux de votes pour un candidat spécifique (pct_xr). Ces variables offrent un aperçu plus détaillé du comportement électoral.

  3. Analyse Statistique et Exploration : L’analyse a inclus une exploration statistique des données, avec des calculs de moyennes, des comparaisons entre zones urbaines et rurales, et l’identification de tendances au sein de différents départements.

  4. Utilisation de Techniques Avancées : Le projet a mis en œuvre des techniques statistiques avancées, telles que l’imputation des valeurs manquantes et la création de variables catégorielles pour une analyse plus fine.

  5. Visualisations des Données : Des graphiques et des visualisations ont été utilisés pour illustrer les résultats, permettant une compréhension plus intuitive des tendances et des relations dans les données.

  6. Réflexion Critique et Approches Alternatives : Le projet a également inclus une réflexion sur les limites des méthodes utilisées et la possibilité d’approches alternatives pour une analyse plus approfondie.

En résumé, ce projet a démontré une utilisation approfondie des capacités du logiciel R pour analyser le taux d’abstention électorale. Le travail a combiné avec succès des techniques de manipulation de données, d’analyse statistique et de visualisation pour aborder la problématique de l’abstention électorale, tout en offrant des pistes pour de futures recherches et analyses.