suppressPackageStartupMessages({
  library(dplyr)
  library(ggplot2)
  library(lmtest)
  library(car)
})
# ============================================================
# PROYEK UTS ANALISIS MULTIVARIAT
# TWO-WAY ANOVA
# ============================================================
# Title:
# Analisis Pengaruh Metode Belajar dan Jenis Kelamin terhadap 
# Nilai Akademik Mahasiswa Menggunakan ANOVA Dua Jalur

# Faktor A       : Weekly Study Time (studytime)
# Faktor B       : Gender (sex)
# Variabel respon: Final Grade (G3)
# Dataset        : Student_por_dataset.csv
# ============================================================


# ============================================================
# 1. PERSIAPAN LIBRARY
# ============================================================

# Jalankan satu kali jika package belum terinstal:
# install.packages(c("ggplot2", "dplyr", "car", "effectsize"))

library(ggplot2)
library(dplyr)
library(car)
library(effectsize)

# ============================================================
# 2. INPUT DAN PERSIAPAN DATA
# ============================================================

# Membaca file CSV
# PENTING: Dataset ini menggunakan pemisah titik koma (;)

data <- read.csv("C:/Users/Acer/Downloads/Dataset_studentpor.csv", header = TRUE,
  sep = ",",
  check.names = FALSE)

# Periksa hasil pembacaan
cat("Jumlah kolom:", ncol(data), "\n")
## Jumlah kolom: 33
print(names(data))
##  [1] "school"     "sex"        "age"        "address"    "famsize"   
##  [6] "Pstatus"    "Medu"       "Fedu"       "Mjob"       "Fjob"      
## [11] "reason"     "guardian"   "traveltime" "studytime"  "failures"  
## [16] "schoolsup"  "famsup"     "paid"       "activities" "nursery"   
## [21] "higher"     "internet"   "romantic"   "famrel"     "freetime"  
## [26] "goout"      "Dalc"       "Walc"       "health"     "absences"  
## [31] "G1"         "G2"         "G3"
data <- data[, c("studytime", "sex", "G3")]

data <- na.omit(data)

head(data)
##   studytime sex G3
## 1         2   F 11
## 2         2   F 11
## 3         2   F 12
## 4         3   F 14
## 5         2   F 13
## 6         2   M 13
str(data)
## 'data.frame':    649 obs. of  3 variables:
##  $ studytime: int  2 2 2 3 2 2 2 2 2 2 ...
##  $ sex      : chr  "F" "F" "F" "F" ...
##  $ G3       : int  11 11 12 14 13 13 13 13 17 13 ...
# Memastikan variabel yang dibutuhkan tersedia
variabel_dibutuhkan <- c("studytime", "sex", "G3")


# Memilih variabel penelitian
data <- data[, variabel_dibutuhkan]

# Menghapus observasi yang memiliki data hilang
data <- na.omit(data)

# Mengubah variabel menjadi tipe numerik jika diperlukan
data$studytime <- as.numeric(as.character(data$studytime))
data$G3 <- as.numeric(as.character(data$G3))

# Mengubah kode waktu belajar menjadi kategori
data$StudyTime <- factor(
  data$studytime,
  levels = c(1, 2, 3, 4),
  labels = c(
    "Less than 2 hours",
    "2-5 hours",
    "5-10 hours",
    "More than 10 hours"))

# Mengubah kode jenis kelamin menjadi kategori
data$Gender <- factor(
  data$sex,
  levels = c("F", "M"),
  labels = c("Female", "Male"))

# Membuat variabel respons
data$FinalGrade <- data$G3

# Menghapus observasi yang tidak memiliki kategori valid
data <- data[
  !is.na(data$StudyTime) &
  !is.na(data$Gender) &
  !is.na(data$FinalGrade),]

# Mengatur ulang urutan faktor
data$StudyTime <- droplevels(data$StudyTime)
data$Gender <- droplevels(data$Gender)

