Comment normaliser les données dans R



Dans la plupart des cas, lorsque les gens parlent de « normaliser » les variables dans un ensemble de données, cela signifie qu’ils souhaitent mettre les valeurs à l’échelle de telle sorte que la variable ait une moyenne de 0 et un écart type de 1.

La raison la plus courante pour normaliser les variables est lorsque vous effectuez un type d’analyse multivariée (c’est-à-dire que vous souhaitez comprendre la relation entre plusieurs variables prédictives et une variable de réponse) et que vous souhaitez que chaque variable contribue de manière égale à l’analyse.

Lorsque les variables sont mesurées à différentes échelles, elles ne contribuent souvent pas de la même manière à l’analyse. Par exemple, si les valeurs d’une variable vont de 0 à 100 000 et les valeurs d’une autre variable de 0 à 100, la variable avec la plus grande plage se verra attribuer un poids plus important dans l’analyse.

Ceci est courant lorsqu’une variable mesure quelque chose comme le salaire (0 à 100 000 $) et qu’une autre variable mesure quelque chose comme l’âge (0 à 100 ans).

En normalisant les variables, nous pouvons être sûrs que chaque variable contribue de manière égale à l’analyse. Il existe deux façons courantes de normaliser (ou de « mettre à l’échelle ») les variables :

  • Normalisation Min-Max : (X – min(X)) / (max(X) – min(X))
  • Standardisation du score Z : (X – μ) / σ

Nous montrerons ensuite comment implémenter ces deux techniques dans R.

Comment normaliser (ou « mettre à l’échelle ») les variables dans R

Pour chacun des exemples suivants, nous utiliserons l’ iris de l’ensemble de données R intégré pour illustrer comment normaliser ou mettre à l’échelle des variables dans R :

#view first six rows of iris dataset
head(iris)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosa
#2          4.9         3.0          1.4         0.2  setosa
#3          4.7         3.2          1.3         0.2  setosa
#4          4.6         3.1          1.5         0.2  setosa
#5          5.0         3.6          1.4         0.2  setosa
#6          5.4         3.9          1.7         0.4  setosa

Normalisation Min-Max

La formule pour une normalisation min-max est :

(X – min(X))/(max(X) – min(X))

Pour chaque valeur d’une variable, nous trouvons simplement la distance entre cette valeur et la valeur minimale, puis nous divisons par la plage.

Pour implémenter cela dans R, nous pouvons définir une fonction simple, puis utiliser lapply pour appliquer cette fonction aux colonnes de l’ensemble de données iris que nous souhaitons :

#define Min-Max normalization function
min_max_norm <- function(x) {
    (x - min(x)) / (max(x) - min(x))
  }

#apply Min-Max normalization to first four columns in iris dataset
iris_norm <- as.data.frame(lapply(iris[1:4], min_max_norm))

#view first six rows of normalized iris dataset
head(iris_norm)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1   0.22222222   0.6250000   0.06779661  0.04166667
#2   0.16666667   0.4166667   0.06779661  0.04166667
#3   0.11111111   0.5000000   0.05084746  0.04166667
#4   0.08333333   0.4583333   0.08474576  0.04166667
#5   0.19444444   0.6666667   0.06779661  0.04166667
#6   0.30555556   0.7916667   0.11864407  0.12500000

Notez que chacune des colonnes a désormais des valeurs comprises entre 0 et 1. Notez également que la cinquième colonne « Espèce » a été supprimée de ce bloc de données. Nous pouvons facilement le rajouter en utilisant le code suivant :

#add back Species column
iris_norm$Species <- iris$Species

#view first six rows of iris_norm
head(iris_norm)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1   0.22222222   0.6250000   0.06779661  0.04166667  setosa
#2   0.16666667   0.4166667   0.06779661  0.04166667  setosa
#3   0.11111111   0.5000000   0.05084746  0.04166667  setosa
#4   0.08333333   0.4583333   0.08474576  0.04166667  setosa
#5   0.19444444   0.6666667   0.06779661  0.04166667  setosa
#6   0.30555556   0.7916667   0.11864407  0.12500000  setosa

Standardisation du score Z

