Come normalizzare i dati in r


Nella maggior parte dei casi, quando le persone parlano di “normalizzare” le variabili in un set di dati, intendono dire che vogliono scalare i valori in modo tale che la variabile abbia una media pari a 0 e una deviazione standard da 1.

Il motivo più comune per standardizzare le variabili è quando si esegue un tipo di analisi multivariata (ovvero si desidera comprendere la relazione tra più variabili predittive e una variabile di risposta) e si desidera che ciascuna variabile contribuisca equamente all’analisi.

Quando le variabili vengono misurate su scale diverse, spesso non contribuiscono equamente all’analisi. Ad esempio, se i valori di una variabile vanno da 0 a 100.000 e i valori di un’altra variabile vanno da 0 a 100, alla variabile con l’intervallo maggiore verrà assegnato un peso maggiore nell’analisi.

Ciò è comune quando una variabile misura qualcosa come lo stipendio (da $ 0 a $ 100.000) e un’altra variabile misura qualcosa come l’età (da 0 a 100 anni).

Standardizzando le variabili, possiamo essere sicuri che ciascuna variabile contribuisca equamente all’analisi. Esistono due modi comuni per normalizzare (o “ridimensionare”) le variabili:

  • Normalizzazione Min-Max: (X – min(X)) / (max(X) – min(X))
  • Standardizzazione del punteggio Z: (X – μ) / σ

Mostreremo quindi come implementare queste due tecniche in R.

Come normalizzare (o “scalare”) le variabili in R

Per ciascuno dei seguenti esempi, utilizzeremo il set di dati R integrato iris per illustrare come normalizzare o ridimensionare le variabili in 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

Normalizzazione Min-Max

La formula per la normalizzazione min-max è:

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

Per ciascun valore di una variabile, troviamo semplicemente la distanza tra quel valore e il valore minimo, quindi dividiamo per l’intervallo.

Per implementarlo in R, possiamo definire una semplice funzione e quindi utilizzare laply per applicare tale funzione alle colonne nel set di dati iris che desideriamo:

 #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

Nota che ciascuna delle colonne ora ha valori compresi tra 0 e 1. Tieni inoltre presente che la quinta colonna “Specie” è stata rimossa da questo frame di dati. Possiamo aggiungerlo facilmente utilizzando il seguente codice:

 #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

Standardizzazione del punteggio Z

Lo svantaggio della tecnica di normalizzazione min-max è che avvicina i valori dei dati alla media. Se vogliamo garantire che i valori anomali siano ponderati più degli altri valori, la standardizzazione del punteggio z è una tecnica migliore da implementare.

La formula per standardizzare lo z-score è la seguente:

(X – μ) / σ

Per ogni valore di una variabile, sottraiamo semplicemente il valore medio della variabile e poi dividiamo per la deviazione standard della variabile.

Per implementarlo in R, abbiamo diverse opzioni:

1. Standardizzare una variabile

Se vogliamo semplicemente standardizzare una variabile in un set di dati, come Sepal.Width nel set di dati iris , possiamo utilizzare il seguente codice:

 #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

I valori Sepal.Width sono ora scalati in modo tale che la media sia 0 e la deviazione standard sia 1. Possiamo anche verificarlo se vogliamo:

 #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. Standardizzare più variabili utilizzando la funzione di scala

Per normalizzare più variabili è sufficiente utilizzare la funzione di scala . Ad esempio, il codice seguente mostra come ridimensionare le prime quattro colonne del set di dati 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

Si noti che la funzione di scala , per impostazione predefinita, tenta di normalizzare ciascuna colonna in un frame di dati. Pertanto, riceveremmo un errore se provassimo a utilizzare scale(iris) perché la colonna Specie non è numerica e non può essere standardizzata:

 scale(iris)

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

Tuttavia, è possibile standardizzare solo alcune variabili in un frame di dati mantenendo tutte le altre variabili uguali utilizzando il pacchetto dplyr . Ad esempio, il codice seguente standardizza le variabili Sepal.Width e Sepal.Length mantenendo invariate tutte le altre variabili:

 #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

Si noti che Sepal.Length e Sepal.Width sono standardizzati in modo tale che entrambe le variabili abbiano una media pari a 0 e una deviazione standard pari a 1, mentre le altre tre variabili nel frame dati rimangono invariate.

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *