R Markdown

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

my_data <- c(12, 5, NA, 9, 14, NA, 7) #Создание датасета
my_data
## [1] 12  5 NA  9 14 NA  7

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

clean_data <- my_data[!is.na(my_data)] #Удаление NA
clean_data
## [1] 12  5  9 14  7

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

df <- data.frame(
  ID = c(1, 2, 3, 4, 5),
  Name = c("Саня", "Андрей", NA, "Дима", "Илья"),
  Score = c(85, NA, 78, 90, NA)
) #Создание таблицы
df
##   ID   Name Score
## 1  1   Саня    85
## 2  2 Андрей    NA
## 3  3   <NA>    78
## 4  4   Дима    90
## 5  5   Илья    NA
clean_df <- df[complete.cases(df), ] #Очистка таблицы
clean_df
##   ID Name Score
## 1  1 Саня    85
## 4  4 Дима    90

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

library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
data(airquality)

#Заполнение NA медианой
preproc_median <- preProcess(airquality, method = "medianImpute")
filled_median <- predict(preproc_median, airquality)
head(filled_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
#Заполнение NA средним вручную
filled_mean <- airquality
for (col in names(filled_mean)) {
  if (is.numeric(filled_mean[[col]])) {
    filled_mean[[col]][is.na(filled_mean[[col]])] <- mean(filled_mean[[col]], na.rm = TRUE)
  }
}
head(filled_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

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

set.seed(123)

#Генерация данных с выбросами
data1 <- c(rnorm(20, 50, 10), 150)
data2 <- c(rnorm(20, 60, 8), 200)

#Построение графика для визуализации
boxplot(data1, main = "Data1")

boxplot(data2, main = "Data2")

#Функция для удаления выбросов
remove_outliers <- function(x) {
  qnt <- quantile(x, probs = c(0.25, 0.75))
  iqr <- IQR(x)
  x[x >= (qnt[1] - 1.5 * iqr) & x <= (qnt[2] + 1.5 * iqr)]
}

# Очистка от выбросов
clean_data1 <- remove_outliers(data1)
clean_data2 <- remove_outliers(data2)

clean_data1
##  [1] 44.39524 47.69823 65.58708 50.70508 51.29288 67.15065 54.60916 37.34939
##  [9] 43.13147 45.54338 62.24082 53.59814 54.00771 51.10683 44.44159 67.86913
## [17] 54.97850 30.33383 57.01356 45.27209
clean_data2
##  [1] 51.45741 58.25620 51.79196 54.16887 54.99969 46.50645 66.70230 61.22698
##  [9] 50.89490 70.03052 63.41171 57.63943 67.16101 67.02507 66.57265 65.50912
## [17] 64.43134 59.50471 57.55230 56.95623

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

#Создание датасета
df_dup <- data.frame(
  ID = c(1, 2, 1, 3, 4, 4),
  Name = c("Саня", "Андрей", "Саня", "Илья", "Дима", "Дима")
)
df_dup
##   ID   Name
## 1  1   Саня
## 2  2 Андрей
## 3  1   Саня
## 4  3   Илья
## 5  4   Дима
## 6  4   Дима
#Удаление дубликатов
df_unique <- unique(df_dup)
df_no_duplicates <- df_dup[!duplicated(df_dup), ]

df_unique
##   ID   Name
## 1  1   Саня
## 2  2 Андрей
## 4  3   Илья
## 5  4   Дима
df_no_duplicates
##   ID   Name
## 1  1   Саня
## 2  2 Андрей
## 4  3   Илья
## 5  4   Дима

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

library(mice)
## 
## Присоединяю пакет: 'mice'
## Следующий объект скрыт от 'package:stats':
## 
##     filter
## Следующие объекты скрыты от 'package:base':
## 
##     cbind, rbind
data(airquality)

init <- mice(airquality, maxit = 0) #Первичная инициализация mice            
predM <- init$predictorMatrix


#Проведение импутации методом PMM
imputed = mice(airquality, method = 'pmm', predictorMatrix = predM, m = 1)
## 
##  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
completed_data = complete(imputed)
head(completed_data)
##   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     1      82 14.3   56     5   5
## 6    28     255 14.9   66     5   6

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

library(car)
## Загрузка требуемого пакета: carData
set.seed(42)
x1 <- rnorm(100)
x2 <- x1 * 0.9 + rnorm(100, sd = 0.1) #x2 сильно коррелирует с x1
x3 <- rnorm(100)
y <- 3 + 2 * x1 + rnorm(100) #Зависимая переменная
df_multi <- data.frame(y, x1 = x1, x2 = x2, x3 = x3)

model <- lm(y ~ ., data = df_multi)#Линейная модель
summary(model)
## 
## Call:
## lm(formula = y ~ ., data = df_multi)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.7944 -0.5867 -0.1038  0.6188  2.3280 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.03150    0.08914  34.007   <2e-16 ***
## x1           1.97829    0.89795   2.203    0.030 *  
## x2           0.08829    0.98903   0.089    0.929    
## x3          -0.03161    0.08882  -0.356    0.723    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8867 on 96 degrees of freedom
## Multiple R-squared:  0.8582, Adjusted R-squared:  0.8538 
## F-statistic: 193.6 on 3 and 96 DF,  p-value: < 2.2e-16
vif(model)
##         x1         x2         x3 
## 110.093625 109.843447   1.027438

Коэффициенты:

x1 — значим (p = 0.030), но имеет большую стандартную ошибку (0.89795).

x2 — не значим (p = 0.929) почти идентичен x1.

x3 — не значим (p = 0.723).

x1 и x2 практически линейно зависимы друг от друга. Это вызывает перекрытие информации: модель не может надёжно оценить вклад каждой из них в y

Таким образом, в лабораторной работе были освоены ключевые инструменты анализа качества данных и предварительной подготовки выборки. Это критически важный этап в любой задаче анализа данных или машинного обучения, так как качество модели напрямую зависит от качества входных данных.