Введение

Это отчет для лабораторной работы №4 по дисциплине “Анализ данных”.

Установка компонентов

options(repos = "https://cran.r-project.org/")
install.packages(c("Rtools", "RANN", "caret", "mice", "car"))
## Устанавливаю пакеты в 'C:/Users/79166/AppData/Local/R/win-library/4.4'
## (потому что 'lib' не определено)
## Warning: пакет ''Rtools'' недоступен (for this version of R
## 
## Другая версия этого пакета может быть доступна для Вашей версии R из других источников,
## см. возможные варианты на
## https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages)
## устанавливаю также зависимости 'bit', 'prettyunits', 'bit64', 'progress', 'ucminf', 'clipr', 'crayon', 'vroom', 'rbibutils', 'ordinal', 'forcats', 'hms', 'readr', 'cowplot', 'Deriv', 'modelr', 'microbenchmark', 'Rdpack', 'backports', 'pan', 'jomo', 'haven', 'doBy', 'SparseM', 'MatrixModels', 'minqa', 'nloptr', 'reformulas', 'broom', 'glmnet', 'mitml', 'carData', 'abind', 'Formula', 'pbkrtest', 'quantreg', 'lme4'
## 
##   В наличии есть бинарные версии, но исходники новее:
##              binary source needs_compilation
## MatrixModels  0.5-3  0.5-4             FALSE
## lme4         1.1-36 1.1-37              TRUE
## 
##   Binaries will be installed
## пакет 'bit' успешно распакован, MD5-суммы проверены
## пакет 'prettyunits' успешно распакован, MD5-суммы проверены
## пакет 'bit64' успешно распакован, MD5-суммы проверены
## пакет 'progress' успешно распакован, MD5-суммы проверены
## пакет 'ucminf' успешно распакован, MD5-суммы проверены
## пакет 'clipr' успешно распакован, MD5-суммы проверены
## пакет 'crayon' успешно распакован, MD5-суммы проверены
## пакет 'vroom' успешно распакован, MD5-суммы проверены
## пакет 'rbibutils' успешно распакован, MD5-суммы проверены
## пакет 'ordinal' успешно распакован, MD5-суммы проверены
## пакет 'forcats' успешно распакован, MD5-суммы проверены
## пакет 'hms' успешно распакован, MD5-суммы проверены
## пакет 'readr' успешно распакован, MD5-суммы проверены
## пакет 'cowplot' успешно распакован, MD5-суммы проверены
## пакет 'Deriv' успешно распакован, MD5-суммы проверены
## пакет 'modelr' успешно распакован, MD5-суммы проверены
## пакет 'microbenchmark' успешно распакован, MD5-суммы проверены
## пакет 'Rdpack' успешно распакован, MD5-суммы проверены
## пакет 'backports' успешно распакован, MD5-суммы проверены
## пакет 'pan' успешно распакован, MD5-суммы проверены
## пакет 'jomo' успешно распакован, MD5-суммы проверены
## пакет 'haven' успешно распакован, MD5-суммы проверены
## пакет 'doBy' успешно распакован, MD5-суммы проверены
## пакет 'SparseM' успешно распакован, MD5-суммы проверены
## пакет 'minqa' успешно распакован, MD5-суммы проверены
## пакет 'nloptr' успешно распакован, MD5-суммы проверены
## пакет 'reformulas' успешно распакован, MD5-суммы проверены
## пакет 'broom' успешно распакован, MD5-суммы проверены
## пакет 'glmnet' успешно распакован, MD5-суммы проверены
## пакет 'mitml' успешно распакован, MD5-суммы проверены
## пакет 'carData' успешно распакован, MD5-суммы проверены
## пакет 'abind' успешно распакован, MD5-суммы проверены
## пакет 'Formula' успешно распакован, MD5-суммы проверены
## пакет 'pbkrtest' успешно распакован, MD5-суммы проверены
## пакет 'quantreg' успешно распакован, MD5-суммы проверены
## пакет 'lme4' успешно распакован, MD5-суммы проверены
## пакет 'RANN' успешно распакован, MD5-суммы проверены
## пакет 'caret' успешно распакован, MD5-суммы проверены
## пакет 'mice' успешно распакован, MD5-суммы проверены
## пакет 'car' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\79166\AppData\Local\Temp\RtmpUn6gx8\downloaded_packages
## устанавливаю пакет 'MatrixModels' из исходников
library(caret)
## Warning: пакет 'caret' был собран под R версии 4.4.3
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
library(mice)
## Warning: пакет 'mice' был собран под R версии 4.4.3
## 
## Присоединяю пакет: 'mice'
## Следующий объект скрыт от 'package:stats':
## 
##     filter
## Следующие объекты скрыты от 'package:base':
## 
##     cbind, rbind
library(car)
## Warning: пакет 'car' был собран под R версии 4.4.3
## Загрузка требуемого пакета: carData
## Warning: пакет 'carData' был собран под R версии 4.4.3

