Kharisma Adhi Wibowo (23031554175)

Kevin Davindio Atha (23031554173)

Iqbal Syahdana Arkan (23031554079)

Analisis Deskriptif

Analisis statistika deskriptif adalah langkah awal dalam analisis data yang bertujuan untuk mendeskripsikan atau merangkum karakteristik utama dari data.

data <- read.csv("C:/Users/hp/Downloads/student_habits_performance.csv")
summary(data)
##   student_id             age           gender          study_hours_per_day
##  Length:1000        Min.   :17.00   Length:1000        Min.   :0.00       
##  Class :character   1st Qu.:18.75   Class :character   1st Qu.:2.60       
##  Mode  :character   Median :20.00   Mode  :character   Median :3.50       
##                     Mean   :20.50                      Mean   :3.55       
##                     3rd Qu.:23.00                      3rd Qu.:4.50       
##                     Max.   :24.00                      Max.   :8.30       
##  social_media_hours netflix_hours   part_time_job      attendance_percentage
##  Min.   :0.000      Min.   :0.000   Length:1000        Min.   : 56.00       
##  1st Qu.:1.700      1st Qu.:1.000   Class :character   1st Qu.: 78.00       
##  Median :2.500      Median :1.800   Mode  :character   Median : 84.40       
##  Mean   :2.506      Mean   :1.820                      Mean   : 84.13       
##  3rd Qu.:3.300      3rd Qu.:2.525                      3rd Qu.: 91.03       
##  Max.   :7.200      Max.   :5.400                      Max.   :100.00       
##   sleep_hours    diet_quality       exercise_frequency parental_education_level
##  Min.   : 3.20   Length:1000        Min.   :0.000      Length:1000             
##  1st Qu.: 5.60   Class :character   1st Qu.:1.000      Class :character        
##  Median : 6.50   Mode  :character   Median :3.000      Mode  :character        
##  Mean   : 6.47                      Mean   :3.042                              
##  3rd Qu.: 7.30                      3rd Qu.:5.000                              
##  Max.   :10.00                      Max.   :6.000                              
##  internet_quality   mental_health_rating extracurricular_participation
##  Length:1000        Min.   : 1.000       Length:1000                  
##  Class :character   1st Qu.: 3.000       Class :character             
##  Mode  :character   Median : 5.000       Mode  :character             
##                     Mean   : 5.438                                    
##                     3rd Qu.: 8.000                                    
##                     Max.   :10.000                                    
##    exam_score    
##  Min.   : 18.40  
##  1st Qu.: 58.48  
##  Median : 70.50  
##  Mean   : 69.60  
##  3rd Qu.: 81.33  
##  Max.   :100.00

Uji Asumsi

normalitas univariat

Uji normalitas univariat digunakan untuk melihat apakah masing masing variabel dalam dataset memiliki sebaran data yang mendekati normal. Uji Normalitas univariat dilakukan dengan menghitung nilai skewness dan kurtosis. Dan hasilnya Sebagian besar variabel dalam dataset memiliki distribusi yang normal. Hanya dua variabel yang menunjukkan bentuk distribusi berbeda sedikit: • exercise_frequency: distribusi agak datar. • mental_health_rating: distribusi agak tinggi. Namun keduanya masih dalam batas toleransi dan tidak menunjukkan penyimpangan ekstrem dari normalitas.

