Importation et inspection des données

#chargement rapide
library(data.table)
X <- data.table::fread("wave100k4.txt",header=TRUE)

#premières lignes
head(X)
#structure
str(X)
## Classes 'data.table' and 'data.frame':   100000 obs. of  4 variables:
##  $ X07: num  -0.14 -0.06 2.4 5.02 1.73 -0.1 2.97 6.79 4.86 0.76 ...
##  $ X11: num  0.53 3.99 3.85 1.44 0.75 1.52 2.43 2.44 0.77 2.94 ...
##  $ X15: num  7.2 2.98 4.59 2.93 5.22 4.97 2.37 0.41 0.44 3.82 ...
##  $ X10: num  1 2.07 1.7 2.9 -0.2 0.7 4.36 1.62 2.92 1.08 ...
##  - attr(*, ".internal.selfref")=<externalptr>
#stat. descriptives
summary(X)
##       X07              X11              X15              X10        
##  Min.   :-3.600   Min.   :-1.980   Min.   :-4.330   Min.   :-2.330  
##  1st Qu.: 1.090   1st Qu.: 2.070   1st Qu.: 1.090   1st Qu.: 1.890  
##  Median : 2.510   Median : 3.170   Median : 2.510   Median : 2.990  
##  Mean   : 2.671   Mean   : 3.328   Mean   : 2.665   Mean   : 2.995  
##  3rd Qu.: 4.230   3rd Qu.: 4.530   3rd Qu.: 4.210   3rd Qu.: 4.100  
##  Max.   : 9.890   Max.   : 9.770   Max.   : 9.310   Max.   : 8.510

Carte de Kohonen

#package
library(kohonen)

#carte
set.seed(0)
carte <- kohonen::som(X=as.matrix(X),grid=somgrid(7,7,"rectangular"))
print(carte$grid)
## $pts
##       x y
##  [1,] 1 1
##  [2,] 2 1
##  [3,] 3 1
##  [4,] 4 1
##  [5,] 5 1
##  [6,] 6 1
##  [7,] 7 1
##  [8,] 1 2
##  [9,] 2 2
## [10,] 3 2
## [11,] 4 2
## [12,] 5 2
## [13,] 6 2
## [14,] 7 2
## [15,] 1 3
## [16,] 2 3
## [17,] 3 3
## [18,] 4 3
## [19,] 5 3
## [20,] 6 3
## [21,] 7 3
## [22,] 1 4
## [23,] 2 4
## [24,] 3 4
## [25,] 4 4
## [26,] 5 4
## [27,] 6 4
## [28,] 7 4
## [29,] 1 5
## [30,] 2 5
## [31,] 3 5
## [32,] 4 5
## [33,] 5 5
## [34,] 6 5
## [35,] 7 5
## [36,] 1 6
## [37,] 2 6
## [38,] 3 6
## [39,] 4 6
## [40,] 5 6
## [41,] 6 6
## [42,] 7 6
## [43,] 1 7
## [44,] 2 7
## [45,] 3 7
## [46,] 4 7
## [47,] 5 7
## [48,] 6 7
## [49,] 7 7
## 
## $xdim
## [1] 7
## 
## $ydim
## [1] 7
## 
## $topo
## [1] "rectangular"
## 
## $neighbourhood.fct
## [1] bubble
## Levels: bubble gaussian
## 
## $toroidal
## [1] FALSE
## 
## attr(,"class")
## [1] "somgrid"
#noeud d'appartenance des individus - 20 premiers
print(head(carte$unit.classif,20))
##  [1]  7  3 26 39 21 20 33 48 46 19 15 32 26 12 26 40 13 35 46 26
#effectifs par noeud
print(nk <- table(carte$unit.classif))
## 
##    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
## 2213 2099 1766 2474 1764 2118 1730 2036 2249 1991 2223 2054 1815 2311 2031 1894 
##   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 
## 1883 2080 2788 1636 1603 2008 2474 2036 2313 2177 1995 2019 1717 2089 2254 2330 
##   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48 
## 1870 1592 1753 2088 2175 2120 2018 1977 1947 1856 1793 2096 2199 2191 1725 2005 
##   49 
## 2425
#le noeud le plus "peuplé"
print(max(nk))
## [1] 2788
print(which.max(nk))
## 19 
## 19
#fonction pour code couleur - degradé de bleu
degrade.bleu <- function(n){
  return(rgb(0,0.5,1,alpha=seq(0,1,1/n)))
}

