Archives de catégorie : R

HeatMap Profession ~ Parti des candidats aux élections législatives et contribution au khi-deux (suite)

Dans le précédent post, nous avons déjà vu quelques notions permettant d’analyser le lien entre la profession exercée par les candidats aux élections législatives et leur appartenance politique.

Nous aurions pu compléter l’analyse des correspondances grâce à une petite heatmap montrant les effectifs et leur aspect significatif..

Plan:
  • La HeatMap
  • Calcul du khi-deux, explications
  • Les éléments-clé du code
  • Le code complet sous github
La heatmap

Dans cette heatmap, l’intensité de la couleur est relative à la valeur du khi-deux de la cellule (issue du couplage de deux modalités, Profession et Parti). Plus la valeur est élevée entre ces deux modalités et plus leur correspondance est élevée.

Nous avons superposé les effectifs pour une meilleure compréhension.

Un effectif faible peut être associé à une valeur de khi deux élevée. Dans ce cas, cela indique que la faiblesse des effectifs est caractéristique du couplage des deux modalités.

On peut prendre l’exemple de quelques cellules du tableau…

  • L’effectif associé au couple Avocat – UMP est élevé de même que la valeur du khi deux. Cela indique que les candidats qui exercent le métier d’avocat sont davantage d’UMP.
  • On peut faire une observation similaire entre Ouvrier et Extrême-Gauche.
  • Pas mal de candidats fonctionnaires de catégorie A sont socialistes.
  • On a une valeur de khi deux élevée pour le duo Cadre Supérieur dans le privé et Extrême-Gauche mais un effectif faible, ce qui semble indiquer que, de manière significative, il y a très peu de candidats cadres supérieurs qui représentent ce parti.
  • Aussi, on voit que pour ce qui est des candidats écologistes, on retrouve beaucoup la catégorie “autres professions libérales“. S’agit-il de professions libérales non réglementées ou réglementées? Dommage que l’on n’ait pas plus de détails car c’est véritablement pour cette catégorie d’activité professionnelle que le parti Ecologiste est le mieux représenté.

Attention, ceci est seulement mon interprétation des résultats et peut être sujet à observations, critiques, notamment sur la méthode statistique employée. N’hésitez pas à commenter.

Calcul du khi-deux, explications

Pour savoir si un lien est fort entre deux modalités, il faut savoir si l’effectif les réunissant est caractéristique. Pour cela, on prend en compte son “environnement” en lignes et colonnes dans le tableau de contingence. Si l’effectif est fort et si les effectifs des cellules en lignes, d’une part, et en colonnes, d’autre part, sont élevées, alors l’effectif fort n’est pas vraiment caractéristique du couple de modalités. Le contraste n’est pas assez fort.

Afin de pouvoir quantifier le côté caractéristique d’un effectif croisant deux modalités, il faut prendre en compte les effectifs marginaux en lignes et colonnes relatifs à cette valeur. Ceux-ci correspondent aux effectifs relatifs à chaque modalité du couple en lignes et colonnes. Il faudra aussi prendre en compte l’effectif total afin de raisonner à une échelle globale, l’échelle du tableau de contingence.

La valeur du khi-deux au niveau d’une cellule d’un tableau de contingence est la suivante:

http://www.math.univ-toulouse.fr/~baccini/zpedago/asdm.pdf

  • nlh est l’effectif au sein de la cellule du tableau
  • nl+ est l’effectif marginal en lignes. Si les professions sont en lignes, cela correspond au nombre de candidats exerçant la profession considérée.
  • n+h est l’effectif marginal en colonne.
  • n est l’effectif total, soit le nombre de candidats

La somme des khi-deux partiels des cellules donne la valeur du khi deux, totale.

L’illustration ci-dessous montre les différentes valeurs de khi deux obtenues pour différents environnements lignes et colonnes au niveau d’une cellule:

schéma fait maison montrant la valeur du khi deux en une cellule (les cellules environnantes dont les valeurs ont changé sont en jaune)

Dans le premier tableau, la valeur du khi-deux vaut:

(8-(12*11)/50)² / (12*11)/50

La valeur du khi-deux décroît à mesure que les valeurs environnantes approchent celles de la cellule.

Les éléments clés du code

Lecture du fichier Excel

