library(readr)
## Warning: пакет 'readr' был собран под R версии 4.5.2
library(haven)
## Warning: пакет 'haven' был собран под R версии 4.5.2
Student = read_csv(file.choose())
## Rows: 10000 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Extracurricular_Activities
## dbl (5): Hours_Studied, Previous_Scores, Sleep_Hours, Sample_Question_Papers...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Student
## # A tibble: 10,000 × 6
##    Hours_Studied Previous_Scores Extracurricular_Activities Sleep_Hours
##            <dbl>           <dbl> <chr>                            <dbl>
##  1             7              99 Yes                                  9
##  2             4              82 No                                   4
##  3             8              51 Yes                                  7
##  4             5              52 Yes                                  5
##  5             7              75 No                                   8
##  6             3              78 No                                   9
##  7             7              73 Yes                                  5
##  8             8              45 Yes                                  4
##  9             5              77 No                                   8
## 10             4              89 No                                   4
## # ℹ 9,990 more rows
## # ℹ 2 more variables: Sample_Question_Papers_Practiced <dbl>,
## #   Performance_Index <dbl>
mod <- lm(Performance_Index ~ Hours_Studied + Previous_Scores + 
          Extracurricular_Activities + Sleep_Hours + 
          Sample_Question_Papers_Practiced, 
          data = Student)

summary(mod)
## 
## Call:
## lm(formula = Performance_Index ~ Hours_Studied + Previous_Scores + 
##     Extracurricular_Activities + Sleep_Hours + Sample_Question_Papers_Practiced, 
##     data = Student)
## 
## 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_ActivitiesYes      0.612898   0.040781   15.03   <2e-16 ***
## Sleep_Hours                        0.480560   0.012022   39.97   <2e-16 ***
## Sample_Question_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

Модель объясняет 98,88% дисперсии (разброса) успеваемости студентов (Multiple R-squared = 0.9888)

Уравнение регрессии Performance_Index = -34.076 + 2.853 * Hours_Studied + 1.018 * Previous_Scores + 0.613 * Extracurricular_Activities_Yes + 0.481 * Sleep_Hours + 0.194 * Sample_Question_Papers_Practiced

Hours_Studied +2.853 Самый сильный положительный эффект. Каждый 1 дополнительный час занятий в неделю увеличивает Индекс Успеваемости на 2.85 балла (при прочих равных условиях).

Previous_Scores +1.018 Предыдущие оценки. Увеличение предыдущего среднего балла на 1 единицу повышает текущий индекс на 1.018 балла. Связь почти линейная.

Extracurricular_ActivitiesYes +0.613 Внеклассные занятия. Студенты, которые занимаются дополнительно (Yes), имеют в среднем на 0.613 балла выше, чем те, кто не занимается (No).

Sleep_Hours +0.481 Сон. Каждый дополнительный час сна в сутки связан с повышением успеваемости на 0.48 балла.

Sample_Question_Papers_Practiced +0.194 Решение пробных тестов. Каждый дополнительный 1 решенный пробный вариант повышает результат на 0.19 балла.

library(caret)
## Warning: пакет 'caret' был собран под R версии 4.5.3
## Загрузка требуемого пакета: ggplot2
## Warning: пакет 'ggplot2' был собран под R версии 4.5.2
## Загрузка требуемого пакета: lattice
x <- Student[, sapply(Student, is.numeric)]
y <- Student$`Performance_Index`
featurePlot(x = x, y = y)

Точки собраны в вертикальные «столбики» — значит, студенты имеют ограниченное число уникальных значений часов сна (целые числа от 4 до 9). Нет явной тенденции: увеличение часов сна не гарантирует рост успеваемости.

Sample_Question_Papers_Prac (практика с образцами тестов): Аналогично Sleep_Hours — дискретные значения (от 0 до 8). Слабая или отсутствующая корреляция с Performance_Index.

Performance_Index (само на себя). Диагональная линия показывает идеальную корреляцию — это контрольная визуализация, подтверждающая корректность построения графика

Hours_Studied (часы учёбы):

Значения от 2 до 10 часов. Слабая положительная тенденция: больше часов учёбы — чуть выше успеваемость

Previous_Scores (предыдущие оценки): Явная положительная линейная зависимость: чем выше предыдущие оценки, тем выше Performance_Index. Самая сильная корреляция среди всех признаков

library(caret)
featurePlot(x = Student[ , c("Hours_Studied", "Previous_Scores", "Sleep_Hours")], y = Student$Performance_Index)

mod <- lm(
  Performance_Index ~ Hours_Studied +
    Previous_Scores +
    Extracurricular_Activities +
    Sleep_Hours +
    Sample_Question_Papers_Practiced,
  data = Student
)
par(mfrow = c(2, 2))
plot(mod)

Residuals vs Fitted (Остатки vs Предсказанные значения) Остатки разбросаны вокруг нулевой линии (горизонтальная чёрная линия), без явного тренда. означает гомоскедастичность

Q-Q Residuals (QQ-график остатков) Точки лежат близко к диагональной линии — это признак нормального распределения остатков. Небольшое отклонение в хвостах (крайние точки)

Scale-Location (Масштаб-Расположение) Линия близка к горизонтальной, без роста или падения с увеличением предсказанных значений.

Residuals vs Leverage (Остатки vs Леверидж) есть наблюдения с высоким левериджем, которые могут искажать результаты

hist(resid(mod),
     breaks = 30,
     main = "Гистограмма остатков",
     xlab = "Остатки")

Гистограмма имеет симметричную колоколообразную форму Пик (максимальная частота) находится около нуля, что означает, что большинство остатков близки к нулю

library(car)
## Warning: пакет 'car' был собран под R версии 4.5.2
## Загрузка требуемого пакета: carData
## Warning: пакет 'carData' был собран под R версии 4.5.2
vif(mod)
##                    Hours_Studied                  Previous_Scores 
##                         1.000478                         1.000326 
##       Extracurricular_Activities                      Sleep_Hours 
##                         1.000802                         1.000600 
## Sample_Question_Papers_Practiced 
##                         1.000557

Все значения VIF практически равны 1.0

Обычно о проблемах с мультиколлинеарностью говорят, когда VIF > 5 или VIF > 10.

sjPlot::tab_model(mod)
  Performance_Index
Predictors Estimates CI p
(Intercept) -34.08 -34.32 – -33.83 <0.001
Hours Studied 2.85 2.84 – 2.87 <0.001
Previous Scores 1.02 1.02 – 1.02 <0.001
Extracurricular
Activities [Yes]
0.61 0.53 – 0.69 <0.001
Sleep Hours 0.48 0.46 – 0.50 <0.001
Sample Question Papers
Practiced
0.19 0.18 – 0.21 <0.001
Observations 10000
R2 / R2 adjusted 0.989 / 0.989

Предыдущие оценки (Previous Scores): Оценка: 1.02 CI: 1.02 – 1.02

Внеклассные занятия (Extracurricular Activities [Yes]):

Оценка: 0.61

CI: 0.53 – 0.69

Sample Question Papers Practiced (Решено пробных вариантов) Оценка: 0.19

CI: 0.18 – 0.21

Sleep Hours (Часы сна) Оценка: 0.48

CI: 0.46 – 0.50

Hours Studied (Часы учебы) Оценка: 2.85

CI: 2.84 – 2.87

В результате регрессионного анализа (N = 10 000) было установлено, что все включенные предикторы статистически значимо (p < 0.001) влияют на индекс успеваемости.