Этот отчет показывает ход и результаты выполнения лабораторной работы №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
Сформируйте свой собственный датасет с помощью функции c (конкатенация), в котором содержатся числовые данные и NA значения.
# Создаем вектор с числами и NA и выводим его
my_data <- c(10, 20, NA, 30, 40, NA, 50)
print(my_data)
## [1] 10 20 NA 30 40 NA 50
Проведите очистку данных с использованием функции 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
Сгенерируйте таблицу данных с числовыми и текстовые столбцами (аналогично с помощью функции 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
Проанализируйте датасет 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
Сгенерируйте два числовых набора данных и добавьте в них выбросы. С использованием функции 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
Сгенерируйте таблицу данных, в которой дублируются строки. Удалите строки с использованием функций 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() оставляет только первые вхождения Дает больше контроля и информации
Обработайте пропуски в данных с использованием пакета 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 перед простой медианой: Учитывает контекст - значения зависят от других переменных Сохраняет вариативность - не все пропуски получают одинаковые значения Реалистичность - использует только существующие в данных значения
Разберите пример с мультиколлинеарностью.
# Создаем данные с мультиколлинеарностью (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 показывает, во сколько раз увеличилась дисперсия коэффициента из-за мультиколлинеарности.
Всю представленную работу собрать в единый отчет с формулирвкой задания, кодом (листингом) и скриншотами выполнения.
Как можно заметить это как раз таки и есть файл .Rmd и он опубликован на RPubs, в нем содержатся все формулировки и реализации заданий, а также вывод к ним, соответственно задание выполнено.
В результате выполнения данной лабораторной работы были закреплены навыки в работе с раздличными пакетами на языке R. Также были изучены основы анализа данных при помощи данных из наборов пакетов языка R и основы предварительной подготовки данных при анализе данных.