Задание №1

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

# Создаем вектор с числам и пропусками
my_data <- c(10, 15, NA, 25, 30, NA, 40, NA, NA)
print(my_data)
## [1] 10 15 NA 25 30 NA 40 NA NA

Задание №2

Проведите очистку данных с использованием функции is.na() И выведите “чистый” датасет.

# Проверяем, где находятся NA, создавая вектор с логическими данными, выведем его, после удаляем все NA и выведем измененный вектор.
na_positions <- is.na(my_data)
print(na_positions)
## [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
clean_data <- my_data[!na_positions]
print(clean_data)
## [1] 10 15 25 30 40

Задание №3

Сгенерируйте таблицу данных с числовыми и текстовые столбцами (аналогично с помощью функции c). Очистите данные с помощью функции complete.cases().

# Создаем таблицу данных с NA среди них, выведем ее, очистим данные с помощью complete.cases()
my_table <- data.frame(
  numbers = c(1, 3, NA, 3, 7),
  text = c("X", "Y", "NA", NA, "X")
)
print(my_table)
##   numbers text
## 1       1    X
## 2       3    Y
## 3      NA   NA
## 4       3 <NA>
## 5       7    X
clean_table <- my_table[complete.cases(my_table), ]
print(clean_table)
##   numbers text
## 1       1    X
## 2       3    Y
## 5       7    X

Задание №4

Проанализируйте датасет airquality с пропусками из пакета caret. С использованием функции preProcess из пакета caret заполните пропуски предсказанными значениями (среднее, медиана).