Pour lire le fichier excel des législatives, j’utilise la librairie gdata. La deuxième feuille comprend le tableau de correspondances entre code des partis (encore appelé nuance) et libellé de ces derniers.

f <- read.xls("IN/Leg 2012 Candidatures T1 31 05 2012.xls", sheet=1)
nuances <- read.xls("IN/Leg 2012 Candidatures T1 31 05 2012.xls", sheet=2, skip=2, header=FALSE)
Reshape Casting

Comme mentionné dans le post précédent, l’obtention du tableau de contingence a nécessité un reshaping de la donnée initiale en basculant les partis en colonnes. Cela se fait avec la fonction cast de la librairie reshape

f$value <- 1
r <- cast(f[, c("Profession", "NuanceLib", "value")], Profession~NuanceLib, sum)

Fonction de calcul du khi-deux

J’ai réalisé une fonction permettant de calculer le khi deux au sein de chaque cellule du tableau et obtenir une matrice de contribution au khi-deux.
khideux <- function(mat){
m.cont <- mat
 
sumR <- apply(mat, 1, sum)
sumC <- apply(mat, 2, sum)
sumT <- sum(mat)
 
for (i in 1:nrow(mat)) {
for (j in 1:ncol(mat)) {
w <- (sumR[i]*sumC[j])/sumT
khikhi <- (mat[i, j] - w)^2/w
m.cont[i, j] <- khikhi
}
}
return (m.cont)
}
 
m.cont <- khideux(r.m)

HeatMap 

Il existe une fonction native dans R appelée heatmap. Elle n’a pas été utilisée ici car je n’ai pas trouvé de moyen de spécifier les points de cassure pour les couleurs (break= ). J’ai donc utilisé la fonction image qui permet de paramétrer de manière plus fine la représentation graphique d’une heatmap.

image(t(m.cont2), breaks=cls$brk, axes=F, col=pal(20))

Libellés

Pour les libellés, il a fallu tout d’abord que je détermine la position/les coordonnées de chaque label au sein du tableau. Pour un tableau de 3 colonnes et 2 lignes, la séquence de coordonnées est la suivante pour les x: 123 123 et pour les y: 111 222. Les cycles sont différents. Dans le deuxième cas, on utilisera each, dans le premier non.

xs <- seq(0, 1, length.out=ncol(r.m))
ys <- seq(1, 0, length.out=nrow(r.m))
 
xs2 <- rep(xs, nrow(r.m))
ys2 <- rep(ys, each = ncol(r.m))

Puis ensuite, j’ai pu procéder à leur affichage

text(xs2, ys2, labels=ifelse(v>0, v, NA), col=gray(.5), cex=fsz*.6, font=2)


Le code sous gihub




Résultats du second tour: Nature du vote et Distance au littoral

Article en français

French elections: nature of votes versus distance to the coast : In the previous post, we saw how to make a simple choropleth of votes. Here, I detail how to create a dataviz combining a map and a standard xy plot to visualize the relation that exists between the nature of votes and the distance to the coast. A good opportunity to use a very interesting R library: spatstat.

 Dans le précédent post, nous avons vu comment ajouter les résultats du vote à de la donnée spatialisée afin d’aboutir à une petite choroplèthe des résultats:

Avant de réaliser l’article sur la réalisation d’une carte isarithmique et de partir en week-end prolongé :), je vous propose ici un petit article sur une méthode de représentation graphique de la relation existant entre la nature des votes et la distance séparant chaque commune au littoral.

Pour cela, dans un premier temps, il faut télécharger le trait de côte disponible sur le site du Service Hydrographique et Océanique de la Marine:

La représentation que nous allons voir se prête assez peu, en soi, à l’analyse mais elle nous permettra de voir comment utiliser la librairie spatiale R spatstat à travers le calcul de distance au plus proche voisin, et de voir l’affichage de graphiques.

Voici le code en entier. Les explications suivent par la suite:
 

Voici le résultat:

Nature du vote et distance au littoral

Le code expliqué:

Afin de déterminer la distance séparant chaque commune au trait de côte, on va utiliser la librairie spatstat. Celle-ci n’utilise pas les mêmes types d’objets que les librairies spatiales standardes, à savoir SpatialPoints/Lines/Polygones. Pour les points, elle définit la classe ppp et pour les lignes, la classe psp. On effectue en préalable une coercion des classes SpatialPoints/Lines vers ppp et psp afin de pouvoir utiliser les données spatiales dans spatstat.

