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.
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])
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+")
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")