{"word_count": 676, "character_count": 6999}
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.Si on veut que les régions regroupées soient proches, il faut une base avec des informations spatiales, comme savoir si deux départements se touchent, ou pas. Pour cela, on utilise la base suivante, qui contientle numéro du département ile numéro du département june variable indicatrice indiquant si les département se touchela distance (en km) entre les centroïdes des départements&#62; 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,&#62; france0=france; i200=c(201,202)&#62; france0=france0[-c(which(france0$depi%in%i200),+ which(france0$depj%in%i200)),]&#62; france0$ij=100*france0$depi+france0$depjLa base ressemble à ça,&#62; head(france0)depi depj Cij Dij   ij1   77   75   0  51 77752   78   75   0  39 78753   91   75   0  40 91754   92   75   1  10 92755   93   75   1  12 93756   94   75   1  13 9475Plusieurs 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,&#62; reg=lm(X.VoixExpH~0+Dpt,weights=+ Votants,data=sbelection)&#62; COEF=coefficients(summary(reg))&#62; dbcoef=data.frame(COEF[,1:3],Dpt=rownames(COEF))&#62; rownames(dbcoef)=rank(COEF[,1])&#62; COEFtrie=dbcoef[as.character(1:94),]&#62; COEFtrie[1:6,]Estimate Std..Error   t.value    Dpt1 35.69903  0.3246129 109.97414 DptD062 36.46840  0.3244806 112.39010 DptD673 36.67594  0.3896297  94.13025 DptD684 37.39283  0.3202112 116.77552 DptD835 39.92023  0.3921762 101.79156 DptD746 42.61811  0.6182921  68.92877 DptD10On 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&#62; sbelection$Dpt=relevel(sbelection$Dpt,"D67")&#62; reg0=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection)&#62; COEF0=coefficients(summary(reg0))&#62; COEF0[c(1,7,67,82),]Estimate Std. Error     t value   Pr(&#62;|t|)(Intercept) 36.4684029  0.3244806 112.3900971 0.00000000DptD06      -0.7693736  0.4589784  -1.6762740 0.09369320DptD68       0.2075400  0.5070493   0.4093093 0.68231515DptD83       0.9244243  0.4558759   2.0277980 0.04258819On fait ensuite une analyse de la variance,&#62; sbelection$DptGroupe=sbelection$Dpt&#62; sblction$DptGroupe[sblction$Dpt%in%c("D06","D68","D83")]="D67"&#62; model0=lm(X.VoixExpH~DptGroupe,weights=Votants,data=sbelection)&#62; model1=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection)&#62; anova(model0,model1)Analysis of Variance TableModel 1: X.VoixExpH ~ DptGroupeModel 2: X.VoixExpH ~ DptRes.Df        RSS Df Sum of Sq      F   Pr(&#62;F)1  36114 22810729602  36111 2280191044  3    881917 4.6556 0.002954 **---Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1On 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&#62; sbelection$DptGroupe=sbelection$Dpt&#62; sblction$DptGroupe[sblction$Dpt%in%c("D06","D68")]="D67"&#62; model0=lm(X.VoixExpH~DptGroupe,weights=Votants,data=sbelection)&#62; model1=lm(X.VoixExpH~Dpt,weights=Votants,data=sbelection)&#62; anova(model0,model1)Analysis of Variance TableModel 1: X.VoixExpH ~ DptGroupeModel 2: X.VoixExpH ~ DptRes.Df        RSS Df Sum of Sq      F Pr(&#62;F)1  36113 22804767232  36111 2280191044  2    285679 2.2621 0.1041Sauf que sur les trois départements, seulement deux se touchent,&#62; france0[france0$ij%in%c(6768,667,668),]depi depj Cij Dij   ij3510    6   67   0 533  6673552   67   68   1  95 67683605    6   68   0 439  668On 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,&#62; departement=as.numeric(substr(COEFtrie$Dpt,5,6))&#62; deptij=departement[1:(nrow(COEFtrie)-1)]*100+&#62; departement[(2):(nrow(COEFtrie))]&#62; voisins=france0[france0$ij%in%deptij,]&#62; voisinage=tapply(voisins$Cij,factor(voisins$ij),max)&#62; COEFtrie$voisin=NA&#62; v=voisinage[as.character(deptij)]&#62; COEFtrie$voisin[1:(nrow(COEFtrie)-1)]=&#62; v[is.na(v)==FALSE]&#62; COEFtrie[1:10,]Estimate Std..Error   t.value    Dpt voisin1  35.69903  0.3246129 109.97414 DptD06      02  36.46840  0.3244806 112.39010 DptD67      13  36.67594  0.3896297  94.13025 DptD68      04  37.39283  0.3202112 116.77552 DptD83      05  39.92023  0.3921762 101.79156 DptD74      06  42.61811  0.6182921  68.92877 DptD10      07  42.77423  0.4397101  97.27826 DptD01      08  43.53395  0.4448212  97.86843 DptD84      09  44.38759  0.3897553 113.88579 DptD85      010 44.65361  0.4577710  97.54575 DptD51      1On 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,&#62;  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&#62; 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,&#62; 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(&#62;|t|)(Intercept) 45.9303788  0.4170114 110.1417762 0.0000000DptD28       0.5643212  0.6594028   0.8558065 0.3921105DptD89       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 TableModel 1: X.VoixExpH ~ DptGroupeModel 2: X.VoixExpH ~ DptRes.Df        RSS Df Sum of Sq      F Pr(&#62;F)1  36113 22803140072  36111 2280191044  2    122963 0.9737 0.3777Géographiquement, ce sont effectivement des voisinsMais peu de départements voisins peuvent effectivement être fusionnés.