Cara menormalkan data di r
Dalam kebanyakan kasus, ketika orang berbicara tentang “menormalkan” variabel dalam kumpulan data, yang mereka maksud adalah mereka ingin menskalakan nilai sedemikian rupa sehingga variabel tersebut memiliki rata-rata 0 dan deviasi standar dari 1.
Alasan paling umum untuk melakukan standarisasi variabel adalah ketika Anda melakukan beberapa jenis analisis multivariat (yaitu, Anda ingin memahami hubungan antara beberapa variabel prediktor dan variabel respons) dan Anda ingin setiap variabel memberikan kontribusi yang sama terhadap analisis.
Ketika variabel diukur pada skala yang berbeda, seringkali variabel tersebut tidak memberikan kontribusi yang sama terhadap analisis. Misalnya, jika nilai suatu variabel berkisar antara 0 hingga 100.000 dan nilai variabel lain berkisar antara 0 hingga 100, maka variabel dengan rentang yang lebih besar akan diberi bobot yang lebih besar dalam analisis.
Hal ini biasa terjadi ketika satu variabel mengukur sesuatu seperti gaji ($0 hingga $100.000) dan variabel lain mengukur sesuatu seperti usia (0 hingga 100 tahun).
Dengan melakukan standarisasi variabel, kita dapat yakin bahwa setiap variabel memberikan kontribusi yang sama terhadap analisis. Ada dua cara umum untuk menormalkan (atau “menskalakan”) variabel:
- Normalisasi Min-Maks: (X – min(X)) / (maks(X) – min(X))
- Standarisasi skor Z: (X – μ) / σ
Kami kemudian akan menunjukkan bagaimana menerapkan kedua teknik ini di R.
Cara menormalkan (atau “menskalakan”) variabel di R
Untuk setiap contoh berikut, kita akan menggunakan iris dataset R bawaan untuk mengilustrasikan cara menormalkan atau menskalakan variabel di 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
Normalisasi Min-Maks
Rumus normalisasi min-max adalah:
(X – min(X))/(maks(X) – min(X))
Untuk setiap nilai suatu variabel, kita cukup mencari jarak antara nilai tersebut dengan nilai minimum, lalu membaginya dengan rentangnya.
Untuk mengimplementasikan hal ini di R, kita dapat mendefinisikan fungsi sederhana dan kemudian menggunakan laply untuk menerapkan fungsi tersebut ke kolom dalam kumpulan data iris yang kita inginkan:
#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
Perhatikan bahwa setiap kolom sekarang memiliki nilai antara 0 dan 1. Perhatikan juga bahwa kolom kelima “Spesies” telah dihapus dari bingkai data ini. Kita dapat dengan mudah menambahkannya menggunakan kode berikut:
#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
Standardisasi skor Z
Kekurangan dari teknik normalisasi min-max adalah membuat nilai data semakin mendekati mean. Jika kita ingin memastikan bahwa outlier memiliki bobot lebih dari nilai lainnya, standarisasi skor-z adalah teknik yang lebih baik untuk diterapkan.
Rumus standarisasi z-score adalah sebagai berikut:
(X – μ) / σ
Untuk setiap nilai suatu variabel, kita cukup mengurangkan nilai rata-rata variabel tersebut lalu membaginya dengan simpangan baku variabel tersebut.
Untuk mengimplementasikan ini di R, kami memiliki beberapa opsi:
1. Standarisasi suatu variabel
Jika kita hanya ingin membakukan variabel dalam dataset, seperti Sepal.Width pada dataset iris , kita dapat menggunakan kode berikut:
#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
Nilai Sepal.Width sekarang diskalakan sedemikian rupa sehingga meannya adalah 0 dan deviasi standarnya adalah 1. Kita bahkan dapat memeriksanya jika kita ingin:
#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. Standarisasi beberapa variabel menggunakan fungsi skala
Untuk menormalkan beberapa variabel, cukup menggunakan fungsi skala . Misalnya, kode berikut memperlihatkan cara menskalakan empat kolom pertama kumpulan data 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
Perhatikan bahwa fungsi skala , secara default, berupaya menormalkan setiap kolom dalam bingkai data. Jadi, kita akan mendapat error jika mencoba menggunakan skala(iris) karena kolom Spesies bukan numerik dan tidak dapat distandarisasi:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
Namun, dimungkinkan untuk menstandarkan hanya variabel tertentu dalam bingkai data sambil menjaga agar semua variabel lainnya tetap sama menggunakan paket dplyr . Misalnya, kode berikut menstandarkan variabel Sepal.Width dan Sepal.Length sambil menjaga agar semua variabel lainnya tetap sama:
#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
Perhatikan bahwa Sepal.Length dan Sepal.Width distandarisasi sedemikian rupa sehingga kedua variabel memiliki rata-rata 0 dan deviasi standar 1, sedangkan tiga variabel lainnya dalam kerangka data tetap tidak berubah.