Studi Kasus 1 - Nilai Ujian Mahasiswa

Seorang dosen memiliki data nilai ujian dari 12 mahasiswa.
Analisis berikut dilakukan untuk menentukan status kelulusan, membuat pesan personal, serta menghitung proporsi kelulusan.

# Data nilai mahasiswa
nilai <- c(80, 55, 45, 90, 70, 60, 85, 72, 50, 95, 40, 77)
# Nama mahasiswa
nama <- c("Andi", "Budi", "Citra", "Dinda", "Eka", "Farah", 
          "Gilang", "Hani", "Indra", "Joko", "Kiki", "Lina")
# Beri nama pada vektor nilai
names(nilai) <- nama
nilai
##   Andi   Budi  Citra  Dinda    Eka  Farah Gilang   Hani  Indra   Joko   Kiki 
##     80     55     45     90     70     60     85     72     50     95     40 
##   Lina 
##     77
# Buat vektor status kelulusan
status <- ifelse(nilai >= 60, "Lulus",
                 ifelse(nilai >= 45, "Perbaikan", "Tidak Lulus"))

status
##          Andi          Budi         Citra         Dinda           Eka 
##       "Lulus"   "Perbaikan"   "Perbaikan"       "Lulus"       "Lulus" 
##         Farah        Gilang          Hani         Indra          Joko 
##       "Lulus"       "Lulus"       "Lulus"   "Perbaikan"       "Lulus" 
##          Kiki          Lina 
## "Tidak Lulus"       "Lulus"
# Cetak pesan personal tiap mahasiswa
pesan <- paste(names(nilai), ": Nilai =", nilai, ", Status =", status)
pesan
##  [1] "Andi : Nilai = 80 , Status = Lulus"      
##  [2] "Budi : Nilai = 55 , Status = Perbaikan"  
##  [3] "Citra : Nilai = 45 , Status = Perbaikan" 
##  [4] "Dinda : Nilai = 90 , Status = Lulus"     
##  [5] "Eka : Nilai = 70 , Status = Lulus"       
##  [6] "Farah : Nilai = 60 , Status = Lulus"     
##  [7] "Gilang : Nilai = 85 , Status = Lulus"    
##  [8] "Hani : Nilai = 72 , Status = Lulus"      
##  [9] "Indra : Nilai = 50 , Status = Perbaikan" 
## [10] "Joko : Nilai = 95 , Status = Lulus"      
## [11] "Kiki : Nilai = 40 , Status = Tidak Lulus"
## [12] "Lina : Nilai = 77 , Status = Lulus"
# Hitung proporsi masing-masing kategori
proporsi <- prop.table(table(status))
proporsi
## status
##       Lulus   Perbaikan Tidak Lulus 
##  0.66666667  0.25000000  0.08333333
# Cari mahasiswa dengan nilai tertinggi
maks_nilai <- max(nilai)
mahasiswa_tertinggi <- names(nilai)[which.max(nilai)]

cat("Mahasiswa dengan nilai tertinggi adalah", mahasiswa_tertinggi, 
    "dengan nilai", maks_nilai)
## Mahasiswa dengan nilai tertinggi adalah Joko dengan nilai 95
# Membuat diagram batang status kelulusan
barplot(table(status),
        col = c("skyblue", "orange", "red"),
        main = "Distribusi Status Kelulusan Mahasiswa",
        ylab = "Jumlah Mahasiswa",
        xlab = "Status Kelulusan")

Data terdiri dari sepuluh angka yang cukup bervariasi. Nilai rata-rata (mean) adalah 26,2 yang menunjukkan pusat distribusi data. Nilai median 23,5 menggambarkan posisi tengah data ketika diurutkan. Standar deviasi sekitar 10,4 menandakan penyebaran data cukup lebar dari rata-ratanya.

Studi kasus 2 - Evaluasi Penjualan Produk

Data penjualan produk disimpan dalam bentuk matriks.

# Membuat matriks penjualan
penjualan <- matrix(c(12,15,18,10,20,   # Produk A
                      8,12,10,9,14,     # Produk B
                      20,18,22,25,24),  # Produk C
                    nrow = 3, byrow = TRUE)

# Menambahkan nama baris dan kolom
rownames(penjualan) <- c("Produk A", "Produk B", "Produk C")
colnames(penjualan) <- c("H1","H2","H3","H4","H5")

