Jak normalizować dane w r
W większości przypadków, gdy ludzie mówią o „normalizowaniu” zmiennych w zbiorze danych, mają na myśli, że chcą skalować wartości w taki sposób, aby zmienna miała średnią 0 i odchylenie standardowe od 1.
Najczęstszym powodem standaryzacji zmiennych jest sytuacja, gdy przeprowadzasz pewnego rodzaju analizę wielowymiarową (tj. chcesz zrozumieć związek między wieloma zmiennymi predykcyjnymi a zmienną odpowiedzi) i chcesz, aby każda zmienna w równym stopniu przyczyniała się do analizy.
Kiedy zmienne są mierzone w różnych skalach, często nie wnoszą one jednakowego wkładu do analizy. Przykładowo, jeśli wartości jednej zmiennej mieszczą się w przedziale od 0 do 100 000, a wartości innej zmiennej mieszczą się w przedziale od 0 do 100, to zmienna o większym zakresie będzie miała w analizie większą wagę.
Dzieje się tak często, gdy jedna zmienna mierzy coś w rodzaju wynagrodzenia (od 0 do 100 000 dolarów), a inna zmienna mierzy coś w rodzaju wieku (od 0 do 100 lat).
Standaryzując zmienne, możemy mieć pewność, że każda zmienna w równym stopniu przyczynia się do analizy. Istnieją dwa typowe sposoby normalizacji (lub „skalowania”) zmiennych:
- Normalizacja Min-Max: (X – min(X)) / (max(X) – min(X))
- Standaryzacja wyniku Z: (X – μ) / σ
Następnie pokażemy, jak wdrożyć te dwie techniki w R.
Jak normalizować (lub „skalować”) zmienne w R
W każdym z poniższych przykładów użyjemy wbudowanej tęczówki zestawu danych R, aby zilustrować, jak normalizować lub skalować zmienne w 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
Normalizacja min.-maks
Wzór na normalizację min-max to:
(X – min(X))/(max(X) – min(X))
Dla każdej wartości zmiennej po prostu znajdujemy odległość między tą wartością a wartością minimalną, a następnie dzielimy przez zakres.
Aby zaimplementować to w R, możemy zdefiniować prostą funkcję, a następnie użyć laply , aby zastosować tę funkcję do kolumn w żądanym zestawie danych iris :
#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
Zauważ, że każda z kolumn ma teraz wartości od 0 do 1. Należy również pamiętać, że piąta kolumna „Gatunek” została usunięta z tej ramki danych. Możemy go łatwo dodać za pomocą następującego kodu:
#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
Standaryzacja wyniku Z
Wadą techniki normalizacji min-max jest to, że przesuwa ona wartości danych bliżej średniej. Jeśli chcemy mieć pewność, że wartości odstające będą miały większą wagę niż inne wartości, lepszą techniką do wdrożenia jest standaryzacja wyniku Z.
Wzór na standaryzację wyniku Z jest następujący:
(X – μ) / σ
Dla każdej wartości zmiennej po prostu odejmujemy średnią wartość zmiennej, a następnie dzielimy przez odchylenie standardowe zmiennej.
Aby zaimplementować to w R, mamy kilka opcji:
1. Standaryzuj zmienną
Jeśli chcemy po prostu ujednolicić zmienną w zbiorze danych, np. Sepal.Width w zbiorze danych tęczówki , możemy użyć następującego kodu:
#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
Wartości Sepal.Width są teraz skalowane w taki sposób, że średnia wynosi 0, a odchylenie standardowe wynosi 1. Możemy to nawet sprawdzić, jeśli chcemy:
#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. Standaryzuj wiele zmiennych za pomocą funkcji skali
Aby znormalizować wiele zmiennych, można po prostu użyć funkcji skali . Na przykład poniższy kod pokazuje, jak skalować pierwsze cztery kolumny zbioru danych tęczówki :
#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
Należy zauważyć, że funkcja skali domyślnie próbuje znormalizować każdą kolumnę w ramce danych. Zatem przy próbie użycia funkcji skala(irys) otrzymalibyśmy błąd, ponieważ kolumna Gatunki nie jest liczbowa i nie można jej ujednolicić:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
Jednak przy użyciu pakietu dplyr możliwa jest standaryzacja tylko niektórych zmiennych w ramce danych, przy jednoczesnym zachowaniu wszystkich pozostałych zmiennych bez zmian. Na przykład poniższy kod standaryzuje zmienne Sepal.Width i Sepal.Length , zachowując jednocześnie wszystkie pozostałe zmienne:
#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
Należy zauważyć, że Sepal.Length i Sepal.Width są standaryzowane w taki sposób, że obie zmienne mają średnią 0 i odchylenie standardowe 1, podczas gdy pozostałe trzy zmienne w ramce danych pozostają niezmienione.