Les résultats des élections européennes 2019 sont disponibles à divers niveaux administratifs sur data.gouv: résultats.
Vous avez le choix entre des fichiers Excel et des fichiers texte. Pour R, privilégiez les fichiers texte.
Téléchargez les fichiers et stokez-les où bon vous semble. Rappel : soyez ordonnés !
# Définition du répertoire de travail. Pas indispensable,
# mais pratique pour éviter de taper des adresses longues
setwd("/Users/eguidat/Documents/Cours/cuej2-19/files")
Il faut bien entendu adapter l'adresse à votre poste de travail.
Astuce pour connaitre l'adresse d'un répertoire sur un Mac : lancez le terminal (Applications - utilitaires) et glissez un dossier sur la fenêtre du terminal. Vous n'avez plus qu'à copier l'adresse.
Renomez le ficher avec un nom plus court pour éviter d'avoir à taper un long nom. Je l'ai renommé en com.txt. Il s'agit d'un fichier texte dont les colonnes sont séparées par un point-virgule. Le séparateur peut être un autre caractère : tabulation ou virgule. Quand on ne sait pas, il faut ouvrir le fichier avec un tableur ou un éditeur de texte pour voir quel caractère est utilisé... ou essayer au hasard. Souvent, les chaines de caractères sont entourées de quotes (' ou ").
Un problème fréquent est celui de l'encodage du fichier, c'est à dire le système de codage des caractères. Très souvent, c'est de l'UTF8, ici, c'est du latin1. Il y a une multitude de systèmes d'encodage. Quand le fichier est mal documenté, cela peut être assez pénible, il faut tester les encodages jusqu'à trouver le bon. Un des symptomes d'un mauvais choix d'encodage est l'affichage fantaisiste des caractères accentués.
La fonction utilisée est read.csv(). On peut aussi utiliser read.table(), qui est plus polyvalente. Il y a aussi des fonction pour importer des fichiers Excel, SAS...
Il y a plein de colonnes inutiles dans le fichier. Il faut par ailleurs indiquer les colonnes qui contiennent du texte et celles qui contiennent des chiffres. C'est le rôle du vecteur classesColonnes. "NULL" indique une colonne à abandonner. La première ligne doit être adaptée pour importer des fichiers à d'autres niveaux géographiques.
# Permet de préciser si une colonne contient du texte, des valeurs numérique, ou doit être abandonnée : NULL
classesColonnes <- c("character", "character", "character", "character", "numeric", "numeric", "NULL", "NULL",
"NULL", "numeric", "NULL", "NULL", "numeric", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL",
"NULL", "NULL", "NULL", "NULL", "numeric", "NULL", "NULL"
)
Les paramètres de la fonction read.csv :
# Exemple de l'avantage d'un WD. Pas besoin de mettre le chemin complet
# /Users/eguidat/Documents/Cours/cuej2-19/files. com.txt est suffisant.
# read.csv importe des données texte. Il faut préciser s'il y a des noms de variables
# quel est le séparateur de colonnes, le marqueur de texte et l'encodage...
com <- read.csv("com.txt", header = FALSE, sep = ";", dec = ",", encoding="latin1", skip = 1, colClasses = classesColonnes)
Comme d'habitude, on peut visualiser le fichier par un simple clic dans la fenêtre Environment
Il nous reste à donner des noms plus clairs aux colonnes :
# Définition du nom des colonnes
# J'ai abrégé les noms des listes
nomsColonnes <- c("codeDep", "libDep", "codeCom", "libCom", "inscrit", "abstention", "blanc", "nul", "exprime",
"LFI", "FR", "LC", "PP", "REM", "DR", "EP", "PACE", "UE", "LDLR", "LE", "EE", "PFD", "IE", "DLF",
"AE", "D19", "LO", "PEG", "EFREX", "LCP", "AVE", "PLP", "NEA", "PRC", "ELC", "EC", "AJ", "UDC",
"EECO", "PA", "LOE", "UDLEF", "ESP")
# Attribution du nom des colonnes
colnames(com) <- nomsColonnes
# Quelques infos sur le fichier qu'on vient d'importer # Nombre de lignes et de colonnes dim.data.frame(com) # Afficher les n premières lignes head(com, n = 5) # Afficher les noms des variables names(com) # Toutes ces infos à la fois str(com) # Un résumé de toutes les variables summary(com)
On utilise la fonction substr() pour ne garder que le premier caractère du code département : substr(variable, à partir du caractère n, sur x caractères n compris).
Notez aussi l'opérateur différent de : !=
# Ne garder que la métropole com <- subset(com, substr(codeDep, 1, 1) != "Z")
Supposons que je ne veuille conserver que les départements 67 et 68
# Ne garder que l'Alsace ## Définir un vecteur de valeurs à conserver alsace <- c(67, 68) ## Utiliser subset en conjonction avec l'opérateur %in% comAlsace <- subset(com, codeDep %in% alsace)
Le paramètre na.rm indique qu'il ne faut pas tenir compte des éventuelles valeurs manquantes.
# Combien d'inscrits en France métropolitaine ?
inscrits <- sum(com$inscrit, na.rm=TRUE)
inscrits
# Combien d'abstentions ?
abstentions <- sum(com$abstention, na.rm=TRUE)
abstentions
# Combien de blancs ?
blancs <- sum(com$blanc, na.rm=TRUE)
blancs
# Combien de nuls ?
nuls <- sum(com$nul, na.rm=TRUE)
nuls
# Combien de nuls ?
exprimes <- sum(com$exprime, na.rm=TRUE)
exprimes
# On aurrait pu faire ça en une fois
votants <- colSums(com[c("inscrit", "abstention", "blanc", "nul", "exprime")], na.rm = TRUE)
votants <- data.frame(votants)
colnames(votants) <- c("Totaux")
Comme on a définit un répertoire de travail, pas besoin d'indiquer toute l'adresse du fichier de destination. Cependant, pour garder mes fichier ordonnés, je me suis créer un sous-répertoire rData. Notez son usage dans la focntion save()
save("votants", file = "rData/votants.RData")
save("com", file = "rData/com.RData")
load("rData/totaux.RData")
load("rData/Licence_2015.RData")
Je me suis créé un répertoire exports. Ici, le séparateur est \t, c'est à dire une tabulation.
# Exportation au format texte tabulé write.table(totaux, "exports/totaux.txt", sep="\t")
Nous allons créer deux nouvelles variables :
# Création de codegeo et txAbs com$CODGEO <- paste(com$codeDep, com$codeCom, sep = '') com$txAbs <- com$abstention / com$inscrit
Discétiser une variable continue c'est la transformer en variable ordinale, avec des catégories donc. il existe plusieurs manière de déterminer les bornes qui vont définir les classes. Nous utiliseront les centiles, qui permettent d'obtenir des classe d'effectifs égaux
# Discétisation
# Calcul des percentiles 20, 40, 60, 80
bornesAbs <- quantile(com$txAbs, c(0, 0.2, 0.4, 0.6, 0.8, 1))
# Attribution d'une classe à chaque ville
com$classeAbs <- cut(com$txAbs,
bornesAbs,
labels = c("très faible", "Faible", "Médiane", "Elevée", "Très élevée")
)
A voir aussi, pour ce genre de manipulations, la fonction discretize() du package arules.
# Tris à plat
tri <- as.data.frame(table(com$classeAbs))
# En utilisant le package questionr
freq(com$classeAbs, cum = TRUE, total = TRUE)
# exemple de tri croisé
varA <- c("A", "A", "B", "C", "B", "A", "A", "B", "C", "B")
varB <- c("1", "3", "2", "2", "1", "3", "2", "2", "1", "3")
dataPourTC <- data.frame(varA, varB)
# Avec R base
table(dataPourTC$varA, dataPourTC$varB)
# Avec le package gmodels et CrossTable
CrossTable(dataPourTC$varA, dataPourTC$varB)
Je voudrais associer des information sur les revenus des habitants des communes. La fonction à utiliser est "merge". Merge permet d'associer les lignes de deux fichiers en se basant sur une variable commune contenue dans les deux fichiers de départ.
L'inséé diffuse les données du Dispositif fichier localisé social et fiscal (Filosofi). Téléchargez le fichier 2016. Le fichier qui nous intéresse est FILO2016_DISP_COM. Il est au format Excel. Il est documenté, prenez le temps de lire cette documentation.
Pour éviter des soucis d'importation, il faut transformer le fichier Excel en fichier csv. Pour cela :
Je veux :
# Import revenus
rev16 <- read.csv("rev16.csv", header = TRUE, sep = "\t", quote = "\"", encoding="UTF8")
# Selection des colonnes
rev16 <- rev16[, c("CODGEO", "NBMEN16", "NBPERS16", "NBUC16", "Q216")]
# Merge. L'option all = TRUE permet de conserver les enregistrements manquants dans une des deux tables
com <- merge(com, rev16, by = "CODGEO", all = TRUE)
# Vérification si données revenus manquantes
pasRevenus <- subset(com, is.na(com$Q216 ))
# Discrétisation
# Calcul des percentiles 20, 40, 60, 80
bornesRev <- quantile(com$Q216, c(0, 0.2, 0.4, 0.6, 0.8, 1), na.rm = TRUE)
# Attribution d'une classe à chaque ville
com$classeRev <- cut(com$Q216,
bornesRev,
labels = c("Revenus très faibles", "Revenus faibles", "Revenus médians", "Revenus élevés", "Revenus très élevés")
)
## classe pour les valeurs manquantes
## Ajout d'un level au facteur
levels(com$classeRev) <- c(levels(com$classeRev), "Valeur manquante")
## Recodage des NA
com$classeRev[is.na(com$classeRev)] <- "Valeur manquante"