Data pre-processing avec R [Mode Zombie]

D
Formation Data SEO Labs

« Tu sais ce qui m’est arrivé ? Ils étaient des milliers… »
Nikolaï Belinski, mode Zombie de Call of Duty Black Ops

Dans tout projet Data SEO (analyse, machine learning, etc.), une étape INDISPENSABLE s’impose : la préparation des données.

Vous allez découvrir ici une liste de scripts R pour transformer et préparer vos jeux de données. Pour celles et ceux qui découvrent ce langage, n’hésitez pas à commencer par lire l’article « utiliser le langage R pour le SEO« .

Avant de plonger corps et âme dans le monde incroyablement sexy des « exterminateurs de données en décomposition », veuillez notez 2 choses : Premièrement, on peut arriver au même résultat avec un M16 et un AK47 ! Comprenez qu’il existe d’autres méthodes que celles que je vais vous présenter ici. Ensuite, sachez que vous n’aurez pas toujours besoin de TOUT faire, à vous donc de picorer cet article au besoin comme un corbeau mange un cadavre ambulant…

S’il avait pris le temps de se poser dans un coin et de sortir le Macbook Pro rangé à côté de son étui à fusil d’assaut automatique pour lancer R Studio, celui qui se dit « plus fort qu’une muraille » aurait probablement pu éviter de se faire croquer par un zombie et ainsi de mourir pour la 14ème fois.

zombies
En cas d’attaque de zombies, il est préférable d’avoir quelques bases de R

Comment ?

En utilisant ce qu’il a appris dans ses cours de machine learning pour créer un modèle de prédiction, évidemment. Pour re-commencer la partie sur de bonnes bases voici le conseil que je lui prodiguerais :

– Nikolaï, il te faut créer un jeu de données pour entrainer le modèle
– Que mettre dans mon jeu de données, ô Grand Rémi qui a déjà atteint la manche 44 à Kino der Toten ?
– Николай Белинский, le plus d’infos possible sur chaque zombie rencontré tu dois récupérer : âge estimé, poids estimé, taille estimée, nombre de membres restants, sexe, lieu de rencontre, armes, couleur des yeux, etc… et surtout s’il a tué quelqu’un (tu noteras 1 pour oui et 0 pour non). Cette variable (« Tué quelqu’un ») sera notre variable à prédire. Nous allons entrainer notre modèle à détecter ce qui rend le zombie particulièrement menaçant et à chaque fois que tu rencontreras un nouveau zombie, tu seras capable de prédire le risque qu’il te tue ou non.
– ♫ On boit de la Vodka ce soir ♫ !

Compte tenu des conditions dans lesquelles les données vont être récupérées par Nikolaï (attaque de zombies), le dataset comportera probablement quelques soucis : erreur encodage. cellules vides, données de grandeur différentes, etc.

Le « dataset imparfait » est monnaie courante dans la plupart (la totalité ?) des projets data science, et il n y a vraiment pas besoin de travailler sur des prédictions d’attaques de zombies pour s’en rendre compte.

Une fois le « dataset » constitué, une phase de « data pre-processing » s’impose donc systématiquement. Cette préparation des données est indispensable pour tirer le meilleur des algorithmes de machine learning.

Importer les données

#Ouvrir le dataset
dataset <- read.csv('my_dataset.csv',na.strings=c(""))

#Connaitre le nombre de valeurs différentes dans chaque colonnes
sapply(dataset, function(x) length(unique(x)))

Nous avons ici utilisé le paramètre na.strings qui nous permet de transformer les valeurs manquantes en NA (pour « Not Available »). Cela sera très utile pour la suite.

Gérer les valeurs manquantes (NA)

La plupart des « vrais » datasets que vous serez amené à utiliser comportent des cellules vides, des données manquantes ou corrompues et c’est précisément de ces données dont nous allons nous occuper maintenant.

Commençons par regarder le volume de données manquantes. Pour cela nous allons utiliser la fonction sapply qui permet d’appliquer la fonction sum() à chaque colonne du dataset.

#Compter le nombre de valeurs manquantes dans chacune des colonnes
sapply(dataset,function(x) sum(is.na(x)))

#Compter le nombre de NA dans une colonne en particulier
sum(is.na(dataset$colonne))

Afficher les lignes dont la valeur dans la colonne "colonne" est NA
dataset[is.na(dataset$colonne),]

Voici une astuce pour obtenir une visualisation de la proportion de valeurs manquantes de chaque colonne.
Nous utilisons le package R « Amelia ».

#Afficher un graph avec les valeurs manquantes vs les valeurs observées
library(Amelia)
missmap(dataset, main = "Missing values vs observed")
missing values r na
Utilisation du package R Amelia pour afficher les valeurs manquantes vs les valeurs observées

Passons maintenant à la gestion des données manquantes (à la main !).

