Як нормалізувати дані в r
У більшості випадків, коли люди говорять про «нормалізацію» змінних у наборі даних, вони мають на увазі, що вони хочуть масштабувати значення таким чином, щоб змінна мала середнє значення 0 і стандартне відхилення від 1.
Найпоширенішою причиною для стандартизації змінних є коли ви виконуєте певний тип багатофакторного аналізу (тобто, ви хочете зрозуміти зв’язок між декількома змінними-прогностиками та змінною-відповіддю) і хочете, щоб кожна змінна однаково вносила свій внесок в аналіз.
Коли змінні вимірюються в різних масштабах, вони часто не однаково впливають на аналіз. Наприклад, якщо значення однієї змінної коливаються від 0 до 100 000, а значення іншої змінної — від 0 до 100, змінній із більшим діапазоном буде присвоєно більшу вагу в аналізі.
Це типово, коли одна змінна вимірює щось на кшталт зарплати (від 0 до 100 000 доларів США), а інша змінна вимірює щось на зразок віку (від 0 до 100 років).
Стандартизуючи змінні, ми можемо бути впевнені, що кожна змінна однаково впливає на аналіз. Існує два поширених способи нормалізації (або «масштабування») змінних:
- Min-Max нормалізація: (X – min(X)) / (max(X) – min(X))
- Стандартизація балів Z: (X – μ) / σ
Потім ми покажемо, як реалізувати ці дві техніки в R.
Як нормалізувати (або «масштабувати») змінні в R
Для кожного з наведених нижче прикладів ми будемо використовувати вбудовану діафрагму набору даних R, щоб проілюструвати, як нормалізувати або масштабувати змінні в 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
Min-Max Нормалізація
Формула мінімально-максимального нормалізації:
(X – min(X))/(max(X) – min(X))
Для кожного значення змінної ми просто знаходимо відстань між цим значенням і мінімальним значенням, а потім ділимо на діапазон.
Щоб реалізувати це в R, ми можемо визначити просту функцію, а потім використовувати laply , щоб застосувати цю функцію до стовпців у наборі даних райдужної оболонки, який нам потрібен:
#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
Зауважте, що кожен із стовпців тепер має значення від 0 до 1. Також зверніть увагу, що п’ятий стовпець «Species» було видалено з цього кадру даних. Ми можемо легко додати його за допомогою наступного коду:
#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
Недоліком техніки мінімально-максимальної нормалізації є те, що вона наближає значення даних до середнього. Якщо ми хочемо переконатися, що викиди мають більшу вагу, ніж інші значення, стандартизація z-показника є кращим методом для впровадження.
Формула стандартизації z-показника така:
(X – μ) / σ
Для кожного значення змінної ми просто віднімаємо середнє значення змінної, а потім ділимо на стандартне відхилення змінної.
Щоб реалізувати це в R, у нас є кілька варіантів:
1. Стандартизуйте змінну
Якщо ми просто хочемо стандартизувати змінну в наборі даних, наприклад Sepal.Width в наборі даних райдужної оболонки, ми можемо використати такий код:
#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 тепер масштабуються таким чином, що середнє значення дорівнює 0, а стандартне відхилення дорівнює 1. Ми навіть можемо перевірити це, якщо хочемо:
#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. Стандартизуйте кілька змінних за допомогою функції масштабування
Щоб нормалізувати декілька змінних, можна просто використати функцію масштабування . Наприклад, наступний код показує, як масштабувати перші чотири стовпці набору даних райдужної оболонки ока:
#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
Зауважте, що функція масштабування за замовчуванням намагається нормалізувати кожен стовпець у кадрі даних. Отже, ми отримаємо помилку, якщо спробуємо використати scale(iris) , оскільки стовпець Species не є числовим і не може бути стандартизований:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
Однак за допомогою пакета dplyr можна стандартизувати лише певні змінні у кадрі даних, зберігаючи всі інші змінні незмінними. Наприклад, наступний код стандартизує змінні Sepal.Width і Sepal.Length , зберігаючи всі інші змінні незмінними:
#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 і Sepal.Width стандартизовані таким чином, що обидві змінні мають середнє значення 0 і стандартне відхилення 1, тоді як інші три змінні у кадрі даних залишаються незмінними.