Science des données biologiques 2

Réalisé par le service d'Écologie numérique des Milieux aquatiques, Université de Mons (Belgique)

Préambule

Si vous n’avez jamais utilisé de tutoriel “learnr”, familiarisez-vous d’abord avec son interface ici.

Ne vous trompez pas dans votre adresse mail et votre identifiant Github

N’oubliez pas de soumettre votre réponse après chaque exercice

Conformément au RGPD (Règlement Général sur la Protection des Données), nous sommes tenus de vous informer de ce que vos résultats seront collecté afin de suivre votre progression. Les données seront enregistrées au nom de l’utilisateur apparaissant en haut de cette page. Corrigez si nécessaire ! En utilisant ce tutoriel, vous marquez expressément votre accord pour que ces données puissent être collectées par vos enseignants et utilisées pour vous aider et vous évaluer. Après avoir été anonymisées, ces données pourront également servir à des études globales dans un cadre scientifique et/ou éducatif uniquement.

CHoix du K pour les K-moyennes

Le regroupement par les K-moyennes est une méthode simple d’analyse multivariée considérée comme moins efficace que le CAH. Cette méthode permet néanmoins de réaliser des regroupements sur de gros jeu de données, alors que la CAH neciessite trop de temps de calcul et de mémoire vive.

Le plus grand défaut de cette méthode est de ne pas proposer le nombre de groupe. Vous devez le fixer par vous même. Il existe néanmoins des outils pour vous aidez Sur base du jeu de données iris, réalisez un graphique permettant d’estimer le nombre de groupes à employer dans la méthode des k-moyennes. La package factoextra propose un outil graphique permettant de donner une indication sur le nombre de groupes (k).

is <- read("iris", package = "datasets", lang = "fr")
summary(is)
  sepal_length    sepal_width     petal_length    petal_width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                
is %>.%
  select(., -species) %>.%
  scale(.) %>.%
  as_tibble(.) -> is_scale

# factoextra::fviz_nbclust(x, FUNcluster = kmeans, method = "wss")
is <- read("iris", package = "datasets", lang = "fr")
summary(is)

is %>.%
  select(., -species) %>.%
  scale(.) %>.%
  as_tibble(.) -> is_scale
is %>.%
  select(., -species) %>.%
  scale(.) %>.%
  as_tibble(.) -> is_scale

factoextra::fviz_nbclust(x, FUNcluster = kmeans, method ="wss")
is %>.%
  select(., -species) %>.%
  scale(.) %>.%
  as_tibble(.) -> is_scale

factoextra::fviz_nbclust(is_scale, FUNcluster = kmeans, method = "wss")
#TODO

Réalisation du regroupement par les K-moyennes

Réalisez à présent un regroupement avec la fonction kmeans() sur le jeu de donnée enviro. Utilisez une valeur de K de 3

Ce tableau comprend 30 sites d’échantillonages avec 11 mesures environnementales.

