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")
## ========================================