Як нормалізувати дані в 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, тоді як інші три змінні у кадрі даних залишаються незмінними.

Додати коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *