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

options(repos = "https://cran.r-project.org/")
install.packages(c("Rtools", "RANN", "caret", "mice", "car"))
## Устанавливаю пакеты в 'C:/Users/oleg3/AppData/Local/R/win-library/4.6'
## (потому что 'lib' не определено)
## Warning: пакет ''Rtools'' недоступен (for this version of R
## 
## Другая версия этого пакета может быть доступна для Вашей версии R из других источников,
## см. возможные варианты на
## https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages)
## package 'RANN' successfully unpacked and MD5 sums checked
## package 'caret' successfully unpacked and MD5 sums checked
## Warning: не могу удалить прежнюю установку пакета 'caret'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): проблема с копированием
## C:\Users\oleg3\AppData\Local\R\win-library\4.6\00LOCK\caret\libs\x64\caret.dll
## в C:\Users\oleg3\AppData\Local\R\win-library\4.6\caret\libs\x64\caret.dll:
## Permission denied
## Warning: восстановлен 'caret'
## package 'mice' successfully unpacked and MD5 sums checked
## Warning: не могу удалить прежнюю установку пакета 'mice'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): проблема с копированием
## C:\Users\oleg3\AppData\Local\R\win-library\4.6\00LOCK\mice\libs\x64\mice.dll в
## C:\Users\oleg3\AppData\Local\R\win-library\4.6\mice\libs\x64\mice.dll:
## Permission denied
## Warning: восстановлен 'mice'
## package 'car' successfully unpacked and MD5 sums checked
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\oleg3\AppData\Local\Temp\RtmpcvvpQq\downloaded_packages
library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
library(mice)
## 
## Присоединяю пакет: 'mice'
## Следующий объект скрыт от 'package:stats':
## 
##     filter
## Следующие объекты скрыты от 'package:base':
## 
##     cbind, rbind
library(car)
## Загрузка требуемого пакета: carData
## Registered S3 method overwritten by 'car':
##   method           from
##   na.action.merMod lme4

Задание №1

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

my_data <- c(1, 2, 3, NA, 4, NA, 5, 6, NA, 7)

Задание №2

При помощи функции is.na() очищу данные и выведу “чистый” датасет. Создам вектор с булевыми значениями, выведу его, затем удалю все NA-значения и выведу итоговый датасет.

na_positions <- is.na(my_data)
print(na_positions)
##  [1] FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE
 [1] FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE
clean_data <- my_data[!na_positions]
print(clean_data)
## [1] 1 2 3 4 5 6 7
[1] 1 2 3 4 5 6 7

Задание №3

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

my_table <- data.frame(
  numbers = c(1, 2, NA, 4, 5),
  text = c("A", NA, "C", "D", "E")
)
print(my_table)
##   numbers text
## 1       1    A
## 2       2 <NA>
## 3      NA    C
## 4       4    D
## 5       5    E
  numbers text
1       1    A
2       2 <NA>
3      NA    C
4       4    D
5       5    E

Очистищу неполные данные с помощью функции complete.cases().

clean_table <- my_table[complete.cases(my_table), ]
#Запятая , означает: [строки, колонки]
#До запятой - условие для отбора строк (только TRUE)
#После запятой - пусто, значит берем все колонки
print(clean_table)
##   numbers text
## 1       1    A
## 4       4    D
## 5       5    E
  numbers text
1       1    A
4       4    D
5       5    E

Задание №4

Проанализирую датасет airquality с пропусками из пакета caret.

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
  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
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0 

Получаем, что пропуски есть в столбцах Ozone (37 пропусков) и Solar.R (7). С использованием функции preProcess из пакета caret заполню пропуски предсказанными значениями.

Среднее:

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
     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
  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
  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
  Ozone Solar.R    Wind    Temp   Month     Day 
      0       0       0       0       0       0 

Задание №5

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

set1 <- c(1, 2, 3, 541, 5)
set2 <- c(10, 20, 3245, 40, 50)
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 5
[1] 1 2 3 5
print(clean_set2)
## [1] 10 20 40 50
[1] 10 20 40 50

Задание №6

Сгенерирую таблицу данных, в которой дублируются строки.

dup_table <- data.frame(
  col1 = c(1, 2, 2, 3, 2, 3),
  col2 = c("A", "B", "B", "C", "B", "A")
)
print(dup_table)
##   col1 col2
## 1    1    A
## 2    2    B
## 3    2    B
## 4    3    C
## 5    2    B
## 6    3    A
  col1 col2 
1    1    A
2    2    B
3    2    B
4    3    C
5    2    B
6    3    A

Удалю строки с использованием функции unique():

unique_table <- unique(dup_table)
print(unique_table)
##   col1 col2
## 1    1    A
## 2    2    B
## 4    3    C
## 6    3    A
    col1 col2 
  1    1    A 
  2    2    B 
  4    3    C 
  6    3    A

И с помощью функции duplicated():

no_dup_table <- dup_table[!duplicated(dup_table), ]
print(no_dup_table)
##   col1 col2
## 1    1    A
## 2    2    B
## 4    3    C
## 6    3    A

Сравню результаты.

Функция unique(dup_table) просто возвращает уникальные строки, не показывает процесс отбора. Удобна для быстрого результата.

Функция duplicated() же показывает, какие строки дублируются; только первые вхождения оставляет !duplicated(). Этот способ требует больше действий для решения поставленной задачи, но может быть полезен именно в поиске дубликатов.

Задание №7

Обработаю пропуски в данных с использованием пакета mice. Возьму для этого датасет airquality и сначала применю к нему mice.

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
    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
  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
  Ozone Solar.R    Wind    Temp   Month     Day
      0       0       0       0       0       0 

Вывод: в отличие от медианы, mice учитывает контекст, сохраняет вариативность и использует только значения, которые есть в исходном датасете.

Задание №8

Разберу пример с мультиколлинеарностью. Создам данные с мультиколлинеарностью (а именно x2 будет сильно коррелировать с x1).

set.seed(123)
x1 <- rnorm(100)
x2 <- x1 * 2 + rnorm(100, 0, 0.1)
x1x2_data <- data.frame(x1, x2)
print(x1x2_data)
##               x1          x2
## 1   -0.560475647 -1.19199195
## 2   -0.230177489 -0.43466661
## 3    1.558708314  3.09274744
## 4    0.070508391  0.10626252
## 5    0.129287735  0.16341361
## 6    1.715064987  3.42562720
## 7    0.460916206  0.84334197
## 8   -1.265061235 -2.69691666
## 9   -0.686852852 -1.41172836
## 10  -0.445661970 -0.79942428
## 11   1.224081797  2.39062890
## 12   0.359813827  0.78042409
## 13   0.400771451  0.63975463
## 14   0.110682716  0.21580924
## 15  -0.555841135 -1.05974155
## 16   1.786913137  3.60394161
## 17   0.497850478  1.00626858
## 18  -1.966617157 -3.99730491
## 19   0.701355902  1.31774137
## 20  -0.472791408 -1.04799569
## 21  -1.067823706 -2.12388275
## 22  -0.217974915 -0.53069729
## 23  -1.026004448 -2.10106464
## 24  -0.728891229 -1.48339168
## 25  -0.625039268 -1.06569234
## 26  -1.686693311 -3.43858161
## 27   0.837787044  1.69911275
## 28   0.153373118  0.31454232
## 29  -1.138136937 -2.37245954
## 30   1.253814921  2.50049903
## 31   0.426464221  0.99738353
## 32  -0.295071483 -0.54499256
## 33   0.895125661  1.79437461
## 34   0.878133488  1.71401729
## 35   0.821581082  1.43783744
## 36   0.688640254  1.49041423
## 37   0.553917654  0.96177130
## 38  -0.061911711 -0.04982867
## 39  -0.305962664 -0.42101497
## 40  -0.380471001 -0.90533132
## 41  -0.694706979 -1.31923552
## 42  -0.207917278 -0.44205430
## 43  -1.265396352 -2.68800712
## 44   2.168955965  4.18644517
## 45   1.207961998  2.25577038
## 46  -1.123108583 -2.29930782
## 47  -0.402884835 -0.95194523
## 48  -0.466655354 -0.86451903
## 49   0.779965118  1.76994113
## 50  -0.083369066 -0.29544118
## 51   0.253318514  0.58541091
## 52  -0.028546755  0.01981071
## 53  -0.042870457 -0.05252066
## 54   1.368602284  2.63636691
## 55  -0.225770986 -0.46348723
## 56   1.516470604  3.00490168
## 57  -1.548752804 -3.04120666
## 58   0.584613750  1.13198362
## 59   0.123854244  0.34540583
## 60   0.215941569  0.39442505
## 61   0.379639483  0.86455011
## 62  -0.502323453 -1.10956461
## 63  -0.333207384 -0.79243029
## 64  -1.018575383 -1.71304677
## 65  -1.071791226 -2.18526821
## 66   0.303528641  0.63688004
## 67   0.448209779  0.96007652
## 68   0.053004227  0.05763039
## 69   0.922267468  1.89622114
## 70   2.050084686  4.13706582
## 71  -0.491031166 -1.00360038
## 72  -2.309168876 -4.61180845
## 73   1.005738524  2.00807032
## 74  -0.709200763 -1.20555634
## 75  -0.688008616 -1.45015084
## 76   1.025571370  1.94154311
## 77  -0.284773007 -0.56576717
## 78  -1.220717712 -2.41038735
## 79   0.181303480  0.40625931
## 80  -0.138891362 -0.32361926
## 81   0.005764186 -0.09480424
## 82   0.385280401  0.89687932
## 83  -0.370660032 -0.77628510
## 84   0.644376549  1.20220181
## 85  -0.220486562 -0.46460108
## 86   0.331781964  0.64384634
## 87   1.096839013  2.30467006
## 88   0.435181491  0.87883671
## 89  -0.325931586 -0.57645779
## 90   1.148807618  2.24768604
## 91   0.993503856  2.00845224
## 92   0.548396960  1.06432533
## 93   0.238731735  0.48692182
## 94  -0.627906076 -1.34534849
## 95   1.360652449  2.59022474
## 96  -0.600259587 -1.00079784
## 97   2.187332993  4.43473687
## 98   1.532610626  2.94009412
## 99  -0.235700359 -0.53251731
## 100 -1.026420900 -2.17138981
              x1          x2 
1   -0.560475647 -1.19199195 
2   -0.230177489 -0.43466661 
3    1.558708314  3.09274744 
4    0.070508391  0.10626252 
5    0.129287735  0.16341361
...

Проверю корреляцию:

# линейная регрессия
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
           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
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 (фактор инфляции дисперсии): он показывает, во сколько раз увеличилась дисперсия коэффициента из-за мультиколлинеарности.

vif(model)
##       x1       x2 
## 356.4434 356.4434
      x1       x2
356.4434 356.4434 

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

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