Poursuivons un peu la discussion d’hier. En fait, si on poursuit, on arrive à regrouper des régions ensemble…. mais sans réelle cohérence car des régions proches au niveau électorale peuvent être éloignées géographiquement.
- le numéro du département i
- le numéro du département j
- une variable indicatrice indiquant si les département se touche
- la distance (en km) entre les centroïdes des départements
> france=read.table( + "http://freakonometrics.blog.free.fr/public/ data/departements-france.csv", + header=TRUE,sep=";")
On va nettoyer un peu, en enlevant les départements d’outre-mer,
> france0=france; i200=c(201,202) > france0=france0[-c(which(france0$depi%in%i200), + which(france0$depj%in%i200)),] > france0$ij=100*france0$depi+france0$depj
La base ressemble à ça,
> head(france0) depi depj Cij Dij ij 1 77 75 0 51 7775 2 78 75 0 39 7875 3 91 75 0 40 9175 4 92 75 1 10 9275 5 93 75 1 12 9375 6 94 75 1 13 9475
Plusieurs stratégies sont possible: regarde des départements voisins et voir si on peut les regrouper. Ou regarder des départements proches électoralement, et voir s’il sont proches géographiquement. Par exemple, si on ordonne les coefficients obtenus lors de la régression,
> reg=lm(X.VoixExpH~0+Dpt,weights= + Votants,data=sbelection) > COEF=coefficients(summary(reg)) > dbcoef=data.frame(COEF[,1:3],Dpt=rownames(COEF)) > rownames(dbcoef)=rank(COEF[,1]) > COEFtrie=dbcoef[as.character(1:94),] > COEFtrie[1:6,] Estimate Std..Error t.value Dpt 1 35.69903 0.3246129 109.97414 DptD06 2 36.46840 0.3244806 112.39010 DptD67 3 36.67594 0.3896297 94.13025 DptD68 4 37.39283 0.3202112 116.77552 DptD83 5 39.92023 0.3921762 101.79156 DptD74 6 42.61811 0.6182921 68.92877 DptD10
On peut se demander si les quatre premiers départements pourraient être regroupés ensemble. Une des modalités sert de modalité de référence, et on regarde les trois autres par rapport à cette dernière
> sbelection$Dpt=relevel(sbelection$Dpt,"D67") > reg0=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection) > COEF0=coefficients(summary(reg0)) > COEF0[c(1,7,67,82),] Estimate Std. Error t value Pr(>|t|) (Intercept) 36.4684029 0.3244806 112.3900971 0.00000000 DptD06 -0.7693736 0.4589784 -1.6762740 0.09369320 DptD68 0.2075400 0.5070493 0.4093093 0.68231515 DptD83 0.9244243 0.4558759 2.0277980 0.04258819
On fait ensuite une analyse de la variance,
> sbelection$DptGroupe=sbelection$Dpt > sblction$DptGroupe[sblction$Dpt%in%c("D06","D68","D83")]="D67" > model0=lm(X.VoixExpH~DptGroupe,weights=Votants,data=sbelection) > model1=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection) > anova(model0,model1) Analysis of Variance Table Model 1: X.VoixExpH ~ DptGroupe Model 2: X.VoixExpH ~ Dpt Res.Df RSS Df Sum of Sq F Pr(>F) 1 36114 2281072960 2 36111 2280191044 3 881917 4.6556 0.002954 ** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
On rejette ici l’hypothèse que les quatre départements se comportent de la même manière. Mais si on tente de regrouper les trois premières, cette fois, on accepte l’hypothèse
> sbelection$DptGroupe=sbelection$Dpt > sblction$DptGroupe[sblction$Dpt%in%c("D06","D68")]="D67" > model0=lm(X.VoixExpH~DptGroupe,weights=Votants,data=sbelection) > model1=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection) > anova(model0,model1) Analysis of Variance Table Model 1: X.VoixExpH ~ DptGroupe Model 2: X.VoixExpH ~ Dpt Res.Df RSS Df Sum of Sq F Pr(>F) 1 36113 2280476723 2 36111 2280191044 2 285679 2.2621 0.1041
Sauf que sur les trois départements, seulement deux se touchent,
> france0[france0$ij%in%c(6768,667,668),] depi depj Cij Dij ij 3510 6 67 0 533 667 3552 67 68 1 95 6768 3605 6 68 0 439 668
On peut essayer de parcourir les sorties de la régression, et regarder si on a des voisins. Pour chaque département, on regarde si le voisin est un voisin géographique,
> departement=as.numeric(substr(COEFtrie$Dpt,5,6)) > deptij=departement[1:(nrow(COEFtrie)-1)]*100+ > departement[(2):(nrow(COEFtrie))] > voisins=france0[france0$ij%in%deptij,] > voisinage=tapply(voisins$Cij,factor(voisins$ij),max) > COEFtrie$voisin=NA > v=voisinage[as.character(deptij)] > COEFtrie$voisin[1:(nrow(COEFtrie)-1)]= > v[is.na(v)==FALSE] > COEFtrie[1:10,] Estimate Std..Error t.value Dpt voisin 1 35.69903 0.3246129 109.97414 DptD06 0 2 36.46840 0.3244806 112.39010 DptD67 1 3 36.67594 0.3896297 94.13025 DptD68 0 4 37.39283 0.3202112 116.77552 DptD83 0 5 39.92023 0.3921762 101.79156 DptD74 0 6 42.61811 0.6182921 68.92877 DptD10 0 7 42.77423 0.4397101 97.27826 DptD01 0 8 43.53395 0.4448212 97.86843 DptD84 0 9 44.38759 0.3897553 113.88579 DptD85 0 10 44.65361 0.4577710 97.54575 DptD51 1
On note qu’il y a plusieurs voisins. On peut ensuite faire un test de Fisher. S’il est positif, on fusionne les classes. Pour la régression, mais aussi dans la base des distances et des voisinages,
> if(COEFtrie$voisin[i]==1){ + sbelection$Dpt[sbelection$Dpt==substr( + COEFtrie$Dpt[i+vsn],4,6)]=substr(COEFtrie$Dpt[i],4,6) + france0$depi[france0$depi==as.numeric( + substr(COEFtrie$Dpt[i+vsn],5,6))]=as.numeric( + substr(COEFtrie$Dpt[i],5,6)) + france0$depi[france0$depj==as.numeric( + substr(COEFtrie$Dpt[i+vsn],5,6))]=as.numeric( + substr(COEFtrie$Dpt[i],5,6))
Dans la base des départements, il y aura plusieurs paires. Si A et B ont fusionné, il suffit que C touche A ou B pour que C soit voisin des régions fusionnées. C’est pour cela que l’on utilise
> voisinage=tapply(voisins$Cij,factor(voisins$ij),max)
pour savoir si les départements sont voisins. On peut alors répéter plusieurs fois l’opération.
Par exemple, on note que 28, 45 et 89 peuvent fusionner,
> sbelection$Dpt=relevel(sbelection$Dpt,"D45") + reg10=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection) + COEF10=coefficients(summary(reg10)) + COEF10[c(1,28,88),] Estimate Std. Error t value Pr(>|t|) (Intercept) 45.9303788 0.4170114 110.1417762 0.0000000 DptD28 0.5643212 0.6594028 0.8558065 0.3921105 DptD89 0.9423212 0.7016026 1.3430982 0.1792486 + sbelection$DptGroupe=sbelection$Dpt + sbelection$DptGroupe[sbelection$Dpt%in% + c("D28","D89")]="D45" + model0=lm(X.VoixExpH~DptGroupe,weights=Votants,data=sbelection) + model1=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection) + anova(model0,model1) Analysis of Variance Table Model 1: X.VoixExpH ~ DptGroupe Model 2: X.VoixExpH ~ Dpt Res.Df RSS Df Sum of Sq F Pr(>F) 1 36113 2280314007 2 36111 2280191044 2 122963 0.9737 0.3777
Géographiquement, ce sont effectivement des voisins