Этот отчет показывает ход и результаты выполнения лабораторной работы №4 по дисциплине “Анализ данных”.
options(repos = "https://cran.r-project.org/")
install.packages(c("Rtools", "RANN", "caret", "mice", "car"))
## Warning: package 'Rtools' is not available for this version of R
##
## A version of this package for your version of R might be available elsewhere,
## see the ideas at
## https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
## package 'RANN' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'RANN'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Soft\R-4.5.2\library\00LOCK\RANN\libs\x64\RANN.dll to
## C:\Soft\R-4.5.2\library\RANN\libs\x64\RANN.dll: Permission denied
## Warning: restored 'RANN'
## package 'caret' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'caret'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Soft\R-4.5.2\library\00LOCK\caret\libs\x64\caret.dll to
## C:\Soft\R-4.5.2\library\caret\libs\x64\caret.dll: Permission denied
## Warning: restored 'caret'
## package 'mice' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'mice'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Soft\R-4.5.2\library\00LOCK\mice\libs\x64\mice.dll to
## C:\Soft\R-4.5.2\library\mice\libs\x64\mice.dll: Permission denied
## Warning: restored 'mice'
## package 'car' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\alexa\AppData\Local\Temp\RtmpCqemLb\downloaded_packages
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
library(car)
## Loading required package: carData
Сформируйте свой собственный датасет с помощью функции 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 и основы предварительной подготовки данных при анализе данных.