Document complémentaire au module 8 du cours SDD II de 2025-2026. Distribué sous licence CC BY-NC-SA 4.0.

Veuillez vous référer au cours en ligne pour les explications et les interprétations de cette analyse.

Installer un environnement R adéquat pour reproduire cette analyse.

Première AFM sur le plancton avec seulement des ACP

# Chargement du dialecte SciViews::R avec le module explore
SciViews::R("explore", lang = "fr")
# Identification des différentes masses d'eaux (transect entre Nice et la Corse)
marzones <- factor(c(
  rep("périphérique", 16),
  rep("divergente1", 8),
  rep("convergente", 5),
  rep("frontale", 11),
  rep("divergente2", 5),
  rep("centrale", 23)),
  levels = c("périphérique", "divergente1", "convergente",
    "frontale", "divergente2", "centrale"))

# Jointure des deux tableaux marphy, marbio et ajout de marzones
bind_cols(
  read("marphy", package = "pastecs"),
  log1p(read("marbio", package = "pastecs"))) %>.%
  smutate(., Zone = marzones) ->
  mar

# Nom des variables de mar
names(mar)
##  [1] "Temperature"            "Salinity"               "Fluorescence"           "Density"               
##  [5] "Acartia"                "AdultsOfCalanus"        "Copepodits1"            "Copepodits2"           
##  [9] "Copepodits3"            "Copepodits4"            "Copepodits5"            "ClausocalanusA"        
## [13] "ClausocalanusB"         "ClausocalanusC"         "AdultsOfCentropages"    "JuvenilesOfCentropages"
## [17] "Nauplii"                "Oithona"                "Acanthaires"            "Cladocerans"           
## [21] "EchinodermsLarvae"      "DecapodsLarvae"         "GasteropodsLarvae"      "EggsOfCrustaceans"     
## [25] "Ostracods"              "Pteropods"              "Siphonophores"          "BellsOfCalycophores"   
## [29] "Zone"
# Première AFM sur mar
mar_mfa <- mfa(data = mar,
  ~ 4*std %as% environment + 24*num %as% plancton - 1*fct %as% zone)