Voici une courte description des variables étudiées (en anglais). Ces informations proviennent de la page d’aide ?ade4::doubs

  • dfs : distance from the source (km * 10),
  • alt : altitude (m),
  • slo : (log(x + 1) where x is the slope (per mil * 100),
  • flo : minimum average stream flow (m3/s * 100),
  • pH : pH,
  • har : total hardness of water (mg/l of Calcium),
  • pho : phosphates (mg/l * 100),
  • nit : nitrates (mg/l * 100),
  • amm : ammonia nitrogen (mg/l * 100),
  • oxy : dissolved oxygen (mg/l * 10),
  • bdo : biological demand for oxygen (mg/l * 10)
summary(enviro)
      dfs              alt             slo             flo      
 Min.   :   3.0   Min.   :172.0   Min.   :1.099   Min.   :  84  
 1st Qu.: 544.5   1st Qu.:248.0   1st Qu.:1.831   1st Qu.: 420  
 Median :1752.0   Median :395.0   Median :2.565   Median :2210  
 Mean   :1879.0   Mean   :481.5   Mean   :2.758   Mean   :2220  
 3rd Qu.:3017.2   3rd Qu.:782.0   3rd Qu.:3.390   3rd Qu.:2858  
 Max.   :4530.0   Max.   :934.0   Max.   :6.176   Max.   :6900  
       pH             har              pho              nit       
 Min.   :77.00   Min.   : 40.00   Min.   :  1.00   Min.   : 15.0  
 1st Qu.:79.25   1st Qu.: 84.25   1st Qu.: 12.50   1st Qu.: 50.5  
 Median :80.00   Median : 89.00   Median : 28.50   Median :160.0  
 Mean   :80.50   Mean   : 86.10   Mean   : 55.77   Mean   :165.4  
 3rd Qu.:81.00   3rd Qu.: 96.75   3rd Qu.: 56.00   3rd Qu.:242.5  
 Max.   :86.00   Max.   :110.00   Max.   :422.00   Max.   :620.0  
      amm              oxy              bdo        
 Min.   :  0.00   Min.   : 41.00   Min.   : 13.00  
 1st Qu.:  0.00   1st Qu.: 80.25   1st Qu.: 27.25  
 Median : 10.00   Median :102.00   Median : 41.50  
 Mean   : 20.93   Mean   : 93.90   Mean   : 51.17  
 3rd Qu.: 20.00   3rd Qu.:109.00   3rd Qu.: 52.75  
 Max.   :180.00   Max.   :124.00   Max.   :167.00  
DF_scale <- as_tibble(scale(DF))
kmeans. <- kmeans(X, centers = VALUES, nstart = VALUES1)

(DF <- broom::glance(kmeans.))
(DF <- broom::tidy(kmeans.))
#TODO
DF_scale <- as_tibble(scale(DF))
kmeans(X, centers = VALUES, nstart = VALUES1)
(DF <- broom::glance(kmeans.))
(DF <- broom::tidy(kmeans.))
kmeans. <- kmeans(scale(enviro), centers = 3, nstart = 25) # la valeur de nstart est par défaut à 1 mais augmenter cette valeur rend l'analyse plus robuste (le temps de calcul augmente malheureusement)
(glance_kmeans <- broom::glance(kmeans.))
(tidy_kmeans <- broom::tidy(kmeans.))
#TODO

Assurez vous d’avoir bien compris cet objet.

Réalisation d’un graphique de regroupement

Afin de réaliser un graphique vous devez réaliser plusieurs étapes.

  • Créer un objet kmeans
  • Extraite l’information intéressante avec augment() et tidy() du package broom. (Souvenez vous, nous avons déjà employé ces fonction dans le modèle linéaire.)
  • Réaliser votre graphique
DF <- as_tibble(scale(DF)) # Scale transforme notre dataframe en matrice

OBJECT_KMEANS <- kmeans(DF, centers = VALUES, nstart = VALUES1)

broom::augment(OBJECT_KMEANS, DF) %>.%
  rename(., cluster = .cluster) -> DF_kMEANS

DF_centers <- broom::tidy(OBJECT_KMEANS, col.names = names(DF))

chart(data = DF_kMEANS, YVAR ~ XVAR %col=% FACTOR) +
  geom_point(alpha = 0.2) +
  stat_ellipse() +
  geom_point(data = DF_centers, 
             size = 5, shape = 17)

Réalisez à un objet Kmeans sur le jeu de données diamonds avec un k = 4. Réalisez ensuite un graphique du price ~ depth en focntion des 4 groupes calculés.

diamonds_red <- read("diamonds", package = "ggplot2") %>.%
  select(., -cut, -color, -clarity) %>.%
  rename(., length = x, width = y, depth = z)
  slice(., 1:15000)
skimr::skim(diamonds_red)
diamonds_red <- read("diamonds", package = "ggplot2") %>.%
  select(., -cut, -color, -clarity) %>.%
  rename(., length = x, width = y, depth = z)
  slice(., 1:15000)

skimr::skim(diamonds_red)
DF <- as_tibble(scale(DF))

OBJECT_KMEANS <- kmeans(DF, centers = VALUES, nstart = VALUES1)

broom::augment(OBJECT_KMEANS, DF) %>.%
  rename(., cluster = .cluster) -> DF_kMEANS

DF_centers <- broom::tidy(OBJECT_KMEANS, col.names = names(DF))

chart(data = DF_kMEANS, YVAR ~ XVAR %col=% FACTOR) +
  geom_point(alpha = 0.2) +
  stat_ellipse() +
  geom_point(data = DF_centers, 
             size = 5, shape = 17)
diamonds_scale <- as_tibble(scale(diamonds_red))

diamonds_kmeans <- kmeans(diamonds_scale, centers = 4, nstart = 1)

broom::augment(diamonds_kmeans, diamonds_scale) %>.%
  rename(., cluster = .cluster) -> diam_kmeans

diam_centers <- broom::tidy(diamonds_kmeans, col.names = names(diamonds_scale))

chart(data = diam_kmeans, price ~ depth %col=% cluster) +
  geom_point(alpha = 0.2) +
  stat_ellipse() +
  geom_point(data = diam_centers, 
             size = 5, shape = 17)
# TODO

Conclusion

Vous venez de terminer votre séance d’exercice.

Laissez nous vos impressions sur cet outil pédagogique ou expérimentez encore dans la zone ci-dessous. Rappelez-vous que pour placer un commentaire dans une zone de code R, vous devez utilisez un dièse (#) devant vos phrases.

# Ajout de commentaires 
# ...
# Not yet...

Guyliann Engels & Philippe Grosjean