tc <- readOGR("F:/DATAS/TRAIT_COTE/TCH.shp", "TCH")
tc.psp <- as(tc, "psp")
 
comm.pp <- SpatialPointsDataFrame(coordinates(comm2), data=comm2@data)
comm.pp <- as(comm.pp, "ppp")

Une fois cela fait, on peut alors utiliser la fonction nncross. Celle-ci permet de déterminer le voisin le plus proche (segment ou point) ainsi que la distance qui le sépare de ce dernier.

nn <- spatstat::nncross(comm.pp, tc.psp)

On peut regarder ce que cela donne au niveau des distances commune – littoral. Pour cela, on utilise la fonction spplot qui adapte les fonctions d’affichage graphique de la librairie lattice aux objets géographiques. C’est une autre possibilité d’affichage, en plus de la fonction de base plot vue dans le post précédent.

comm2$dist <- nn$dist
spplot(comm2, "dist", col=NA)
Distances entre chaque commune et le littoral
PS: on dirait du raster mais ça n’en est pas 🙂

Les données que l’on va utiliser pour les représentations suivantes sont:
– Les coordonnées xy des centroïdes de communes
– Le pourcentage de vote pour l’un et l’autre des candidats
– La distance de séparation commune – trait de côte

Nous allons créer un data.frame exprès pour cela, concentrant toutes ces informations:

df <- data.frame(pcsar=comm2$pc.sar, x=comm.pp$x, y=comm.pp$y, dist=nn$dist)

Attaquons-nous aux graphiques.

On va utiliser une couleur rouge pour les votes dominants de gauche et bleue pour ceux de droite (logique). Contrairement à avant, on n’utilisera pas de nuance liée au pourcentage. On intègre également une valeur de transparence de 10%.

alpha <- .1
cols <- rgb(ifelse(pcsar > .5, 0, 1), 0, ifelse(pcsar > .5, 1, 0), alpha)

Il n’y aura rien de nouveau au niveau du graphique géographique par rapport au post précédent, à part que l’on affiche des points et non des polygones. On superposera aussi le trait de côte.

plot(comm2.ctrd, col=cols, pch=16, cex=2, xlim=bb[1,], ylim=bb[2,])
plot(tc, col="white", lwd=4, add=TRUE)

C’est là, la partie nouvelle: à partir du data.frame appelé sobrement df, nous allons réaliser un plot x versus y assez standard. En x, nous aurons la distance séparant chaque commune de la côte, en y, la latitude et en couleur de point la nature du vote. Cette dernière sera donc la troisième dimension de ce graphique.

plot(dist, df$y, pch=16, cex=2, col=cols, xlab=NA, ylab=NA, axes=FALSE)

Le paramètre graphique par(mfrow=c(1,2)) a permis de mettre côte à côte le graphique géographique et le graphique xy. 

par(mfrow=c(1,2), bg="black")

 J’ai choisi de représenter les traits de la même couleur afin de pouvoir faire la relation entre les deux. En quelque sorte, pour aboutir au second graphique. C’est comme si on prenait la France et qu’on la dépliait, l’étendait selon son littoral.

abline(v=0, col="white", lwd=4)

Nature du vote et distance au littoral

Intéressant ou pas, à vous de voir! En tout cas, nous avons pu voir quelques fonctions bien sympathiques!

 
 

Résultats du second tour: ma première choroplèthe avec R


 article en français

French elections – my first choropleth with R : Many journalists say that the electoral campaigns are becoming “data campaigns”. The candidates are fighting, making massive use of numbers. They’re looking for the number that will make the other one wrong. They’re speaking numbers, displaying plots, graphics – interactive or not – about what the actual state of the country is, and how they intend to change it. Why not taking the most of the elections data to learn how to make a simple choropleth with R?

The entire code is available for download at the end of the article

Dans cet article, nous allons créer une petite choroplèthe des résultats du second tour des élections présidentielles.

Voici les adresses de téléchargement des fichiers source:
– Contours des communes : http://professionnels.ign.fr/ficheProduitCMS.do?idDoc=6185461
– Résultats des élections : http://www.data-publica.com/opendata/13495–resultats-du-deuxieme-tour-de-l-election-presidentielle-2012

