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