Exemple d’analyse statistique sur données réelles de football pro

On étudie ici une base de données récensant entre 2009 et 2016 diverses statistiques concernant les joueurs des 5 championnats majeurs de football pro européen. On a ici une base de données brute, riche en information, mais trop volumineuse pour être analysée directement par un cerveau humain. Les statistiques nous servent d’outil pour synthétiser, organiser les données afin d’en extraire l’information importante et pertinente, tout en évitant le superflu. Commençons par visualiser ces données brutes :

raw_tab = read.csv2("C:/Users/user/CloudStation/Présentations/Cours Master INSEP/Cours stat Master INSEP/DB_Football_2009_2016_complet.csv", sep=";", stringsAsFactors = FALSE, dec=".")

tab = raw_tab[,-1]

kable(tab[1:20,])
année..début.du.championnat. Player Club âge Position Position.2 Position.3 CM KG Apps Mins Goals Assists Yel Red SpG PS. AerialsWon MotM Rating
2016 Fabinho Monaco 23 D(R) DMC 188 78 33(4) 3071 9 1 8 0 0.8 84.4 1.8 2 7.51
2016 Thomas Lemar Monaco 21 AM(CLR) 170 58 28(6) 2612 9 10 1 0 1.7 82.8 0.3 5 7.48
2016 Jorge Monaco 21 D(L) 184 70 1(1) 91 1 0 0 0 2.0 76.5 2.0 1 7.42
2016 Falcao Monaco 31 FW 177 72 22(7) 1941 21 5 2 0 2.8 78.9 1.4 3 7.38
2016 Boschilia Monaco 21 AM(CL) 172 63 5(6) 437 6 2 1 0 1.8 76.1 0.3 1 7.35
2016 Marcel Tisserand Monaco 24 D(CR) M(R) 190 80 1 90 0 0 1 0 1.0 67.6 1.0 0 7.31
2016 Bernardo Silva Monaco 23 AM(CLR) 173 64 33(4) 2800 8 9 3 0 1.6 81.1 0.5 3 7.29
2016 Almamy Touré Monaco 21 D(R) 183 72 12(3) 1082 0 5 0 0 0.4 79.3 2.1 0 7.29
2016 Tiemoué Bakayoko Monaco 23 DMC 185 77 25(7) 2220 2 1 2 1 0.9 87.3 2.0 1 7.27
2016 Benjamin Mendy Monaco 23 D(L) DMC M(L) 185 85 24(1) 2060 0 5 6 1 0.6 76.0 1.6 2 7.25
2016 Kylian Mbappe Monaco 18 FW 178 68 17(12) 1501 15 8 2 0 1.8 73.3 0.3 5 7.22
2016 Djibril Sidibe Monaco 25 D(LR) M(R) 182 71 26(3) 2322 2 5 7 0 0.8 81.3 1.1 1 7.17
2016 Loic Badiashile Monaco 19 Goalkeeper 186 80 0(1) 45 0 0 0 0 0.0 85.0 0.0 0 7.16
2016 Kamil Glik Monaco 29 D(C) 190 80 36 3240 6 2 6 0 0.7 82.0 1.8 0 7.16
2016 Kevin N’Doram Monaco 21 Defender 184 76 3(2) 320 0 1 0 0 0.2 89.9 2.4 0 7.14
2016 Jemerson Monaco 25 D(C) 184 77 34 3058 2 0 7 1 0.4 85.7 1.7 0 7.07
2016 Abdou Diallo Monaco 21 D(C) 188 80 4(1) 386 0 0 0 0 0.4 82.9 1.4 0 7.04
2016 Valère Germain Monaco 27 AM(L) FW 180 73 27(9) 2240 10 3 0 0 1.8 76.3 1.4 1 6.94
2016 João Moutinho Monaco 30 M(C) 170 61 19(12) 1768 2 4 0 0 0.6 85.2 0.5 2 6.92
2016 Danijel Subasic Monaco 32 GK 191 84 36 3240 0 0 1 0 0.0 63.1 0.2 0 6.90

Dans un premier temps, il est important d’avoir un idée globale de notre base de données, sa dimension, sa quantité d’information, le type de variable. Avant de nous pencher sur le détail des variables et les analyses spécifiques, arretons nous la dessus :