library(MVN)
## Warning: package 'MVN' was built under R version 4.4.3
data_numeric <-data[sapply(data,is.numeric)]
data_numeric$student_id <- NULL
mvn(data_numeric, mvnTest= "mardia")
## $multivariateNormality
##              Test         Statistic              p value Result
## 1 Mardia Skewness  236.738894247668 0.000212260768262173     NO
## 2 Mardia Kurtosis -5.09967966167901 3.40228794248887e-07     NO
## 3             MVN              <NA>                 <NA>     NO
## 
## $univariateNormality
##               Test              Variable Statistic   p value Normality
## 1 Anderson-Darling          age            20.2610  <0.001      NO    
## 2 Anderson-Darling  study_hours_per_day     0.3561  0.4573      YES   
## 3 Anderson-Darling  social_media_hours      0.7138  0.0624      YES   
## 4 Anderson-Darling     netflix_hours        2.5728  <0.001      NO    
## 5 Anderson-Darling attendance_percentage    2.1869  <0.001      NO    
## 6 Anderson-Darling      sleep_hours         0.6788  0.0761      YES   
## 7 Anderson-Darling  exercise_frequency     24.9606  <0.001      NO    
## 8 Anderson-Darling mental_health_rating    16.0929  <0.001      NO    
## 9 Anderson-Darling      exam_score          1.5247   6e-04      NO    
## 
## $Descriptives
##                          n    Mean   Std.Dev Median  Min   Max   25th   75th
## age                   1000 20.4980  2.308100   20.0 17.0  24.0 18.750 23.000
## study_hours_per_day   1000  3.5501  1.468890    3.5  0.0   8.3  2.600  4.500
## social_media_hours    1000  2.5055  1.172422    2.5  0.0   7.2  1.700  3.300
## netflix_hours         1000  1.8197  1.075118    1.8  0.0   5.4  1.000  2.525
## attendance_percentage 1000 84.1317  9.399246   84.4 56.0 100.0 78.000 91.025
## sleep_hours           1000  6.4701  1.226377    6.5  3.2  10.0  5.600  7.300
## exercise_frequency    1000  3.0420  2.025423    3.0  0.0   6.0  1.000  5.000
## mental_health_rating  1000  5.4380  2.847501    5.0  1.0  10.0  3.000  8.000
## exam_score            1000 69.6015 16.888564   70.5 18.4 100.0 58.475 81.325
##                               Skew    Kurtosis
## age                    0.008411845 -1.22246176
## study_hours_per_day    0.054090451 -0.06724233
## social_media_hours     0.119446027 -0.10540417
## netflix_hours          0.236443407 -0.44181525
## attendance_percentage -0.237097471 -0.39996237
## sleep_hours            0.091209703 -0.22479167
## exercise_frequency    -0.031827267 -1.27959239
## mental_health_rating   0.037697343 -1.19228210
## exam_score            -0.155881916 -0.42895478

normalitas multivariat

Uji normalitas multivariat digunakan untuk melihat apakah gabungan dari semua variabel dalam model memiliki sebaran data yang normal. Uji normalitas multivariat dilakukan karena SEM menggunakan matriks kovarians yang mengasumsikan normalitas multivariat agar hasil estimasinya kuat. Dengan menggunakan metode mardia, dataset tidak memenuhi uji normalitas multivariat

cat("=== Normalitas Multivariat (Mardia Test) ===\n")
## === Normalitas Multivariat (Mardia Test) ===
result <- mvn(data_numeric, mvnTest = "mardia")
print(result$multivariateNormality)
##              Test         Statistic              p value Result
## 1 Mardia Skewness  236.738894247668 0.000212260768262173     NO
## 2 Mardia Kurtosis -5.09967966167901 3.40228794248887e-07     NO
## 3             MVN              <NA>                 <NA>     NO

cek korelasi antar variabel

karena tidak memenuhi normalitas multivariat peneliti mencoba melihat korelasi antar variabel, dan hasilnya korelasi antar variabel begitu kecil, hanya korelasi antara study_hours_per_day dan exam_score yang memiliki nilai yang baik yaitu 0.8, selain itu nilai korelasi antar variabel sangat kecil bahkan mendekati nol

cor(data_numeric)
##                                age study_hours_per_day social_media_hours
## age                    1.000000000         0.003971179       -0.009151199
## study_hours_per_day    0.003971179         1.000000000        0.020282314
## social_media_hours    -0.009151199         0.020282314        1.000000000
## netflix_hours         -0.001174104        -0.031158347        0.011476564
## attendance_percentage -0.026055201         0.026264118        0.040478792
## sleep_hours            0.037481916        -0.027757114        0.018236260
## exercise_frequency    -0.003836236        -0.028701192       -0.037319003
## mental_health_rating  -0.045101361        -0.003767826        0.001496491
## exam_score            -0.008906872         0.825418509       -0.166732885
##                       netflix_hours attendance_percentage   sleep_hours
## age                   -0.0011741040          -0.026055201  0.0374819156
## study_hours_per_day   -0.0311583466           0.026264118 -0.0277571140
## social_media_hours     0.0114765638           0.040478792  0.0182362596
## netflix_hours          1.0000000000          -0.002091540 -0.0009345491
## attendance_percentage -0.0020915397           1.000000000  0.0137560647
## sleep_hours           -0.0009345491           0.013756065  1.0000000000
## exercise_frequency    -0.0064482222          -0.007857196  0.0197690236
## mental_health_rating   0.0080342346          -0.018744560 -0.0065079649
## exam_score            -0.1717792385           0.089835602  0.1216829106
##                       exercise_frequency mental_health_rating   exam_score
## age                        -0.0038362359        -0.0451013606 -0.008906872
## study_hours_per_day        -0.0287011920        -0.0037678263  0.825418509
## social_media_hours         -0.0373190028         0.0014964907 -0.166732885
## netflix_hours              -0.0064482222         0.0080342346 -0.171779238
## attendance_percentage      -0.0078571964        -0.0187445601  0.089835602
## sleep_hours                 0.0197690236        -0.0065079649  0.121682911
## exercise_frequency          1.0000000000        -0.0002422927  0.160107464
## mental_health_rating       -0.0002422927         1.0000000000  0.321522931
## exam_score                  0.1601074644         0.3215229307  1.000000000