#effectifs dans les noeuds
plot(carte,type="count",palette.name = degrade.bleu)

#codebooks
#moyennes conditionnellement aux noeuds
print(carte$codes)
## [[1]]
##            X07       X11         X15       X10
## V1   1.7970928 5.0957129  2.13818646 5.7217036
## V2   1.3743381 6.0086096  3.49156137 4.9570448
## V3  -0.5784362 3.9278500  4.16040314 2.7050619
## V4   1.1087058 4.4569350  4.60889777 3.7459237
## V5  -0.7659054 2.7488395  6.02395963 2.0813969
## V6   0.8198278 1.4690022  6.16778609 1.9984366
## V7   0.2925451 2.1421029  6.80180134 0.4264744
## V8   1.1913965 6.4651841  1.47362969 4.5947988
## V9   2.5012925 5.4757050  3.26444954 3.2792503
## V10  2.6256589 4.0374639  3.24225302 4.5613086
## V11  0.6336316 2.5190351  4.81004172 3.3081917
## V12  2.0531233 2.3975348  5.44040739 0.9179408
## V13 -0.1007406 3.1804598  5.09848764 0.2293138
## V14  0.8880825 3.5574868  5.99640353 1.8782007
## V15  3.2763116 5.9581072  1.10002910 3.6061481
## V16  0.4180288 4.3040731  2.86194640 4.4127729
## V17  0.7025150 5.4730675  2.79685067 2.8560540
## V18  1.0131049 4.3518780  4.14605475 1.6331038
## V19  0.2701448 2.2676279  4.14565088 1.4923676
## V20 -0.6948966 1.1701382  5.24057317 1.0521238
## V21  1.2163149 1.0917278  4.71782106 0.3555973
## V22  2.9631642 6.6388704  2.44197311 5.0447366
## V23  1.7229178 4.6675830  1.33393198 4.0265451
## V24  3.8017393 4.9659939  1.84237186 5.3585663
## V25  1.2917868 3.0980478  2.85952690 2.7727695
## V26  2.5281657 3.0666244  4.51718785 2.4773081
## V27  1.8549596 1.0131558  4.34814222 2.3270976
## V28  2.1422922 2.2983429  3.32103681 0.7953525
## V29  2.6904892 5.6221442  0.42926306 5.3563950
## V30  3.1491304 3.5827995  0.94421224 4.8645394
## V31  4.0001153 4.3714102  2.01253242 3.5497861
## V32  3.6104214 2.3294897  1.02695838 3.0808161
## V33  3.4220861 1.8108754  2.91042917 3.3181222
## V34  2.2584597 1.0823619  2.20627452 1.7854108
## V35  3.9102526 1.3158928  3.61053101 1.4853538
## V36  3.3523993 4.0422063  0.08111549 3.2917325
## V37  5.0313174 4.6395052  0.46584314 4.2889474
## V38  5.0419996 2.9617318  1.63331476 4.3071782
## V39  5.3975231 2.4217549  2.30519763 2.4595071
## V40  4.4833898 1.8385922 -0.44491785 2.5350817
## V41  4.1498049 1.7612525  1.39116525 1.3025677
## V42  3.3299732 3.1842295  2.45101161 1.8351995
## V43  5.9918170 3.2363289 -0.81413637 3.1446332
## V44  6.5108637 2.6750116  0.84113668 3.5831011
## V45  4.7774005 2.4692039 -0.01674306 4.5583925
## V46  5.0743216 0.9089923  1.27165874 3.3028399
## V47  6.2445521 1.3972535 -0.44530434 3.4852358
## V48  6.2523541 1.8481793  0.48161652 1.8616431
## V49  5.0755377 3.5662321  0.59247717 2.2846420
#attention, $codes est une liste
#pour obtenir le codebook du 1er noeud
print(carte$codes[[1]][1,])
##      X07      X11      X15      X10 
## 1.797093 5.095713 2.138186 5.721704
#affichage des codebooks - interprétation des noeuds
#possible parce que 4 variables seulement
plot(carte,type="codes")
## Warning in par(opar): argument 1 does not name a graphical parameter

