Chapitre 1 Introduction

1.1 Pourquoi ce livre?

R a d’abord été conçu comme logiciel de statistiques. Sa richesse, en terme de modèles stats, est indéniable. Cependant, malgré (ou peut-être à cause de) cette richesse et de l’hétérogénéité des packages dédiés aux analyses statistiques, il peut être assez compliqué de s’y retrouver, d’un point de vue purement pratique, dans les lignes de commande permettant d’arriver à ses fins… En effet, pour produire l’ensemble d’une analyse, on aura la plupart du temps de combiner des commandes de plusieurs types (certaines pour produire un graphique, d’autres pour ajuster un modèle, etc.)

Ce livre peut ainsi servir d’aide-mémoire pour retrouver plus facilement les lignes de commande permettant de réaliser les différentes étapes des analyses les plus “classiques”.

Au-delà de cet aspect plus logistique, les statistiques sont un sujet épineux qu’il peut être compliqué de s’approprier si l’on a pas le “parcours académique” adéquat… Or nombreuses sont les personnes qui ont besoin de comprendre et d’appliquer des modèles statistiques, sans pour autant avoir eu une formation de base à cette discipline (ou même sans avoir les notions de probabilités mises en jeu). Or, sans cette formation de base, il est délicat d’appliquer un modèle, de le comprendre et d’avoir le recul nécessaire pour interpréter les résultats de ce modèle…

Ce livre vise ainsi à introduire les modèles statistiques et leurs applications en reprenant et en explicitant les notions de probabilités et statistiques sous-jacentes de la manière la plus didactique et accessible possible.

1.2 Packages

1.2.1 Usage du tidyverse

En terme de data wrangling (ou arrangement de données dans la langue de Molière) j’ai pris l’habitude d’utiliser les packages du tidyverse (ggplot2, dplyr, tidyr, …), qui sont très bien conçus et facilitent beaucoup de tâches… Je priviligierai donc les fonctions du tidyverse plutôt que les commandes de base quand c’est possible.

Ainsi, avant d’essayer de reproduire toute autre ligne de commande dans ce livre, il faudra (installer et) charger le tidyverse:

install.packages("tidyverse") # installation (si nécessaire)
library(tidyverse) # chargement

Voici les quelques packages du tidyverse que j’utiliserai le plus:

ggplot2 pour produire les graphiques. Dans ce livre, je me servirai très souvent des fonctions de de package pour produire les graphiques (en fait, j’ai essayé, autant que possible, de ne me servir que de ce package pour produire les graphiques statistiques dans cet ouvrage). Vous pouvez en apprendre plus sur ce sujet sur ce billet de blog et disposer d’un aide-mémoire ici.
dplyr pour manipuler et transformer les tables. Dans ce livre, je m’en sers très souvent, notamment pour calculer des statistiques descriptives par groupe. Vous pouvez en apprendre plus sur ce sujet sur ce billet de blog et disposer d’un aide-mémoireici.
purrr pour simplifier l’écriture de procédures itératives. Dans ce livre, je m’en sers notamment pour faire quelques simulations, ajuster quelques modèles de manière itérative… Vous n’en aurez pas forcément besoin pour comprendre les analyses détaillées mais si vous souhaitez en savoir plus à ce sujet vous pouvez aller voir ce billet de blog et disposer d’un aide-mémoireici

1.2.2 Autres packages

J’utilise un certain nombre d’autres packages:

janitor pour nettoyer les données et mettre en forme des tableaux d’effectifs(https://github.com/sfirke/janitor/blob/master/vignettes/tabyls.md).
infer pour réaliser des tests statistiques selon la logique tidyverse, aider à leur compréhension, et à la réalisation des tests par permutationPackage tout récent!

1.2.3 Illustrations

Je me suis amusée à créer quelques illustrations pour cet ouvrage, à l’aide du merveilleux logiciel ArtRage. Au cas où, je précise que j’ai fait ça sur mon temps libre et non mes heures de travail ;-) …