L’inconvénient de la technique de normalisation min-max est qu’elle rapproche les valeurs des données de la moyenne. Si nous voulons nous assurer que les valeurs aberrantes sont plus pondérées que les autres valeurs, une standardisation du score z est une meilleure technique à mettre en œuvre.

La formule pour une standardisation du z-score est la suivante :

(X – μ) / σ

Pour chaque valeur d’une variable, nous soustrayons simplement la valeur moyenne de la variable, puis divisons par l’écart type de la variable.

Pour implémenter cela dans R, nous disposons de plusieurs options :

1. Standardisez une variable

Si nous voulons simplement standardiser une variable dans un ensemble de données, comme Sepal.Width dans l’ensemble de données iris , nous pouvons utiliser le code suivant :

#standardize Sepal.Width
iris$Sepal.Width <- (iris$Sepal.Width - mean(iris$Sepal.Width)) / sd(iris$Sepal.Width)

head(iris)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1  1.01560199          1.4         0.2  setosa
#2          4.9 -0.13153881          1.4         0.2  setosa
#3          4.7  0.32731751          1.3         0.2  setosa
#4          4.6  0.09788935          1.5         0.2  setosa
#5          5.0  1.24503015          1.4         0.2  setosa
#6          5.4  1.93331463          1.7         0.4  setosa

Les valeurs de Sepal.Width sont désormais mises à l’échelle de telle sorte que la moyenne soit de 0 et l’écart type soit de 1. Nous pouvons même le vérifier si nous le souhaitons :

#find mean of Sepal.Width
mean(iris$Sepal.Width)

#[1] 2.034094e-16 #basically zero

#find standard deviation of Sepal.Width
sd(iris$Sepal.Width)

#[1] 1

2. Standardisez plusieurs variables à l’aide de la fonction d’échelle

Pour normaliser plusieurs variables, on peut simplement utiliser la fonction d’échelle . Par exemple, le code suivant montre comment mettre à l’échelle les quatre premières colonnes de l’ensemble de données iris :

#standardize first four columns of iris dataset
iris_standardize <- as.data.frame(scale(iris[1:4]))

#view first six rows of standardized dataset
head(iris_standardize)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1   -0.8976739  1.01560199    -1.335752   -1.311052
#2   -1.1392005 -0.13153881    -1.335752   -1.311052
#3   -1.3807271  0.32731751    -1.392399   -1.311052
#4   -1.5014904  0.09788935    -1.279104   -1.311052
#5   -1.0184372  1.24503015    -1.335752   -1.311052
#6   -0.5353840  1.93331463    -1.165809   -1.048667

Notez que la fonction d’échelle , par défaut, tente de normaliser chaque colonne d’un bloc de données. Ainsi, nous obtiendrions une erreur si nous tentions d’utiliser scale(iris) car la colonne Espèce n’est pas numérique et ne peut pas être standardisée :

scale(iris)

#Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric

Cependant, il est possible de standardiser uniquement certaines variables dans un bloc de données tout en conservant toutes les autres variables identiques en utilisant le package dplyr . Par exemple, le code suivant standardise les variables Sepal.Width et Sepal.Length tout en conservant toutes les autres variables identiques :

#load dplyr package
library(dplyr)

#standardize Sepal.Width and Sepal.Length 
iris_new <- iris %>% mutate_each_(list(~scale(.) %>% as.vector),
                                  vars = c("Sepal.Width","Sepal.Length"))

#view first six rows of new data frame
head(iris_new)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1   -0.8976739  1.01560199          1.4         0.2  setosa
#2   -1.1392005 -0.13153881          1.4         0.2  setosa
#3   -1.3807271  0.32731751          1.3         0.2  setosa
#4   -1.5014904  0.09788935          1.5         0.2  setosa
#5   -1.0184372  1.24503015          1.4         0.2  setosa
#6   -0.5353840  1.93331463          1.7         0.4  setosa

Notez que Sepal.Length et Sepal.Width sont standardisés de telle sorte que les deux variables ont une moyenne de 0 et un écart type de 1, tandis que les trois autres variables du bloc de données restent inchangées.

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *