Введение

Этот отчет демонстрирует выполнение заданий по обработке данных в R с использованием R Markdown. Мы рассмотрим работу с пропущенными значениями, выбросами, дубликатами и проведем анализ мультиколлинеарности. Каждое задание включает формулировку, код, результаты и пояснения.


Задание 1: Создание датасета с пропущенными значениями

Формулировка: Сформируйте датасет с числовыми данными и пропущенными значениями (NA) с помощью функции c().

Код:

dataset <- c(1, 2, NA, 4, 5, NA, 7, 8, NA)
print(dataset)
## [1]  1  2 NA  4  5 NA  7  8 NA

Результат:
Вектор с пропущенными значениями:

[1] 1 2 NA 4 5 NA 7 8 NA

Пояснение:
Мы создали простой числовой вектор, где два значения заменены на NA, что обозначает пропуски.


Задание 2: Очистка данных от пропусков

Формулировка: Очистите датасет от пропущенных значений с помощью функции is.na().

Код:

clean_dataset <- dataset[!is.na(dataset)]
print(clean_dataset)
## [1] 1 2 4 5 7 8

Результат:
Очищенный вектор:

[1] 1 2 4 5 7 8

Пояснение:
Функция is.na() определяет позиции пропущенных значений, а с помощью логического отрицания ! мы исключаем их из вектора.


Задание 3: Работа с таблицей данных

Формулировка: Создайте таблицу с числовыми и текстовыми столбцами, содержащими пропуски. Очистите данные с помощью complete.cases().

Код:

df <- data.frame(
  numeric_col = c(1, 2, NA, 4),
  text_col = c("a", "b", "c", NA)
)
print(df)
##   numeric_col text_col
## 1           1        a
## 2           2        b
## 3          NA        c
## 4           4     <NA>
clean_df <- df[complete.cases(df), ]
print(clean_df)
##   numeric_col text_col
## 1           1        a
## 2           2        b

Результат:
Исходная таблица:

  numeric_col text_col
1           1        a
2           2        b
3          NA        c
4           4       NA

Очищенная таблица:

  numeric_col text_col
1           1        a
2           2        b

Пояснение:
Функция complete.cases() возвращает только те строки, где нет ни одного пропущенного значения в любом из столбцов.


Задание 4: Заполнение пропусков в датасете airquality

Формулировка: Используйте встроенный датасет airquality и заполните пропуски средними значениями с помощью пакета caret.

Код:

library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
data(airquality)

preProc_bag <- preProcess(airquality, method = "bagImpute")
airquality_imputed_bag <- predict(preProc_bag, airquality)
head(airquality_imputed_bag)
##      Ozone  Solar.R Wind Temp Month Day
## 1 41.00000 190.0000  7.4   67     5   1
## 2 36.00000 118.0000  8.0   72     5   2
## 3 12.00000 149.0000 12.6   74     5   3
## 4 18.00000 313.0000 11.5   62     5   4
## 5 15.25395 178.1686 14.3   56     5   5
## 6 28.00000 185.8075 14.9   66     5   6

Результат:
Первые 6 строк с заполненными пропусками:

  Ozone    Solar.R  Wind Temp Month Day
1   41.0000 190.0000    7.4   67    5       1
2   36.0000 118.0000    8.0   72    5       2
3   12.0000 149.0000    12.6    74  5       3
4   18.0000 313.0000    11.5    62  5       4
5   18.2499 128.4019    14.3    56  5       5
6   28.0000 222.0830    14.9    66  5       6

Пояснение:
Пакет caret с функцией preProcess() вычисляет средние значения для каждого столбца, а затем predict() заменяет пропуски этими значениями.


Задание 5: Обработка выбросов

Формулировка: Создайте два числовых набора данных с выбросами, найдите их с помощью boxplot и удалите.

Код:

set1 <- c(1, 2, 3, 4, 5, 100)
set2 <- c(10, 20, 30, 40, 50, 200)
boxplot(set1)$out

## [1] 100
boxplot(set2)$out

## [1] 200
clean_set1 <- set1[!set1 %in% boxplot.stats(set1)$out]
clean_set2 <- set2[!set2 %in% boxplot.stats(set2)$out]
print(clean_set1)
## [1] 1 2 3 4 5
print(clean_set2)
## [1] 10 20 30 40 50

Результат:
Выбросы:
- set1: 100
- set2: 200
Очищенные наборы:
- clean_set1: [1] 1 2 3 4 5
- clean_set2: [1] 10 20 30 40 50

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


Задание 6: Удаление дубликатов

Формулировка: Сгенерируйте таблицу данных, в которой дублируются строки. Удалите строки с использованием функций unique(), duplicated(). Сравните результаты

Код:

df <- data.frame(
  id = c(1, 2, 3, 1, 4, 2),
  value = c("a", "b", "c", "a", "d", "b")
)

