Kharisma Adhi Wibowo (23031554175)
Kevin Davindio Atha (23031554173)
Iqbal Syahdana Arkan (23031554079)
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 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
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
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
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)
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
'
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 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 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
## 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.