Archives par étiquette : fatigue

Visualisations des données : exemple avec un questionnaire de bien-être

Dans une publication précédente je vous avais présenté une solution pour recueillir des résultats d’un questionnaire en ligne de bien-être type Hooper, puis d’importer les résultats dans le logiciel RStudio.

Aujourd’hui je vous présente quelques unes de possibilités pour visualiser des résultats afin de faire une interprétation graphique et une analyse. Collecter, traiter et analyser des données est utile que si le destinataire final interprète rapidement le rapport ou le tableau de bord. Si personne ne le lit tout cela ne sert à rien.

Note 1 : je rappelle avant toute chose que l’exemple est avec un questionnaire hooper, mais libre à vous d’utiliser le questionnaire ou les données de votre choix. 

Note 2 : je rappelle enfin que l’analyse et les conclusions sont dépendantes du type de données et du contexte. 

Le système de graphique de base sur RStudio est simple et pratique. Mais le package ggplot2 est généralement plus utilisé car il propose plus d’options. 

Nous allons donc commencer par installer le package et créer une colonne de score total additionnant toutes les valeurs des réponses (sommeil,fatigue,stress et courbatures).

 
#Installation et chargement package ggplot2
install.packages("ggplot2")
library(ggplot2)

# Création colonne score total
data$total<-data$Sommeil+data$Fatigue+data$Stress+data$Courbatures

Le premier graphique que nous allons faire est une courbe du score total sur la durée des données. Comme nous représentons l’évolution du score dans le temps c’est en fait une série temporelle avec geom_line() .

 
ggplot(data, aes(x=Date, y=total,group = 1)) +
  geom_line() + 
  xlab("")

Le graphique de base n’est très lisible. Pour chaque jour il présente les valeurs de toutes l’équipe. Nous allons changer de thème avec theme_classic().

 
ggplot(data, aes(x=as.Date(Date), y=total,group = 1)) +
  geom_line() + 
  xlab("")  +  theme_classic()

Le graphique est plus visible mais toujours peu parlant. Essayons avec une repésentation en boites avec geom_boxplot().

 
ggplot(data, aes(x=as.factor(Date), y=total)) +
  geom_boxplot() + 
  xlab("")+theme_classic()

La représentation est plus intéressante car elle donne des indications de tendance centrale, de dispersion et de valeurs anormales.

Essayons à présent de représenter l’évolution du score total dans le temps, mais cette fois-ci avec un graphique pour chaque athlète avec facet_wrap().

 
ggplot(data, aes(x=Date, y=total, group = 1)) +
  geom_line() + 
  xlab("")+  theme_classic()+facet_wrap(~Athlete)

Cette visualisation est parlante car elle renseigne sur l’évolution dans le temps pour chaque athlète. Il est possible de faire le même chose en diagramme en barres avec geom_bar().

 
ggplot(data, aes(x=Date, y=total, group = 1)) +
  geom_bar(stat = 'identity') + 
  xlab("")+  theme_classic()+facet_wrap(~Athlete)

Cependant, avons-le, l'interprétation n’est pas très instinctive et rapide. Nous allons mettre des couleurs en conditionnant la couleur à la valeur de score total avec “fill=”.

 
ggplot(data, aes(x=Date, y=total, fill=total)) +
  geom_bar(stat = 'identity') + 
  xlab("")+theme_classic()+facet_wrap(~Athlete)

Déjà mieux ! Nous pouvons ensuite choisir les couleurs pour être toujours plus parlant visuellement avec scale_y_continuous() et scale_fill_gradient2().

 
ggplot(data, aes(x=Date, y=total, fill=total)) +
  geom_bar(stat = 'identity') + 
  xlab("")+
  theme_classic()+facet_wrap(~Athlete)+
  scale_y_continuous(breaks=seq(0,28,14))+
  scale_fill_gradient2(low='blue', mid='green', high='red', midpoint = 14, name='Total')

Le graphique est bien plus visuel. Le contraste de couleurs permet de rapidement distinguer les valeurs hautes ou basses. Notez qu’il est également possible de représenter le score total par date.

 
ggplot(data, aes(x=Athlete, y=total, fill=total)) +
  geom_bar(stat = 'identity') + 
  xlab("")+
  theme_classic()+facet_wrap(~Date)+
  scale_y_continuous(breaks=seq(0,28,14))+
  scale_fill_gradient2(low='blue', mid='green', high='red', midpoint = 14, name='Total')

Ou bien encore de le faire une variable en particulier. La fatigue par exemple.

 
ggplot(data, aes(x=Date, y=Fatigue, fill=Fatigue)) +
  geom_bar(stat = 'identity') + 
  xlab("")+
  theme_classic()+facet_wrap(~Athlete)+
  scale_y_continuous(breaks=seq(0,7,1))+
  scale_fill_gradient2(low='blue', mid='green', high='red', midpoint = 3.5, name='Fatigue')

La représentation dépend de la question, des données et du destinataire. Mais vous avez à présent une brève idée des possibilités.

Maintenant la question est que ce passe t-il avec l’athlète A ?

Suivi de l’état de forme à partir du CMJ – Tout est-il sous contrôle ?

Le saut en contre mouvement ( ou CMJ – counter movement jump – en anglais) est probablement une des mesures les plus utilisées pour suivre les effets de l’entraînement sur la capacité à s’entraîner ou à être performant. Cette une mesure qui ne concerne que le système nerveux et la capacité musculaire et ne saurait représenter l’ensemble des capacités nécessaire à la performance dans le sport (cardiovasculaire, technique, tactique,motivation,etc). 

Cependant c’est une mesure rapide, pratique, reproductible et de ce fait très étudiée.

L’objectif de cet article est de présenter le suivi des performances lors d’un CMJ pour 11 sujets pratiquants le MMA, pendant 5 mois.

Nous allons retenir uniquement le pic de vélocité qui semble être un marqueur plus précis de la fatigue neuromusculaire.

Pour suivre cette évolution sur 5 mois nous allons utiliser un procédé basé sur la Maîtrise Statistique de Processus (MSP), aussi dénommée Statistical Process Control (SPC) en anglais. Ce procédé permet d’identifier les valeurs “anormales” ou qui vont au delà de valeurs prédéfinies.

Nous utiliserons pour chaque cas étudié le langage R pour une analyse graphique à partir la moyenne et l’écart-type. Toutes les données sont disponibles sur mon Github.

1/ Les données

Tout d’abord nous allons charger le package ggplot2 d’exporation graphique, puis explorer les données.

library(ggplot2)
head(cmj)
table(cmj$ID)
table(cmj$Date)

En examinant les données nous constatons que pour chaque sujet (ID) les résultats sont présentés par date. Pour chaque date nous avons 3 sauts (Saut1, Saut2, Saut3). Les sujets 1/7/8 sont ceux pour lesquels nous avons le plus de données (10 ou 11). Nous constatons également que la régularité n’est pas optimales. Les 11 sujets sont loin d’avoir participés à toutes les prises de mesures. Mais dans le cas présent, présentation du procédé MSP/SPC pour un suivi du CMJ, cela ne sera pas handicapant.

2/ Exemples

Nous allons prendre pour 1er exemple le sujet 8 car il présente le plus de données (avec le sujet 1).  Nous allons isoler toutes les données du sujet 8 puis calculer la moyenne des 3 sauts pour chacune des dates.

Nous avons besoin de la moyenne et de l’écart-type de l’ensemble des observations du sujet. 

Le procédé MSP/SPC utilise des seuils hauts et bas se basant sur l’écart-type. J’attire l’attention du lecteur que les seuils sont ici calculés sur la base de 1 et 2 écarts-types. Libre à chacun de définir les seuils selon sa volonté et ses besoins. Ces seuils s’obtiennent en ajoutant ou soustrayant 1 et 2 écarts-types à la moyenne.

# Isoler les données sur sujet 8 
Sujet8<-cmj[cmj$ID=='8',] 

# Calcul de la moyenne pour chaque date 
Sujet8$moyenne<-round(with(Sujet8,(Saut1+Saut2+Saut3)/3),2) 

# Calcul de la moyenne et écart-type pour l'ensemble des observations 
Sujet8_sauts<-c(Sujet8$Saut1, Sujet8$Saut2 ,Sujet8$Saut3) 
Sujet8_moyenne<-mean(Sujet8_sauts) 
Sujet8_sd<-sd(Sujet8_sauts) 

# Détermination des seuils haut et bas 
sd1_haut<-Sujet8_moyenne+(1*Sujet8_sd) 
sd1_bas<-Sujet8_moyenne-(1*Sujet8_sd) 
sd2_haut<-Sujet8_moyenne+(2*Sujet8_sd) 
sd2_bas<-Sujet8_moyenne-(2*Sujet8_sd) 

Nous pouvons alors faire le graphique avec la moyenne (trait en rouge continu), les seuils 1 écart-type (trait pointillé noir) et les seuils 2 écarts-types (trait pointillé rouge).

ggplot(Sujet8, aes(x = Date, y = moyenne)) +
  geom_point(color = "blue") +
  theme_classic()+ geom_hline(aes(yintercept = mean(Sujet8_sauts)), color = "red")+
  geom_hline(aes(yintercept = sd1_haut), linetype = "dashed")+
  geom_hline(aes(yintercept = sd1_bas), linetype = "dashed")+geom_line()+
  geom_hline(aes(yintercept = sd2_haut), linetype = "dashed", color = "red")+
  geom_hline(aes(yintercept = sd2_bas), linetype = "dashed", color = "red")+
  ggtitle("Sujet 8 - Evolution Pic de vitesse lors d'un CMJ") + xlab("Date")+ylab("Vitesse (m/s)")

Le procédé MSP/SPC se base sur une suite ou un fréquence de valeur au delà des différents seuils. Par exemple, si les valeurs restent entre les seuils 1 supérieur et inférieur, les réponses au processus d’entraînement sont considérées comme normales. Les différentes performances et la variation de l’état de forme du sportif font partie de processus d’adaptations à la charge d’entraînement. Ce que l’on cherche à savoir est si ce processus est sous contrôle (adaptations/réponses désirées) ou non (surentrainement/mauvaise adaptation/désentrainement)  

Le sujet 8 présente 2 valeurs inférieures au seuil 1. Mais elles ne sont pas consécutives. Elles ne semblent pas indiquer de mal-adaptations du sujet au processus d’entraînement ou d’effets indésirables de celui-ci.

Nous pouvons procéder à la même analyse avec les sujets 1 et 7 pour finalement présenter les 3 graphiques.


# Sujet8
ggplot(Sujet8, aes(x = Date, y = moyenne)) +
  geom_point(color = "blue") +
  theme_classic()+ geom_hline(aes(yintercept = mean(Sujet8_sauts)), color = "red")+
  geom_hline(aes(yintercept = sd1_haut), linetype = "dashed")+
  geom_hline(aes(yintercept = sd1_bas), linetype = "dashed")+geom_line()+
  geom_hline(aes(yintercept = sd2_haut), linetype = "dashed", color = "red")+
  geom_hline(aes(yintercept = sd2_bas), linetype = "dashed", color = "red")+
  ggtitle("Sujet 8 - Evolution Pic de vitesse lors d'un CMJ") + xlab("Date")+ylab("Vitesse (m/s)")

# Sujet 1
Sujet1<-cmj[cmj$ID=='1',]

Sujet1$moyenne<-round(with(Sujet1,(Saut1+Saut2+Saut3)/3),2)