Vous avez repéré qu’une colonne avait un taux élevé de valeurs manquantes ? Voici 2 options possibles pour y faire face :

#Option 1. Supprimer la colonne de votre dataset
dataset$Colonne <- NULL

#Option 2. Supprimer les lignes dont la valeur de cette colonne est NA
dataset_2 <- subset(dataset,
               !is.na(dataset$colonne))

Vous avez repéré qu'une colonne avait quelques valeurs manquantes mais vous souhaitez l'utiliser quand même ?
L'une des solutions parmi les plus utilisées est de remplacer les valeurs vides par la moyenne ou la médiane de la colonne.

#Remplacer les valeurs manquantes par la moyenne de la colonne
dataset$Colonne[is.na(dataset$Colonne)] <- mean(dataset$Colonne,na.rm=T)

#Remplacer les valeurs manquantes par la médiane de la colonne
dataset$Colonne[is.na(dataset$Colonne)] <- median(dataset$Colonne,na.rm=T)

#Méthode plus fine : remplacer les valeurs manquantes par la médiane des lignes similaires
dataset_filtered <- filter(dataset, dataset$classe==3 & dataset$embarquement=="Southampton")
my_median <- median(dataset_filtered$prix,na.rm = T)
full[is.na(dataset$prix) & dataset$classe==3 & dataset$embarquement=="Southampton" ,"prix"] <- my_median

Cette dernière méthode est celle que j'utilise le plus. C'est celle que j'ai par exemple utilisé pour remplacer le valeur manquante dans la colonne "prix" (Fare) sur la ligne du passager 1044 du dataset titanic, un exemple d'exercice de machine learning bien connu du site Kaggle que je vous invite à tester.

Enlever les caractères spéciaux dans les variables numériques

De nombreux jeux de données sur lesquels vous serez amenés à travailler peuvent comporter des variables avec des caractères spéciaux. C'est souvent le cas sur des colonnes de données financières (salaires, chiffre d'affaire, etc). L'intérêt est d'enlever tous les caractères spéciaux pour faciliter les calculs sur ces données.
Pour cela nous utilisons la fonction gsub() qui permet de remplacer des caractères.

#Passer de $8,684 à 8684
gsub(",","",dataset$colonne)
gsub("\\$","",dataset$colonne)

Transformer une variable catégorique en Factor

Si votre dataset comporte des variables catégoriques, elles doivent être encodées en factor.

#Vérifier qu'une variable catégorique est encodée en Factor
is.factor(dataset$Colonne)

#Si la réponse est FALSE, il faut l'encoder vous-même :
dataset$Colonne <- factor(dataset$Colonne, levels = c(0, 1))

#Encoder plusieurs variables en factor d'un coup
factor_vars <- c('colonneA','colonneB','colonneC','colonneD')

dataset[factor_vars] <- lapply(dataset[factor_vars], function(x) as.factor(x))

Encoder une variable catégorique avec le One Hot Encoder

Le One hot encoding est une représentation binaire d'une variable catégorique.
Imaginez par exemple que votre dataset comporte une variable (= une colonne) $Gender avec pour valeur "Men" ou "Female".
Le one hot encoding va transformer cette colonne en plusieurs colonnes correspondant chacune à l'un des 2 genres pré-cités, et ayant pour valeur des 0 et des 1.

Le one hot encoding avec r

Voici le code pour faire du one hot encoding avec R :

#On crée un nouvelle colonne pour chaque valeur de la variable catégorique
for(unique_value in unique(dataset$Gender)){
  dataset[paste("Gender", unique_value, sep = ".")] <- ifelse(dataset$Gender == unique_value, 1, 0)
}

#Ne pas oublier de supprimer une colonne générée par le One Hot Encoding
dataset$Gender.Male <- NULL

 

Features scaling

Avec le "features scaling" (= mise à l'échelle des variables) nous allons mettre les différentes variables sur le même ordre de grandeur pour améliorer les performances du modèle.

La fonction scale() de R
#Mettre les colonnes 1 et 2 à la même échelle
dataset[,1:2] = scale(dataset[,1:2])

J'espère que ce nouvel article sur R vous a plu ! Encore une fois j'insiste sur le fait que ce n'est pas nécessairement une recette à suivre mais plus une liste d'actions possibles pour préparer vos jeux de données.

Je mettrai l'article à jour de temps en temps avec de nouveaux scripts R pour le data pre-processing. Pour être au courant des prochaines mise à jour, n'hésitez pas à me suivre sur Twitter !

A propos de l'auteur

Rémi Bacha

Passionné de SEO et Data Science. Cofondateur des formations Data SEO Labs.

Ajouter un commentaire

Articles récents

Rémi Bacha

Passionné de SEO et Data Science. Cofondateur des formations Data SEO Labs.

Restons en contact

RDV sur les réseaux sociaux pour discuter et être informé de mes prochains articles :