Les illustrations servent à rompre la monotonie (formelle) de cet ouvrage (car, oui, malgré le nombre de graphiques statistiques qu’il contient, j’ai bien peur, du fait de sa taille, qu’il puisse être indigeste si on l’appréhende en un bloc…) et à servir de points de repère visuels. Et puis, solliciter un tout petit peu l’imagination par des images, ça favorise la mémorisation et l’apprentissage.

1.3 Jeux de données

1.3.1 Des jeux de données fictifs

Dans ce livre, j’utiliserai (presque) exclusivement des jeux de données fictifs, pour une question de facilité et de souplesse… Cela me permettra en effet d’avoir des jeux de données intuitifs qui limiteront l’effort à fournir pour le lecteur pour comprendre ce qu’est telle ou telle variable. En effet, je veux me concentrer sur l’explication de la méthode, pas sur l’explication thématique… Par ailleurs, cela me permet de disposer de données de tous les types, distributions, tailles d’échantillon, etc. qu’il me faut pour expliquer un très large éventail de méthodes statistiques.

Utiliser des jeux de données fictifs, cela va aussi me permettre de prendre des exemples les plus universels possibles… En effet, si je prenais des exemples réels issus d’une discipline particulière (par exemple, tout-à-fait au hasard, la géomorphologie fluviale), ça ne serait pas particulièrement parlant pour les personnes d’une autre discipline (par exemple, la psychologie)… Alors que tout le monde peut se projeter dans les histoires de chevaliers, de magicien(ne)s, et de prince(sse)s :-).

Soyons clairs néanmoins: avoir des bons jeux de vraies données pour expliquer une méthode, c’est super, ça permet de vraiment comprendre les problèmes auxquels on est confrontés dans la “vraie” vie (par exemple les données manquantes, le peu de données, la non-normalité), mais c’est très contraignant et c’est beaucoup de travail (trouver un jeu de donnée “open” et ad hoc pour chaque méthode, le rendre facilement accessible et compréhensible…) et ce n’est donc pas le choix que j’ai fait pour cet ouvrage.

1.3.2 Brocéliande

Le jeu de données broceliande recense (en terme d’individus) un certain nombre d’arbres de la forêt de Brocéliande ainsi que (en terme de variables):

  • age: leur âge, en années
  • espece: leur espèce (chêne, châtaignier, hêtre ou sapin)
  • hauteur: leur hauteur, en cm
  • largeur: leur largeur, en cm
  • gui: le nombre de touffes de gui qui les affecte
  • enchantement: la présence d’un enchantement sur cet arbre (TRUE ou FALSE)
  • fees: le nombre de fées qui habitent cet arbre
  • lutins: le nombre de lutins qui habitent cet arbre
  • perlimpinpin: la quantité de poudre de perlimpinpin dans sa sève (en \(\mu\)g/L)

Le jeu de données broceliande est disponible en ligne à cette adresse.

broceliande=read.csv("http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/datasets/broceliande.csv",
                     header=TRUE,sep=";")
str(broceliande)
## 'data.frame':    864 obs. of  9 variables:
##  $ age         : num  5.228 20.942 50.651 12.566 0.419 ...
##  $ espece      : Factor w/ 4 levels "chataignier",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ hauteur     : num  219 179 302 265 110 ...
##  $ gui         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ largeur     : num  190 175 320 313 118 ...
##  $ enchantement: logi  TRUE TRUE TRUE FALSE TRUE FALSE ...
##  $ fees        : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ lutins      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ perlimpinpin: num  129 170 153 134 122 ...

1.3.3 Châteaux et Boulots

Le jeu de données chateauxEtBoulots recense (en terme d’individus) un certain nombre de personnes du pays Fantaisie ainsi que (en terme de variables)

  • activite: leur activité (la royauté, la chevalerie, les enchantements ou la magie noire),
  • sexe: leur sexe (féminin ou masculin),
  • region: leur région (Bois-Jolis,Montage-Sombre ou Flots-Blancs)
  • tenue: leur couleur de tenue (noire, grise, bleue, verte, ou rose).

