1. Library

library(car)
## Warning: package 'car' was built under R version 4.6.1
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.6.1
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.6.1
## corrplot 0.95 loaded
library(readxl)
library(MASS)
## Warning: package 'MASS' was built under R version 4.6.1
# Opsi C: Langsung mendefinisikan path file lengkap
file_excel <- "C:/Users/user/Downloads/Student Productivity & Digital Distraction Dataset.xlsx"

if (!file.exists(file_excel)) {
  stop("File Excel tidak ditemukan. Periksa kembali path file Anda.")
}
# Membaca sheet pertama dari file Excel
sheet_names <- excel_sheets(file_excel[1])
cat("Sheet yang tersedia:", sheet_names, "\n")
## Sheet yang tersedia: Data Produktivitas
data <- read_excel(file_excel[1], sheet = sheet_names[1])
# Konversi ke dataframe standar R
data <- as.data.frame(data)

# Informasi data
cat("File yang digunakan:", basename(file_excel[1]), "\n")
## File yang digunakan: Student Productivity & Digital Distraction Dataset.xlsx
cat("Jumlah baris:", nrow(data), "\n")
## Jumlah baris: 5000
cat("Jumlah kolom:", ncol(data), "\n")
## Jumlah kolom: 8
head(data)
##   Student_ID Age Study_Hours_Per_Week Social_Media_Hours_Per_Day
## 1          1  24                 17.6                        3.7
## 2          2  21                 18.2                        2.5
## 3          3  22                 17.8                        3.3
## 4          4  24                 15.4                        3.8
## 5          5  20                 14.0                        2.1
## 6          6  25                 14.2                        2.9
##   Sleep_Hours_Per_Night AI_Tool_Usage_Frequency Stress_Level  GPA
## 1                   5.6                       2            6 2.77
## 2                   5.8                       1            5 3.55
## 3                   6.0                       1            4 3.13
## 4                   7.1                       2            4 3.23
## 5                   7.1                       3            3 3.19
## 6                   8.9                       2            2 2.77
str(data)
## 'data.frame':    5000 obs. of  8 variables:
##  $ Student_ID                : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ Age                       : num  24 21 22 24 20 25 22 22 24 19 ...
##  $ Study_Hours_Per_Week      : num  17.6 18.2 17.8 15.4 14 14.2 14 20.7 18 0.3 ...
##  $ Social_Media_Hours_Per_Day: num  3.7 2.5 3.3 3.8 2.1 2.9 2.9 4.2 1.4 2.9 ...
##  $ Sleep_Hours_Per_Night     : num  5.6 5.8 6 7.1 7.1 8.9 7.5 3.8 7.3 5.3 ...
##  $ AI_Tool_Usage_Frequency   : num  2 1 1 2 3 2 3 1 2 1 ...
##  $ Stress_Level              : num  6 5 4 4 3 2 4 5 4 1 ...
##  $ GPA                       : num  2.77 3.55 3.13 3.23 3.19 2.77 3.51 3.04 3.83 2.08 ...
names(data)
## [1] "Student_ID"                 "Age"                       
## [3] "Study_Hours_Per_Week"       "Social_Media_Hours_Per_Day"
## [5] "Sleep_Hours_Per_Night"      "AI_Tool_Usage_Frequency"   
## [7] "Stress_Level"               "GPA"
dim(data)
## [1] 5000    8
summary(data)
##    Student_ID        Age        Study_Hours_Per_Week Social_Media_Hours_Per_Day
##  Min.   :   1   Min.   :18.00   Min.   : 0.00        Min.   :0.000             
##  1st Qu.:1251   1st Qu.:19.00   1st Qu.:11.47        1st Qu.:2.000             
##  Median :2500   Median :21.00   Median :14.90        Median :3.000             
##  Mean   :2500   Mean   :21.47   Mean   :14.86        Mean   :3.012             
##  3rd Qu.:3750   3rd Qu.:23.00   3rd Qu.:18.30        3rd Qu.:4.000             
##  Max.   :5000   Max.   :25.00   Max.   :34.60        Max.   :8.000             
##  Sleep_Hours_Per_Night AI_Tool_Usage_Frequency  Stress_Level        GPA       
##  Min.   : 3.000        Min.   :0.000           Min.   :1.000   Min.   :1.540  
##  1st Qu.: 6.200        1st Qu.:1.000           1st Qu.:3.000   1st Qu.:2.780  
##  Median : 7.000        Median :2.000           Median :4.000   Median :3.080  
##  Mean   : 7.025        Mean   :1.914           Mean   :3.676   Mean   :3.076  
##  3rd Qu.: 7.800        3rd Qu.:3.000           3rd Qu.:5.000   3rd Qu.:3.370  
##  Max.   :10.000        Max.   :3.000           Max.   :8.000   Max.   :4.000
colSums(is.na(data))
##                 Student_ID                        Age 
##                          0                          0 
##       Study_Hours_Per_Week Social_Media_Hours_Per_Day 
##                          0                          0 
##      Sleep_Hours_Per_Night    AI_Tool_Usage_Frequency 
##                          0                          0 
##               Stress_Level                        GPA 
##                          0                          0
cat("1. STATISTIK DESKRIPTIF\n")
## 1. STATISTIK DESKRIPTIF
# Memilih variabel numerik yang digunakan dalam model regresi
data_korelasi <- data.frame(
  GPA                        = data$GPA,
  Study_Hours                = data$Study_Hours_Per_Week,
  Social_Media               = data$Social_Media_Hours_Per_Day,
  Sleep_Hours                = data$Sleep_Hours_Per_Night,
  AI_Usage                   = data$AI_Tool_Usage_Frequency,
  Stress_Level               = data$Stress_Level
)
# Matriks korelasi
cat("\nMatriks Korelasi:\n")
## 
## Matriks Korelasi:
cor_matrix <- cor(data_korelasi)
print(round(cor_matrix, 3))
##                 GPA Study_Hours Social_Media Sleep_Hours AI_Usage Stress_Level
## GPA           1.000       0.575       -0.333       0.102    0.312        0.195
## Study_Hours   0.575       1.000       -0.014      -0.014   -0.011        0.416
## Social_Media -0.333      -0.014        1.000       0.017    0.006       -0.003
## Sleep_Hours   0.102      -0.014        0.017       1.000    0.006       -0.380
## AI_Usage      0.312      -0.011        0.006       0.006    1.000        0.010
## Stress_Level  0.195       0.416       -0.003      -0.380    0.010        1.000
# Visualisasi matriks korelasi
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  col = colorRampPalette(c("blue", "white", "red"))(200),
  addCoef.col = "darkblue",
  tl.col = "darkblue",
  tl.srt = 45,
  tl.cex = 0.8,
  title = "Matriks Korelasi Antar Variabel",
  mar = c(0, 0, 2, 0)
)

