R'deki veriler nasıl normalleştirilir
Çoğu durumda, insanlar bir veri kümesindeki değişkenleri “normalleştirmekten” bahsettiklerinde, değişkenin ortalaması 0 ve standart sapması 1 olacak şekilde değerleri ölçeklendirmek istediklerini kastediyorlar.
Değişkenleri standartlaştırmanın en yaygın nedeni, bir tür çok değişkenli analiz gerçekleştirmenizdir (yani, birden fazla yordayıcı değişken ile bir yanıt değişkeni arasındaki ilişkiyi anlamak istemeniz) ve her değişkenin analize eşit şekilde katkıda bulunmasını istemenizdir.
Değişkenler farklı ölçeklerde ölçüldüğünde çoğu zaman analize eşit katkı sağlamazlar. Örneğin bir değişkenin değerleri 0 ile 100.000 arasında değişiyorsa ve başka bir değişkenin değerleri 0 ile 100 arasında değişiyorsa, aralığı daha büyük olan değişkene analizde daha fazla ağırlık verilecektir.
Bu, bir değişkenin maaş gibi bir şeyi (0 ila 100.000 ABD Doları) ölçtüğü ve başka bir değişkenin yaş (0 ila 100 yaş) gibi bir şeyi ölçtüğü durumlarda yaygındır.
Değişkenleri standartlaştırarak her değişkenin analize eşit katkıda bulunduğundan emin olabiliriz. Değişkenleri normalleştirmenin (veya “ölçeklendirmenin”) iki yaygın yolu vardır:
- Min-Maks normalizasyonu: (X – min(X)) / (max(X) – min(X))
- Z puanının standardizasyonu: (X – μ) / σ
Daha sonra bu iki tekniğin R’de nasıl uygulanacağını göstereceğiz.
R’de değişkenler nasıl normalleştirilir (veya “ölçeklenir”)
Aşağıdaki örneklerin her biri için, R’deki değişkenlerin nasıl normalleştirileceğini veya ölçeklendirileceğini göstermek için yerleşik R veri kümesi irisini kullanacağız:
#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-Maks Normalleştirme
Min-max normalizasyonunun formülü şöyledir:
(X – min(X))/(maks(X) – min(X))
Bir değişkenin her değeri için, o değer ile minimum değer arasındaki mesafeyi bulup aralığa böleriz.
Bunu R’de uygulamak için basit bir fonksiyon tanımlayabilir ve ardından bu fonksiyonu istediğimiz iris veri kümesindeki sütunlara uygulamak için laply’yi kullanabiliriz:
#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
Sütunların her birinin artık 0 ile 1 arasında değerlere sahip olduğunu unutmayın. Ayrıca beşinci sütun “Türler”in bu veri çerçevesinden kaldırıldığını da unutmayın. Aşağıdaki kodu kullanarak kolayca ekleyebiliriz:
#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
Z puanı standardizasyonu
Min-max normalizasyon tekniğinin dezavantajı veri değerlerini ortalamaya yaklaştırmasıdır. Aykırı değerlerin diğer değerlerden daha fazla ağırlıklandırılmasını sağlamak istiyorsak, z-puanı standardizasyonunun uygulanması daha iyi bir tekniktir.
Z-puanını standartlaştırma formülü aşağıdaki gibidir:
(X – μ) / σ
Bir değişkenin her bir değeri için, değişkenin ortalama değerini çıkarırız ve ardından değişkenin standart sapmasına böleriz.
Bunu R’de uygulamak için birkaç seçeneğimiz var:
1. Bir değişkeni standartlaştırın
İris veri kümesindeki Sepal.Width gibi bir veri kümesindeki bir değişkeni standartlaştırmak istiyorsak aşağıdaki kodu kullanabiliriz:
#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
Sepal.Width değerleri artık ortalama 0 ve standart sapma 1 olacak şekilde ölçeklendirilmiştir. Hatta istersek bunu kontrol edebiliriz:
#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. Ölçek fonksiyonunu kullanarak birden fazla değişkeni standartlaştırın
Birden fazla değişkeni normalleştirmek için ölçek fonksiyonu basitçe kullanılabilir. Örneğin, aşağıdaki kod iris veri kümesinin ilk dört sütununun nasıl ölçeklendirileceğini gösterir:
#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
Ölçek fonksiyonunun varsayılan olarak bir veri çerçevesindeki her sütunu normalleştirmeye çalıştığını unutmayın. Dolayısıyla, Türler sütunu sayısal olmadığı ve standartlaştırılamadığı için ölçek(iris) kullanmayı denediğimizde bir hata alırız:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
Ancak dplyr paketini kullanarak bir veri çerçevesindeki yalnızca belirli değişkenleri standartlaştırırken diğer tüm değişkenleri aynı tutmak mümkündür. Örneğin, aşağıdaki kod Sepal.Width ve Sepal.Length değişkenlerini standartlaştırırken diğer tüm değişkenleri aynı tutar:
#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
Sepal.Length ve Sepal.Width’in , her iki değişkenin de ortalaması 0 ve standart sapması 1 olacak şekilde standartlaştırıldığını, veri çerçevesindeki diğer üç değişkenin ise değişmediğini unutmayın.