Soal 1

Lakukan visualisasi, interpretasi/penjelasan, dan lampiran koding untuk dataset berikut.
Visualisasi bebas apa saja yang penting cocok untuk peubah yang dipilih (minimal 5, buat untuk satu peubah ataupun dua peubah)

Jawaban:

Data

dataKaggle <- read.csv("C:/Users/Putera Ramadhan/Downloads/StudentPerformanceFactors.csv")
DT::datatable(dataKaggle, options = list(scrollX = TRUE))

Histogram: Exam_Score

library(ggplot2)

ggplot(dataKaggle, aes(x = Exam_Score)) +
  geom_histogram(binwidth = 2, fill = "#2E86C1", color = "black") +
  theme_bw() + labs(title = "Distribusi Nilai Ujian", x = "Exam Score", y = "Frekuensi")

Interpretasi:

  • Sebaran nilai berkisar antara 55 hingga 100, dengan mayoritas berada di 60–75.
  • Puncak distribusi (modus) ada di sekitar 65–70, artinya nilai ini paling sering muncul.
  • Distribusi miring ke kanan, menunjukkan beberapa siswa mendapat nilai sangat tinggi, tapi jumlahnya sedikit.
  • Umumnya, siswa memperoleh nilai sedang, menandakan ujian cukup menantang namun tidak terlalu sulit.

Bar chart: Gender

ggplot(dataKaggle, aes(x = Gender)) +
  geom_bar(fill = "#AF7AC5") + theme_bw() +
  labs(title = "Distribusi Jenis Kelamin", x = "Gender", y = "Jumlah Siswa")

Interpretasi:

Sebagian besar siswa adalah laki-laki. Ini dapat menjadi pertimbangan jika ingin membandingkan nilai ujian antar gender.

Boxplot: Exam_Score berdasarkan Access_to_Resources

ggplot(dataKaggle, aes(x = Access_to_Resources, y = Exam_Score, fill = Access_to_Resources)) +
  geom_boxplot() + theme_bw() +
  labs(title = "Nilai Ujian Berdasarkan Akses ", x = "Akses to Resources", y = "Exam Score")

Interpretasi:

Siswa dengan akses materi High cenderung memiliki skor ujian yang sedikit lebih tinggi dibanding yang aksesnya Low atau Medium.

Scatter Plot: Hours_Study vs Exam_Score

ggplot(dataKaggle, aes(x = Hours_Studied, y = Exam_Score)) +
  geom_point(color = "#28B463", size = 3) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") + theme_bw() +
  labs(title = "Jam Belajar vs Skor Ujian", x = "Hours of Studied", y = "Exam Score")
## `geom_smooth()` using formula = 'y ~ x'

Interpretasi:

  • 📈 Hubungan positif lemah: Terlihat adanya kecenderungan bahwa semakin banyak jam belajar, skor ujian cenderung meningkat, meskipun hubungannya tidak terlalu kuat.
  • 📊 Sebaran data menyebar: Banyak siswa dengan jam belajar tinggi tapi tidak selalu mendapat nilai tinggi, dan sebaliknya.
  • 🔵 Garis regresi (biru putus-putus) menunjukkan tren umum, namun banyak penyimpangan dari garis tersebut, yang berarti faktor lain juga memengaruhi skor ujian selain jam belajar.
  • 📝 Kesimpulan: Meskipun belajar lebih banyak cenderung berdampak positif, tapi tidak menjamin nilai ujian tinggi, sehingga kualitas belajar dan faktor lain juga penting.

Bar chart: Exam_Score Berdasarkan Peer_Influence

ggplot(dataKaggle, aes(x = Peer_Influence, y = Exam_Score, fill = Peer_Influence)) +
  stat_summary(fun = mean, geom = "bar") + theme_bw() +
  labs(title = "Rata-rata Nilai Ujian Berdasarkan Pengaruh Teman Sebaya", x = "Peer Influence", y = "Rata-rata Exam Score")

Interpretasi:

  • 📊 Perbedaan rata-rata skor ujian berdasarkan pengaruh teman sebaya:
    • Siswa dengan pengaruh teman sebaya positif memiliki rata-rata skor ujian paling tinggi.
    • Diikuti oleh siswa dengan pengaruh netral.
    • Siswa dengan pengaruh negatif memiliki rata-rata skor ujian terendah di antara ketiganya.
  • 📈 Makna:
    • Teman sebaya yang memberikan pengaruh positif (misalnya mendukung belajar, rajin, disiplin) tampaknya berkontribusi pada hasil akademik yang lebih baik.
    • Sebaliknya, pengaruh negatif dari teman (misalnya sering mengajak bermain atau tidak serius belajar) dapat berdampak menurunkan performa ujian.
  • 📝 Kesimpulan:
    • Lingkungan sosial (khususnya teman sebaya) berperan penting dalam keberhasilan akademik.
    • Membangun lingkungan pertemanan yang positif bisa menjadi strategi efektif untuk meningkatkan performa belajar siswa.

Soal 2

Buatlah class system S4

  1. dengan nama “Mahasiswa” yang berisi atribut:

    • nama (bertipe karakter)
    • nim (bertipe karakter)
    • domisili (bertipe karakter)
  2. Buatlah objek dalam class “Mahasiswa” sebanyak 5 individu

  3. Buatlah objek tersebut dengan fungsi konstruktor

  4. Ubahlah method show agar dapat menampilkan objek

