UP | HOME

Séance 11 : Algo & Prog avec R

Table des matières

1 Chargement des données

Les résultats d'une saison de ligue 1 de football composent le jeu de données. Nous utiliserons les résultats de la saison 2014/2015 récupérés sur www.football-data.co.uk. Les notes à propos du jeu de données sont disponibles ici.

Nous utiliserons le code suivant pour charger et filtrer le jeu de données.

df.schema <-c(
    Div = "League Division",
    Date = "Match Date (dd/mm/yy)",
    HomeTeam = "Home Team",
    AwayTeam = "Away Team",
    FTHG = "Full Time Home Team Goals",
    FTAG = "Full Time Away Team Goals",
    FTR = "Full Time Result (H=Home Win, D=Draw, A=Away Win)",
    HTHG = "Half Time Home Team Goals",
    HTAG = "Half Time Away Team Goals",
    HTR = "Half Time Result (H=Home Win, D=Draw, A=Away Win)",
    Attendance = "Crowd Attendance",
    Referee = "Match Referee",
    HS = "Home Team Shots",
    AS = "Away Team Shots",
    HST = "Home Team Shots on Target",
    AST = "Away Team Shots on Target",
    HHW = "Home Team Hit Woodwork",
    AHW = "Away Team Hit Woodwork",
    HC = "Home Team Corners",
    AC = "Away Team Corners",
    HF = "Home Team Fouls Committed",
    AF = "Away Team Fouls Committed",
    HO = "Home Team Offsides",
    AO = "Away Team Offsides",
    HY = "Home Team Yellow Cards",
    AY = "Away Team Yellow Cards",
    HR = "Home Team Red Cards",
    AR = "Away Team Red Cards",
    HBP = "Home Team Bookings Points (10 = yellow, 25 = red)",
    ABP = "Away Team Bookings Points (10 = yellow, 25 = red)"
  )
read.csv.league <- function(file.db) {
## Read csv file : season matrix (one row per match)
  df <- read.csv(file.db)
  ## Extract relevant columns

     df[,colnames(df) %in% names(df.schema)]
   }
file.db <- file.path('TP11-TD11', 'F1_14_15.csv')
df <- read.csv.league(file.db)
tail(df[,1:7])
    Div     Date   HomeTeam AwayTeam FTHG FTAG FTR
375  F1 23/05/15  Marseille   Bastia    3    0   H
376  F1 23/05/15       Metz    Lille    1    4   A
377  F1 23/05/15   Paris SG    Reims    3    2   H
378  F1 23/05/15     Rennes     Lyon    0    1   A
379  F1 23/05/15 St Etienne Guingamp    2    1   H
380  F1 23/05/15   Toulouse     Nice    2    3   A

Il est possible de générer les statistiques ou les classements à n'importe quelle date de la saison.

df.y <- df[ as.Date(df$Date, '%d/%m/%y') <=  as.Date('01/01/15', '%d/%m/%y'), ]
tail(df.y[,1:7])
    Div     Date   HomeTeam              AwayTeam FTHG FTAG FTR
184  F1 20/12/14   Paris SG           Montpellier    0    0   D
185  F1 20/12/14     Rennes                 Reims    1    3   A
186  F1 20/12/14   Toulouse              Guingamp    1    1   D
187  F1 21/12/14   Bordeaux                  Lyon    0    5   A
188  F1 21/12/14  Marseille                 Lille    2    1   H
189  F1 21/12/14 St Etienne Evian Thonon Gaillard    3    0   H

2 Statistiques De la saison

Nous allons manipuler les fonctions table et pie pour afficher les statistiques de la saison à la manière de l'équipe.fr.

  1. À titre d'exemple, voici un camembert indiquant le nombre de victoires à domicile, matchs nul, et victoires à l'extérieur pour l'ensemble de la saison.
    x <- table(df$FTR) 
    labs <- paste(c("Home", "Draw", "Away"), ":", x)
    pie(x, labels = labs, main = "Full Time Results")
    

    pie_FTR.jpg

  2. Tracer un camembert donnant les nombres x[i] de matchs terminant avec un total de i buts.
  3. Tracer un camembert donnant les nombres x[i] de matchs terminant avec une différence de i buts.
  4. Tracer un camembert avec les moyennes de buts à domicile et à l'extérieur par mi-temps
  5. Tracer un camembert avec les moyennes des cartons jaunes et rouges à domicile et à l'extérieur

3 Classement Ligue 1

3.1 Règlement

Le classement Ligue 1 est édité avec les règles qui suivent :

  • la victoire rapporte trois points ;
  • le match nul rapporte un point ;
  • la défaite ne rapporte pas de point.