Hapus Outlier

Setelah melihat hasil korelasi dari masing masing variabel, peneliti mengambil 200 data yang paling dekat dengan garis linear berdasarkan variabel study_hours_per_day dan attendance_percentage

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data_scale <- as.data.frame(scale(data_numeric))

model <- lm(study_hours_per_day ~ attendance_percentage, data = data_scale)

data_with_residuals <- data_scale %>%
  mutate(
    pred = predict(model, newdata = data_scale),
    resid = abs(attendance_percentage - pred)
  )

closest_5 <- data_with_residuals %>%
  arrange(resid) %>%
  slice(1:200)

Model SEM

hasil dari pengambilan 200 data terdekat kemudian dibuat model SEM, dengan 3 variabel laten yang di wakili ‘belajar’ (diukur dari indikator study_hours_per_day dan attendance_percentage) , laten ‘kesehatan’ (diukur melalui indikator mental_health_rating dan exercise_frequency) dan laten ‘screen time’ (diukur melalui indikator social_media_hours dan Netflix_hours) berhubungan dengan variabel teramati exam_score

model <- '
  belajar =~ study_hours_per_day + attendance_percentage
  kesehatan =~ mental_health_rating + exercise_frequency
  screen_time =~ social_media_hours + netflix_hours
  
  exam_score ~ belajar + kesehatan + screen_time 
'

Hasil Model

Model SEM memiliki fit yang sangat baik, ditunjukkan oleh nilai CFI, TLI, RMSEA, dan SRMR yang ideal. Namun, secara struktural Hanya laten “belajar” yang signifikan memengaruhi exam_score, sedangkan laten “screen_time” dan “kesehatan” tidak signifikan.

## Warning: package 'lavaan' was built under R version 4.4.3
## This is lavaan 0.6-19
## lavaan is FREE software! Please report any bugs.
## Warning: lavaan->lav_lavaan_step11_estoptim():  
##    Model estimation FAILED! Returning starting values.
## Warning: lavaan->lav_object_summary():  
##    fit measures not available if model did not converge
## lavaan 0.6-19 did NOT end normally after 868 iterations
## ** WARNING ** Estimates below are most likely unreliable
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        19
## 
##   Number of observations                           200
## 
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   belajar =~                                                            
##     stdy_hrs_pr_dy    1.000                               1.008    0.940
##     attndnc_prcntg    0.012       NA                      0.012    0.089
##   kesehatan =~                                                          
##     mntl_hlth_rtng    1.000                               0.254    0.263
##     exercis_frqncy    0.632       NA                      0.161    0.160
##   screen_time =~                                                        
##     social_med_hrs    1.000                               0.287    0.297
##     netflix_hours     1.063       NA                      0.305    0.320
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   exam_score ~                                                          
##     belajar           1.351       NA                      1.362    1.325
##     kesehatan        12.324       NA                      3.134    3.049
##     screen_time      -9.260       NA                     -2.660   -2.587
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   belajar ~~                                                            
##     kesehatan        -0.025       NA                     -0.099   -0.099
##     screen_time       0.014       NA                      0.047    0.047
##   kesehatan ~~                                                          
##     screen_time       0.050       NA                      0.684    0.684
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .stdy_hrs_pr_dy    0.134       NA                      0.134    0.117
##    .attndnc_prcntg    0.017       NA                      0.017    0.992
##    .mntl_hlth_rtng    0.871       NA                      0.871    0.931
##    .exercis_frqncy    0.985       NA                      0.985    0.974
##    .social_med_hrs    0.850       NA                      0.850    0.912
##    .netflix_hours     0.816       NA                      0.816    0.898
##    .exam_score       -5.100       NA                     -5.100   -4.826
##     belajar           1.017       NA                      1.000    1.000
##     kesehatan         0.065       NA                      1.000    1.000
##     screen_time       0.082       NA                      1.000    1.000

