Введение

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

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

Установка и импорт необходимых компонентов

options(repos = "https://cran.r-project.org/")
install.packages(c("Rtools", "RANN", "caret", "mice", "car"))
## Устанавливаю пакеты в 'C:/Users/t3400/AppData/Local/R/win-library/4.5'
## (потому что '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', 'colorspace', 'fracdiff', 'lmtest', 'urca', 'zoo', 'RcppArmadillo', 'ordinal', 'forcats', 'hms', 'readr', 'cowplot', 'Deriv', 'forecast', 'modelr', 'microbenchmark', 'rbibutils', 'backports', 'pan', 'jomo', 'haven', 'doBy', 'SparseM', 'MatrixModels', 'Rdpack', 'minqa', 'nloptr', 'reformulas', 'broom', 'glmnet', 'mitml', 'carData', 'abind', 'Formula', 'pbkrtest', 'quantreg', 'lme4'
## пакет 'bit' успешно распакован, MD5-суммы проверены
## пакет 'prettyunits' успешно распакован, MD5-суммы проверены
## пакет 'bit64' успешно распакован, MD5-суммы проверены
## пакет 'progress' успешно распакован, MD5-суммы проверены
## пакет 'ucminf' успешно распакован, MD5-суммы проверены
## пакет 'clipr' успешно распакован, MD5-суммы проверены
## пакет 'crayon' успешно распакован, MD5-суммы проверены
## пакет 'vroom' успешно распакован, MD5-суммы проверены
## пакет 'colorspace' успешно распакован, MD5-суммы проверены
## пакет 'fracdiff' успешно распакован, MD5-суммы проверены
## пакет 'lmtest' успешно распакован, MD5-суммы проверены
## пакет 'urca' успешно распакован, MD5-суммы проверены
## пакет 'zoo' успешно распакован, MD5-суммы проверены
## пакет 'RcppArmadillo' успешно распакован, MD5-суммы проверены
## пакет 'ordinal' успешно распакован, MD5-суммы проверены
## пакет 'forcats' успешно распакован, MD5-суммы проверены
## пакет 'hms' успешно распакован, MD5-суммы проверены
## пакет 'readr' успешно распакован, MD5-суммы проверены
## пакет 'cowplot' успешно распакован, MD5-суммы проверены
## пакет 'Deriv' успешно распакован, MD5-суммы проверены
## пакет 'forecast' успешно распакован, MD5-суммы проверены
## пакет 'modelr' успешно распакован, MD5-суммы проверены
## пакет 'microbenchmark' успешно распакован, MD5-суммы проверены
## пакет 'rbibutils' успешно распакован, MD5-суммы проверены
## пакет 'backports' успешно распакован, MD5-суммы проверены
## пакет 'pan' успешно распакован, MD5-суммы проверены
## пакет 'jomo' успешно распакован, MD5-суммы проверены
## пакет 'haven' успешно распакован, MD5-суммы проверены
## пакет 'doBy' успешно распакован, MD5-суммы проверены
## пакет 'SparseM' успешно распакован, MD5-суммы проверены
## пакет 'MatrixModels' успешно распакован, MD5-суммы проверены
## пакет 'Rdpack' успешно распакован, 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\t3400\AppData\Local\Temp\RtmpgFHCU0\downloaded_packages
library(caret)
## Warning: пакет 'caret' был собран под R версии 4.5.3
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
library(mice)
## Warning: пакет 'mice' был собран под R версии 4.5.3
## 
## Присоединяю пакет: 'mice'
## Следующий объект скрыт от 'package:stats':
## 
##     filter
## Следующие объекты скрыты от 'package:base':
## 
##     cbind, rbind
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

Задание №1

Задание:

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

Выполнение задания:

# Создаем вектор с числами и NA и выводим его
my_data <- c(10, 20, NA, 30, 40, NA, 50)
print(my_data)
## [1] 10 20 NA 30 40 NA 50

Задание №2

Задание:

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

Выполнение задания:

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

Задание №3

Задание:

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

Выполнение задания:

# Создаем таблицу данных с NA среди них, выводим ее, очищаем данные с помощью
# complete.cases()
my_table <- data.frame(
  numbers = c(1, 2, 3, NA, 5),
  text = c("A", NA, "C", "D", "E")
)
print(my_table)
##   numbers text
## 1       1    A
## 2       2 <NA>
## 3       3    C
## 4      NA    D
## 5       5    E
clean_table <- my_table[complete.cases(my_table), ]
#Запятая , означает: [строки, колонки]
#До запятой - условие для отбора строк (только TRUE)
#После запятой - пусто, значит берем все колонки
print(clean_table)
##   numbers text
## 1       1    A
## 3       3    C
## 5       5    E

Задание №4

Задание:

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

Выполнение задания:

