doubs_env <- read.table("doubs_env.txt", header = TRUE)
Rappelez la nature des données en présence. Quelles analyses multivariées pourraient être réalisées, pour atteindre quel objectif ?
Les données utilisées proviennent du fichier “doubs_env.txt”. Elles décrivent les caractéristiques physico-chimiques et topographiques de 30 sites de mesure le lond du Doubs. On retrouve ci-dessous les diagrammes de boites à moustache des différentes variables de la table “doubs_env” :
par(mfrow = c(1,2))
boxplot(doubs_env$dfs, range = 1, col = "forestgreen", xlab = "dfs")
boxplot(doubs_env$ele, range = 1, col = "darkorange", xlab = "ele")
boxplot(doubs_env$slo, range = 1, col = "yellow", xlab = "slo")
boxplot(doubs_env$dis, range = 1, col = "purple", xlab = "dis")
boxplot(doubs_env$pH, range = 1, col = "cyan", xlab = "pH")
boxplot(doubs_env$har, range = 1, col = "darkcyan", xlab = "har")
boxplot(doubs_env$pho, range = 1, col = "brown", xlab = "pho")
boxplot(doubs_env$nit, range = 1, col = "darkred", xlab = "nit")
boxplot(doubs_env$amm, range = 1, col = "coral4", xlab = "amm")
boxplot(doubs_env$oxy, range = 1, col = "cornflowerblue", xlab = "oxy")
boxplot(doubs_env$bod, range = 1, col = "darkorchid4", xlab = "bod")
On a alors 11 variables quantitatives continues (distance à la
source, altitude, pente, débit, pH, dureté, phosphates, nitrates,
ammonium, oxygène dissous et DBO5).
On peut ainsi réaliser des classifications pour regrouper les sites
ayant des des caractéristiques similaires.
Aisni, l’objectif est d’identifier les typologies de sites afin de
comprendre l’organisation spatiale des variables environnementales. On
peut donc utiliser des analyses multivariées telles que le CAH,
k-means.
Proposez une validation préliminaire des données, ainsi qu’une première visualisation
par(mfrow = c(1,1))
#on peut résumer doubs_env avec différentes commandes :
summary(doubs_env)
## dfs ele slo dis
## Min. : 0.30 Min. :172.0 Min. : 0.200 Min. : 0.84
## 1st Qu.: 54.45 1st Qu.:248.0 1st Qu.: 0.525 1st Qu.: 4.20
## Median :175.20 Median :395.0 Median : 1.200 Median :22.10
## Mean :188.23 Mean :481.6 Mean : 3.497 Mean :22.20
## 3rd Qu.:301.73 3rd Qu.:782.0 3rd Qu.: 2.875 3rd Qu.:28.57
## Max. :453.00 Max. :934.0 Max. :48.000 Max. :69.00
## pH har pho nit
## Min. :7.700 Min. : 40.00 Min. :0.0100 Min. :0.150
## 1st Qu.:7.925 1st Qu.: 84.25 1st Qu.:0.1250 1st Qu.:0.505
## Median :8.000 Median : 89.00 Median :0.2850 Median :1.600
## Mean :8.050 Mean : 86.10 Mean :0.5577 Mean :1.654
## 3rd Qu.:8.100 3rd Qu.: 96.75 3rd Qu.:0.5600 3rd Qu.:2.425
## Max. :8.600 Max. :110.00 Max. :4.2200 Max. :6.200
## amm oxy bod
## Min. :0.0000 Min. : 4.100 Min. : 1.300
## 1st Qu.:0.0000 1st Qu.: 8.025 1st Qu.: 2.725
## Median :0.1000 Median :10.200 Median : 4.150
## Mean :0.2093 Mean : 9.390 Mean : 5.117
## 3rd Qu.:0.2000 3rd Qu.:10.900 3rd Qu.: 5.275
## Max. :1.8000 Max. :12.400 Max. :16.700
#toutes les variables
plot(doubs_env)
#ou individuellement
plot(doubs_env$ele)
Cette visualisation ne permet pas de grandes analyses (on ne voit pas beaucoup de détails sur le résultats “plot(doubs_env)”) mais on peut tout de même remarquer quelques corrélations ou décorrélations (par exemple on peu remarquer que la distance à la source et l’altitude sont décorélées). De plus, on voit la grande disparité d’ordre de grandeurs des variables (déjà visibles sur les boites à moustaches). Aisni, cela impose un “centrage réduction”.
Etablissez un plan d’analyse de données, en précisant notamment la (les) question(s) posée(s), les différentes étapes de la démarche et le protocole à suivre pour interpréter les classifications
On doit donc suivre le plan suiviant : - il faut centrer - réduire
les données.
- réaliser une classification ascendante hiérarchique (CAH), il faut
penser à utiliser la distance euclidienne pour la méthode de Ward. -
choix du nombre de classes (de dimensions). - méthode des k-means.
- caractérisation des groupes par les moyennes des variables.
distances <- dist(doubs_env, method = "euclidean")
dendro <- hclust(distances, method = "ward.D2")
plot(dendro, hang = -1)
classes.cah <- cutree(dendro, k = 2)
rect.hclust(dendro, k = 3, border = "darkcyan")
doubs_env.cluster <- data.frame(classes.cah, doubs_env)
compoCluster <- aggregate(doubs_env.cluster[,2:length(doubs_env.cluster)], by = list(doubs_env.cluster$classes.cah), mean)
compoCluster
Ainsi, le CAH permet de voir la structure hiérarchique. D’après les
résulats, on doit prendre alors un “découpage” en ” dimensions.
On a notamment le groupe “amont” et le groupe “pollué”. Le premier
présente des sites à haute altitude, forte pente, eau bien oxygénée et
faible teneur en nutriments. Le second présente des sites présentant des
pics d’ammonium (amm), de phosphates (pho) et une forte DBO5 (bod),
souvent liés à des rejets anthropiques.
classes.kmean <- kmeans(doubs_env, centers=2)
classes.kmean$centers
## dfs ele slo dis pH har pho nit amm oxy bod
## 1 34.050 833.1 8.360 3.177 8.01 70.7 0.139 0.3630 0.060 9.75 4.07
## 2 265.325 305.8 1.065 31.713 8.07 93.8 0.767 2.2995 0.284 9.21 5.64
Les k-means confirment généralement les résultats de la CAH, bien que certains sites “frontières” puissent changer de groupe. La variable nit (nitrates) et oxy (oxygène) sont souvent discriminantes pour expliquer les différences entre les groupes amont/aval ou les zones d’eutrophisation.
Formulez une synthèse de cette analyse par regroupement ; pointez ses limites éventuelles et proposez des pistes d’amélioration
L’analyse par regroupement a permis de segmenter la rivière en zones homogènes (amont préservé, zone de transition, aval plus chargé en nutriments). Limites : le choix du nombre de classes reste subjectif malgré les critères d’inertie. De plus, ces méthodes sont sensibles aux valeurs extrêmes. Pistes d’amélioration : réaliser une ACP en amont pour visualiser les sites dans le plan factoriel et superposer les clusters pour mieux interpréter leur proximité spatiale.
doubs_pisc <- read.table("doubs_pisc.txt", header = TRUE)
#nature du fichier
class(doubs_pisc)
## [1] "data.frame"
#nature des données dans le fichier
summary (doubs_pisc)
## famille longueur longueurMax facteurForme
## Length:27 Length:27 Length:27 Length:27
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## niveauTrophique
## Length:27
## Class :character
## Mode :character
#ou encore pour plus de rapidité
sapply(doubs_pisc[sapply(doubs_pisc, is.character)], class)
## famille longueur longueurMax facteurForme niveauTrophique
## "character" "character" "character" "character" "character"
Les données doubs_pisc.txt présentent les abondances (ou présences/absences transformées en classes) de différentes espèces de poissons sur les 30 sites de la rivière.
Nature des données : Il s’agit de variables qualitatives (ou quantitatives discrétisées). On y trouve des informations sur les familles et les longueurs des individus.
Objectif : L’analyse bivariée (deux par deux) étant limitée pour comprendre un écosystème complexe, nous utilisons une Analyse des Correspondances Multiples (ACM). L’objectif est d’identifier des structures de corrélation entre les espèces, de définir des profils de sites (typologies piscicoles) et d’étudier l’évolution de la biodiversité le long du gradient de la rivière.
library(ade4)
summary(doubs_pisc$famille)
## Length Class Mode
## 27 character character
summary(doubs_pisc$longueur)
## Length Class Mode
## 27 character character
#on n'affichera pas le résultat de cette commande pour cause de lisibilité
doubs_pisc.disjonct <- acm.disjonctif(doubs_pisc)
doubs_pisc.disjonct
On vérifie qu’il n’y a pas de données manquantes :
length(which(is.na(doubs_pisc)))
## [1] 0
L’utilisation de acm.disjonctif permet de transformer le tableau en une matrice binaire (0/1) où chaque colonne représente une modalité. Cela montre la structure éclatée que l’ACM va traiter pour calculer les proximités entre sites et espèces.
On commence par le choix des axes. Comme indiqué en cours, dans le cas de l’ACM, la valeur de l’inertie est peu pertinente pour l’interprétation des axes à retenir. Il faut passer par la “correction de Benzecri” qui distribue l’inertie dans un nombre plus restreint d’axes. On retient alors, pour l’interprétation, les axes propres (otenus par la commande “doubs_pisc.mca$eig”) qui expliquent entre 60% et 80% de la variance corrigée. Cette correction intervient uniquement pour le choix des axes ; la suite des calculs se fait à l’aide des valeurs propres initialement calculées par l’ACM.
library(FactoMineR)
doubs_pisc.acm <- MCA(doubs_pisc)
doubs_pisc.acm
summary(doubs_pisc.acm)
##
## Call:
## MCA(X = doubs_pisc)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
## Variance 0.721 0.650 0.457 0.334 0.289 0.253 0.200
## % of var. 18.978 17.095 12.027 8.783 7.609 6.665 5.263
## Cumulative % of var. 18.978 36.073 48.101 56.884 64.493 71.158 76.421
## Dim.8 Dim.9 Dim.10 Dim.11 Dim.12 Dim.13 Dim.14
## Variance 0.200 0.191 0.158 0.129 0.107 0.049 0.031
## % of var. 5.263 5.029 4.149 3.402 2.809 1.302 0.815
## Cumulative % of var. 81.684 86.713 90.862 94.264 97.072 98.374 99.189
## Dim.15 Dim.16 Dim.17 Dim.18 Dim.19
## Variance 0.021 0.010 0.000 0.000 0.000
## % of var. 0.550 0.260 0.000 0.000 0.000
## Cumulative % of var. 99.740 100.000 100.000 100.000 100.000
##
## Individuals (the 10 first)
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
## Cogo | -0.164 0.138 0.005 | -0.466 1.236 0.037 | 0.881 6.288
## Satr | -0.284 0.415 0.016 | 0.724 2.987 0.106 | -0.544 2.402
## Phph | -0.163 0.136 0.038 | -0.393 0.880 0.219 | 0.418 1.418
## Babl | -0.164 0.138 0.005 | -0.466 1.236 0.037 | 0.881 6.288
## Thth | -0.091 0.043 0.002 | -0.160 0.145 0.007 | -0.898 6.540
## Teso | -0.163 0.136 0.038 | -0.393 0.880 0.219 | 0.418 1.418
## Chna | -0.156 0.124 0.004 | -0.323 0.595 0.015 | -1.467 17.447
## Pato | -0.180 0.166 0.026 | -0.340 0.659 0.093 | 0.276 0.617
## Lele | -0.135 0.093 0.013 | -0.338 0.652 0.082 | -0.277 0.624
## Sqce | -0.084 0.036 0.006 | -0.317 0.573 0.092 | -0.660 3.527
## cos2
## Cogo 0.134 |
## Satr 0.060 |
## Phph 0.249 |
## Babl 0.134 |
## Thth 0.232 |
## Teso 0.249 |
## Chna 0.316 |
## Pato 0.061 |
## Lele 0.055 |
## Sqce 0.398 |
##
## Categories (the 10 first)
## Dim.1 ctr cos2 v.test Dim.2 ctr cos2 v.test
## Anguillidae | -1.094 1.229 0.046 -1.094 | 4.490 22.988 0.775 4.490 |
## Centrarchidae | -0.334 0.115 0.004 -0.334 | 0.245 0.068 0.002 0.245 |
## Cottidae | -0.193 0.038 0.001 -0.193 | -0.578 0.381 0.013 -0.578 |
## Cyprinidae | -0.189 0.622 0.061 -1.254 | -0.284 1.568 0.137 -1.891 |
## Esocidae | 4.880 24.461 0.916 4.880 | 0.980 1.096 0.037 0.980 |
## Ictaluridae | -0.334 0.115 0.004 -0.334 | 0.245 0.068 0.002 0.245 |
## Nemacheilidae | -0.193 0.038 0.001 -0.193 | -0.578 0.381 0.013 -0.578 |
## Percidae | 0.459 0.433 0.017 0.662 | -0.335 0.256 0.009 -0.483 |
## Salmonidae | -0.221 0.100 0.004 -0.319 | 0.350 0.279 0.010 0.505 |
## court | -0.194 0.578 0.047 -1.104 | -0.385 2.534 0.185 -2.194 |
## Dim.3 ctr cos2 v.test
## Anguillidae 0.225 0.082 0.002 0.225 |
## Centrarchidae 1.926 6.013 0.143 1.926 |
## Cottidae 1.303 2.751 0.065 1.303 |
## Cyprinidae -0.260 1.869 0.115 -1.731 |
## Esocidae 0.408 0.270 0.006 0.408 |
## Ictaluridae 1.926 6.013 0.143 1.926 |
## Nemacheilidae 1.303 2.751 0.065 1.303 |
## Percidae -0.265 0.228 0.006 -0.382 |
## Salmonidae -1.067 3.691 0.091 -1.539 |
## court 0.664 10.729 0.552 3.787 |
##
## Categorical variables (eta2)
## Dim.1 Dim.2 Dim.3
## famille | 0.979 0.880 0.541 |
## longueur | 0.947 0.696 0.664 |
## longueurMax | 0.940 0.477 0.741 |
## facteurForme | 0.048 0.777 0.182 |
## niveauTrophique | 0.691 0.418 0.157 |
doubs_pisc.acm$eig
new.vp <- c((5/4*(doubs_pisc.acm$eig[,1]-1/5))^2)
new.var <- c(round(new.vp/sum(new.vp), digits = 2))
vp.benzec <- data.frame(doubs_pisc.acm$eig[,1], doubs_pisc.acm$eig[,2]/100, new.var)
Interprétation : si l’axe 1 après correction explique par exemple 70% de la variance, il sera le seul nécessaire pour interpréter la majeure partie de la distribution des poissons.
Le graphique des modalités “(invisible =”ind”)“ permet de voir quelles espèces s’associent entre elles.
Proximités : des modalités proches sur le graphique indiquent que ces caractéristiques (ex: telle famille de poisson et telle tranche de longueur) se retrouvent souvent sur les mêmes sites.
Opposition : une opposition sur le premier axe traduit souvent le gradient amont (espèces d’eaux vives, froides et oxygénées comme la Truite) versus aval (espèces d’eaux lentes comme la Brème ou la Carpe).
doubs_pisc.acm$var$contrib
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Anguillidae 1.228960153 22.98762063 0.08217531 1.45071328 1.77307037
## Centrarchidae 0.114757232 0.06825803 6.01325384 4.15526908 12.43610292
## Cottidae 0.038302040 0.38053015 2.75137255 0.07098311 5.43530295
## Cyprinidae 0.621545642 1.56781805 1.86852487 7.17373392 0.08844514
## Esocidae 24.461182450 1.09571646 0.26983404 0.31876060 0.14428308
## Ictaluridae 0.114757232 0.06825803 6.01325384 4.15526908 12.43610292
## Nemacheilidae 0.038302040 0.38053015 2.75137255 0.07098311 5.43530295
## Percidae 0.432753203 0.25565968 0.22778432 2.94442277 5.03755786
## Salmonidae 0.100374503 0.27947054 3.69093989 23.40348937 0.12975848
## court 0.577991934 2.53428537 10.72860860 1.77040857 0.09955625
## long 1.213077696 17.71165920 0.12197180 5.67559318 0.49422460
## moyen 0.021879029 0.07708799 17.95311128 9.17485096 0.04102823
## très long 24.461182450 1.09571646 0.26983404 0.31876060 0.14428308
## courtMax 0.513640804 1.88141977 16.29815579 0.22573064 0.05361840
## longMax 1.104594589 10.35616963 2.53982776 0.68430649 0.89720300
## moyenMax 0.001419938 1.35421773 13.30008918 0.01445476 0.71701974
## très longMax 24.461182450 1.09571646 0.26983404 0.31876060 0.14428308
## ovale 0.034485997 0.18315692 7.63459944 4.24969242 14.97181587
## rond 0.067007341 0.76267816 0.24530535 0.42665295 0.25761232
## torpille 1.228960153 22.98762063 0.08217531 1.45071328 1.77307037
## predateur 1.129171230 9.84711135 4.33833310 11.74409887 11.00585440
## proie 0.377109369 2.46189841 0.00703064 0.44307303 13.60254630
## proieProie 0.319685510 0.19005699 2.10015255 18.98820889 12.40396647
## superPredateur 17.337677012 0.37734324 0.44245991 0.77107045 0.47799123
doubs_pisc.acm$ind$contrib
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Cogo 1.381086e-01 1.23599934 6.2875030 0.1184602 7.8579893
## Satr 4.147410e-01 2.98694028 2.4023971 26.4550971 1.2067268
## Phph 1.363534e-01 0.87980602 1.4182819 0.4106164 0.6468431
## Babl 1.381086e-01 1.23599934 6.2875030 0.1184602 7.8579893
## Thth 4.276349e-02 0.14506456 6.5395401 13.6511941 0.2361786
## Teso 1.363534e-01 0.87980602 1.4182819 0.4106164 0.6468431
## Chna 1.243488e-01 0.59491169 17.4467710 7.0921015 21.6452276
## Pato 1.659088e-01 0.65925335 0.6165812 4.6264099 1.4007490
## Lele 9.301319e-02 0.65201284 0.6238792 4.0550607 2.1723014
## Sqce 3.591497e-02 0.57273267 3.5265708 0.2958376 0.4068322
## Baba 1.852627e-01 0.06604275 2.3877257 0.6388163 1.5003417
## Albi 1.363534e-01 0.87980602 1.4182819 0.4106164 0.6468431
## Gogo 1.363534e-01 0.87980602 1.4182819 0.4106164 0.6468431
## Eslu 8.820154e+01 3.55899477 0.6166313 0.5319638 0.2085946
## Pefl 3.204757e+00 0.10295649 4.8722334 5.4457062 2.6645553
## Rham 1.659088e-01 0.65925335 0.6165812 4.6264099 1.4007490
## Legi 4.137888e-01 0.22170878 13.7416328 6.9345230 17.9792672
## Scer 9.301319e-02 0.65201284 0.6238792 4.0550607 2.1723014
## Cyca 7.270165e-01 4.34963064 1.3923590 7.8200855 0.1645404
## Titi 3.591497e-02 0.57273267 3.5265708 0.2958376 0.4068322
## Abbr 1.852627e-01 0.06604275 2.3877257 0.6388163 1.5003417
## Icme 4.137888e-01 0.22170878 13.7416328 6.9345230 17.9792672
## Gyce 5.568906e-04 0.93674906 1.4089265 0.6420770 4.7706643
## Ruru 3.591497e-02 0.57273267 3.5265708 0.2958376 0.4068322
## Blbj 7.124748e-02 0.87143848 0.1475871 0.2536156 0.2641190
## Alal 1.363534e-01 0.87980602 1.4182819 0.4106164 0.6468431
## Anan 4.431355e+00 74.66605177 0.1877890 2.4210236 2.5633839
doubs_pisc.acm$ind$cos2
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Cogo 4.647663e-03 0.037468192 0.134098011 0.001845038 0.1060265049
## Satr 1.632734e-02 0.105924239 0.059939517 0.482021546 0.0190474254
## Phph 3.773146e-02 0.219308255 0.248731183 0.052588724 0.0717671202
## Babl 4.647663e-03 0.037468192 0.134098011 0.001845038 0.1060265049
## Thth 2.395443e-03 0.007319889 0.232161393 0.353917531 0.0053044724
## Teso 3.773146e-02 0.219308255 0.248731183 0.052588724 0.0717671202
## Chna 3.551399e-03 0.015305267 0.315793443 0.093745759 0.2478615047
## Pato 2.597555e-02 0.092977556 0.061180879 0.335241804 0.0879315248
## Lele 1.299524e-02 0.082059010 0.055242114 0.262213933 0.1216882724
## Sqce 6.394268e-03 0.091853920 0.397922030 0.024377402 0.0290415374
## Baba 2.292309e-02 0.007361066 0.187240441 0.036583048 0.0744327898
## Albi 3.773146e-02 0.219308255 0.248731183 0.052588724 0.0717671202
## Gogo 3.773146e-02 0.219308255 0.248731183 0.052588724 0.0717671202
## Eslu 9.479956e-01 0.034457833 0.004200353 0.002646251 0.0008989224
## Pefl 1.072910e-01 0.003104933 0.103377554 0.084380290 0.0357669391
## Rham 2.597555e-02 0.092977556 0.061180879 0.335241804 0.0879315248
## Legi 1.189044e-02 0.005738950 0.250257733 0.092226219 0.2071476589
## Scer 1.299524e-02 0.082059010 0.055242114 0.262213933 0.1216882724
## Cyca 3.359530e-02 0.181057763 0.040777033 0.167249394 0.0030485668
## Titi 6.394268e-03 0.091853920 0.397922030 0.024377402 0.0290415374
## Abbr 2.292309e-02 0.007361066 0.187240441 0.036583048 0.0744327898
## Icme 1.189044e-02 0.005738950 0.250257733 0.092226219 0.2071476589
## Gyce 3.513714e-05 0.053241499 0.056339757 0.018750050 0.1206880784
## Ruru 6.394268e-03 0.091853920 0.397922030 0.024377402 0.0290415374
## Blbj 1.625113e-02 0.179052880 0.021335005 0.026773726 0.0241547564
## Alal 3.773146e-02 0.219308255 0.248731183 0.052588724 0.0717671202
## Anan 5.779219e-02 0.877175120 0.001552147 0.014613372 0.0134040267
doubs_pisc.acm$quali.sup$v.test
## NULL
par(mfrow = c(1,2))
plot(doubs_pisc.acm, invisible = "var")
plot(doubs_pisc.acm, invisible = "ind")
par(mfrow = c(1,1))
doubs_pisc.hc <- HCPC(doubs_pisc.acm, nb.clust = 3)
Le découpage en 3 clusters permet de sectoriser la rivière :
Cluster 1 : sites de tête de bassin (haute altitude, peu d’espèces mais spécifiques). Cluster 2 : zone de transition (mélange de biodiversité). Cluster 3 : zone de plaine (aval), riche en espèces cyprinicoles (poissons d’eau calme).
Formulez une synthèse de cette analyse ; pointez ses limites éventuelles et proposez des pistes d’amélioration.
L’ACM a permis de simplifier la complexité du jeu de données piscicoles en quelques axes interprétables.
Limites : l’ACM est sensible aux modalités rares (espèces peu fréquentes) qui peuvent parfois “tirer” un axe de manière disproportionnée.
Pistes d’amélioration : il serait intéressant de croiser ces résultats avec les données environnementales (doubs_env) via plusieurs analyses pour vérifier si la typologie des poissons correspond parfaitement à la typologie physico-chimique de l’eau.