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

options(repos = "https://cloud.r-project.org/")
install.packages(c("Rtools", "RANN", "caret", "mice", "car"))
## Устанавливаю пакеты в 'C:/Users/sgelo/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)
## пакет 'RANN' успешно распакован, MD5-суммы проверены
## пакет 'caret' успешно распакован, MD5-суммы проверены
## пакет 'mice' успешно распакован, MD5-суммы проверены
## пакет 'car' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\sgelo\AppData\Local\Temp\Rtmp6zI6Ox\downloaded_packages
library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
library(mice)
## 
## Присоединяю пакет: 'mice'
## Следующий объект скрыт от 'package:stats':
## 
##     filter
## Следующие объекты скрыты от 'package:base':
## 
##     cbind, rbind
library(car)
## Загрузка требуемого пакета: carData

Сформируем датасет

my_data <- c(15, 4, NA, 31, 0, NA, 200, 85, NA)
print(my_data)
## [1]  15   4  NA  31   0  NA 200  85  NA

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

cleaned_flags <- is.na(my_data)
print(cleaned_flags)
## [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE

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

data_table <- data.frame(
  column1 = c(NA, NA, "A", "B"),
  column2 = c(NA, 15, 4, NA)
)
print(data_table)
##   column1 column2
## 1    <NA>      NA
## 2    <NA>      15
## 3       A       4
## 4       B      NA

Очистка таблицы

filtered_table <- data_table[complete.cases(data_table),]
print(filtered_table)
##   column1 column2
## 3       A       4

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

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
impute_mean <- preProcess(airquality, method = c("center", "scale", "knnImpute"))
airquality_imputed_mean <- predict(impute_mean, airquality)
print(head(airquality_imputed_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_imputed_mean)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0
impute_median <- preProcess(airquality, method = c("center", "scale", "medianImpute"))
airquality_imputed_median <- predict(impute_median, airquality)
print(head(airquality_imputed_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_imputed_median)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

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

data1 <- c(2,5,3,-3,-2, 150)
data2 <- c(150,155,148,152, 2)
boxplot(data1)

boxplot(data2)

clean_data1 <- data1[!data1 %in% boxplot.stats(data1)$out]
clean_data2 <- data2[!data2 %in% boxplot.stats(data2)$out]
print(clean_data1)
## [1]  2  5  3 -3 -2
print(clean_data2)
## [1] 150 155 148 152

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

duplicates <- data.frame(
  colA = c(2, 3, 3, 4, 2),
  colB = c("X", "Y", "Y", "Z", "X")
)
print(duplicates)
##   colA colB
## 1    2    X
## 2    3    Y
## 3    3    Y
## 4    4    Z
## 5    2    X
unique_data <- duplicates[!duplicated(duplicates), ]
print(unique_data)
##   colA colB
## 1    2    X
## 2    3    Y
## 4    4    Z

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

imputation <- 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_complete <- complete(imputation)
print(head(airquality_complete))
##   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_complete)))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

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

set.seed(456)
var1 <- rnorm(70)
var2 <- var1 * 3 + rnorm(70, 0, 0.2)
response <- var1 + 3 * var2 + rnorm(70)
mc_data <- data.frame(response, var1, var2)
correlation_matrix <- cor(mc_data)
print(correlation_matrix)
##           response      var1      var2
## response 1.0000000 0.9938818 0.9956726
## var1     0.9938818 1.0000000 0.9983538
## var2     0.9956726 0.9983538 1.0000000
linear_model <- lm(response ~ var1 + var2, data = mc_data)
summary(linear_model)
## 
## Call:
## lm(formula = response ~ var1 + var2, data = mc_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.29059 -0.75401  0.01488  0.86468  1.68185 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.02885    0.11865  -0.243    0.809    
## var1        -0.45918    1.96922  -0.233    0.816    
## var2         3.45318    0.65590   5.265  1.6e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9807 on 67 degrees of freedom
## Multiple R-squared:  0.9914, Adjusted R-squared:  0.9911 
## F-statistic:  3849 on 2 and 67 DF,  p-value: < 2.2e-16
vif(linear_model)
##     var1     var2 
## 303.9884 303.9884