# Scatter plot matrix
pairs(
  data_korelasi,
  main = "Scatter Plot Matrix",
  pch = 19
)

cat("\n\n")
cat("3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION\n")
## 3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION
cat("\n")
# Fit model MLR dengan GPA sebagai variabel dependen
model <- lm(
  GPA ~ Study_Hours_Per_Week + Social_Media_Hours_Per_Day + 
        Sleep_Hours_Per_Night + AI_Tool_Usage_Frequency + Stress_Level,
  data = data
)
# Ringkasan koefisien regresi
cat("\nKoefisien Regresi:\n")
## 
## Koefisien Regresi:
coef_df <- data.frame(
  Variabel = names(coef(model)),
  Koefisien = round(coef(model), 4),
  Std_Error = round(summary(model)$coefficients[, 2], 4),
  t_value = round(summary(model)$coefficients[, 3], 4),
  p_value = round(summary(model)$coefficients[, 4], 4)
)
print(coef_df, row.names = FALSE)
##                    Variabel Koefisien Std_Error  t_value p_value
##                 (Intercept)    2.0798    0.0353  58.8640  0.0000
##        Study_Hours_Per_Week    0.0496    0.0009  54.6278  0.0000
##  Social_Media_Hours_Per_Day   -0.0971    0.0028 -34.6814  0.0000
##       Sleep_Hours_Per_Night    0.0399    0.0037  10.6501  0.0000
##     AI_Tool_Usage_Frequency    0.1468    0.0044  33.6365  0.0000
##                Stress_Level   -0.0027    0.0040  -0.6852  0.4932
# Interval kepercayaan 95%
cat("\nInterval Kepercayaan 95%:\n")
## 
## Interval Kepercayaan 95%:
ci <- round(confint(model, level = 0.95), 4)
colnames(ci) <- c("Batas_Bawah", "Batas_Atas")
print(ci)
##                            Batas_Bawah Batas_Atas
## (Intercept)                     2.0105     2.1490
## Study_Hours_Per_Week            0.0478     0.0514
## Social_Media_Hours_Per_Day     -0.1026    -0.0916
## Sleep_Hours_Per_Night           0.0326     0.0472
## AI_Tool_Usage_Frequency         0.1382     0.1554
## Stress_Level                   -0.0105     0.0050
cat("4. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 4. UJI SIGNIFIKANSI SIMULTAN (UJI F)
f_stat <- summary(model)$fstatistic
f_value <- f_stat[1]
df1 <- f_stat[2]
df2 <- f_stat[3]
f_pvalue <- pf(f_value, df1, df2, lower.tail = FALSE)

cat("\nHipotesis:\n")
## 
## Hipotesis:
cat("H0: Seluruh koefisien beta = 0 (Model tidak signifikan)\n")
## H0: Seluruh koefisien beta = 0 (Model tidak signifikan)
cat("H1: Minimal ada satu beta j != 0 (Model signifikan)\n")
## H1: Minimal ada satu beta j != 0 (Model signifikan)
cat("\nHasil Uji F:\n")
## 
## Hasil Uji F:
cat("F-statistic:", round(f_value, 4), "\n")
## F-statistic: 1225.572
cat("df1:", df1, "\n")
## df1: 5
cat("df2:", df2, "\n")
## df2: 4994
cat("p-value:", format(f_pvalue, scientific = TRUE), "\n")
## p-value: 0e+00
if (f_pvalue < 0.05) {
  cat("Kesimpulan: Tolak H0 -> Model signifikan pada alpha = 5%\n")
} else {
  cat("Kesimpulan: Gagal Tolak H0 -> Model tidak signifikan\n")
}
## Kesimpulan: Tolak H0 -> Model signifikan pada alpha = 5%
cat("5. UJI SIGNIFIKANSI PARSIAL (UJI t)\n")
## 5. UJI SIGNIFIKANSI PARSIAL (UJI t)
t_test <- summary(model)$coefficients

t_table <- data.frame(
  Variabel = rownames(t_test),
  Koefisien = round(t_test[, 1], 4),
  t_value = round(t_test[, 3], 4),
  p_value = round(t_test[, 4], 4)
)
print(t_table, row.names = FALSE)
##                    Variabel Koefisien  t_value p_value
##                 (Intercept)    2.0798  58.8640  0.0000
##        Study_Hours_Per_Week    0.0496  54.6278  0.0000
##  Social_Media_Hours_Per_Day   -0.0971 -34.6814  0.0000
##       Sleep_Hours_Per_Night    0.0399  10.6501  0.0000
##     AI_Tool_Usage_Frequency    0.1468  33.6365  0.0000
##                Stress_Level   -0.0027  -0.6852  0.4932
cat("\nKeputusan pada alpha = 5%:\n")
## 
## Keputusan pada alpha = 5%:
for (i in 2:nrow(t_test)) {
  if (t_test[i, 4] < 0.05) {
    cat(rownames(t_test)[i], ": Tolak H0 -> signifikan\n")
  } else {
    cat(rownames(t_test)[i], ": Gagal Tolak H0 -> tidak signifikan\n")
  }
}
## Study_Hours_Per_Week : Tolak H0 -> signifikan
## Social_Media_Hours_Per_Day : Tolak H0 -> signifikan
## Sleep_Hours_Per_Night : Tolak H0 -> signifikan
## AI_Tool_Usage_Frequency : Tolak H0 -> signifikan
## Stress_Level : Gagal Tolak H0 -> tidak signifikan
cat("6. KOEFISIEN DETERMINASI\n")
## 6. KOEFISIEN DETERMINASI
r_squared <- summary(model)$r.squared
adj_r_squared <- summary(model)$adj.r.squared

cat("\nR-squared:", round(r_squared, 4), "\n")
## 
## R-squared: 0.551
cat("Adjusted R-squared:", round(adj_r_squared, 4), "\n")
## Adjusted R-squared: 0.5505
cat("7. UJI ASUMSI RESIDUAL\n")
## 7. UJI ASUMSI RESIDUAL
# 7.1 Normalitas (Menggunakan sampel acak jika N besar agar Shapiro-Wilk tidak error)
set.seed(123)
res_sample <- residuals(model)
if(length(res_sample) > 5000) {
  res_sample <- sample(res_sample, 5000)
}
shapiro_test <- shapiro.test(res_sample)
cat("Shapiro-Wilk W =", round(shapiro_test$statistic, 4), "p-value =", format(shapiro_test$p.value, scientific = TRUE), "\n")
## Shapiro-Wilk W = 0.9994 p-value = 9.327904e-02
# 7.2 Heteroskedastisitas (Breusch-Pagan)
bp_test <- bptest(model)
cat("Breusch-Pagan BP =", round(bp_test$statistic, 4), "p-value =", format(bp_test$p.value, scientific = TRUE), "\n")
## Breusch-Pagan BP = 8.341 p-value = 1.384182e-01
# 7.3 Autokorelasi (Durbin-Watson)
dw_test <- dwtest(model)
cat("Durbin-Watson DW =", round(dw_test$statistic, 4), "p-value =", format(dw_test$p.value, scientific = TRUE), "\n")
## Durbin-Watson DW = 2.0128 p-value = 6.749756e-01
# 7.4 Multikolinearitas (VIF)
vif_value <- vif(model)
print(round(vif_value, 4))
##       Study_Hours_Per_Week Social_Media_Hours_Per_Day 
##                     1.2463                     1.0006 
##      Sleep_Hours_Per_Night    AI_Tool_Usage_Frequency 
##                     1.2046                     1.0006 
##               Stress_Level 
##                     1.4560
stepwise_model <- step(
  model,
  direction = "both",
  trace = 0
)

cat("\nModel hasil Stepwise Selection:\n")
## 
## Model hasil Stepwise Selection:
print(formula(stepwise_model))
## GPA ~ Study_Hours_Per_Week + Social_Media_Hours_Per_Day + Sleep_Hours_Per_Night + 
##     AI_Tool_Usage_Frequency
summary(stepwise_model)
## 
## Call:
## lm(formula = GPA ~ Study_Hours_Per_Week + Social_Media_Hours_Per_Day + 
##     Sleep_Hours_Per_Night + AI_Tool_Usage_Frequency, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.06467 -0.19955  0.00269  0.19452  1.08362 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 2.0666664  0.0296989   69.59   <2e-16 ***
## Study_Hours_Per_Week        0.0493422  0.0008138   60.63   <2e-16 ***
## Social_Media_Hours_Per_Day -0.0971079  0.0027991  -34.69   <2e-16 ***
## Sleep_Hours_Per_Night       0.0409551  0.0034140   12.00   <2e-16 ***
## AI_Tool_Usage_Frequency     0.1467457  0.0043634   33.63   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2894 on 4995 degrees of freedom
## Multiple R-squared:  0.5509, Adjusted R-squared:  0.5506 
## F-statistic:  1532 on 4 and 4995 DF,  p-value: < 2.2e-16