Le jeu de données chateauxEtBoulots est disponible en ligne à cette adresse.

chateauxEtBoulots=read.csv("http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/datasets/chateauxEtBoulots.csv",
                           header=TRUE, sep=";")
str(chateauxEtBoulots)
## 'data.frame':    72 obs. of  4 variables:
##  $ activite: Factor w/ 4 levels "chevalerie","enchantements",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sexe    : Factor w/ 2 levels "feminin","masculin": 2 2 2 2 2 2 2 2 2 2 ...
##  $ region  : Factor w/ 3 levels "bois-jolis","flots-blancs",..: 1 1 1 1 1 1 2 2 2 2 ...
##  $ tenue   : Factor w/ 5 levels "bleue","grise",..: 1 1 2 4 5 5 1 1 2 3 ...

1.3.4 Potions

Le jeu de données potions recense un certain nombre de potions magiques ainsi que pour lesquelles sont renseignées

  • des quantités d’ingrédients (noms de variables commençant par i_)
  • des scores relatifs aux propriétés magiques des potions (noms de variables commençant par p_)
  • des modalités d’élaboration des potions (noms de variables commençant par p_)

Parmi les ingrédients, on peut citer par exemple ailes de papillon, bave de crapaud, pierre de lune, etc.

En terme de propriétés on a relevé si les potions permettent

  • d’altérer l’apparence, de se transformer en loup-garou ou en plante verte (altération) - de conjurer des esprits ou des morts-vivants (conjuration)
  • de lancer des éclairs, des boules de feu ou des pics de glace (destruction)
  • de devenir invisible (invisibilite)
  • de se protéger des attaques (resistance)?

Quant aux modalités d’élaboration des potions, elles décrivent la nécessité d’une formule ou non, et si oui, et en quelle langue (elfique ou latin). La préparation peut être effectuée par bouillon, macération ou distillation.

Le jeu de données potions est disponible en ligne à cette adresse.

potions=read.csv("http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/datasets/potions.csv",
                 sep=";", header=T)
str(potions)
## 'data.frame':    67 obs. of  17 variables:
##  $ m_formule         : Factor w/ 3 levels "aucune","elfique",..: 3 1 2 3 3 3 1 3 1 2 ...
##  $ m_preparation     : Factor w/ 3 levels "bouillon","distillation",..: 1 1 1 1 2 1 1 3 3 2 ...
##  $ i_bave_crapaud    : num  6.98 13.06 15.61 12.75 6.96 ...
##  $ i_sang_hirondelle : num  11.07 16.1 18.07 21.86 8.53 ...
##  $ i_aile_papillon   : num  3.841 0.271 21.129 31.255 11.125 ...
##  $ i_ectoplasme      : num  2.197 3.39 1.767 0.935 8.172 ...
##  $ i_graisse_troll   : num  5.38 2.93 16.62 13.8 6.93 ...
##  $ i_pied_lutin      : num  14.77 22.99 2526.39 4.84 30.15 ...
##  $ i_givreboises     : num  36.84 99.44 30.89 541.82 9.61 ...
##  $ i_pierre_lune     : num  1.57e+05 6.39e+06 3.89e+02 1.88e+10 2.07e+19 ...
##  $ i_larmes_crocodile: num  0.312 4.393 2.131 0.586 20.246 ...
##  $ p_resistance      : num  4.12 4.9 2.39 11.28 3.75 ...
##  $ p_destruction     : num  0.421 0.664 0.491 -0.154 1.212 ...
##  $ p_invisibilite    : num  7.24 8.62 7.53 14.76 21.18 ...
##  $ p_transformation  : num  46 18.2 26.1 23.8 20.6 ...
##  $ p_conjuration     : num  -0.876 -2.174 14.245 3.827 5.215 ...
##  $ p_alteration      : num  4.33 4.98 8.28 4.49 4.04 ...

1.4 Rappels

Quelques rappels des fonctions de bases pour décrire ses données

1.4.1 Décrire un tableau

Affichage des dimensions, nombre de lignes, nombre de colonnes :

dim(broceliande)
## [1] 864   9
nrow(broceliande)
## [1] 864
ncol(broceliande)
## [1] 9

Affichage des premières lignes, ou dernières lignes ou de l’ensemble du tableau dans le “Viewer” de RStudio:

head(broceliande)
##          age espece hauteur gui  largeur enchantement fees lutins
## 1   5.228017  chene   219.1   0 189.6339         TRUE    1      0
## 2  20.942126  chene   178.7   0 174.9923         TRUE    0      0
## 3  50.651180  chene   301.8   0 320.0635         TRUE    0      0
## 4  12.565862  chene   265.2   0 312.5803        FALSE    0      0
## 5   0.419487  chene   109.9   0 117.7305         TRUE    0      0
## 6 152.585839  chene   287.9   0 329.7500        FALSE    0      0
##   perlimpinpin
## 1     129.0095
## 2     170.2561
## 3     153.1471
## 4     134.0399
## 5     122.3146
## 6     154.5884
tail(broceliande)
##             age espece hauteur gui  largeur enchantement fees lutins
## 859   4.4723849  sapin   248.4   0 249.8085        FALSE    0      0
## 860  38.3755844  sapin   252.2   1 243.1223        FALSE    0      0
## 861   8.9334070  sapin   274.8   3 227.3613         TRUE    0      0
## 862   7.2500990  sapin   177.0   1 159.6963        FALSE    0      0
## 863 250.3051182  sapin   195.0   1 214.0476        FALSE    0      0
## 864   0.1406944  sapin   272.3   4 219.6357        FALSE    0      0
##     perlimpinpin
## 859    112.41735
## 860     84.04768
## 861    156.11338
## 862    133.52802
## 863    140.52587
## 864    139.22678

Affichage de la structure, d’un résumé de la distribution des variables du tableau:

str(broceliande)
## 'data.frame':    864 obs. of  9 variables:
##  $ age         : num  5.228 20.942 50.651 12.566 0.419 ...
##  $ espece      : Factor w/ 4 levels "chataignier",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ hauteur     : num  219 179 302 265 110 ...
##  $ gui         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ largeur     : num  190 175 320 313 118 ...
##  $ enchantement: logi  TRUE TRUE TRUE FALSE TRUE FALSE ...
##  $ fees        : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ lutins      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ perlimpinpin: num  129 170 153 134 122 ...
summary(broceliande)
##       age                   espece       hauteur           gui        
##  Min.   :   0.046   chataignier:265   Min.   :  7.9   Min.   :0.0000  
##  1st Qu.:   2.867   chene      :351   1st Qu.:149.4   1st Qu.:0.0000  
##  Median :  12.938   hetre      :174   Median :197.6   Median :0.0000  
##  Mean   :  88.433   sapin      : 74   Mean   :216.0   Mean   :0.3032  
##  3rd Qu.:  46.224                     3rd Qu.:268.8   3rd Qu.:0.0000  
##  Max.   :4500.259                     Max.   :853.2   Max.   :7.0000  
##     largeur        enchantement         fees             lutins       
##  Min.   :  9.087   Mode :logical   Min.   : 0.0000   Min.   :  0.000  
##  1st Qu.:144.073   FALSE:698       1st Qu.: 0.0000   1st Qu.:  0.000  
##  Median :207.499   TRUE :166       Median : 0.0000   Median :  0.000  
##  Mean   :228.269                   Mean   : 0.2442   Mean   :  1.258  
##  3rd Qu.:289.223                   3rd Qu.: 0.0000   3rd Qu.:  0.000  
##  Max.   :792.646                   Max.   :22.0000   Max.   :718.000  
##   perlimpinpin   
##  Min.   : 70.01  
##  1st Qu.:104.98  
##  Median :119.84  
##  Mean   :120.25  
##  3rd Qu.:134.36  
##  Max.   :185.41

1.4.2 Décrire vecteur numérique

1.4.2.1 par une métrique

Longueur du vecteur:

length(broceliande$hauteur)
## [1] 864

Minimum, maximum, étendue d’un vecteur

min(broceliande$hauteur)
## [1] 7.9
max(broceliande$hauteur)
## [1] 853.2
range(broceliande$hauteur)
## [1]   7.9 853.2

Tendance centrale: moyenne, médiane:

La moyenne d’une variable \(X\) (ou espérance, \(E(X)\)) correspond à:

\[\begin{eqnarray} E(X) &=&\frac{1}{N}(X_1+X_2+....+X_N)\\ &=&\frac{1}{N}\sum_{i=1}^{i=N}{X_i} \end{eqnarray}\]
mean(broceliande$hauteur)
## [1] 216.0025
median(broceliande$hauteur)
## [1] 197.6

Variabilité: écart-type, variance:

La variance d’une variable (\(V(X)\)) correspond à:

\[\begin{eqnarray} V(X)&=&\frac{1}{N-1}[(X_1-\bar X)^2+...+(X_N-\bar X)^2]\\ &=& \frac{1}{N-1}\sum_{i=1}^{i=N}(X_i-\bar X)^2\\ &=& sd(X)^2 \end{eqnarray}\]
sd(broceliande$hauteur)
## [1] 97.94254
var(broceliande$hauteur)
## [1] 9592.741

Distribution: quantiles, résumé

Le quantile d’ordre \(q\) d’une variable \(X\) est la valeur \(x\) telle que :

\[pr(X\leq x)=q\].

On parle de premier, deuxième, et troisième quartiles pour les quantiles d’ordre 0.25, 0.5, et 0.75.

Le deuxième quartile est en outre équivalent à la médiane.

quantile(broceliande$hauteur,0.05)
##    5% 
## 87.09
quantile(broceliande$hauteur,c(0.05,0.95))
##     5%    95% 
##  87.09 374.44
summary(broceliande$hauteur)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     7.9   149.4   197.6   216.0   268.8   853.2

Si le nombre de valeurs différentes est limité, affichage des effectifs par valeur:

table(broceliande$fees)
## 
##   0   1   2   3   4   5   6   7  11  22 
## 769  53  23   6   4   3   2   1   2   1

ou bien par les fonctions du tidyverse (ici package dplyr):

broceliande %>% 
  group_by(fees) %>% 
  summarise(n=n())
## # A tibble: 10 x 2
##     fees     n
##    <int> <int>
##  1     0   769
##  2     1    53
##  3     2    23
##  4     3     6
##  5     4     4
##  6     5     3
##  7     6     2
##  8     7     1
##  9    11     2
## 10    22     1

1.4.2.2 par un graphique

ggplot(broceliande, aes(x=hauteur))+
  geom_histogram(fill="forestgreen")

1.4.3 Décrire un vecteur catégoriel:

1.4.3.1 par une métrique

Longueur du vecteur:

length(broceliande$espece)
## [1] 864

Affichage des effectifs par valeur:

table(broceliande$espece)
## 
## chataignier       chene       hetre       sapin 
##         265         351         174          74

ou bien par les fonctions du tidyverse (ici package dplyr):

broceliande %>% 
  group_by(espece) %>% 
  summarise(n=n())
## # A tibble: 4 x 2
##   espece          n
##   <fct>       <int>
## 1 chataignier   265
## 2 chene         351
## 3 hetre         174
## 4 sapin          74

Le package janitor propose également quelques fonctions qui permettent d’“arranger” plus facilement ces tables d’effectifs en tables de proportions (avec quelques infos supplémentaires -fonctions adorn_xxx()-):

##install.packages("janitor")
library(janitor)
tabyl(broceliande$espece) %>% 
  adorn_pct_formatting() %>% # rajoute pourcentage
  adorn_totals("row")        # rajoute total des lignes
##  broceliande$espece   n percent
##         chataignier 265   30.7%
##               chene 351   40.6%
##               hetre 174   20.1%
##               sapin  74    8.6%
##               Total 864       -

1.4.3.2 par un graphique

ggplot(broceliande,aes(x=espece))+
  geom_bar(fill="greenyellow")