Jawab:

Definisi Class S4: Mahasiswa

# Definisikan class S4
setClass(
  "Mahasiswa",
  slots = list(
    nama = "character",
    nim = "character",
    domisili = "character"
  )
)

Fungsi Konstruktor

# Fungsi konstruktor
Mahasiswa <- function(nama, nim, domisili) {
  new("Mahasiswa", nama = nama, nim = nim, domisili = domisili)
}

Membuat 5 Objek Mahasiswa

# 5 objek Mahasiswa
m1 <- Mahasiswa("Andi", "G140123201", "Bogor")
m2 <- Mahasiswa("Budi", "G140123202", "Depok")
m3 <- Mahasiswa("Citra", "G140123203", "Jakarta")
m4 <- Mahasiswa("Dewi", "G140123204", "Bandung")
m5 <- Mahasiswa("Eko", "G140123205", "Bekasi")

Modifikasi Method show() agar Output Rapi

setMethod(
  "show",
  "Mahasiswa",
  function(object) {
    cat("=== Data Mahasiswa ===\n")
    cat("Nama     :", object@nama, "\n")
    cat("NIM      :", object@nim, "\n")
    cat("Domisili :", object@domisili, "\n")
    cat("======================\n")
  }
)
# Gabungkan data menjadi data frame
data_mahasiswa <- data.frame(
  Nama = c(m1@nama, m2@nama, m3@nama, m4@nama, m5@nama),
  NIM = c(m1@nim, m2@nim, m3@nim, m4@nim, m5@nim),
  Domisili = c(m1@domisili, m2@domisili, m3@domisili, m4@domisili, m5@domisili)
)

data_mahasiswa
##    Nama        NIM Domisili
## 1  Andi G140123201    Bogor
## 2  Budi G140123202    Depok
## 3 Citra G140123203  Jakarta
## 4  Dewi G140123204  Bandung
## 5   Eko G140123205   Bekasi

Soal 3

Buatlah program R untuk mencari nilai minimum dari suatu fungsi berikut:

\[ f(x_1, x_2, x_3) = 10(x_1 + x_2)^2 + (2x_1 + x_3^2) + (1 + x_2)^2 \]

Jawab:

Definisikan Fungsi

# Definisi fungsi f(x1, x2, x3)
f <- function(x) {
  x1 <- x[1]
  x2 <- x[2]
  x3 <- x[3]
  10 * (x1 + x2)^2 + (2 * x1 + x3^2) + (1 + x2)^2
}

Gunakan optim() untuk Minimalisasi

# Titik awal tebakan (bisa dipilih sembarang)
start_point <- c(0, 0, 0)

# Lakukan minimisasi
result <- optim(par = start_point, fn = f)

# Tampilkan hasil
cat("Nilai minimum fungsi:", result$value, "\n")
## Nilai minimum fungsi: 0.9
cat("Diperoleh pada titik:\n")
## Diperoleh pada titik:
cat("x1 =", result$par[1], "\n")
## x1 = -0.1000313
cat("x2 =", result$par[2], "\n")
## x2 = 3.772963e-05
cat("x3 =", result$par[3], "\n")
## x3 = -8.259502e-06

Soal 4

Buatlah Class System S3 dengan nama “Optimasi” yang berisi atribut “nama_metode” dan “fungsi” (dapat diambil dari sumber mana pun). Kemudian buatlah method “execute.Optimasi” sebagai method yang digunakan untuk mengeksekusi suatu persamaan ke dalam fungsi optimasi tersebut.

Jawab:

Buat Constructor Class S3 Optimasi

Optimasi <- function(nama_metode, fungsi) {
  obj <- list(nama_metode = nama_metode, fungsi = fungsi)
  class(obj) <- "Optimasi"
  return(obj)
}

Buat Method execute.Optimasi

execute.Optimasi <- function(obj, titik_awal) {
  if (!inherits(obj, "Optimasi")) stop("Objek bukan dari class 'Optimasi'")
  
  hasil <- optim(par = titik_awal,
                 fn = obj$fungsi,
                 method = obj$nama_metode)
  
  return(list(
    nilai_minimum = hasil$value,
    parameter_optimum = hasil$par
  ))
}

Contoh Penggunaan

Misalnya kita ingin meminimalkan fungsi:

\[ f(x_1, x_2) = (x_1 - 3)^2 + (x_2 + 5)^2 \]

# Definisi fungsi
fungsi_contoh <- function(x) {
  (x[1] - 3)^2 + (x[2] + 5)^2
}

# Buat objek dari class S3
objek_opt <- Optimasi("Nelder-Mead", fungsi_contoh)

# Eksekusi fungsi optimasi
hasil <- execute.Optimasi(objek_opt, titik_awal = c(0, 0))

# Tampilkan hasil
cat("Nilai minimum:", hasil$nilai_minimum, "\n")
## Nilai minimum: 7.987809e-08
cat("Parameter optimum:", hasil$parameter_optimum, "\n")
## Parameter optimum: 2.999859 -5.000245