📈 Lima Latihan Statistik Dasar di R

Konversi suhu, ringkasan data, standardisasi (z-score), median manual, dan modus dengan lebih dari satu nilai teratas.

1 Exercise 1 — Konversi Suhu

Fungsi convert_temperature() mengubah suhu Celsius ke Fahrenheit atau Kelvin. Rumus yang digunakan:

\[F = \frac{9}{5}C + 32 \qquad\qquad K = C + 273.15\]

convert_temperature <- function(celsius, target = "Fahrenheit") {
  if (target == "Fahrenheit") {
    result <- (9/5) * celsius + 32
  } else if (target == "Kelvin") {
    result <- celsius + 273.15
  } else {
    stop("target harus 'Fahrenheit' atau 'Kelvin'")
  }
  return(result)
}

1.1 Uji Coba

suhu_f <- convert_temperature(30)              # target default = Fahrenheit
suhu_k <- convert_temperature(0, target = "Kelvin")

suhu_f
## [1] 86
suhu_k
## [1] 273.15

✅ Hasil: 30°C = 86°F (harusnya 86°F)  |  0°C = 273.15 K (harusnya 273.15 K)


2 Exercise 2 — Ringkasan Skor dalam List

Fungsi summarize_practice() mengembalikan sebuah list berisi n, average, median, minimum, dan maximum.

practice_scores <- c(78, 82, 90, 74, 86)
practice_scores
## [1] 78 82 90 74 86
summarize_practice <- function(x) {
  list(
    n       = length(x),
    average = mean(x),
    median  = median(x),
    minimum = min(x),
    maximum = max(x)
  )
}

2.1 Uji Coba

ringkasan_skor <- summarize_practice(practice_scores)
ringkasan_skor
## $n
## [1] 5
## 
## $average
## [1] 82
## 
## $median
## [1] 82
## 
## $minimum
## [1] 74
## 
## $maximum
## [1] 90
# Mengambil rata-rata menggunakan $
ringkasan_skor$average
## [1] 82

✅ Hasil: n = 5, rata-rata = 82, median = 82, minimum = 74, maksimum = 90


3 Exercise 3 — Standardisasi (Z-score)

Fungsi standardize() menghitung z-score untuk setiap nilai:

\[z_i = \frac{x_i - \bar{x}}{s}\]

dengan \(s\) adalah standar deviasi sampel (sd(x)).

practice_x <- c(55, 65, 70, 80, 90)
practice_x
## [1] 55 65 70 80 90
standardize <- function(x) {
  (x - mean(x)) / sd(x)
}

3.1 Uji Coba

z_scores <- standardize(practice_x)
z_scores
## [1] -1.2583965 -0.5181632 -0.1480466  0.5921866  1.3324198
length(z_scores) == length(practice_x)  # panjang harus sama
## [1] TRUE
mean(z_scores)                          # harus mendekati 0
## [1] -1.11456e-17
sd(z_scores)                            # harus mendekati 1
## [1] 1

✅ Hasil: panjang = 5, rata-rata ≈ 0 (≈ 0), sd ≈ 1 (≈ 1)


4 Exercise 4 — Median Secara Manual

Fungsi median_by_hand() menghitung median tanpa memanggil median() di dalamnya: urutkan data, lalu tangani kasus jumlah data ganjil dan genap.

practice_odd  <- c(9, 2, 7, 4, 6)
practice_even <- c(9, 2, 7, 4)

median_by_hand <- function(x) {
  x_sorted <- sort(x)
  n <- length(x_sorted)

  if (n %% 2 == 1) {
    # ganjil: ambil nilai tengah
    hasil <- x_sorted[(n + 1) / 2]
  } else {
    # genap: rata-rata dua nilai tengah
    tengah_bawah <- x_sorted[n / 2]
    tengah_atas  <- x_sorted[n / 2 + 1]
    hasil <- (tengah_bawah + tengah_atas) / 2
  }
  return(hasil)
}

4.1 Uji Coba

median_odd  <- median_by_hand(practice_odd)
median_even <- median_by_hand(practice_even)

median_odd
## [1] 6
median_even
## [1] 5.5
# Bandingkan dengan median() bawaan R
median(practice_odd)
## [1] 6
median(practice_even)
## [1] 5.5

✅ Hasil: median(practice_odd) = 6 (harusnya 6)  |  median(practice_even) = 5.5 (harusnya 5.5)


5 Exercise 5 — Mencari Dua Modus yang Seri

Fungsi mode_by_hand() mengembalikan semua nilai yang memiliki frekuensi tertinggi (bisa lebih dari satu), beserta frekuensinya.

practice_modes <- c(1, 1, 3, 3, 3, 5, 5, 5, 8)
practice_modes
## [1] 1 1 3 3 3 5 5 5 8
mode_by_hand <- function(x) {
  nilai_unik <- unique(x)
  frekuensi  <- sapply(nilai_unik, function(v) sum(x == v))

  freq_maks  <- max(frekuensi)
  modus      <- nilai_unik[frekuensi == freq_maks]

  list(
    modes     = modus,
    frequency = freq_maks
  )
}

5.1 Uji Coba

hasil_modus <- mode_by_hand(practice_modes)
hasil_modus
## $modes
## [1] 3 5
## 
## $frequency
## [1] 3

✅ Hasil: modus = 3, 5, masing-masing muncul 3 kali.