Как удалить выбросы в r


Выброс — это наблюдение, которое аномально далеко от других значений в наборе данных. Выбросы могут быть проблематичными, поскольку они могут повлиять на результаты анализа.

В этом руководстве объясняется, как идентифицировать и удалять выбросы в R.

Как идентифицировать выбросы в R

Прежде чем вы сможете удалить выбросы, вы должны сначала решить, что вы считаете выбросами. Есть два распространенных способа сделать это:

1. Используйте межквартильный размах.

Межквартильный размах (IQR) — это разница между 75-м процентилем (Q3) и 25-м процентилем (Q1) в наборе данных. Он измеряет распределение средних 50% значений.

Вы можете определить наблюдение как выброс, если оно в 1,5 раза превышает межквартильный размах выше третьего квартиля (Q3) или в 1,5 раза превышает межквартильный размах ниже первого квартиля (Q1).

Выбросы = Наблюдения > Q3 + 1,5*IQR или < Q1 – 1,5*IQR

2. Используйте z-показатели.

Z-показатель показывает, на сколько стандартных отклонений данное значение отличается от среднего. Для расчета z-показателя мы используем следующую формулу:

z = (X – µ)/σ

Золото:

  • X — одно значение необработанных данных.
  • μ — среднее значение генеральной совокупности
  • σ — стандартное отклонение генеральной совокупности.

Вы можете определить наблюдение как выброс, если его z-показатель меньше -3 или больше 3.

Выбросы = наблюдения с z-показателями > 3 или < -3.

Как удалить выбросы в R

После того как вы определились с тем, что вы считаете выбросом, вы можете идентифицировать и удалить его из набора данных. Чтобы проиллюстрировать, как это сделать, мы будем использовать следующий фрейм данных:

 #make this example reproducible 
set.seed(0)

#create data frame with three columns A', 'B', 'C' 
df <- data.frame(A=rnorm(1000, mean=10, sd=3),
                 B=rnorm(1000, mean=20, sd=3),
                 C=rnorm(1000, mean=30, sd=3))

#view first six rows of data frame
head(df)
         ABC
1 13.78886 19.13945 31.33304
2 9.02130 25.52332 30.03579
3 13.98940 19.52971 29.97216
4 13.81729 15.83059 29.09287
5 11.24392 15.58069 31.47707
6 5.38015 19.79144 28.19184

Затем мы можем определить и удалить выбросы, используя метод z-показателя или метод межквартильного диапазона:

Метод Z-оценки:

Следующий код показывает, как вычислить z-показатель каждого значения в каждом столбце фрейма данных, а затем удалить строки, которые имеют хотя бы один z-показатель с абсолютным значением больше 3:

 #find absolute value of z-score for each value in each column
z_scores <- as.data.frame (sapply(df, function(df) (abs(df-mean(df))/sd(df))))

#view first six rows of z_scores data frame
head(z_scores)

          ABC
1 1.2813403 0.25350805 0.39419878
2 0.3110243 1.80496734 0.05890232
3 1.3483190 0.12766847 0.08112630
4 1.2908343 1.32044506 0.38824414
5 0.4313316 1.40102642 0.44450451
6 1.5271674 0.04327186 0.70295309

#only keep rows in dataframe with all z-scores less than absolute value of 3 
no_outliers <- z_scores[!rowSums(z_scores>3), ]

#view row and column count of new data frame
dim(no_outliers)

[1] 994 3

Исходный фрейм данных имел 1000 строк и 3 столбца. Новый фрейм данных содержит 994 строки и 3 столбца, что говорит нам о том, что 6 строк были удалены, поскольку в одном из столбцов у них был хотя бы один z-показатель с абсолютным значением больше 3.

Метод межквартильного размаха:

В некоторых случаях нам может потребоваться выявить выбросы только в столбце фрейма данных. Например, предположим, что мы хотим удалить только строки с выбросом в столбце «A» нашего фрейма данных.

Следующий код показывает, как удалить строки из фрейма данных, значение которых в столбце «A» в 1,5 раза превышает межквартильный диапазон выше третьего квартиля (Q3) или в 1,5 раза превышает межквартильный диапазон ниже первого квартиля (Q1). .

 #find Q1, Q3, and interquartile range for values in column A
Q1 <- quantile(df$A, .25)
Q3 <- quantile(df$A, .75)
IQR <- IQR(df$A)

#only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3
no_outliers <- subset(df, df$A> (Q1 - 1.5*IQR) & df$A< (Q3 + 1.5*IQR))

#view row and column count of new data frame
dim(no_outliers) 

[1] 994 3

Исходный фрейм данных имел 1000 строк и 3 столбца. Новый фрейм данных содержит 994 строки и 3 столбца, что говорит нам о том, что 6 строк были удалены, поскольку они содержали хотя бы один выброс в столбце A.

Когда удалять выбросы

Если присутствуют один или несколько выбросов, необходимо сначала убедиться, что они не являются результатом ошибки ввода данных. Иногда человек просто вводит неправильное значение данных при сохранении данных.

Если выброс оказывается результатом ошибки ввода данных, вы можете присвоить ему новое значение, например среднее или медиану набора данных.

Если значение действительно является выбросом, вы можете удалить его, если оно окажет существенное влияние на общий анализ. Просто не забудьте упомянуть в своем итоговом отчете или анализе, что вы удалили выбросы.

Дополнительные ресурсы

В этом уроке мы использовали rnorm() для генерации векторов нормально распределенных случайных величин с заданной длиной вектора n , средним значением популяции μ и стандартным отклонением совокупности σ . Подробнее об этой функции можно узнать здесь .

Мы также использовали sapply() , чтобы применить функцию к каждому столбцу во фрейме данных, который рассчитывал z-показатели. Подробнее об этой функции можно узнать здесь .

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

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