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.