cat("\nJUMLAH OBSERVASI:", nrow(data), "\n")
## 
## JUMLAH OBSERVASI: 649
cat("JUMLAH VARIABEL:", ncol(data), "\n")
## JUMLAH VARIABEL: 6
cat("\nSTRUKTUR DATA:\n")
## 
## STRUKTUR DATA:
str(data)
## 'data.frame':    649 obs. of  6 variables:
##  $ studytime : num  2 2 2 3 2 2 2 2 2 2 ...
##  $ sex       : chr  "F" "F" "F" "F" ...
##  $ G3        : num  11 11 12 14 13 13 13 13 17 13 ...
##  $ StudyTime : Factor w/ 4 levels "Less than 2 hours",..: 2 2 2 3 2 2 2 2 2 2 ...
##  $ Gender    : Factor w/ 2 levels "Female","Male": 1 1 1 1 1 2 2 1 2 2 ...
##  $ FinalGrade: num  11 11 12 14 13 13 13 13 17 13 ...
cat("\nENAM DATA PERTAMA:\n")
## 
## ENAM DATA PERTAMA:
print(head(data))
##   studytime sex G3  StudyTime Gender FinalGrade
## 1         2   F 11  2-5 hours Female         11
## 2         2   F 11  2-5 hours Female         11
## 3         2   F 12  2-5 hours Female         12
## 4         3   F 14 5-10 hours Female         14
## 5         2   F 13  2-5 hours Female         13
## 6         2   M 13  2-5 hours   Male         13
cat("\nJUMLAH DATA HILANG:\n")
## 
## JUMLAH DATA HILANG:
print(colSums(is.na(data)))
##  studytime        sex         G3  StudyTime     Gender FinalGrade 
##          0          0          0          0          0          0
cat("\nFREKUENSI KATEGORI WAKTU BELAJAR:\n")
## 
## FREKUENSI KATEGORI WAKTU BELAJAR:
print(table(data$StudyTime))
## 
##  Less than 2 hours          2-5 hours         5-10 hours More than 10 hours 
##                212                305                 97                 35
cat("\nFREKUENSI JENIS KELAMIN:\n")
## 
## FREKUENSI JENIS KELAMIN:
print(table(data$Gender))
## 
## Female   Male 
##    383    266
cat("\nJUMLAH OBSERVASI SETIAP KOMBINASI:\n")
## 
## JUMLAH OBSERVASI SETIAP KOMBINASI:
print(table(data$StudyTime, data$Gender))
##                     
##                      Female Male
##   Less than 2 hours      89  123
##   2-5 hours             198  107
##   5-10 hours             75   22
##   More than 10 hours     21   14
# ============================================================
# 3. STATISTIK DESKRIPTIF
# ============================================================

cat("\n========================================\n")
## 
## ========================================
cat("STATISTIK DESKRIPTIF NILAI AKHIR\n")
## STATISTIK DESKRIPTIF NILAI AKHIR
cat("========================================\n")
## ========================================
print(summary(data$FinalGrade))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   10.00   12.00   11.91   14.00   19.00
cat("\nSTATISTIK BERDASARKAN WAKTU BELAJAR:\n")
## 
## STATISTIK BERDASARKAN WAKTU BELAJAR:
deskriptif_A <- data %>%
  group_by(StudyTime) %>%
  summarise(
    Jumlah = n(),
    Rata_rata = mean(FinalGrade),
    Median = median(FinalGrade),
    Simpangan_baku = sd(FinalGrade),
    Minimum = min(FinalGrade),
    Maksimum = max(FinalGrade),
    .groups = "drop")

print(deskriptif_A)
## # A tibble: 4 × 7
##   StudyTime          Jumlah Rata_rata Median Simpangan_baku Minimum Maksimum
##   <fct>               <int>     <dbl>  <dbl>          <dbl>   <dbl>    <dbl>
## 1 Less than 2 hours     212      10.8     11           3.22       0       18
## 2 2-5 hours             305      12.1     12           3.24       0       19
## 3 5-10 hours             97      13.2     13           2.50       8       18
## 4 More than 10 hours     35      13.1     13           3.04       6       19
cat("\nSTATISTIK BERDASARKAN JENIS KELAMIN:\n")
## 
## STATISTIK BERDASARKAN JENIS KELAMIN:
deskriptif_B <- data %>%
  group_by(Gender) %>%
  summarise(
    Jumlah = n(),
    Rata_rata = mean(FinalGrade),
    Median = median(FinalGrade),
    Simpangan_baku = sd(FinalGrade),
    Minimum = min(FinalGrade),
    Maksimum = max(FinalGrade),
    .groups = "drop")

print(deskriptif_B)
## # A tibble: 2 × 7
##   Gender Jumlah Rata_rata Median Simpangan_baku Minimum Maksimum
##   <fct>   <int>     <dbl>  <dbl>          <dbl>   <dbl>    <dbl>
## 1 Female    383      12.3     12           3.12       0       19
## 2 Male      266      11.4     11           3.32       0       19
cat("\nSTATISTIK BERDASARKAN KOMBINASI KEDUA FAKTOR:\n")
## 
## STATISTIK BERDASARKAN KOMBINASI KEDUA FAKTOR:
deskriptif_AB <- data %>%
  group_by(StudyTime, Gender) %>%
  summarise(
    Jumlah = n(),
    Rata_rata = mean(FinalGrade),
    Simpangan_baku = sd(FinalGrade),
    .groups = "drop")

print(deskriptif_AB)
## # A tibble: 8 × 5
##   StudyTime          Gender Jumlah Rata_rata Simpangan_baku
##   <fct>              <fct>   <int>     <dbl>          <dbl>
## 1 Less than 2 hours  Female     89      11.2           2.97
## 2 Less than 2 hours  Male      123      10.6           3.38
## 3 2-5 hours          Female    198      12.2           3.22
## 4 2-5 hours          Male      107      11.9           3.28
## 5 5-10 hours         Female     75      13.1           2.61
## 6 5-10 hours         Male       22      13.6           2.11
## 7 More than 10 hours Female     21      14.2           2.87
## 8 More than 10 hours Male       14      11.4           2.50
# ============================================================
# 4. EKSPLORASI DAN VISUALISASI DATA
# ============================================================

# 4.1 Histogram nilai akhir

grafik1 <- ggplot(data, aes(x = FinalGrade)) +
  geom_histogram(
    bins = 15,
    fill = "skyblue",
    color = "black"
  ) +
  labs(
    title = "Distribution of Final Grades",
    x = "Final Grade",
    y = "Frequency"
  ) +
  theme_minimal()

print(grafik1)

# 4.2 Boxplot berdasarkan waktu belajar dan gender

grafik2 <- ggplot(
  data,
  aes(x = StudyTime, y = FinalGrade, fill = Gender)
) +
  geom_boxplot() +
  labs(
    title = "Final Grades by Study Time and Gender",
    x = "Weekly Study Time",
    y = "Final Grade",
    fill = "Gender"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 20,
      hjust = 1))

print(grafik2)

# 4.3 Grafik interaksi

grafik3 <- ggplot(
  deskriptif_AB,
  aes(
    x = StudyTime,
    y = Rata_rata,
    color = Gender,
    group = Gender
  )
) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  labs(
    title = "Interaction Plot: Study Time and Gender",
    x = "Weekly Study Time",
    y = "Mean Final Grade",
    color = "Gender"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 20,
      hjust = 1))

print(grafik3)

# ============================================================
# 5. MEMBENTUK MODEL ANOVA DUA JALUR
# ============================================================

# Model mencakup:
# Efek utama StudyTime
# Efek utama Gender
# Interaksi StudyTime dan Gender

model <- aov(
  FinalGrade ~ StudyTime * Gender,
  data = data)

cat("\n========================================\n")
## 
## ========================================
cat("HASIL ANOVA DUA JALUR\n")
## HASIL ANOVA DUA JALUR
cat("========================================\n")
## ========================================
print(summary(model))
##                   Df Sum Sq Mean Sq F value  Pr(>F)    
## StudyTime          3    465  155.03  16.022 4.7e-10 ***
## Gender             1     31   31.07   3.211  0.0736 .  
## StudyTime:Gender   3     65   21.61   2.233  0.0832 .  
## Residuals        641   6202    9.68                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ============================================================
# 6. UJI NORMALITAS RESIDUAL
# ============================================================

residual <- residuals(model)

cat("\n========================================\n")
## 
## ========================================
cat("UJI NORMALITAS SHAPIRO-WILK\n")
## UJI NORMALITAS SHAPIRO-WILK
cat("========================================\n")
## ========================================
uji_normalitas <- shapiro.test(residual)

print(uji_normalitas)
## 
##  Shapiro-Wilk normality test
## 
## data:  residual
## W = 0.93702, p-value = 6.315e-16
if (uji_normalitas$p.value > 0.05) {
  cat("\nKesimpulan: Tidak terdapat bukti yang cukup",
      "bahwa residual menyimpang dari normalitas.\n")
} else {
  cat("\nKesimpulan: Terdapat indikasi residual",
      "menyimpang dari normalitas.\n")}
## 
## Kesimpulan: Terdapat indikasi residual menyimpang dari normalitas.
# Histogram residual

hist(
  residual,
  main = "Histogram of ANOVA Residuals",
  xlab = "Residual",
  col = "lightblue",
  border = "black")

# Q-Q plot

qqnorm(
  residual,
  main = "Normal Q-Q Plot of Residuals")

qqline(
  residual,
  col = "red",
  lwd = 2)

# ============================================================
# 7. UJI HOMOGENITAS VARIANS
# ============================================================

cat("\n========================================\n")
## 
## ========================================
cat("UJI HOMOGENITAS VARIANS LEVENE\n")
## UJI HOMOGENITAS VARIANS LEVENE
cat("========================================\n")
## ========================================
# Menguji kesamaan varians pada setiap kombinasi
# StudyTime dan Gender

uji_levene <- leveneTest(
  FinalGrade ~ interaction(StudyTime, Gender),
  data = data,
  center = median)

print(uji_levene)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   7  0.7334 0.6437
##       641
p_levene <- uji_levene[1, "Pr(>F)"]

if (p_levene > 0.05) {
  cat("\nKesimpulan: Tidak terdapat bukti yang cukup",
      "bahwa varians antar kelompok berbeda.\n")
} else {
  cat("\nKesimpulan: Terdapat indikasi varians",
      "antar kelompok tidak homogen.\n")}
## 
## Kesimpulan: Tidak terdapat bukti yang cukup bahwa varians antar kelompok berbeda.
# ============================================================
# 8. UJI ANOVA DENGAN EFEK UTAMA DAN INTERAKSI
# ============================================================

cat("\n========================================\n")
## 
## ========================================
cat("PENGUJIAN EFEK ANOVA\n")
## PENGUJIAN EFEK ANOVA
cat("========================================\n")
## ========================================
# Menggunakan Type III agar pengujian efek utama
# memperhitungkan faktor lain dan interaksi.
# Kontras sum harus ditetapkan sebelum model dibuat.

options(contrasts = c("contr.sum", "contr.poly"))

model_type3 <- aov(
  FinalGrade ~ StudyTime * Gender,
  data = data)

hasil_anova <- car::Anova(
  model_type3,
  type = 3)

print(hasil_anova)
## Anova Table (Type III tests)
## 
## Response: FinalGrade
##                  Sum Sq  Df   F value    Pr(>F)    
## (Intercept)       45515   1 4703.9316 < 2.2e-16 ***
## StudyTime           383   3   13.1935 2.285e-08 ***
## Gender               50   1    5.1898   0.02305 *  
## StudyTime:Gender     65   3    2.2329   0.08323 .  
## Residuals          6202 641                        
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mengambil p-value dari tabel Type III

p_study <- hasil_anova["StudyTime", "Pr(>F)"]
p_gender <- hasil_anova["Gender", "Pr(>F)"]
p_interaksi <- hasil_anova[
  "StudyTime:Gender", "Pr(>F)"]

alpha <- 0.05


# ============================================================
# 9. INTERPRETASI HASIL ANOVA
# ============================================================

cat("\n========================================\n")
## 
## ========================================
cat("INTERPRETASI HASIL ANOVA\n")
## INTERPRETASI HASIL ANOVA
cat("Taraf signifikansi =", alpha, "\n")
## Taraf signifikansi = 0.05
cat("========================================\n")
## ========================================
cat("\n1. EFEK WAKTU BELAJAR\n")
## 
## 1. EFEK WAKTU BELAJAR
cat("p-value =", p_study, "\n")
## p-value = 2.284858e-08
if (p_study < alpha) {
  cat("Keputusan: Tolak H0.\n")
  cat("Kesimpulan: Terdapat perbedaan rata-rata nilai",
      "berdasarkan kategori waktu belajar.\n")
} else {
  cat("Keputusan: Gagal menolak H0.\n")
  cat("Kesimpulan: Belum terdapat bukti yang cukup",
      "mengenai perbedaan rata-rata nilai antar kategori waktu belajar.\n")
}
## Keputusan: Tolak H0.
## Kesimpulan: Terdapat perbedaan rata-rata nilai berdasarkan kategori waktu belajar.
cat("\n2. EFEK JENIS KELAMIN\n")
## 
## 2. EFEK JENIS KELAMIN
cat("p-value =", p_gender, "\n")
## p-value = 0.02304783
if (p_gender < alpha) {
  cat("Keputusan: Tolak H0.\n")
  cat("Kesimpulan: Terdapat perbedaan rata-rata nilai",
      "berdasarkan jenis kelamin.\n")
} else {
  cat("Keputusan: Gagal menolak H0.\n")
  cat("Kesimpulan: Belum terdapat bukti yang cukup",
      "mengenai perbedaan rata-rata nilai berdasarkan jenis kelamin.\n")
}
## Keputusan: Tolak H0.
## Kesimpulan: Terdapat perbedaan rata-rata nilai berdasarkan jenis kelamin.
cat("\n3. INTERAKSI WAKTU BELAJAR DAN JENIS KELAMIN\n")
## 
## 3. INTERAKSI WAKTU BELAJAR DAN JENIS KELAMIN
cat("p-value =", p_interaksi, "\n")
## p-value = 0.0832297
if (p_interaksi < alpha) {
  cat("Keputusan: Tolak H0.\n")
  cat("Kesimpulan: Terdapat interaksi antara waktu belajar",
      "dan jenis kelamin terhadap nilai akhir.\n")
} else {
  cat("Keputusan: Gagal menolak H0.\n")
  cat("Kesimpulan: Belum terdapat bukti yang cukup",
      "mengenai interaksi waktu belajar dan jenis kelamin.\n")
}
## Keputusan: Gagal menolak H0.
## Kesimpulan: Belum terdapat bukti yang cukup mengenai interaksi waktu belajar dan jenis kelamin.
# ============================================================
# 10. UKURAN EFEK
# ============================================================

cat("\n========================================\n")
## 
## ========================================
cat("UKURAN EFEK PARTIAL ETA-SQUARED\n")
## UKURAN EFEK PARTIAL ETA-SQUARED
cat("========================================\n")
## ========================================
print(
  effectsize::eta_squared(
    hasil_anova,
    partial = TRUE))
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter        | Eta2 (partial) |       95% CI
## ------------------------------------------------
## StudyTime        |           0.06 | [0.03, 1.00]
## Gender           |       8.03e-03 | [0.00, 1.00]
## StudyTime:Gender |           0.01 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
# ============================================================
# 11. UJI LANJUT TUKEY
# ============================================================

cat("\n========================================\n")
## 
## ========================================
cat("UJI LANJUT\n")
## UJI LANJUT
cat("========================================\n")
## ========================================
if (p_interaksi < alpha) {

  # Interaksi signifikan:
  # bandingkan kombinasi kedua faktor sebagai
  # analisis eksploratif awal.

  cat("\nInteraksi signifikan.\n")
  cat("Uji Tukey pada kombinasi StudyTime dan Gender:\n")

  data$Combination <- interaction(
    data$StudyTime,
    data$Gender,
    sep = " - ",
    drop = TRUE)

  model_kombinasi <- aov(
    FinalGrade ~ Combination,
    data = data)

  print(TukeyHSD(model_kombinasi, "Combination"))

  cat("\nCatatan: Untuk interpretasi yang lebih tepat,",
      "pertimbangkan uji efek sederhana antar kelompok.\n")

} else {

  # Jika interaksi tidak signifikan,
  # periksa efek utama yang signifikan.

  if (p_study < alpha) {
    cat("\nUJI TUKEY UNTUK WAKTU BELAJAR:\n")
    print(TukeyHSD(model_type3, "StudyTime"))
  }

  # Gender hanya memiliki dua kategori.
  # Jika signifikan, tidak perlu uji Tukey tambahan.

  if (p_gender < alpha) {
    cat("\nGender signifikan dan hanya memiliki dua kategori.")
    cat("\nTidak diperlukan uji Tukey tambahan untuk gender.\n")
  }

  if (p_study >= alpha && p_gender >= alpha) {
    cat("\nTidak ada efek utama signifikan yang memerlukan",
        "uji lanjut berdasarkan aturan ini.\n")}}
## 
## UJI TUKEY UNTUK WAKTU BELAJAR:
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = FinalGrade ~ StudyTime * Gender, data = data)
## 
## $StudyTime
##                                            diff        lwr      upr     p adj
## 2-5 hours-Less than 2 hours           1.2474637  0.5310164 1.963911 0.0000510
## 5-10 hours-Less than 2 hours          2.3824645  1.4003045 3.364625 0.0000000
## More than 10 hours-Less than 2 hours  2.2128032  0.7509515 3.674655 0.0006166
## 5-10 hours-2-5 hours                  1.1350008  0.2010284 2.068973 0.0098518
## More than 10 hours-2-5 hours          0.9653396 -0.4645823 2.395261 0.3043608
## More than 10 hours-5-10 hours        -0.1696613 -1.7495405 1.410218 0.9926050
## 
## 
## Gender signifikan dan hanya memiliki dua kategori.
## Tidak diperlukan uji Tukey tambahan untuk gender.
# ============================================================
# 12. MENYIMPAN HASIL
# ============================================================

# Menyimpan tabel deskriptif
write.csv(
  deskriptif_AB,
  "descriptive_statistics.csv",
  row.names = FALSE)

# Menyimpan tabel ANOVA
write.csv(
  as.data.frame(hasil_anova),
  "anova_results.csv")

cat("\n========================================\n")
## 
## ========================================
cat("ANALISIS SELESAI\n")
## ANALISIS SELESAI
cat("Tabel deskriptif dan hasil ANOVA telah disimpan.\n")
## Tabel deskriptif dan hasil ANOVA telah disimpan.
cat("========================================\n")
## ========================================