# Tampilkan matriks penjualan
penjualan
##          H1 H2 H3 H4 H5
## Produk A 12 15 18 10 20
## Produk B  8 12 10  9 14
## Produk C 20 18 22 25 24
# Total per produk (baris)
total_produk <- rowSums(penjualan)

# Total per hari (kolom)
total_hari <- colSums(penjualan)

total_produk
## Produk A Produk B Produk C 
##       75       53      109
total_hari
## H1 H2 H3 H4 H5 
## 40 45 50 44 58
# Ambil data produk C
produkC <- penjualan["Produk C", ]

# Cari hari dengan penjualan tertinggi
hari_max_C <- names(produkC)[which.max(produkC)]
nilai_max_C <- max(produkC)

cat("Produk C memiliki penjualan tertinggi pada", hari_max_C, 
    "dengan jumlah", nilai_max_C, "unit")
## Produk C memiliki penjualan tertinggi pada H4 dengan jumlah 25 unit
# Buat pesan untuk setiap produk
pesan <- paste(names(total_produk),
               "total penjualan selama 5 hari:",
               total_produk, "unit")

pesan
## [1] "Produk A total penjualan selama 5 hari: 75 unit" 
## [2] "Produk B total penjualan selama 5 hari: 53 unit" 
## [3] "Produk C total penjualan selama 5 hari: 109 unit"
# Tambahkan 10% ke setiap elemen matriks
penjualan_bonus <- penjualan * 1.1
penjualan_bonus
##            H1   H2   H3   H4   H5
## Produk A 13.2 16.5 19.8 11.0 22.0
## Produk B  8.8 13.2 11.0  9.9 15.4
## Produk C 22.0 19.8 24.2 27.5 26.4

Data nilai mahasiswa menunjukkan bahwa sebagian besar nilai berada di atas batas kelulusan (75). Mahasiswa yang nilainya ≥ 75 dikategorikan lulus, sedangkan sisanya tidak lulus. Dari hasil pengelompokan terlihat mayoritas mahasiswa lulus, menandakan performa kelas cukup baik.

Studi kasus nomor 3 - Sistem Klasifikasi Barang

Sebuah gudang mencatat kategori kualitas 10 produk dalam bentuk huruf berikut: kategori <- c(“B”, “A”, “C”, “B”, “A”, “C”, “B”, “B”, “A”, “C”) Kualitas terbaik secara berurutan adalah A, B dan C. Ubah vektor kategori menjadi faktor berurutan. Hitung jumlah produk untuk tiap kategori kualitas. Buat vektor keterangan dengan aturan: A → “Sangat Bagus” B → “Bagus” C → “Perlu Perbaikan” Buat vektor baru kode_barang dengan format: “BRG-01”, “BRG-02”, dst. Cetak pesan untuk produk dengan keterangan “Perlu Perbaikan”. Contohnya adalah:“Produk BRG-10 adalah produk yang perlu perbaikan”

#  Load library untuk tampilan tabel lebih rapi
library(knitr)
library(kableExtra)

#  Data kategori kualitas produk 
kategori <- c("B", "A", "C", "B", "A", "C", "B", "B", "A", "C")

#  Ubah ke faktor dengan urutan kualitas terbaik A, B, C 
kategori <- factor(kategori, levels = c("A", "B", "C"), ordered = TRUE)

#  Hitung jumlah produk tiap kategori 
jumlah_kategori <- table(kategori)

#  Buat vektor keterangan 
keterangan <- ifelse(kategori == "A", "Sangat Bagus",
              ifelse(kategori == "B", "Bagus", "Perlu Perbaikan"))

#  Buat kode barang: BRG-01, BRG-02, dst. 
kode_barang <- sprintf("BRG-%02d", 1:length(kategori))

#  Gabungkan ke dalam tabel data frame 
data_produk <- data.frame(
  Kode = kode_barang,
  Kategori = kategori,
  Keterangan = keterangan
)

#  Tampilkan tabel data produk dengan format cantik 
kable(data_produk, caption = "Tabel Kualitas Produk") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE, position = "center")
Tabel Kualitas Produk
Kode Kategori Keterangan
BRG-01 B Bagus
BRG-02 A Sangat Bagus
BRG-03 C Perlu Perbaikan
BRG-04 B Bagus
BRG-05 A Sangat Bagus
BRG-06 C Perlu Perbaikan
BRG-07 B Bagus
BRG-08 B Bagus
BRG-09 A Sangat Bagus
BRG-10 C Perlu Perbaikan
#  Tampilkan ringkasan jumlah produk per kategori 
kable(as.data.frame(jumlah_kategori), caption = "Jumlah Produk per Kategori") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), position = "center")
Jumlah Produk per Kategori
kategori Freq
A 3
B 4
C 3
#  Buat pesan khusus untuk produk perlu perbaikan 
kode_perlu <- kode_barang[keterangan == "Perlu Perbaikan"]
pesan <- paste("Produk", kode_perlu, "adalah produk yang perlu perbaikan")

