Как нормализовать данные в 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 iris , чтобы проиллюстрировать, как нормализовать или масштабировать переменные в 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 – мин(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. Также обратите внимание, что пятый столбец «Виды» был удален из этого фрейма данных. Мы можем легко добавить его, используя следующий код:
#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-оценки
Недостатком метода нормализации min-max является то, что он приближает значения данных к среднему значению. Если мы хотим гарантировать, что выбросы имеют больший вес, чем другие значения, лучше реализовать стандартизацию 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) #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, в то время как остальные три переменные в фрейме данных остаются неизменными.