# Загружаем датасет, проверяем количество NA, используем preProcess для заполнения NA средними, а после медианными значениями, проверяем, что NA больше нет, сравним методы.
data(airquality)
print(head(airquality))
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6
print(colSums(is.na(airquality)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##      37       7       0       0       0       0
preproc_mean <- preProcess(airquality, method = c("center", "scale", "knnImpute"))
airquality_mean <- predict(preproc_mean, airquality)
print(head(airquality_mean))
##         Ozone      Solar.R       Wind       Temp     Month       Day
## 1 -0.03423409  0.045176154 -0.7259482 -1.1497140 -1.407294 -1.670019
## 2 -0.18580489 -0.754304874 -0.5556388 -0.6214670 -1.407294 -1.557210
## 3 -0.91334473 -0.410083876  0.7500660 -0.4101682 -1.407294 -1.444401
## 4 -0.73145977  1.410956244  0.4378323 -1.6779609 -1.407294 -1.331592
## 5 -0.81027658 -0.221317522  1.2326091 -2.3118573 -1.407294 -1.218782
## 6 -0.42831817  0.007422883  1.4029185 -1.2553634 -1.407294 -1.105973
print(colSums(is.na(airquality_mean)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0
preproc_median <- preProcess(airquality, method = c("center", "scale", "medianImpute"))
airquality_median <- predict(preproc_median, airquality)
print(head(airquality_median))
##         Ozone     Solar.R       Wind       Temp     Month       Day
## 1 -0.03423409  0.04517615 -0.7259482 -1.1497140 -1.407294 -1.670019
## 2 -0.18580489 -0.75430487 -0.5556388 -0.6214670 -1.407294 -1.557210
## 3 -0.91334473 -0.41008388  0.7500660 -0.4101682 -1.407294 -1.444401
## 4 -0.73145977  1.41095624  0.4378323 -1.6779609 -1.407294 -1.331592
## 5 -0.32221861  0.21173470  1.2326091 -2.3118573 -1.407294 -1.218782
## 6 -0.42831817  0.21173470  1.4029185 -1.2553634 -1.407294 -1.105973
print(colSums(is.na(airquality_median)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

Задание №5

Сгенерируйте два числовых набора данных и добавьте в них выбросы. С использованием функции boxplot обнаружьте выбросы и удалим их.

# Создаем два набора данных с выбросами, визуализируем выбросы с помощью boxplot, затем удаляем выбросы.
set1 <- c(1, 2, 3, 4, 5, 100)
set2 <- c(-1, 2, -3, 4, -660)
boxplot(set1, main = "Set 1")

boxplot(set2, main = "Set 2")

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] -1  2 -3  4

Задание №6

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

# Создаем таблицу с дубликатами, удаляем дубликаты с unique() и duplicated().
dup_table <- data.frame(
  col1 = c(22, 8, 1, 33, 8),
  col2 = c("A", "B", "C", "D", "B")
)
print(dup_table)
##   col1 col2
## 1   22    A
## 2    8    B
## 3    1    C
## 4   33    D
## 5    8    B
unique_table <- unique(dup_table)
print(unique_table)
##   col1 col2
## 1   22    A
## 2    8    B
## 3    1    C
## 4   33    D
no_dup_table <- dup_table[!duplicated(dup_table), ]
print(no_dup_table)
##   col1 col2
## 1   22    A
## 2    8    B
## 3    1    C
## 4   33    D

Задание №7

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

# Применяем mice к airquality
imp <- mice(airquality, m = 1, maxit = 5, method = "pmm", seed = 500)
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R
airquality_mice <- complete(imp)
print(head(airquality_mice))
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    14     137 14.3   56     5   5
## 6    28     191 14.9   66     5   6
print(colSums(is.na(airquality_mice)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

Задание №8

Разберите пример с мультиколлинеарностью.

# Создаем данные с мультиколлинеарностью, проверим корреляцию, линейная регрессия, вычислим VIF (фактор инфляции дисперсии)
set.seed(123)
x1 <- rnorm(50)
x2 <- x1 * 2 + rnorm(50, 0, 0.1)
y <-  x1 + 2 * x2 + rnorm(50)
data_mc <- data.frame(y, x1, x2)
cor_matrix <- cor(data_mc)
print(cor_matrix)
##            y        x1        x2
## y  1.0000000 0.9786334 0.9777459
## x1 0.9786334 1.0000000 0.9988040
## x2 0.9777459 0.9988040 1.0000000
model <- lm(y ~ x1 + x2, data = data_mc)
summary(model)
## 
## Call:
## lm(formula = y ~ x1 + x2, data = data_mc)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.88137 -0.74056 -0.06374  0.52516  2.27045 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  -0.2299     0.1431  -1.607    0.115
## x1            4.4173     3.1479   1.403    0.167
## x2            0.3039     1.5748   0.193    0.848
## 
## Residual standard error: 0.9975 on 47 degrees of freedom
## Multiple R-squared:  0.9578, Adjusted R-squared:  0.956 
## F-statistic: 532.8 on 2 and 47 DF,  p-value: < 2.2e-16
library(car)
vif(model)
##       x1       x2 
## 418.3189 418.3189

Задание №9

Всю представленную работу собрать в единый отчет с формулирвкой задания, кодом (листингом) и скриншотами выполнения.

Если вы это читаете, значит это задание выполнено. Этот файл опубликован на RPubs, в нем содержатся все формулировки и реализации заданий, а также вывод к ним.

Вывод по лабораторной работе

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