# Загружаем датасет, выводим его первые 6 строк, проверяем количество NA,
# используем preProcess для заполнения NA средними, а после медианными 
# значениями, проверяем, что 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_median_scale <- preProcess(airquality, method = c("medianImpute", "center", "scale"))
#airquality_mean <- predict(preproc_mean, airquality)
airquality_mean <- airquality
airquality_mean$Ozone[is.na(airquality_mean$Ozone)] <- mean(airquality$Ozone, na.rm = TRUE)
airquality_mean$Solar.R[is.na(airquality_mean$Solar.R)] <- mean(airquality$Solar.R, na.rm = TRUE)
print(head(airquality_mean))
##      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 42.12931 185.9315 14.3   56     5   5
## 6 28.00000 185.9315 14.9   66     5   6
print(colSums(is.na(airquality_mean)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0
preproc_median <- preProcess(airquality, method= "medianImpute")
airquality_median <- predict(preproc_median, airquality)
print(head(airquality_median))
##   Ozone Solar.R Wind Temp Month Day
## 1  41.0     190  7.4   67     5   1
## 2  36.0     118  8.0   72     5   2
## 3  12.0     149 12.6   74     5   3
## 4  18.0     313 11.5   62     5   4
## 5  31.5     205 14.3   56     5   5
## 6  28.0     205 14.9   66     5   6
print(colSums(is.na(airquality_median)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

Задание №5

Задание:

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

Выполнение задания:

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

boxplot(set2, main = "Set 2")

clean_set1 <- set1[!set1 %in% boxplot.stats(set1)$out]
#boxplot.stats(set1)$out → [123] (вектор выбросов)
#set1 %in% ... → [FALSE, FALSE, FALSE, FALSE, TRUE] (где TRUE - выброс)
#! инвертирует → [TRUE, TRUE, TRUE, TRUE, FALSE]
#set1[...] оставляет только элементы с TRUE → [1, 2, 3, 4]

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

Задание №6

Задание:

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

Выполнение задания:

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

Вывод:

Разница между методами: unique(dup_table): Просто возвращает уникальные строки Не показывает процесс отбора Удобно для быстрого результата

duplicated(): Показывает, какие строки дублируются !duplicated() оставляет только первые вхождения Дает больше контроля и информации

Задание №7

Задание:

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

Выполнение задания:

# Применяем mice к airquality
imp <- mice(airquality, m = 2, maxit = 10, method = "pmm", seed = 123)
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   1   2  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   2   2  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   3   2  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   4   2  Ozone  Solar.R
##   5   1  Ozone  Solar.R
##   5   2  Ozone  Solar.R
##   6   1  Ozone  Solar.R
##   6   2  Ozone  Solar.R
##   7   1  Ozone  Solar.R
##   7   2  Ozone  Solar.R
##   8   1  Ozone  Solar.R
##   8   2  Ozone  Solar.R
##   9   1  Ozone  Solar.R
##   9   2  Ozone  Solar.R
##   10   1  Ozone  Solar.R
##   10   2  Ozone  Solar.R
airquality_mice <- complete(imp)
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(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     6     273 14.3   56     5   5
## 6    28     186 14.9   66     5   6
print(colSums(is.na(airquality_mice)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

Вывод:

Преимущества MICE перед простой медианой: Учитывает контекст - значения зависят от других переменных Сохраняет вариативность - не все пропуски получают одинаковые значения Реалистичность - использует только существующие в данных значения

Задание №8

Задание:

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

Выполнение задания:

# Создаем данные с мультиколлинеарностью (x2 сильно коррелирует с x1), проверим
# корреляцию, линейная регрессия, вычислим VIF (фактор инфляции дисперсии)
set.seed(123)
x1 <- rnorm(100)
x2 <- x1 * 2 + rnorm(100, 0, 0.1)
y <- 3 * x1 + 2 * x2 + rnorm(100)
data_mc <- data.frame(y, x1, x2)
cor_matrix <- cor(data_mc)
print(cor_matrix)
##            y        x1        x2
## y  1.0000000 0.9882897 0.9887106
## x1 0.9882897 1.0000000 0.9985963
## x2 0.9887106 0.9985963 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.8730 -0.6607 -0.1245  0.6214  2.0798 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  0.13507    0.09614   1.405    0.163  
## x1           2.39060    1.97748   1.209    0.230  
## x2           2.23811    0.98995   2.261    0.026 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9513 on 97 degrees of freedom
## Multiple R-squared:  0.9779, Adjusted R-squared:  0.9774 
## F-statistic:  2144 on 2 and 97 DF,  p-value: < 2.2e-16
vif(model)
##       x1       x2 
## 356.4434 356.4434
#Что такое VIF (Variance Inflation Factor):
#VIF показывает, во сколько раз увеличилась дисперсия коэффициента из-за мультиколлинеарности.

Задание №9

Задание:

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

Выполнение задания:

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

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

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