# Résumé de la première AFM
summary(mar_mfa)
## 
## Call:
## MFA(base = data, group = params$groups, type = params$types,  
##      ind.sup = suprow, ncp = nd, name.group = params$names, num.group.sup = params$suppl,  
##      graph = graph) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7   Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13
## Variance               1.801   1.145   0.215   0.121   0.116   0.103   0.092   0.063   0.057   0.047   0.032   0.030   0.028
## % of var.             45.228  28.768   5.409   3.047   2.908   2.575   2.320   1.578   1.430   1.179   0.804   0.754   0.710
## Cumulative % of var.  45.228  73.996  79.405  82.452  85.360  87.935  90.256  91.834  93.264  94.443  95.247  96.001  96.712
##                       Dim.14  Dim.15  Dim.16  Dim.17  Dim.18  Dim.19  Dim.20  Dim.21  Dim.22  Dim.23  Dim.24  Dim.25  Dim.26
## Variance               0.021   0.019   0.016   0.013   0.012   0.011   0.010   0.008   0.005   0.005   0.004   0.003   0.003
## % of var.              0.537   0.477   0.397   0.328   0.298   0.276   0.242   0.211   0.123   0.115   0.097   0.080   0.070
## Cumulative % of var.  97.249  97.726  98.124  98.452  98.750  99.026  99.267  99.479  99.602  99.717  99.814  99.893  99.963
##                       Dim.27  Dim.28
## Variance               0.001   0.000
## % of var.              0.037   0.000
## Cumulative % of var. 100.000 100.000
## 
## Groups
##                    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr   cos2  
## environment     |  0.864 47.958  0.408 |  0.967 84.430  0.511 |  0.056 25.844  0.002 |
## plancton        |  0.937 52.042  0.781 |  0.178 15.570  0.028 |  0.160 74.156  0.023 |
## 
## Supplementary group
##                   Dim.1  cos2   Dim.2  cos2   Dim.3  cos2  
## zone            | 0.849 0.144 | 0.753 0.113 | 0.220 0.010 |
## 
## Individuals (the 10 first)
##                    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr   cos2  
## 1               | -3.029  7.493  0.788 | -0.153  0.030  0.002 | -1.203  9.881  0.124 |
## 2               | -2.826  6.522  0.907 |  0.100  0.013  0.001 | -0.613  2.569  0.043 |
## 3               | -2.986  7.280  0.923 | -0.015  0.000  0.000 | -0.558  2.126  0.032 |
## 4               | -2.817  6.479  0.917 | -0.040  0.002  0.000 | -0.324  0.716  0.012 |
## 5               | -2.988  7.290  0.913 |  0.116  0.017  0.001 | -0.530  1.915  0.029 |
## 6               | -2.850  6.635  0.889 |  0.319  0.131  0.011 | -0.470  1.511  0.024 |
## 7               | -2.561  5.357  0.796 |  0.807  0.835  0.079 | -0.306  0.638  0.011 |
## 8               | -2.434  4.837  0.761 |  0.676  0.586  0.059 | -0.012  0.001  0.000 |
## 9               | -2.192  3.923  0.651 |  0.832  0.889  0.094 |  0.200  0.272  0.005 |
## 10              | -1.526  1.902  0.708 |  0.355  0.161  0.038 |  0.642  2.815  0.125 |
## 
## Continuous variables (the 10 first)
##                    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr   cos2  
## Temperature     | -0.526  7.649  0.277 | -0.756 24.810  0.571 |  0.281 18.192  0.079 |
## Salinity        |  0.676 12.621  0.457 | -0.718 22.364  0.515 | -0.084  1.641  0.007 |
## Fluorescence    |  0.600  9.929  0.359 |  0.737 23.603  0.544 | -0.065  0.989  0.004 |
## Density         |  0.802 17.758  0.643 | -0.561 13.654  0.314 | -0.147  5.022  0.022 |
## Acartia         |  0.007  0.000  0.000 |  0.711  2.381  0.384 |  0.410  4.215  0.128 |
## AdultsOfCalanus |  1.721  8.883  0.873 | -0.084  0.033  0.002 |  0.102  0.262  0.003 |
## Copepodits1     |  1.662  8.288  0.866 | -0.245  0.283  0.019 |  0.265  1.764  0.022 |
## Copepodits2     |  0.708  1.503  0.381 | -0.041  0.008  0.001 |  0.400  4.003  0.121 |
## Copepodits3     |  0.764  1.750  0.625 |  0.272  0.349  0.079 |  0.104  0.271  0.012 |
## Copepodits4     |  0.801  1.925  0.654 |  0.229  0.246  0.053 |  0.147  0.544  0.022 |
## 
## Supplementary categories
##                    Dim.1   cos2 v.test    Dim.2   cos2 v.test    Dim.3   cos2 v.test  
## périphérique    | -2.084  0.974 -7.052 |  0.257  0.015  1.090 |  0.117  0.003  1.143 |
## divergente1     | -0.404  0.291 -0.900 |  0.185  0.061  0.516 |  0.306  0.166  1.968 |
## convergente     |  0.558  0.083  0.959 |  1.747  0.810  3.765 |  0.246  0.016  1.221 |
## frontale        |  1.225  0.484  3.282 |  1.181  0.450  3.968 | -0.313  0.032 -2.424 |
## divergente2     |  0.478  0.129  0.822 | -0.918  0.474 -1.978 | -0.419  0.099 -2.084 |
## centrale        |  0.779  0.373  3.399 | -0.988  0.599 -5.403 |  0.000  0.000 -0.002 |
# Graphique des éboulis de la première AFM
chart$scree(mar_mfa, fill = "cornsilk")

# Graphique des variables de la première AFM
chart$loadings(mar_mfa, choices = c(1, 2))

# Graphique du compromis de la la première AFM
chart$axes(mar_mfa, choices = c(1, 2))

# Graphique des individus de la première AFM
chart$scores(mar_mfa, choices = c(1, 2))

# Variante du graphique des individus avec annotations des zones et ellipses
chart$ellipses(mar_mfa, choices = c(1, 2), keepvar = "Zone")

# Graphique de la relation entre groupes de la première AFM
chart$groups(mar_mfa, choices = c(1, 2))

Seconde AFM sur le plancton avec données mixtes ACP et AFC