pesan
## [1] "Produk BRG-03 adalah produk yang perlu perbaikan"
## [2] "Produk BRG-06 adalah produk yang perlu perbaikan"
## [3] "Produk BRG-10 adalah produk yang perlu perbaikan"

Barang diklasifikasikan ke dalam tiga kategori: A (Sangat Bagus), B (Bagus), dan C (Perlu Perbaikan). Hasil tabel menunjukkan distribusi jumlah barang dalam tiap kategori. Dengan adanya kode unik (BRG-01, BRG-02, dst), setiap barang dapat diidentifikasi dengan jelas. Interpretasi hasil menunjukkan bahwa barang kategori A dan B mayoritas dalam kondisi baik, sedangkan kategori C harus mendapat perhatian khusus.

Studi kasus 4 - Monitoring Suhu Harian

#  Data suhu udara selama 7 hari 
suhu <- c(28.5, 30.2, 29.8, 31.0, 33.5, 27.5, 26.8)

#  Nama hari (asumsikan Senin sampai Minggu, hari terakhir = hari tugas diberikan) 
hari <- c("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu")
names(suhu) <- hari

#  Hitung statistik dasar 
rata2 <- mean(suhu)
maks  <- max(suhu)
minim <- min(suhu)

cat("Rata-rata suhu:", rata2, "°C\n")
## Rata-rata suhu: 29.61429 °C
cat("Suhu maksimum:", maks, "°C\n")
## Suhu maksimum: 33.5 °C
cat("Suhu minimum :", minim, "°C\n\n")
## Suhu minimum : 26.8 °C
#  Buat vektor status 
status <- ifelse(suhu > 30, "Panas", "Normal")

#  Tabel data suhu 
data_suhu <- data.frame(
  Hari = hari,
  Suhu = suhu,
  Status = status
)

# Tampilkan tabel lebih rapi 
kable(data_suhu, caption = "Data Suhu Harian") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Data Suhu Harian
Hari Suhu Status
Senin Senin 28.5 Normal
Selasa Selasa 30.2 Panas
Rabu Rabu 29.8 Normal
Kamis Kamis 31.0 Panas
Jumat Jumat 33.5 Panas
Sabtu Sabtu 27.5 Normal
Minggu Minggu 26.8 Normal
#  Daftar hari dengan suhu di atas rata-rata 
cat("Hari dengan suhu di atas rata-rata (", round(rata2,1), "°C ):\n", sep = "")
## Hari dengan suhu di atas rata-rata (29.6°C ):
print(hari[suhu > rata2])
## [1] "Selasa" "Rabu"   "Kamis"  "Jumat"
# Loop interaktif untuk menampilkan suhu berdasarkan input pengguna 
repeat {
  input <- readline(prompt = "Masukkan nama hari (UpperCamelCase, misal: Senin): ")
  
  if (!(input %in% hari)) {
    cat("Program berhenti. Input tidak ditemukan.\n")
    break
  }
  
  idx <- which(hari == input)
  cat("Suhu hari", input, ":", suhu[idx], "°C (", status[idx], ")\n")
}
## Masukkan nama hari (UpperCamelCase, misal: Senin): 
## Program berhenti. Input tidak ditemukan.
#Hitung persentase hari yang dikategorikan 'Panas' 
persen_panas <- mean(status == "Panas") * 100
cat("\nPersentase hari dengan kategori Panas:", persen_panas, "%\n")
## 
## Persentase hari dengan kategori Panas: 42.85714 %

Rata-rata suhu selama satu minggu adalah 29,6°C. Suhu tertinggi tercatat pada hari Jumat sebesar 33,5°C, sedangkan suhu terendah terjadi pada hari Minggu yaitu 26,8°C. Dengan klasifikasi sederhana, hari yang suhunya di atas 30°C ditandai sebagai Panas. Hasil menunjukkan hanya dua hari (Kamis dan Jumat) yang panas, sedangkan hari lainnya termasuk kategori normal.