Uji Validasi

Uji validitas menggunakan AVE (Average Variance Extracted), jika nilai AVE ≥ 0.50 maka nilai dianggap baik dan konstruk menjelaskan lebih dari 50% variansi indikator. Hasilnya : belajar = 0.870 kesehatan = 0.047 screen time = 0.095 Dari hasil AVE, hanya konstruk laten “belajar” yang memiliki validitas konvergen yang baik. Sedangkan konstruk laten “kesehatan” dan “screen_time” menunjukkan validitas konvergen yang sangat lemah

library(semTools)
## Warning: package 'semTools' was built under R version 4.4.3
## 
## ###############################################################################
## This is semTools 0.5-7
## All users of R (or SEM) are invited to submit functions or ideas for functions.
## ###############################################################################
AVE(fit)
##     belajar   kesehatan screen_time 
##       0.870       0.047       0.095

Uji Reliabilitas

Uji reliabilitas dengan menggunakan Cronbach’s alpha, Jika nilai alpha > 0.7 maka reliabilitas baik. Hasilnya : alpha belajar = 0.0396859, alpha kesehatan = 0.08064498, alpha screen time = 0.1738172(paling tinggi diatara yang lain). Hasil tersebut menunjukkan bahwa setiap konstruk memiliki nilai yang rendah dan masih belum cukup kuat untuk digunakan sebagai konstruk reliabel.

library(psych)
## Warning: package 'psych' was built under R version 4.4.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:semTools':
## 
##     reliability, skew
## The following object is masked from 'package:lavaan':
## 
##     cor2cov
psych::alpha(closest_5[c("study_hours_per_day", "attendance_percentage")])$total$raw_alpha
## Number of categories should be increased  in order to count frequencies.
## [1] 0.0396859
psych::alpha(closest_5[c("mental_health_rating", "exercise_frequency")])$total$raw_alpha
## Number of categories should be increased  in order to count frequencies.
## [1] 0.08064498
psych::alpha(closest_5[c("social_media_hours", "netflix_hours")])$total$raw_alpha
## Number of categories should be increased  in order to count frequencies.
## [1] 0.1738172

CFA

## Warning: package 'semPlot' was built under R version 4.4.3

Struktur Konstruk Laten

Konstruk belajar (blj): study_hours_per_day (s_): loading = 0.940 → kuat attendance_percentage (at): loading = 0.089 → sangat lemah

Interpretasi: Konstruk belajar terbentuk secara dominan oleh study_hours_per_day, sedangkan attendance_percentage hampir tidak berkontribusi.

Konstruk kesehatan (ksh): exercise_frequency (exr_): loading = 0.160 mental_health_rating (m__): loading = 0.263

Interpretasi: Kedua indikator memberikan kontribusi rendah, menunjukkan bahwa konstruk kesehatan tidak terbentuk dengan baik. Indikator-indikator ini mungkin kurang saling berkorelasi atau tidak cukup representatif terhadap konstruk kesehatan.

Konstruk screen_time (sc_): social_media_hours (sc_): loading = 0.297 netflix_hours (nt): loading = 0.320

Interpretasi: Loading masing-masing indikator menunjukkan kontribusi sedang, dan masih lebih baik daripada konstruk kesehatan. Namun tetap berada dalam batas bawah moderat, artinya validitas konstruk masih bisa ditingkatkan.

Kesimpulan : Konstruk belajar cukup kuat, tetapi sangat tergantung pada satu indikator (study_hours_per_day), sedangkan indikator lainnya terlalu lemah.

Konstruk kesehatan dan screen_time tidak terbentuk dengan baik karena nilai loading-nya rendah.

Pengaruh ketiga konstruk terhadap exam_score tidak signifikan, meskipun kesehatan menunjukkan nilai estimasi yang besar.

Hubungan antar konstruk juga tidak signifikan, yang menunjukkan kurangnya struktur internal yang kuat di antara variabel laten.