Dans un premier temps, nous avons besoin d’installer les paquets appropriés: rgdal pour lire les données au format ESRI et maptools pour certains traitements associés aux données géographiques.

install.packages(c("rgdal", "maptools"))

Puis, nous importons, d’un côté les contours des communes de GEOFLA:

comm <- readOGR("F:/DATAS/GEOFLA/COMMUNES/COMMUNE.SHP", "COMMUNE")

et le fichier du résultat du second tour des élections présidentielles.

votes <- read.csv2("IN/resultats2012.csv", sep=",", quote=""")

Le fichier des votes contient plusieurs colonnes. Pour les afficher:

names(votes)

Calculons le pourcentage de votants par parti:

votes$pc.sar <- votes$results.sarkozy /  votes$results.exprimes
votes$pc.hol <- votes$results.hollande / votes$results.exprimes
On peut d’ores et déjà afficher quelques statistiques:
summary(votes$pc.sar)
summary(votes$pc.hol)
 

Retenons uniquement les communes pour lesquelles des résultats électoraux sont renseignés dans le fichier.

nmatch <- which(is.na(match(comm@data$INSEE_COM, votes$commune.code)))
print(comm@data[nmatch, c("INSEE_COM", "NOM_COMM")])
comm <- comm[-nmatch, ]

Et hop, la jointure:

m <- merge(comm@data, votes, by.x="INSEE_COM", by.y="commune.code", all.x=TRUE)

Il faut aussi affecter un nom unique à chaque ligne. Pour les objets géographiques, on utilise la fonction spChFIDs et pour les data frames, row.names. Affectons le numéro INSEE de la commune:

comm <- spChFIDs(comm, as.character(comm$INSEE_COM))
rownames(m) <- as.character(m$INSEE_COM)

Maintenant, on peut aboutir à un nouvel objet géographique muni des résultats des élections.

comm2 <- SpatialPolygonsDataFrame(as(comm, "SpatialPolygons"), data=m)

Voici un petit diagramme qui schématise toutes les étapes:

Effectuer une jointure avec R

Nous allons, dans la carte, créer 20 classes de valeurs à partir des pourcentages avec la fonction classIntervals

cls <- classIntervals(comm2$pc.sar, n=20, style="equal")

Notre palette de couleurs ira du rouge pour Mr Hollande au bleu, pour Mr Sarkozy, mais en passant par un point d’arrêt: le blanc là où il n’y a pas d’affection particulière pour l’un ou l’autre des candidats (votes proches de 50%). Considérant cette palette à trois couleurs, nous retrouvons les couleurs de chaque valeur et classe de cette façon:

colcode <- findColours(cls, c("red", "white", "blue"))

Affichons le résultat:

plot(comm2, col=colcode, border=NA)
title(main="résultats des élections présidentielles - second tour") 

Cela pourrait être sympa de mettre les contours des régions en plus. Cela nous permettra de voir en même temps comment dissoudre des polygones en fonction d’une valeur. Les contours des régions n’existent pas dans GEOFLA mais on peut les créer à partir du fichier des départements. On le fait comme ceci:

dep <- readOGR("F:/DATAS/GEOFLA/DEPARTEMENTS/DEPARTEMENT.SHP", "DEPARTEMENT")
reg <- maptools::unionSpatialPolygons(dep, dep$NOM_REGION)
 

On ajoute les contours de régions en les convertissant vers des objets lignes. Dans le jargon spatial R, on parle de coercion et cela se fait avec la librairie maptools. On ajoute aussi les libellés des régions. Pour la transparence des contours et des libellés, on utilise le 4e argument de la fonction rgb.

plot(as(reg, "SpatialLines"), col=rgb(0,0,0,.2), lwd=2, add=T)
text(coordinates(reg), labels=row.names(reg), cex=.5, col=rgb(0,0,0,.5))
title(main="résultats des élections présidentielles - second tour")

Dans le prochain post, nous verrons comment aboutir à une représentation de ce type, toujours pour les élections présidentielles

Carte isarithmique des élections selon David B. Sparks

N’hésitez pas à poser vos questions dans l’espace des commentaires si vous rencontrez des difficultés!

Le code entier https://gist.github.com/2857180