Как нормализовать данные в 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, в то время как остальные три переменные в фрейме данных остаются неизменными.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *