Hoe gegevens in r te normaliseren
Als mensen het hebben over het ‘normaliseren’ van de variabelen in een dataset, bedoelen ze in de meeste gevallen dat ze de waarden zo willen schalen dat de variabele een gemiddelde van 0 heeft en een standaardafwijking van 1.
De meest voorkomende reden om variabelen te standaardiseren is wanneer u een soort multivariate analyse uitvoert (dat wil zeggen, u wilt inzicht krijgen in de relatie tussen meerdere voorspellende variabelen en een responsvariabele) en u wilt dat elke variabele in gelijke mate bijdraagt aan de analyse.
Wanneer variabelen op verschillende schalen worden gemeten, dragen ze vaak niet in gelijke mate bij aan de analyse. Als de waarden van de ene variabele bijvoorbeeld variëren van 0 tot 100.000 en de waarden van een andere variabele van 0 tot 100, krijgt de variabele met het grootste bereik een groter gewicht in de analyse.
Dit is gebruikelijk wanneer de ene variabele iets meet als salaris (€0 tot €100.000) en een andere variabele iets als leeftijd meet (0 tot 100 jaar oud).
Door de variabelen te standaardiseren, kunnen we er zeker van zijn dat elke variabele in gelijke mate bijdraagt aan de analyse. Er zijn twee veelgebruikte manieren om variabelen te normaliseren (of te ’schalen‘):
- Min-Max-normalisatie: (X – min(X)) / (max(X) – min(X))
- Standaardisatie van de Z-score: (X – μ) / σ
Vervolgens laten we zien hoe deze twee technieken in R kunnen worden geïmplementeerd.
Hoe variabelen in R te normaliseren (of te „schalen“)
Voor elk van de volgende voorbeelden zullen we de ingebouwde R-dataset -iris gebruiken om te illustreren hoe variabelen in R kunnen worden genormaliseerd of geschaald:
#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
Min-Max-normalisatie
De formule voor min-max-normalisatie is:
(X – min(X))/(max(X) – min(X))
Voor elke waarde van een variabele vinden we eenvoudigweg de afstand tussen die waarde en de minimumwaarde en delen we deze vervolgens door het bereik.
Om dit in R te implementeren, kunnen we een eenvoudige functie definiëren en vervolgens Laply gebruiken om die functie toe te passen op de kolommen in de irisgegevensset die we willen:
#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
Merk op dat elk van de kolommen nu waarden tussen 0 en 1 heeft. Merk ook op dat de vijfde kolom „Species“ uit dit dataframe is verwijderd. We kunnen het eenvoudig toevoegen met behulp van de volgende code:
#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
Standaardisatie van de Z-score
Het nadeel van de min-max-normalisatietechniek is dat deze de gegevenswaarden dichter bij het gemiddelde brengt. Als we ervoor willen zorgen dat uitschieters zwaarder wegen dan andere waarden, is een z-score-standaardisatie een betere techniek om te implementeren.
De formule voor het standaardiseren van de z-score is als volgt:
(X – μ) / σ
Voor elke waarde van een variabele trekken we eenvoudigweg de gemiddelde waarde van de variabele af en delen we deze door de standaardafwijking van de variabele.
Om dit in R te implementeren, hebben we verschillende opties:
1. Standaardiseer een variabele
Als we eenvoudigweg een variabele in een dataset willen standaardiseren, zoals Sepal.Width in de irisdataset , kunnen we de volgende code gebruiken:
#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
De Sepal.Width -waarden zijn nu zo geschaald dat het gemiddelde 0 is en de standaarddeviatie 1. We kunnen dit zelfs controleren als we willen:
#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. Standaardiseer meerdere variabelen met behulp van de schaalfunctie
Om meerdere variabelen te normaliseren, kan men eenvoudigweg de schaalfunctie gebruiken. De volgende code laat bijvoorbeeld zien hoe u de eerste vier kolommen van de irisgegevensset kunt schalen:
#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
Houd er rekening mee dat de schaalfunctie standaard probeert elke kolom in een dataframe te normaliseren. We krijgen dus een foutmelding als we scale(iris) proberen te gebruiken, omdat de kolom Species niet numeriek is en niet kan worden gestandaardiseerd:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
Het is echter mogelijk om alleen bepaalde variabelen in een dataframe te standaardiseren terwijl alle andere variabelen hetzelfde blijven met behulp van het dplyr- pakket. De volgende code standaardiseert bijvoorbeeld de variabelen Sepal.Width en Sepal.Length , terwijl alle andere variabelen hetzelfde blijven:
#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
Merk op dat Sepal.Length en Sepal.Width zodanig zijn gestandaardiseerd dat beide variabelen een gemiddelde van 0 en een standaarddeviatie van 1 hebben, terwijl de andere drie variabelen in het gegevensframe ongewijzigd blijven.