Analyse de données en biologie – 2 octobre 2024
Série 2 – Fonctions graphiques
Comment rédiger un rapport statistique ?
L'un des objectifs de ce cours est que vous soyez capable de rédiger des rapports décrivant une
analyse statistiques de données issues des sciences de la vie. En avançant dans les séries de ce
cours, nous nous éloignerons des exercices scolaires et dirigés que nous utilisons pour
apprendre R et les statistiques, pour se concentrer sur des exercices d'analyse de données,
orientés sur des problèmes plus ouverts et plus directement liés aux sciences de la vie. La
rédaction de vos rapports doit suivre le même chemin.
Les points ci-dessous devraient vous permettre d'éviter certaines erreurs courantes.
Utilisez le format PDF
Si la personne qui reçoit votre document n'a pas besoin de le modifier, enregistrez votre
document au format PDF : le résultat affiché ou imprimé ne changera pas, quel que soit
l'ordinateur, le logiciel ou l'imprimante utilisés. D'autres formats, tels que ceux produits par les
logiciels LibreOffice, Word ou d'autres traitements de textes sont plus capricieux.
Choisissez la bonne précision pour vos chiffres
Ce choix n'est pas uniquement une question statistique, mais nécessite de bien connaître le
contexte biologique d'où viennent les données. Avec trop peu de chiffres significatifs, on perdra
de l'information utile, alors que trop de décimales donnent un résultat peu lisible, et une
impression illusoire de précision. Il n'est par exemple pas raisonnable d'arrondir la taille d'un
patient au mètre ou même au décimètre, mais il n'est pas non plus utile d'aller au-delà des
centimètres.
Evitez de copier tel quel des tables de nombres obtenues dans R; celles-ci contiendront
généralement trop de chiffres significatifs. Même si vos données originales n'ont qu'un nombre
limité de chiffres significatifs, le résultat aura une précision trop grande après transformation des
données (en prenant le logarithme ou en calculant la moyenne de vos données par exemple). Par
exemple, le moyenne calculée par R pour la taille des étudiants dans le fichier de données que
vous avez traité la première semaine est 172.3404 cm; mais on sait qu'une mesure de taille avec
quatre décimales ne signifie rien, étant donné qu'elle n'est jamais mesurée avec cette précision.
On se limitera à 172 (ou au plus à 172.3) cm.
Pour les valeurs p (p-values) que nous discuterons dans quelques semaines (série 8), la règle est
simple : il n'est jamais nécessaire d'utiliser plus d'un chiffre significatif. Ecrire p=0.0143134 ne
donne pas plus d'information que p=0.01.
Une certaine tradition veut que l'on écrive « p<0.05 » ou « p<0.001 » si une p-value est en
dessous du seuil que l'on s'était fixé, sans donner la valeur exacte. Cet usage date du temps où
on utilisait des tables numériques pour calculer les p-values, et on pouvait uniquement savoir si
on était en dessous ou en dessus de seuils pré-calculés. De nos jours, aucune raison ne justifie
de ne pas indiquer la valeur exacte, sauf si elle est vraiment petite (par exemple, R indique p <
2.2´10-16 même si la valeur obtenue est plus petite). A l'inverse, connaître la valeur exacte est
utile, par exemple dans le cas des meta-analyses qui combinent le résultat de plusieurs
expériences indépendantes.
Il reste bien sûr possible de détailler explicitement dans la conclusion que la valeur est en
dessous du seuil prédéfini, ou d'écrire « p=0.014<0.05 » si nécessaire.
N'oubliez pas la biologie
Dans le cadre d'une analyse de données en sciences de la vie, les graphiques ou analyses
statistiques sont utiles parce qu'ils permettent de répondre à une question biologique. Une
analyse ne doit donc pas se terminer par ces éléments (ou pire, par le résultat brut d'une
commande dans R), mais doit contenir une conclusion détaillant ce qu'on peut tirer de ces
informations du point de vue biologique.
Spécifiquement, une p-value n'a aucune signification en elle-même, et se réfère toujours à une
hypothèse donnée. Comparez par exemple l'extrait suivant, conclusion d'un exercice rédigé par
un étudiant :
Le test de t apparié nous donne une p-value de 2´10-5 (t=5.5, df=19), le résultat est
donc significatif.
avec la version similaire qui contient la réponse à la question biologique d'intérêt :
Les patients ont perdu en moyenne 6 kg à la suite de ce régime ; un test de t
apparié indique que cette différence est significativement différente de 0 (p=2
´10-5, t=5.5, df=19).
Lors de la rédaction d'articles scientifiques, en pratique, certains de ces éléments sont implicites.
On écrira par exemple : « Les patients ont perdu en moyenne 6 kg à la suite de ce régime (p=2
´10-5, test de t apparié, t=5.5, df=19). »
N'indiquez que ce qui est utile
Au cours d'une analyse statistique, vous allez tatonner, essayer différentes choses, consulter des
pages d'aides. Vous pouvez garder une trace de ces essais (en indiquant ce qui a marché ou
pas) dans vos notes, mais ceux-ci ne doivent pas se retrouver dans votre rapport final.
De la même façon, il est naturel dans R de commencer par regarder à l'écran le contenu des
données que l'on traite. Mais si vous copiez ces informations dans votre rapport, il risque de
contenir plusieurs pages de données brutes qui seront complétement inutiles. L'un des buts de
l'analyse statistique est justement de pouvoir prendre un grand ensemble de données, que l'on
ne peut pas appréhender à l'oeil nu, et de le résumer graphiquement ou numériquement pour
qu'on puisse voir ce qu'il contient. Ce sont uniquement ces résumés qui doivent figurer dans vos
rapports.
Présentation des résultat
Une bonne présentation n'est pas un but en soi, mais elle est nécessaire pour que les résultats
de vos analyses soient lisibles et compréhensibles. Votre interlocuteur n'a pas pour rôle de
décrypter votre travail, de faire une « chasse au trésor » pour trouver les informations correctes,
ni de remplir lui-même d'éventuelles parties manquantes et d'ignorer d'éventuels essais d'analyse
avortés que vous auriez conservé dans votre rapport final – en particulier si cette personne est le
correcteur de votre examen ! Entre autres conseils, pour rendre vos résultats lisibles :
Structurez votre document clairement en sections et paragraphes.
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 2/9
Ne donnez jamais un résultat brut, mais mettez-le dans son contexte (à quelle question
répond-on, etc). Evitez une rédaction trop scolaire, et préférez un mode de rédaction qui permet
de comprendre le résultat même sans avoir lu l'énoncé du problème. Par exemple, écrivez :
Question 1 : La moyenne des masses mesurées sur des glands du chêne frileux
est de 3.5 gr.
au lieu de
Question 1 : la réponse est 3.5.
Et n'oubliez pas les unités !
Utilisez différentes mises en formes (polices de caractères, couleur, mises en évidence
telles que gras et italique) pour différencier différentes parties de votre document. Mais
soyez cohérents : si vous utilisez une police de caractère particulière pour indiquer du code R
(comme très fortement suggéré dans la section suivante), faites-le systématiquement.
Comparez les deux exemples de rapports suivants; leur contenu est exactement le même, mais
l'un est plus lisible que l'autre :
#Série 1, Lancer "R":
> 2+2
[1] 4 #Le programme "R" additionne les deux chiffres
#Exercice 1.4:trouver de l'aide:
> help(mean) #Le programme "R" ouvre une page d'aide sur le web qui explique que
"mean()" sgnifie faire la moyenne
aritméthique des nombres compris dans la parenthèse
#Exercice 2.1(1) Opération sur les vecteurs:
> x<-c(1.3,0.32,10.5,5.9,6.3);x
[1] 1.30 0.32 10.50 5.90 6.30
> y<-c(2.0,10.0);y;x*y
[1] 2 10
[1] 2.6 3.2 21.0 59.0 12.6
Message d'avis :
In x * y :
la taille d'un objet plus long n'est pas multiple de la taille d'un objet plus court
#Ce qui c'est passé ici est le fait que le vecteur "x" comprend un plus grand nombre de
#valeurs que le vecteur "y". Lorsqu'on multiplie ces 2 vecteurs, le vectuer est appliqué
#aux première valeur de "x" puis est appliqué sur les valeurs suivantes.
Nom: ….. Groupe: …..
Série 1, Lancer "R"
Section 1.1
Exercice 1
> 2+2
[1] 4
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 3/9
Le programme "R" additionne les deux chiffres
Exercice 1.4: trouver de l'aide:
> help(mean)
Le programme "R" ouvre une page d'aide sur le web qui explique que "mean()" signifie faire
la moyenne arithmétique des nombres compris dans la parenthèse.
Exercice 2.1 - 1 Opération sur les vecteurs:
> x <- c(1.3,0.32,10.5,5.9,6.3); x
[1] 1.30 0.32 10.50 5.90 6.30
> y <- c(2.0,10.0); y; x*y
[1] 2 10
[1] 2.6 3.2 21.0 59.0 12.6
Message d'avis :
In x * y :
la taille d'un objet plus long n'est pas multiple de
la taille d'un objet plus court
Ce qui c'est passé ici est le fait que le vecteur "x" comprend un plus grand nombre
de valeurs que le vecteur "y". Lorsqu'on multiplie ces 2 vecteurs, le vecteur est appliqué
aux premières valeurs de "x" puis est appliqué sur les valeurs suivantes.
Notez également que la deuxième version a été relue, les fautes d'orthographe corrigées – ce qui
améliore également la lisibilité.
Choisissez vos polices de caractères
A priori, le choix d'une police de caractères ne devrait pas vraiment avoir d'influence sur un
rapport de statistiques (à part peut-être pour la police Comic Sans MS, qui tend à décrédibiliser
votre texte). Et pourtant, il y a une bonne raison de choisir une police plutôt qu'une autre :
l'alignement.
Voici un exemple d'analyse effectuée par un étudiant, dans laquelle deux nombres sont extraits
d'un tableau avant d'être combinés par division :
Analysis of Variance Table
Response: df$masse
Df Sum Sq Mean Sq F value Pr(>F)
factor(df$polluant) 3 533659 177886 85.1586 6.219e-13 ***
factor(df$polluant):factor(df$aquarium) 8 18505 2313 1.1073 0.3928
Residuals 24 50133 2089
---
Sign. Codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 '' 1
Nous devons calculer F =
Mean Sq (polluant) / MSaquarium(polluant) = 177886/18505 = 9.612861
Le calcul (dont vous verrez les détails au semestre de printemps) est réalisé en utilisant
l'alignement affiché ; or, celui-ci dépend de la largeur et du type d'espaces utilisés, et rien ne
garantit qu'il sera correct. En utilisant une police de caractères à chasse fixe (« fixed width » en
anglais), telle que Courier New, l'alignement est correct, et on voit que le calcul est différent :
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 4/9
Analysis of Variance Table
Response: df$masse
Df Sum Sq Mean Sq F value Pr(>F)
factor(df$polluant) 3 533659 177886 85.1586 6.219e-13 ***
factor(df$polluant):factor(df$aquarium)
8 18505 2313 1.1073 0.3928
Residuals 24 50133 2089
---
Sign. Codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 '' 1
Nous devons calculer F =
MSpolluant/MSaquarium(polluant) = 177886/2313 = 76.91
il n'est cependant pas conseillé d'écrire tout votre texte avec une telle police type « machine à
écrire », car la lecture en est laborieuse. Au contraire, il est recommandé de changer de type
d'écriture pour bien montrer la différence entre du texte, du code informatique ou des résultats
statistiques.
Créer des graphiques dans R
Nous avons déjà rencontré quelques-unes des possibilités graphiques de R dans la première
série (fonctions hist(), plot()). Si vous n'avez pas encore terminé la partie « fonctions
graphiques » de cette série, commencez par le faire avant d'attaquer la suite.
Aujourd'hui nous allons voir un peu plus en détails les fonctions plot() et boxplot(). Vous
trouverez un résumé des fonctions graphiques de R, comme par exemple hist() ou pie(),
dans le guide R pour débutants à la page 19.
Pour une représentation graphique de base, on utilise
généralement la fonction plot(x, y), qui permet de
représenter le diagramme de dispersion entre deux variables x
et y (cf les exercices) :
x <- -10:10
plot(x, sin(x))
Quelle est la différence entre le résultat de la commande
précédente et celui de celle-ci ?
plot(sin(x))
Ces fonctions graphiques acceptent des options permettant
d'ajouter un titre principal du graphique (main), une légende pour les différents axes (xlab,
ylab), ou de spécifier la couleur des points (col). Comme discuté dans la première série, si
l’option contient des caractères ([Link]. pour le titre du graphique), il est nécessaire de les indiquer
entre guillemets ( "…" ).
x <- seq(-10,10,0.01)
plot(x, (x^3+2*x^2-3*x+1)/(2*x^2+5*x-12),
xlab="x", ylab="f(x)", main="Graphique de la fonction")
x <- seq(0,4,0.1)
plot(x, exp(-(x^3+2*x^2-3*x+1)), ylab="exp(f(x))")
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 5/9
x <- seq(0,4,0.01)
plot(x, exp(-(x^3+2*x^2-3*x+1)), ylab="exp(f(x))", col="red")
Par défaut, plot() utilise des points. A l'aide de l'option type, on peut préciser si on souhaite
plutôt une ligne et des points (type="b") ou une ligne seule (type="l") :
x <- seq(-10,10,0.01)
plot(x, (x^3+2*x^2-3*x+1)/(2*x^2+5*x-12), type="l")
D’autres options options sont possible (voir l’aide) ; on peut en particulier demander à R de ne
rien afficher du tout (type="n"). Cette option peut sembler inutile, mais elle permet de créer un
graphique avec un système d’axes sur lequel on peut ensuite librement ajouter ce qu’on veut.
Afin de voir plusieurs graphiques en même temps, on peut spécifier à R un nombre de panneaux
à représenter dans la fenêtre. Ceci se fait grâce à l'option mfrow=c(x,y) de la fonction par. Le
paramètre mfrow accepte comme argument un vecteur de deux nombres indiquant le nombre x
de lignes et le nombre y de colonnes à mettre sur la fenêtre graphique. Le graphique sera alors
rempli par ligne. Notez que la fonction par permet de spécifier l'ensemble des paramètres
graphiques que l'on peut modifier dans R (voir ?par – attention, la liste est longue !).
par(mfrow=c(2,1))
x <- seq(-10,10,0.01)
plot(x, (x^3+2*x^2-3*x+1)/(2*x^2+5*x-12))
plot(x, (x^3+2*x^2-3*x+1)/(2*x^2+5*x-12), type="l")
par(mfrow=c(1,1)) # Pour retourner à un seul panneau
Attention, en faisant cela, chaque graphique aura ses propres axes et sa propre échelle – ce qui
rend difficile d’éventuelles comparaisons entre les différents graphiques placés côte à côte.
On peut aussi vouloir afficher plusieurs jeux de données sur un même graphique (et donc, avec
les mêmes axes et échelles). On commence par utiliser plot(), qui va afficher la première série
de données, et définir en même temps l'échelle sur les axes, les légendes, etc. On peut ensuite
faire appel aux fonctions lines(), text() ou points() pour ajouter des éléments sans
effacer les graphiques précédents.
x <- seq(0,2,0.05)
ymax <- 10
plot(x, x, ylim=c(0,ymax), ylab="f(x)")
lines(x, x^0.5, col="blue")
points(x, x^2, col="red")
text(x, x^3, labels="3", col="green")
A noter l'utilisation de l'option ylim qui permet de fixer les limites de l'échelle y du graphique
(xlim ferait la même chose pour l'axe des x), afin qu'il y ait suffisamment de place pour dessiner
les graphiques suivants (puisque R ne changera plus les axes après le premier graphique).
Essayez de dessiner le graphique ci-dessus, avec à côté le même graphique sans utiliser ylim,
et comparez-les.
Si vous faites ensuite de nouveau appel à la fonction plot(), un nouveau graphique effacera le
précédent.
Avant de passer aux questions et afin d'avoir un aperçu plus complet des capacités graphiques
de R, tapez la commande
demo(graphics)
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 6/9
Questions
Les fonctions et opérateurs que vous pourriez utiliser aujourd'hui sont les suivants:
boxplot(), hist(), mean(), median()
par(), plot(), [Link](), sd()
1. Boxplot
Dessinez à la main le boxplot décrivant la variabilité des points du jeu de données suivant:
18, 6, 14, 16, 11, 16, 20, 14, 17, 18, 15
Créez ensuite dans R un vecteur contenant ces données et calculez à l’aide de R la moyenne de
ce vecteur (?mean), la médiane (?median), le maximum (?max), le minimum (?min) et les
quartiles (?quantile) ? Essayez également les commandes summary() et fivenum() et
interprétez le résultat de ces commandes.
Enfin, produisez dans R un boxplot (?boxplot) de vos données afin de vérifier l’exactitude de
votre boxplot dessiné à la main. Interprétez les différences éventuelles entre le boxplot que vous
avez dessiné et celui reporté dans R.
2. Graphiques de données d'étudiants
Chargez le fichier [Link], disponible sur le site Moodle (et que nous avons déjà utilisé la
semaine dernière). Ce fichier contient plusieurs informations collectées sur des étudiants en
biologie telles que par exemple le sexe, la taille, le poids, la pointure, la latéralité, si ces étudiants
sont fumeurs ou non, la couleur des cheveux, la couleur des yeux, la taille du poignet gauche, le
nombre de frères et sœurs, ou encore le lieu d’origine.
Pour rappel, il vous faut utiliser la commande [Link](), dans laquelle on indique le fichier
que l'on veut lire ([Link]) et on précise que ce fichier contient les noms des variables
dans la première ligne du fichier (header=TRUE). On indique aussi dans quelle variable on veut
stocker le data frame qui sera ainsi créé (etudiant) :
> etudiant <- [Link]("[Link]", header=TRUE)
Pour visualiser les données contenues dans la variable (data frame) etudiant, on peut
simplement taper son nom, ou utiliser la commande head() si on ne veut afficher que les
premières lignes :
> etudiant
> head(etudiant)
On peut obtenir les noms des vecteurs disponibles dans le data frame en utilisant la commande
names() :
> names(etudiant)
Vous pouvez obtenir un résumé des données, colonne par colonne, à l’aide de la commande
summary() :
> summary(etudiant)
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 7/9
Pour utiliser par exemple la variable taille de ce fichier, vous pouvez utiliser le symbole $: par
exemple, etudiant$taille spécifie dans R que l'on intéresse au vecteur taille qui se
trouve dans le dataframe etudiant.
Pour les variables qualitatives, vous pouvez obtenir le compte des différentes valeurs à l’aide de
la commande table() ; par exemple, pour la colonne lieux :
> table(etudiant$lieux)
bresil colombie fr France ge ju ne
1 1 3 1 1 4 1
ti vd vs zh
3 27 4 1
Attention : l’une des variables de ce jeu de données contient une erreur
(volontaire!) qui fait que vous n’arriverez pas directement à la représenter
graphiquement. Nous en parlerons en détails dans la série 3, mais vous pouvez
déjà essayer de la trouver.
Questions
1. Lesquels des vecteurs suivants sont des variables qualitatives nominales, qualitatives
ordinales, quantitatives discrètes, quantitatives continues?
Sexe, taille, poids, pointure, latéralité, fumeurs, couleur des cheveux,
couleur des yeux, taille du poignet gauche, nombre de frères et sœurs, lieu d’origine.
2. Décrivez les données pour la latéralité, la taille et la couleur des cheveux. Pour les
variables discrètes (qualitatives ou quantitatives discrètes), donnez la proportion de
chaque valeur. Pour les variables continues, indiquez [Link]. la moyenne, l’intervalle
(minimum et maximum), et l’écart type – et utilisez également un graphique adéquat
([Link]. boxplot()) pour décrire chaque variable continue.
3. Comment interprétez-vous la médiane de la taille ? (utilisez la définition de la médiane)
4. Transformez la variable poids de telle sorte que la moyenne de la variable transformée
soit de 0 et sa variance de 1 (i.e. variable dite ‘standardisée’, voir polycopié de V.
Rousson). Vérifiez la moyenne de la nouvelle variable à l'aide de la fonction mean() et
son écart-type à l'aide de la fonction sd() ; qu'observez-vous ?
5. Sur une même fenêtre divisée en deux panneaux (2 colonnes ; voir le paramètre "mfrow"
de la commande par, déjà utilisé dans la série précédente ; n'hésitez pas à consulter
l'aide si nécessaire), représentez sur le panneau de gauche un boxplot des poids avant
standardisation et sur le panneau de droite un boxplot des poids après standardisation
(i.e. moyenne = 0, sd =1). Que remarquez-vous ?
6. Dessinez un histogramme des tailles. Comment est la distribution: uniforme, normale,
bimodale? Sur une fenêtre divisée en deux panneaux, représentez un histogramme pour
les hommes et un histogramme pour les femmes. Commentez vos résultats.
La commande boxplot() peut également dessiner des boxplots séparés pour différents sous-
groupes des données. Une façon de faire est de simplement lister différents sous-groupes, par
exemple :
boxplot(data1, data2, data3)
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 8/9
Une autre façon est d’indiquer à R qu’il doit séparer le boxplot en fonction des sous-groupes
indiqués dans une variable catégorique ; par exemple,
boxplot(taille ~ sexe)
(où taille ~ sexe se lit « la taille en fonction du sexe »).
7. Divisez une fenêtre en suffisamment de panneaux, et dessinez des boxplots des mesures
quantitatives du tableau des étudiants en les séparant par la variable sexe. Quelles
mesures semblent montrer une différence en fonction du sexe ?
8. (facultatif) Répétez l’opération en utilisant la couleur des cheveux au lieu du sexe.
9. Extrayez du jeu des données les poids des femmes fumeuses, ainsi que les poids des
femmes non-fumeuses. Comparez ces deux groupes en utilisant des boxplots et
interprétez les résultats.
Aide : utilisez les crochets [ … ] et le signe « & » pour sélectionner uniquement les
lignes qui vous intéressent en fonction de 2 critères, comme vu dans la série 1.
UNIL – Analyse de données en biologie – Série 2 – 2 octobre 2024 9/9