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