# Seconde AFM avec plancton traité selon une AFC au lieu d'une ACP
mar_mfa2 <- mfa(data = mar,
  ~ 4*std %as% environment + 24*cnt %as% plancton - 1*fct %as% zone)

# Premières valeurs propres de la seconde AFM
head(mar_mfa2$eig)
##        eigenvalue percentage of variance cumulative percentage of variance
## comp 1 1.78441859              47.260175                          47.26017
## comp 2 1.03313254              27.362427                          74.62260
## comp 3 0.18926229               5.012596                          79.63520
## comp 4 0.12752685               3.377538                          83.01274
## comp 5 0.10759137               2.849548                          85.86228
## comp 6 0.08901514               2.357558                          88.21984
# Graphique des éboulis de la seconde AFM
chart$scree(mar_mfa2, fill = "cornsilk")

# Graphique des variables de la seconde AFM
chart$loadings(mar_mfa2, choices = c(1, 2))

# Graphique du compromis de la la seconde AFM
chart$axes(mar_mfa2, choices = c(1, 2))

# Graphique des individus annoté pour la seconde AFM
chart$ellipses(mar_mfa2, choices = c(1, 2), keepvar = "Zone")

# Graphique de la relation entre groupes de la seconde AFM
chart$groups(mar_mfa2, choices = c(1,2))

# Biplot de l'AFC réalisée sur le plancton de la seconde AFM
chart$contingency(mar_mfa2, choices = c(1, 2))

Big data et base de données

# # Exemple fictif de lecture de données depuis internet avec mise en cache
# # (décommentez et ajustez le code ci-dessous pour l'utiliser)
# #dir_create("data/cache") # S"assurer que le dossier existe
# #big_data <- read$csv.xz("https://mysite.org/mybigdata.cs.xz",
# #  cache_file = "data/cache/mybigdata.csv.xz")

# Chargement du dialecte SciViews::R
SciViews::R
# Lecture du jeu de données babynames depuis le package du même nom
babynames <- read("babynames", package = "babynames")

# Création de la base de données et copie de babynames dedans
con <- DBI::dbConnect(duckdb::duckdb())
copy_to(con, babynames)

# Élimination du jeu de données dans la session R (on garde la version duckdb)
rm(babynames)

# Liste des tables dans notre base de données
DBI::dbListTables(con)
## [1] "babynames"
# Liste des champs (colonnes) de la table babynames dans la base de données
DBI::dbListFields(con, "babynames")
## [1] "year" "sex"  "name" "n"    "prop"
# Liaison à une table dans la base de données
db_babynames <- tbl(con, "babynames")
# Premières lignes de la table
head(db_babynames)
## # Source:   SQL [?? x 5]
## # Database: DuckDB v1.2.1 [root@Darwin 25.3.0:R 4.4.3/:memory:]
##    year sex   name          n   prop
##   <dbl> <chr> <chr>     <int>  <dbl>
## 1  1880 F     Mary       7065 0.0724
## 2  1880 F     Anna       2604 0.0267
## 3  1880 F     Emma       2003 0.0205
## 4  1880 F     Elizabeth  1939 0.0199
## 5  1880 F     Minnie     1746 0.0179
## 6  1880 F     Margaret   1578 0.0162
# Remaniement de données dans la base de données
db_babynames %>.%
  group_by(., name) %>.%
  summarise(., total = sum(n, na.rm = TRUE)) %>.%
  arrange(., desc(total)) ->
  query

# Visualiation de la requête SQL équivalent
show_query(query)
## <SQL>
## SELECT "name", SUM(n) AS total
## FROM babynames
## GROUP BY "name"
## ORDER BY total DESC
# Réalisation de la requête SQL
names <- collect_dtx(query)
names
## # A data.trame: [97,310 × 2]
##    name      total
##    <chr>     <dbl>
##  1 James   5173828
##  2 John    5137142
##  3 Robert  4834915
##  4 Michael 4372536
##  5 Mary    4138360
##  6 William 4118553
##  7 David   3624225
##  8 Joseph  2614083
##  9 Richard 2572613
## 10 Charles 2398453
## # ℹ 97,300 more rows
# Déconnexion et destruction de notre base de données en mémoire
DBI::dbDisconnect(con, shutdown = TRUE)