En cas d'égalité, on utilise successivement (vous pouvez ignorer la règle 3) :

  1. la différence de buts ;
  2. le nombre de buts marqués ;
  3. la différence de buts "particulière" (c'est-à-dire en ne prenant en compte que les matches entre les équipes à égalité) ;
  4. le classement au Challenge du Fair-Play suivant ce barème à la fin d'une rencontre : 3 points par joueur exclu (déjà averti ou non), 1 point par joueur averti.

Nous allons calculer les classements suivants :

  1. Général
  2. Domicile
  3. Extérieur
  4. Fair-play

Essayez d'utiliser les fonctions table et aggregate. Par exemple, un appel de table vous aidera à calculer le nombre de points à domicile de chaque équipe grâce à l'arithmétique vectorielle.

head( table(df[,c("HomeTeam", "FTR")]), 3)
          FTR
HomeTeam   A D  H
  Bastia   4 7  8
  Bordeaux 2 5 12
  Caen     9 3  7

La fonction aggregate permet de calculer les différences de buts à l'extérieur. que l'on peut aussi écrire

head( aggregate(df$FTAG - df$FTHG, by = list(df$AwayTeam) , sum), 3 )

3.2 Calcul des points

Écrire une fonction GetScores(df, home) renvoyant une data.frame avec les scores à domicile (home=TRUE) où à l'extérieur (home=FALSE). Dans un second temps, vous pouvez aussi comptabiliser le nombre de cartons pour calculer simultanément le classement du Fair-play.

df.pts <- GetScores(df)
head(df.pts, 3)
    Equipe Pts  G N P CJ CR FP  p  c Diff
1   Bastia  31  8 7 4 43  2 49 24 18    6
2 Bordeaux  41 12 5 2 19  2 25 31 23    8
3     Caen  24  7 3 9 19  3 28 26 25    1

3.3 Classement des équipes

Utiliser les fonctions order et sort pour classer les équipes.

head( SortLeague(df.pts), n = 3)
      Equipe Pts  G N P CJ CR FP  p  c Diff
1   Paris SG  49 15 4 0 27  1 30 52 14   38
2       Lyon  45 14 3 2 34  1 37 40 11   29
3 St Etienne  41 12 5 2 33  0 33 32 11   21

3.4 Génération des classements

Écrire une fonction GetRankings(df) qui renvoie le classement général, à domicile, à l'extérieur et du Fair-play dans une liste.

df.rankings <- GetRankings(df)
lapply(df.rankings, head, n = 3L)
$general
    Equipe Pts  G  N P  p  c Diff
1 Paris SG  83 24 11 3 83 36   47
2     Lyon  75 22  9 7 72 33   39
3   Monaco  71 20 11 7 51 26   25

$home
      Equipe Pts  G N P  p  c Diff
1   Paris SG  49 15 4 0 52 14   38
2       Lyon  45 14 3 2 40 11   29
3 St Etienne  41 12 5 2 32 11   21

$away
    Equipe Pts  G N P  p  c Diff
1   Monaco  38 12 2 5 28 16   12
2 Paris SG  34  9 7 3 31 22    9
3     Lyon  30  8 6 5 32 22   10

$fairplay
       Equipe CJ CR Pts
1 Montpellier 51  1  54
2      Rennes 55  1  58
3     Lorient 54  2  60

3.5 Histogramme du classement

Écrire une fonction BarPlotGeneral qui trace un histogramme (barplot) indiquant le nombre de points à domicile et à l'extérieur des équipes classées de la première à la dernière.

BarPlotGeneral(df.rankings)

hist_general.jpg

3.6 Classement en relief

Écrire une fonction GetRelief(df.pts) qui renvoie une matrice permettant d'afficher le classement en relief.

head( GetRelief(df.rankings$general), n = 15)
   [,1]                             
83 "Paris SG (47)"                  
82 ""                               
81 ""                               
80 ""                               
79 ""                               
78 ""                               
77 ""                               
76 ""                               
75 "Lyon (39)"                      
74 ""                               
73 ""                               
72 ""                               
71 "Monaco (25)"                    
70 ""                               
69 "Marseille (34), St Etienne (21)"

3.7 Classement de la saison 2004/2005

Nous pouvons maintenant calculer les classements de n'importe quelle saison de L1 en quelques lignes de code sous réserve que le fichier d'entrée soit correct et que le règlement soit le même.

file.db <- file.path('TP11-TD11', 'F1_04_05.csv')
df.past <- read.csv.league(file.db)
df.past.general <- GetRankings(df.past)$general
res <- cbind( Rang = 1:nrow(df.past.general), df.past.general)
rbind(colnames(res), res)
Rang Equipe Pts G N P p c Diff
1 Lyon 79 22 13 3 56 22 34
2 Lille 67 18 13 7 52 29 23
3 Monaco 63 15 18 5 52 35 17
4 Rennes 55 15 10 13 49 42 7
5 Marseille 55 15 10 13 47 42 5
6 St Etienne 53 12 17 9 47 34 13
7 Lens 52 13 13 12 45 39 6
8 Auxerre 52 14 10 14 48 47 1
9 Paris SG 51 12 15 11 40 41 -1
10 Sochaux 50 13 11 14 42 41 1
11 Strasbourg 48 12 12 14 42 43 -1
12 Nice 46 10 16 12 38 45 -7
13 Toulouse 46 12 10 16 36 43 -7
14 Ajaccio 45 10 15 13 36 40 -4
15 Bordeaux 44 8 20 10 37 41 -4
16 Metz 44 10 14 14 33 45 -12
17 Nantes 43 10 13 15 33 38 -5
18 Caen 42 10 12 16 36 60 -24
19 Bastia 41 11 8 19 32 48 -16
20 Istres 32 6 14 18 25 51 -26

Created: 2017-08-02 mer. 12:08