Découverte du langage R

Tags :
  • MON
  • 2023-2024
  • temps 3
Auteurs :
  • Nicolas Ouzoulias

Mon 5ème MON pour découvrir et apprendre à manipuler le langage R

Objectifs

A travers ce MON je vais m'initier au langage R pour l'analyse de données. Pour cela je vais tout d'abord voir la théorie à travers des cours en ligne pour ensuite l'appliquer à un exemple précis afin de manipuler moi même.

Initiation théorique à R

R est un langage informatique orienté objet et interprété principalement conçu pour le traitement et l'analyse de données. Son utilisation peut également être plus poussée et permettre de réaliser du machin learning.

Le langage est associé à un IDE (Integrated Development Environment) : RStudio pour faciliter son utilisation.

Syntaxe

Pour stocker une variable on utilise le symbole <- :

x <- 1000

La manipulation mathématique d'une variable se fait ensuite traditionnellement comme en python :

x <- x + 5
y <- x*3
z <- sqrt(y)

Il est également possible de créer des fonctions :

calculer_moyenne <- function(liste) {
  somme <- sum(liste)
  nombre_elements <- length(liste)
  moyenne <- somme / nombre_elements
  return(moyenne)
}

moyenne_resultat <- calculer_moyenne(c(4, 7, 9, 12, 5))
print(moyenne_resultat)

Une autre façon d'écrire les opérations existe avec l'opérateur |> :

12 |> log(base = 10) |> sqrt() |> exp()
# = exp(sqrt(log(12, base = 10)))

Les vecteurs et matrices

Une liste, ou vecteur, s'écrit à l'aide de la fonction c() :

noms <- c("Benjamin", "Daniel", "Emma", "Romuald", "Tom", "Bastien", "Alice", "Martin", "Léa", "Dimitri")

Des opérations peuvent être effectuées directement sur les vecteurs (concaténation, opérations mathématiques, conversion, comparaison,...)

Par prolongement on peut utiliser des matrices avec la syntaxe suivante :

# Création d'une matrice
matrice_exemple <- matrix(c(10, 20, 30, 40, 50, 60), nrow = 3, ncol = 2, byrow = TRUE)
     [,1] [,2]
[1,]   10   20
[2,]   30   40
[3,]   50   60

Organisation d'un projet

Les projets d'analyse de données reposent sur plusieurs documents :

On structure donc un projet sous forme de Working directory. Cela permet de communiquer avec d'autres fichiers plus facilement sans avoir à préciser les emplacements complets de ces derniers. De plus cela permet de lier un projet R avec Github plus facilement car il ne va pas dépendre de l'ordinateur utilisé.

structuration projet

from https://openclassrooms.com/fr/courses/8248096-initiez-vous-a-r-pour-lanalyse-de-donnees/8309117-creez-votre-premier-projet-dans-r

Utilisation d'un fichier externe

Le plus important pour traiter des données est de pouvoir les extraire et les analyser à partir d'un fichier externe. Pour cela il faut tout d'abord importer

CSV

On utilise la fonction read.csv() :

table <- read.csv("table.csv", sep = ";") 
#ou
table <- read.csv2("table.csv") 
# .csv2 utilise par défaut un séparateur ";"

Excel

Pour un fichier qui n'est pas texte il faut tout d'abord importer le type de fichier, par exemple ici readxl :

library(readxl)

salaire <- read_excel("data_raw/salaire.xlsx", sheet = "T1", range="B10:F352", col_names = c("SSOC 2020",	"Occupation",	"Number Covered",	"Basic  Wage", "Gross  Wage"
))

Ici on rentre plus de paramètres :

Une fois la table importée on lit et on modifie les données avec :

table[65, 1] <- 65
table[65, "tri"] <- 65
table$tri[65] <- 65

Ici les trois écritures permettent d'écrire la valeur 65 à la ligne 65 de la colonne 1 dont le titre est "tri". Le $ permet de descendre d’un niveau et les tableaux sont traités comme des assemblages de colonnes.

De la même manière, on peut sélectionner toutes les lignes de plusieurs colonnes en ne mettant rien avant la virgule, et les colonnes d’intérêt listées après.

# avec le nom des colonnes
mixite_groupe_edf_fr <- mixite_groupe_edf[, c("tri", "annee", "perimetre_juridique", "perimetre_spatial", "indicateur", "valeur_de_l_indicateur", "unite", "methode_de_consolidation")]

# ou la position des colonnes
mixite_groupe_edf_fr <- mixite_groupe_edf[, c(1:3, 5, 7, 9, 10, 12)]

Les graphiques

Il est possible de créer un très grand nombre de graphes différents grâce à R :

Application

A travers les cours j'ai suivi des petits exemples et exercice mais j'ai voulu appliquer la théorie à un autre groupe de données pour manipuler moi même. J'ai donc choisi de travailler sur un sujet que j'apprécie particulièrement : l'esport de League of Legends et plus particulièrement le plus grand joueur au monde Faker.

J'ai ainsi trouvé en ligne une data base csv qui regroupait toutes les parties professionnelles qui ont été jouées depuis 2014 à travers les ligues et tournois principaux.

projet data LoL

Il y avait un data frame par an, je les ai donc tous importés puis filtrés pour ne garder que les parties du joueur qui m'intéresse avant de concaténer les data frames filtrées en un seul.

A partir de là j'ai pu manipuler les data et afficher moi-même diverses statistiques comme le taux de victoire, l'avantage en or, ...

Je met ici quelques exemples sans trop m'attarder dans les détails et les explications.

Kill par an

#Calcul kill par an 
kill_year <- aggregate(kills ~ year, data = tableFaker10ans, sum)

#Création graphique à barres
barplot(kill_year$kills, names.arg = kill_year$year, 
        col = "skyblue", main = "Nombre de kills de Faker par an", 
        xlab = "Année", ylab = "Kills")

kill par an

K/D/A global et par champion

K/D/A = kill/deats/assists (les statistiques principales d'une joueur dans une partie)

Global

taux_victoire <- mean(tableFaker10ans$result)
KDA <- (sum(tableFaker10ans$kills) + sum(tableFaker10ans$assists))/(sum(tableFaker10ans$deaths))
sprintf("%.2f%%", taux_victoire * 100)
  [1] "66.75%"

print(KDA)
  [1] 4.17038

Par champion (joués minimum 10 fois)

library(dplyr)

# Nombre de parties jouées par champion
games_champion <- tableFaker10ans %>%
  group_by(champion) %>%
  summarize(parties_jouees = n())

# Champions joués 10 fois ou plus
champion_10plus <- games_champion %>%
  filter(parties_jouees >= 10)

# Taux de victoire pour chaque champion
winrate_champion <- tableFaker10ans %>%
  filter(champion %in% champion_10plus$champion) %>%
  group_by(champion) %>%
  summarize(winrate = mean(result))

# Affichage top 3
top_3_champions <- winrate_champion %>%
  arrange(desc(winrate)) %>%
  head(3)

top_3_champions <- merge(top_3_champions, games_champion, by = "champion", all.x = TRUE)%>%
  arrange(desc(winrate))

print(top_3_champions)

resultat print top_3_champions

Conclusion

R est un très bon outil pour l'analyse de data en très grand nombre, pour l'appication aux matchs compétitifs de League of Legends les data en csv s'étendaient sur des dizaines de milliers de lignes et pourtant les calculs et l'affichage de résultats se sont fait très rapidement.

La prise en main est également assez facile si on a déjà des bases en python car je trouve que les langages se ressemblent beaucoup.

Sources

Cours théoriques suivis :

Data LoL :