Поиск по сайту:

Анализ выбросов в R — обнаружение и удаление выбросов


Здравствуйте, читатели! В этой статье мы подробно сосредоточимся на анализе выбросов в программировании на R.

Итак, начнем!!

Что такое выбросы в данных?

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

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

В нашем последнем посте мы узнали об анализе пропущенных значений в программировании на R.

Сегодня мы сосредоточимся на том же продвинутом уровне — обнаружении и удалении выбросов в R.

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

Обычно предполагается, что это аномальное распределение значений данных.

Влияние выбросов на модель -

  1. Данные оказались в искаженном формате.
  2. Изменяет общее статистическое распределение данных с точки зрения среднего значения, дисперсии и т. д.
  3. Приводит к искажению уровня точности модели.

Поняв эффект выбросов, пришло время поработать над его реализацией.

Анализ выбросов - Приготовьтесь!

Во-первых, нам очень важно обнаружить наличие выбросов в наборе данных.

Итак, давайте начнем. Мы использовали набор данных прогнозирования количества проката велосипедов. Вы можете найти набор данных здесь!

1. Загрузка набора данных

Первоначально мы загрузили набор данных в среду R с помощью функции read.csv().

Перед обнаружением выбросов мы выполнили анализ отсутствующих значений только для проверки наличия каких-либо NULL или отсутствующих значений. Для этого мы использовали функцию sum(is.na(data)).

#Removed all the existing objects
rm(list = ls())

#Setting the working directory
setwd("D:/Ediwsor_Project - Bike_Rental_Count/")
getwd()

#Load the dataset
bike_data = read.csv("day.csv",header=TRUE)

### Missing Value Analysis ###
sum(is.na(bike_data))
summary(is.na(bike_data))

#From the above result, it is clear that the dataset contains NO Missing Values.

Данные здесь НЕ содержат пропущенных значений

2. Обнаружение выбросов с помощью функции Boxplot

Сказав это, сейчас самое время обнаружить наличие выбросов в наборе данных. Для этого мы сохранили столбцы числовых данных в отдельную структуру данных/переменную, используя функцию c().

Кроме того, мы использовали функцию boxplot() для обнаружения выбросов в числовых переменных.

БоксПлот:

Из изображений видно, что переменные «гул» и «скорость ветра» содержат выбросы в своих значениях данных.

3. Замена выбросов значениями NULL

Теперь, после выполнения анализа выбросов в R, мы заменяем выбросы, идентифицированные методом boxplot(), значениями NULL, чтобы работать с ними, как показано ниже.

##############################Outlier Analysis -- DETECTION###########################

# 1. Outliers in the data values exists only in continuous/numeric form of data variables. Thus, we need to store all the numeric and categorical independent variables into a separate array structure.
col = c('temp','cnt','hum','windspeed')
categorical_col = c("season","yr","mnth","holiday","weekday","workingday","weathersit")

# 2. Using BoxPlot to detect the presence of outliers in the numeric/continuous data columns.
boxplot(bike_data[,c('temp','atemp','hum','windspeed')])

# From the above visualization, it is clear that the data variables 'hum' and 'windspeed' contains outliers in the data values.
#OUTLIER ANALYSIS -- Removal of Outliers
# 1. From the boxplot, we have identified the presence of outliers. That is, the data values that are present above the upper quartile and below the lower quartile can be considered as the outlier data values.
# 2. Now, we will replace the outlier data values with NULL.

for (x in c('hum','windspeed'))
{
  value = bike_data[,x][bike_data[,x] %in% boxplot.stats(bike_data[,x])$out]
  bike_data[,x][bike_data[,x] %in% value] = NA
} 

#Checking whether the outliers in the above defined columns are replaced by NULL or not
sum(is.na(bike_data$hum))
sum(is.na(bike_data$windspeed))
as.data.frame(colSums(is.na(bike_data)))

4. Убедитесь, что все выбросы заменены на NULL

Теперь мы проверяем наличие отсутствующих данных, т. е. правильно ли были преобразованы значения выбросов в отсутствующие значения с помощью функции sum(is.na()).

Выход:

> sum(is.na(bike_data$hum))
[1] 2
> sum(is.na(bike_data$windspeed))
[1] 13
> as.data.frame(colSums(is.na(bike_data)))
           colSums(is.na(bike_data))
instant                            0
dteday                             0
season                             0
yr                                 0
mnth                               0
holiday                            0
weekday                            0
workingday                         0
weathersit                         0
temp                               0
atemp                              0
hum                                2
windspeed                         13
casual                             0
registered                         0
cnt                                0

В результате мы преобразовали 2 точки выброса из столбца «гул» и 13 точек выброса из столбца «скорость ветра» в отсутствующие (NA) значения.

5. Отбросьте столбцы с пропущенными значениями

Наконец, мы обрабатываем отсутствующие значения, удаляя значения NULL с помощью функции drop_na() из библиотеки «tyr».

#Removing the null values
library(tidyr)
bike_data = drop_na(bike_data)
as.data.frame(colSums(is.na(bike_data)))

Выход:

В результате все выбросы теперь эффективно удалены!

> as.data.frame(colSums(is.na(bike_data)))
           colSums(is.na(bike_data))
instant                            0
dteday                             0
season                             0
yr                                 0
mnth                               0
holiday                            0
weekday                            0
workingday                         0
weathersit                         0
temp                               0
atemp                              0
hum                                0
windspeed                          0
casual                             0
registered                         0
cnt                                0

Заключение

На этом мы подошли к концу этой темы. Не стесняйтесь комментировать ниже, если у вас возникнут какие-либо вопросы. Чтобы узнать больше о таких сообщениях, связанных с программированием на R, следите за обновлениями!

А пока удачного обучения! :)