str(tab)
## 'data.frame':    21622 obs. of  20 variables:
##  $ année..début.du.championnat.: int  2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
##  $ Player                      : chr  "Fabinho" "Thomas Lemar" "Jorge" "Falcao" ...
##  $ Club                        : chr  " Monaco" " Monaco" " Monaco" " Monaco" ...
##  $ âge                         : int  23 21 21 31 21 24 23 21 23 23 ...
##  $ Position                    : chr  " D(R)" " AM(CLR)" " D(L)" " FW" ...
##  $ Position.2                  : chr  "DMC" "" "" "" ...
##  $ Position.3                  : chr  "" "" "" "" ...
##  $ CM                          : int  188 170 184 177 172 190 173 183 185 185 ...
##  $ KG                          : int  78 58 70 72 63 80 64 72 77 85 ...
##  $ Apps                        : chr  "33(4)" "28(6)" "1(1)" "22(7)" ...
##  $ Mins                        : int  3071 2612 91 1941 437 90 2800 1082 2220 2060 ...
##  $ Goals                       : int  9 9 1 21 6 0 8 0 2 0 ...
##  $ Assists                     : int  1 10 0 5 2 0 9 5 1 5 ...
##  $ Yel                         : int  8 1 0 2 1 1 3 0 2 6 ...
##  $ Red                         : int  0 0 0 0 0 0 0 0 1 1 ...
##  $ SpG                         : num  0.8 1.7 2 2.8 1.8 1 1.6 0.4 0.9 0.6 ...
##  $ PS.                         : num  84.4 82.8 76.5 78.9 76.1 67.6 81.1 79.3 87.3 76 ...
##  $ AerialsWon                  : num  1.8 0.3 2 1.4 0.3 1 0.5 2.1 2 1.6 ...
##  $ MotM                        : int  2 5 1 3 1 0 3 0 1 2 ...
##  $ Rating                      : num  7.51 7.48 7.42 7.38 7.35 7.31 7.29 7.29 7.27 7.25 ...

Avec plus de 20 000 lignes, nous avons une base de données assez conséquente, et nos estimations de moyennes ou autres paramètres seront vraisemblablement fiables. De plus, avec 20 variables, nous avons divers angles d’analyse de ces données qui s’offrent à nous. Nous allons en voir certains, basiques, et l’on essaiera d’en trouver d’autres ensemble.

Les statistiques descriptives

Dans un premier temps, les statistiques nous servent à synthétiser un gros volume de données en information utile de plus petite dimension. Le premier indicateur statistique simple et évident qui nous vient en tête est souvent la moyenne. C’est en effet un moyen de résumer un ensemble, potentiellement très grand, de nombres à l’aide d’un seul nombre qui représente globalement un mélange de tous :

apply(tab[,c(4,8,9,11:20)], 2, mean)
##          âge           CM           KG         Mins        Goals 
##   29.9448710  181.5613264   76.2373508 1320.6593285    1.7604754 
##      Assists          Yel          Red          SpG          PS. 
##    1.2274998    2.6893904    0.1599760    0.7733235   75.2776616 
##   AerialsWon         MotM       Rating 
##    0.9592868    0.6693645    6.6991388

La moyenne est appelée un paramètre de position, ce qui signifit qu’il donne une valeur autour de laquelle sont situées toutes les données de la série statistique. Même si il est très utilisé, ce n’est pas le seul. Il existe aussi la médiane, qui présente l’avantage de ne pas être sensible aux valeures extrêmes :

apply(tab[,c(4,8,9,11:20)], 2, median)
##        âge         CM         KG       Mins      Goals    Assists 
##      30.00     182.00      76.00    1202.00       0.00       0.00 
##        Yel        Red        SpG        PS. AerialsWon       MotM 
##       2.00       0.00       0.60      77.50       0.70       0.00 
##     Rating 
##       6.71

Pour être plus complet, il est nécessaire d’associer un deuxième nombre pour résumer notre série statistique : un paramètre de dispersion. Cela permet de situer à quel point nos données sont éloignées de notre paramètre de position et donne donc un “intervalle” de valeurs auquel appartiennent nos données. En général on utiise ces paramètres par couple : moyenne/variance ou médiane/écart interquartile:

summary(tab[,c(4,8,9,11:20)])
##       âge              CM              KG              Mins     
##  Min.   :16.00   Min.   :  0.0   Min.   :  0.00   Min.   :   1  
##  1st Qu.:26.00   1st Qu.:178.0   1st Qu.: 72.00   1st Qu.: 377  
##  Median :30.00   Median :182.0   Median : 76.00   Median :1202  
##  Mean   :29.94   Mean   :181.6   Mean   : 76.24   Mean   :1321  
##  3rd Qu.:33.00   3rd Qu.:186.0   3rd Qu.: 81.00   3rd Qu.:2173  
##  Max.   :47.00   Max.   :203.0   Max.   :104.00   Max.   :3420  
##      Goals          Assists            Yel              Red      
##  Min.   : 0.00   Min.   : 0.000   Min.   : 0.000   Min.   :0.00  
##  1st Qu.: 0.00   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.:0.00  
##  Median : 0.00   Median : 0.000   Median : 2.000   Median :0.00  
##  Mean   : 1.76   Mean   : 1.228   Mean   : 2.689   Mean   :0.16  
##  3rd Qu.: 2.00   3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.:0.00  
##  Max.   :50.00   Max.   :20.000   Max.   :18.000   Max.   :5.00  
##       SpG              PS.           AerialsWon          MotM        
##  Min.   :0.0000   Min.   :  0.00   Min.   :0.0000   Min.   : 0.0000  
##  1st Qu.:0.2000   1st Qu.: 70.90   1st Qu.:0.3000   1st Qu.: 0.0000  
##  Median :0.6000   Median : 77.50   Median :0.7000   Median : 0.0000  
##  Mean   :0.7733   Mean   : 75.28   Mean   :0.9593   Mean   : 0.6694  
##  3rd Qu.:1.1000   3rd Qu.: 82.70   3rd Qu.:1.4000   3rd Qu.: 1.0000  
##  Max.   :7.4000   Max.   :100.00   Max.   :9.5000   Max.   :25.0000  
##      Rating      
##  Min.   : 3.700  
##  1st Qu.: 6.430  
##  Median : 6.710  
##  Mean   : 6.699  
##  3rd Qu.: 6.960  
##  Max.   :10.000
boxplot(tab$âge, ylab = "Age")

boxplot(tab[,c(8,9)])

boxplot(tab[,12:16])

Distribution des données

Pour connaitre la répartition des valeurs pour une variable donnée, il est utile d’observer sa distribution. Elle renseigne sur les valeurs très représentées ou non dans la série. C’est un graphique essentiel pour commencer l’étude d’un variable spécifique.

hist(tab$Goals, nclass = 30, xlab = "Goals", main = "Distribution du nombre de buts par joueur") 

hist(tab$Yel, nclass = 20, xlab = "Yellow", main = "Distribution du nombre de cartons jaunes par joueur") 

hist(tab$CM, nclass = 50, xlab = "Taille", main = "Distribution de la taille des joueurs") 

Ici, on remarque une valeur étrange. On appelle cela une valeur aberrante et doit être due à une erreur de remplissage. C’est très commun et très important à corriger pour ne pas fausser les analyses.

hist(tab$CM[tab$CM> 130], nclass = 50, xlab = "Taille", main = "Distribution de la taille des joueurs") 

Il est également intéressant de regarder les relations entre différentes variables à travers la distribution selon deux variables.

plot(tab$Assists , tab$PS. , xlab = "Passes décisives", ylab="Taux passes réussies")

plot(tab$CM[tab$CM> 130] , tab$AerialsWon[tab$CM> 130] , xlab = "Taille", ylab="Duel aériens gagnés/match")

Il peut également être intéressant de se focaliser sur des sous groupes particuliers dans une analyse. Prenons l’exmple des joueurs ayant mis plus de 20 buts en une saison :

plot(tab$Mins[tab$âge >25] , tab$Goals[tab$âge >25] , xlab = "Minutes jouées pour buteur 30+", ylab="Age pour buteur 30+")

Autres méthodes plus avancées

plot(tab$Goals ~ tab$SpG, xlab = "tir par match", ylab = "buts par saison") 
abline(lm(tab$Goals ~ tab$SpG))

library("FactoMineR")
## Warning: package 'FactoMineR' was built under R version 3.4.4
res.pca = PCA(tab[,c(4,8,9,11:20)],scale.unit = TRUE)

hist(tab$CM[tab$CM> 130], nclass = 50, xlab = "Taille", main = "Distribution de la taille des joueurs")