#caractérisation des noeuds (bis)
#couleurs plus ou moins intenses en fonction de la valeur
#des variables
par(mfrow=c(2,2))
for (j in 1:ncol(X)){
  plot(carte,type="property",property=carte$codes[[1]][,j],palette.name=degrade.bleu,main=colnames(X)[j])
}

par(mfrow=c(1,1))

CAH à partir de la carte de Kohonen

#distance entre les noeuds
D <- dist(carte$codes[[1]])

#affichage de contrôle
print(round(as.matrix(D)[1:10,1:10],2))
##       V1   V2   V3   V4   V5   V6   V7   V8   V9  V10
## V1  0.00 1.85 4.49 3.30 6.36 6.65 7.80 1.99 2.81 2.09
## V2  1.85 0.00 3.70 2.28 5.47 6.07 6.90 2.11 2.10 2.38
## V3  4.49 3.70 0.00 2.10 2.30 3.54 4.01 4.51 3.61 3.82
## V4  3.30 2.28 2.10 0.00 3.35 3.81 4.67 3.82 2.24 2.24
## V5  6.36 5.47 2.30 3.35 0.00 2.04 2.20 6.68 5.21 5.20
## V6  6.65 6.07 3.54 3.81 2.04 0.00 1.90 7.34 5.38 5.00
## V7  7.80 6.90 4.01 4.67 2.20 1.90 0.00 8.08 6.05 6.23
## V8  1.99 2.11 4.51 3.82 6.68 7.34 8.08 0.00 2.76 3.33
## V9  2.81 2.10 3.61 2.24 5.21 5.38 6.05 2.76 0.00 1.93
## V10 2.09 2.38 3.82 2.24 5.20 5.00 6.23 3.33 1.93 0.00
#cah
cah <- hclust(D,method="ward.D2",members=nk)
plot(cah,hang=-1)

#découpage en 3 groupes
groupes_cah <- cutree(cah,k=3)
print(groupes_cah)
##  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 
##   1   1   2   1   2   2   2   1   1   1   2   2   2   2   1   1   1   2   2   2 
## V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 
##   2   1   1   1   2   2   2   3   1   1   1   3   3   3   3   1   1   3   3   3 
## V41 V42 V43 V44 V45 V46 V47 V48 V49 
##   3   3   3   3   3   3   3   3   3
#effectifs par groupe
print(table(groupes_cah))
## groupes_cah
##  1  2  3 
## 17 15 17
#code couleur pour groupes
couleur.groupes <- function(k){
  return(c('orchid','chartreuse','gold'))
}

#carte avec groupes finaux
plot(carte,type="property",property=groupes_cah,palette.name=couleur.groupes)

Associer les individus à leur groupe définitif

#associer les individus au groupe final
finalGroup <- groupes_cah[carte$unit.classif]
print(head(finalGroup,20))
##  V7  V3 V26 V39 V21 V20 V33 V48 V46 V19 V15 V32 V26 V12 V26 V40 V13 V35 V46 V26 
##   2   2   2   3   2   2   3   3   3   2   1   3   2   2   2   3   2   3   3   2
#effectifs par groupe final
print(table(finalGroup))
## finalGroup
##     1     2     3 
## 35711 30373 33916
#vérification pour le groupe 1
#à partir des effectifs des noeuds associés
print(sum(nk[groupes_cah == 1]))
## [1] 35711

Interprétation des groupes

#moyenne marginale de X15
print(mean(X$X15))
## [1] 2.665058
#moyenne conditionnelle des individus du groupe 2 (chartreuse)
print(mean(X$X15[finalGroup==2]))
## [1] 4.916023
#moyenne marginale de X07
print(mean(X$X07))
## [1] 2.671258
#moyenne conditionnelle des individus du groupe 2 (chartreuse)
print(mean(X$X07[finalGroup==2]))
## [1] 0.7681306