library(tidyverse) # Для обработки данных (dplyr, ggplot2)
## Warning: пакет 'tidyverse' был собран под R версии 4.5.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.1.6
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(DataExplorer) # Для быстрого анализа и визуализации (introduce, plot_intro)
## Warning: пакет 'DataExplorer' был собран под R версии 4.5.3
library(caret) # Для проверки мультиколлинеарности (VIF)
## Warning: пакет 'caret' был собран под R версии 4.5.3
## Загрузка требуемого пакета: lattice
##
## Присоединяю пакет: 'caret'
##
## Следующий объект скрыт от 'package:purrr':
##
## lift
# Загрузка данных
data <- read.csv("C:/Users/nudar/Downloads/Student_Performance.csv")
names(data) <- c("Hours_Studied", "Previous_Scores", "Extracurricular", "Sleep_Hours", "Papers_Practiced", "Performance_Index")
# Быстрый обзор данных
library(DataExplorer)
introduce(data)
## rows columns discrete_columns continuous_columns all_missing_columns
## 1 10000 6 1 5 0
## total_missing_values complete_rows total_observations memory_usage
## 1 0 10000 60000 322344
plot_intro(data)
график, “Memory Usage: 354.5 Kb”, представляет собой горизонтальную столбчатую диаграмму, демонстрирующую распределение использования памяти по различным метрикам. Столбец “Complete Rows” (Полные строки) занимает наибольшую долю, составляя 100% использования памяти, что указывает на то, что весь объем памяти выделен для обработки полных строк данных. Столбец “Continuous Columns” (Непрерывные столбцы) также занимает значительную часть, 83%, подчеркивая важность непрерывных данных в анализе. “Discrete Columns” (Дискретные столбцы) используют 17% ресурсов, а “All Missing Columns” (Все пропущенные столбцы) и “Missing Observations” (Пропущенные наблюдения) практически не требуют памяти, с показателями 0%, что говорит об отсутствии или минимальном количестве таких данных.
# Проверка на пропущенные значения
sum(is.na(data))
## [1] 0
# Преобразование категориальной переменной в числовую (фактор -> 0/1)
data$Extracurricular <- as.factor(data$Extracurricular)
data$Extracurricular_Num <- as.numeric(data$Extracurricular) - 1
# 'No' станет 0, 'Yes' станет 1
# Проверим распределение целевой переменной
library(tidyverse)
ggplot(data, aes(x = Performance_Index)) +
geom_histogram(binwidth = 5, fill = "steelblue", color = "black") +
labs(title = "Распределение Индекса Успеваемости", x = "Performance Index", y = "Количество студентов")
# Строим модель множественной линейной регрессии
model <- lm(Performance_Index ~ Hours_Studied + Previous_Scores + Extracurricular_Num + Sleep_Hours + Papers_Practiced, data = data)
# Выводим краткую сводку модели
summary(model)
##
## Call:
## lm(formula = Performance_Index ~ Hours_Studied + Previous_Scores +
## Extracurricular_Num + Sleep_Hours + Papers_Practiced, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.6333 -1.3684 -0.0311 1.3556 8.7932
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -34.075588 0.127143 -268.01 <2e-16 ***
## Hours_Studied 2.852982 0.007873 362.35 <2e-16 ***
## Previous_Scores 1.018434 0.001175 866.45 <2e-16 ***
## Extracurricular_Num 0.612898 0.040781 15.03 <2e-16 ***
## Sleep_Hours 0.480560 0.012022 39.97 <2e-16 ***
## Papers_Practiced 0.193802 0.007110 27.26 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.038 on 9994 degrees of freedom
## Multiple R-squared: 0.9888, Adjusted R-squared: 0.9887
## F-statistic: 1.757e+05 on 5 and 9994 DF, p-value: < 2.2e-16
График, “Распределение Индекса Успеваемости”, представляет собой гистограмму, показывающую частотное распределение индекса успеваемости студентов. По оси X отложен сам “Performance Index” (Индекс успеваемости), а по оси Y — “Количество студентов”. Гистограмма имеет колоколообразную форму, с максимальной частотой студентов, наблюдаемой в диапазоне индексов примерно от 50 до 80. Распределение выглядит приблизительно симметричным, с небольшим смещением в правую сторону, что может указывать на небольшое количество студентов с очень высокими показателями успеваемости. Диапазон значений индекса успеваемости простирается от 0 до 100.
Это уравнение получившейся модели: Performance_Index = -34.08 + 2.85 * Hours_Studied + 1.02 * Previous_Scores + 0.61 * Extracurricular_Num + 0.48 * Sleep_Hours + 0.19 * Papers_Practiced
Intercept (-34.08): Базовое значение, не имеющее практического смысла (успеваемость гипотетического студента с нулевыми показателями). Hours_Studied (2.85): Самый сильный фактор! Каждый дополнительный час учёбы повышает итоговый индекс в среднем на 2.85 пункта. Это огромный вклад. Previous_Scores (1.02): Второй по важности фактор. Каждый балл за предыдущие экзамены добавляет 1.02 пункта к итоговому результату. Sleep_Hours (0.48): Каждый дополнительный час сна добавляет 0.48 пункта. Сон — важный фактор успеха. Papers_Practiced (0.19): Решение одной пробной работы добавляет 0.19 пункта. Extracurricular_Num (0.61): Участие во внеклассной деятельности (Yes) добавляет 0.61 пункта к результату по сравнению с теми, кто не участвует (No)
# Проверяем VIF для всех предикторов
library(car)
## Warning: пакет 'car' был собран под R версии 4.5.3
## Загрузка требуемого пакета: carData
##
## Присоединяю пакет: 'car'
## Следующий объект скрыт от 'package:dplyr':
##
## recode
## Следующий объект скрыт от 'package:purrr':
##
## some
vif_values <- vif(model)
data.frame(Variable = names(vif_values), VIF = vif_values)
## Variable VIF
## Hours_Studied Hours_Studied 1.000478
## Previous_Scores Previous_Scores 1.000326
## Extracurricular_Num Extracurricular_Num 1.000802
## Sleep_Hours Sleep_Hours 1.000600
## Papers_Practiced Papers_Practiced 1.000557
Мультиколлинеарность (VIF): Результаты vif_values идеальны: Все значения VIF очень близки к 1 (от 1.0003 до 1.0008). Вывод: Мультиколлинеарность отсутствует. Факторы (часы учёбы, сон, прошлые оценки) не дублируют информацию друг друга, а дают независимый вклад. Коэффициенты модели надёжны.
plot(model, which = 1) # Проверка на гомоскедастичность (равномерность разброса)
график “Residuals vs Fitted Большинство точек сконцентрировано вблизи горизонтальной линии нулевых остатков, что свидетельствует о хорошем согласовании модели с данными. Отсутствие выраженных закономерностей (например, криволинейных тенденций или расширения разброса с увеличением Fitted Values) подтверждает адекватность выбранной модели. Несколько точек находятся далеко от основной массы данных (особенно точки с метками 6977 и 7469), что указывает на возможные выбросы или аномалии, заслуживающие отдельного внимания.
plot(model, which = 2) # Проверка на нормальность остатков
график, “Q-Q Residuals” используется для визуальной оценки того, насколько хорошо данные соответствуют теоретическому распределению, в данном случае — нормальному. По оси X отложены теоретические квантили, а по оси Y — стандартизированные остатки. Большинство точек данных располагаются вдоль пунктирной линии, что свидетельствует о хорошем соответствии остатков нормальному распределению. Незначительные отклонения точек на краях графика могут указывать на легкие несоответствия нормальности в крайних значениях. Указанные на графике числа (например, 687, 746, 6977), вероятно, относятся к идентификаторам наблюдений с наибольшими отклонениями.
Ключевые метрики модели: Multiple R-squared: 0.9888 Модель объясняет 98.88% вариации индекса успеваемости. Это невероятно высокий показатель. Он означает, что выбранные вами факторы почти полностью определяют успех студента в вашей выборке. Adjusted R-squared: 0.9887 Скорректированный показатель практически не отличается от обычного, что подтверждает: все переменные в модели важны и не являются избыточными. F-statistic: 1.757e+05Огромное значение F-статистики и p-value < 2.2e-16 говорят о том, что модель в целом является статистически значимой. Гипотеза о том, что все коэффициенты равны нулю, уверенно отвергается.