Введение

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


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

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

Код:

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

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

[1] 1 2 NA 4 5 NA 7

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


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

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

Код:

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

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

[1] 1 2 4 5 7

Пояснение:
Функция 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.

Код:

install.packages("caret")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
library(caret)
## Loading required package: ggplot2
## Loading required package: 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.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 16.3633 179.1605 14.3   56     5   5
## 6 28.0000 228.5671 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.   :-2.23150   Min.   :2.722  
##  1st Qu.:-1.08409   1st Qu.:4.849  
##  Median : 0.17047   Median :5.298  
##  Mean   : 0.02057   Mean   :5.239  
##  3rd Qu.: 0.95256   3rd Qu.:5.856  
##  Max.   : 2.06799   Max.   :7.146  
##  NA's   :4          NA's   :3
install.packages("mice")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
library(mice)
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from '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.   :-2.2315   Min.   :2.722  
##  1st Qu.:-1.2478   1st Qu.:4.890  
##  Median :-0.3157   Median :5.372  
##  Mean   :-0.1582   Mean   :5.304  
##  3rd Qu.: 0.9526   3rd Qu.:5.856  
##  Max.   : 2.0680   Max.   :7.146

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


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

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

Код:

install.packages("car")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
## also installing the dependencies 'colorspace', 'fracdiff', 'lmtest', 'urca', 'zoo', 'RcppArmadillo', 'cowplot', 'Deriv', 'forecast', 'modelr', 'microbenchmark', 'doBy', 'SparseM', 'MatrixModels', 'carData', 'abind', 'Formula', 'pbkrtest', 'quantreg'
library(car)
## Loading required package: carData
## 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 позволило объединить код, результаты и пояснения в одном структурированном документе, что упрощает анализ и представление данных.