Sujet1_saut<-c(Sujet1$Saut1, Sujet1$Saut2 ,Sujet1$Saut3  )
Sujet1_saut
mean(Sujet1_saut)
sd(Sujet1_saut)
sd1_haut<-mean(Sujet1_saut)+(1*sd(Sujet1_saut))
sd1_bas<-mean(Sujet1_saut)-(1*sd(Sujet1_saut))
sd2_haut<-mean(Sujet1_saut)+(2*sd(Sujet1_saut))
sd2_bas<-mean(Sujet1_saut)-(2*sd(Sujet1_saut))

ggplot(Sujet1, aes(x = Date, y = moyenne)) +
  geom_point(color = "blue") +
  theme_classic()+ geom_hline(aes(yintercept = mean(Sujet1_saut)), color = "red")+
  geom_hline(aes(yintercept = sd1_haut), linetype = "dashed")+
  geom_hline(aes(yintercept = sd1_bas), linetype = "dashed")+
  geom_hline(aes(yintercept = sd2_haut), linetype = "dashed", color = "red")+
  geom_hline(aes(yintercept = sd2_bas), linetype = "dashed", color = "red")+
  ggtitle("Sujet 1 - Evolution Pic de vitesse lors d'un CMJ") + xlab("Date")+ylab("Vitesse (m/s)")+
  geom_line()



# Sujet 7
Sujet7<-cmj[cmj$ID=='7',]

Sujet7$moyenne<-round(with(Sujet7,(Saut1+Saut2+Saut3)/3),2)

Sujet7_saut<-c(Sujet7$Saut1, Sujet7$Saut2 ,Sujet7$Saut3  )
Sujet7_saut
mean(Sujet7_saut)
sd(Sujet7_saut)
sd1_haut<-mean(Sujet7_saut)+(1*sd(Sujet7_saut))
sd1_bas<-mean(Sujet7_saut)-(1*sd(Sujet7_saut))
sd2_haut<-mean(Sujet7_saut)+(2*sd(Sujet7_saut))
sd2_bas<-mean(Sujet7_saut)-(2*sd(Sujet7_saut))

ggplot(Sujet7, aes(x = Date, y = moyenne)) +
  geom_point(color = "blue") +
  theme_classic()+ geom_hline(aes(yintercept = mean(Sujet7_saut)), color = "red")+
  geom_hline(aes(yintercept = sd1_haut), linetype = "dashed")+
  geom_hline(aes(yintercept = sd1_bas), linetype = "dashed")+
  geom_hline(aes(yintercept = sd2_haut), linetype = "dashed", color = "red")+
  geom_hline(aes(yintercept = sd2_bas), linetype = "dashed", color = "red")+geom_line()+
  ggtitle("Sujet 7 - Evolution Pic de vitesse lors d'un CMJ") + xlab("Date")+ylab("Vitesse (m/s)")




Nous constatons que pour les 3 sujets présentés ici le processus d'entraînement semble sous contrôle. 

3/ Conclusion

Un procédé basé sur la Maîtrise Statistique de Processus (MSP), aussi dénommée Statistical Process Control (SPC), est une méthode simple pour suivre la réponse du sportif au processus d'entraînement. Nous avons vu ici le cas du pic de vitesse lors d’un CMJ mais d’autres données peuvent sans problème être utilisées. 

Volontairement, le cas des tendances des courbes n’a pas été abordé. Il fera certainement l’objet d’un autre billet sur ce blog.

 

 

Réferences :

- Bertrand Mathieu, Alexis Peeters , Julien Piscione , Mathieu Lacome - Usefulness of typical tests of short-duration maximal effort used to assess players readiness to perform - SPSR - 2017 | Nov | 3 | v1

- Taylor KL. Monitoring neuromuscular fatigue in high performance athletes. Edith Cowan University; 2012.

- Kennedy, R., & Drake, D. (2018). Improving the Signal-To-Noise Ratio When Monitoring Countermovement Jump Performance: Signal-to-noise ratio of CMJ performance. Journal of Strength and Conditioning Research.

- William Sands, Marco Cardinale, Jeni McNeal, Steven Murray, Christopher Sole, Jacob Reed, Nikos Apostolopoulos, and Michael Stone - Recommendations for Measurement and Management of an Elite Athlete (2019)