print(df)
##   id value
## 1  1     a
## 2  2     b
## 3  3     c
## 4  1     a
## 5  4     d
## 6  2     b
unique_df <- unique(df)
print(unique_df)
##   id value
## 1  1     a
## 2  2     b
## 3  3     c
## 5  4     d
not_duplicated_df <- df[!duplicated(df), ]
print(not_duplicated_df)
##   id value
## 1  1     a
## 2  2     b
## 3  3     c
## 5  4     d

Пояснение:
Оба метода — unique() и duplicated() — эффективно удаляют дублирующиеся строки из таблицы данных. В данном примере они дали одинаковый результат, что подтверждается функцией identical(). Использование этих функций зависит от ваших предпочтений: unique() проще в применении, тогда как duplicated() предоставляет больше гибкости, если нужно, например, дополнительно анализировать дубликаты.


Задание 7: Обработка пропусков с использованием пакета mice

Формулировка: Обработайте пропуски в данных с использованием пакета mice.

Код:

dataset <- data.frame(var1=rnorm(20,0,1), var2=rnorm(20,5,1))
    dataset[c(2,5,7,10),1] <- NA
    dataset[c(4,8,19),2] <- NA
    summary(dataset)
##       var1               var2      
##  Min.   :-1.48008   Min.   :4.026  
##  1st Qu.:-0.83348   1st Qu.:4.281  
##  Median :-0.37663   Median :5.049  
##  Mean   :-0.07748   Mean   :5.116  
##  3rd Qu.: 0.65137   3rd Qu.:5.420  
##  Max.   : 2.30512   Max.   :6.899  
##  NA's   :4          NA's   :3
install.packages("mice", repos = "https://cran.rstudio.com/")
## пакет 'mice' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\AlexS\AppData\Local\Temp\Rtmp2PSRee\downloaded_packages
library(mice)
## Warning: пакет 'mice' был собран под R версии 4.5.3
## 
## Присоединяю пакет: 'mice'
## Следующий объект скрыт от 'package:stats':
## 
##     filter
## Следующие объекты скрыты от 'package:base':
## 
##     cbind, rbind
dataset2 <- mice(dataset)
## 
##  iter imp variable
##   1   1  var1  var2
##   1   2  var1  var2
##   1   3  var1  var2
##   1   4  var1  var2
##   1   5  var1  var2
##   2   1  var1  var2
##   2   2  var1  var2
##   2   3  var1  var2
##   2   4  var1  var2
##   2   5  var1  var2
##   3   1  var1  var2
##   3   2  var1  var2
##   3   3  var1  var2
##   3   4  var1  var2
##   3   5  var1  var2
##   4   1  var1  var2
##   4   2  var1  var2
##   4   3  var1  var2
##   4   4  var1  var2
##   4   5  var1  var2
##   5   1  var1  var2
##   5   2  var1  var2
##   5   3  var1  var2
##   5   4  var1  var2
##   5   5  var1  var2
dataset2 <- complete(dataset2)
summary(dataset2)
##       var1              var2      
##  Min.   :-1.4801   Min.   :4.026  
##  1st Qu.:-0.8757   1st Qu.:4.412  
##  Median :-0.6653   Median :4.970  
##  Mean   :-0.1871   Mean   :5.091  
##  3rd Qu.: 0.2425   3rd Qu.:5.399  
##  Max.   : 2.3051   Max.   :6.899

Пояснение:
Мы создали случайный блок данных, намеренно внеся в него несколько пропущенных значений. В примере по MICE мы использовали значения по умолчанию.


Задание 8: Анализ мультиколлинеарности

Формулировка: Проанализируйте мультиколлинеарность в датасете airquality с помощью пакета car.

Код:

library(car)
## Warning: пакет 'car' был собран под R версии 4.5.3
## Загрузка требуемого пакета: carData
## Warning: пакет 'carData' был собран под R версии 4.5.3
## Registered S3 method overwritten by 'car':
##   method           from
##   na.action.merMod lme4
model <- lm(Ozone ~ Solar.R + Wind + Temp, data = airquality)
vif(model)
##  Solar.R     Wind     Temp 
## 1.095253 1.329070 1.431367

Результат:
Значения VIF (фактор инфляции дисперсии):

 Solar.R     Wind     Temp 
 1.095253   1.32907   1.431367

Пояснение:
Значения VIF меньше 5 указывают на отсутствие выраженной мультиколлинеарности между переменными Solar.R, Wind и Temp в модели.


Заключение

В этом отчете мы рассмотрели основные методы обработки данных в R: удаление и заполнение пропусков, устранение выбросов и дубликатов, а также анализ мультиколлинеарности. Использование R Markdown позволило объединить код, результаты и пояснения в одном структурированном документе, что упрощает анализ и представление данных.