Pengenalan

Materi ini akan membahas pengenalan materi Metode Simulasi dan Resampling sesi UTS selama 7 pertemuan kedepan, yaitu

Tahapan Simulasi Statistika

Simulasi adalah cara untuk memodelkan peristiwa acak, sehingga hasil yang disimulasikan sangat mirip dengan hasil di dunia nyata. Berikut langkah-langkah dalam melakukan simulasi statistika:

  1. Nyatakan masalahnya atau jelaskan eksperimennya
  2. Nyatakan asumsinya
  3. Tetapkan angka untuk mewakili hasil
  4. Simulasikan banyak pengulangan
  5. Nyatakan Kesimpulan

Ilustrasi

Ilustrasi 1

  • Lakukan percobaan melempar koin dengan R, isi table berikut

  • Buat histogram pada pelemparan 100x dan 500x

Syntax R

Dalam simulasi ini, koin diasumsikan ideal dengan dua kemungkinan hasil, yaitu Heads (1) dan Tails (0), masing-masing memiliki peluang teoretis sebesar 50%. Menggunakan simulasi berbasis komputer seperti R, lemparan koin dapat direplikasi sebanyak 100 atau 500 kali untuk mengamati distribusi hasil.
set.seed(123)

# Simulasi Koin
frekuensi_100 <- sample(0:1, 100, replace = TRUE)
frekuensi_500 <- sample(0:1, 500, replace = TRUE)

# Menghitung frekuensi untuk 100x dan 500x
frekuensi_100_table <- table(frekuensi_100) / length(frekuensi_100)
frekuensi_500_table <- table(frekuensi_500) / length(frekuensi_500)

# Membuat tabel hasil
tabel_hasil <- data.frame(
  "Frekuensi" = c("Heads", "Tails"),
  "Lempar Koin 100x" = c(frekuensi_100_table["1"], frekuensi_100_table["0"]),
  "Lempar Koin 500x" = c(frekuensi_500_table["1"], frekuensi_500_table["0"])
)

# Menampilkan tabel
print(tabel_hasil)
##   Frekuensi Lempar.Koin.100x Lempar.Koin.500x
## 1     Heads             0.43            0.506
## 0     Tails             0.57            0.494
# Membuat histogram untuk 100x lemparan
library(ggplot2)
library(gridExtra)

# Data frame untuk 100x
data_100 <- data.frame(Hasil = frekuensi_100)

# Histogram 100x
plot_100 <- ggplot(data_100, aes(x = factor(Hasil, labels = c("Tails", "Heads")))) +
  geom_bar(fill = "skyblue", color = "black") +
  labs(title = "Histogram Lemparan Koin (100x)",
       x = "Hasil Lemparan",
       y = "Frekuensi") +
  theme_minimal()

# Membuat histogram untuk 500x lemparan
# Data frame untuk 500x
data_500 <- data.frame(Hasil = frekuensi_500)

# Histogram 500x
plot_500 <- ggplot(data_500, aes(x = factor(Hasil, labels = c("Tails", "Heads")))) +
  geom_bar(fill = "salmon", color = "black") +
  labs(title = "Histogram Lemparan Koin (500x)",
       x = "Hasil Lemparan",
       y = "Frekuensi") +
  theme_minimal()

# Menampilkan kedua histogram berdampingan
grid.arrange(plot_100, plot_500, ncol = 2)

  • Pada sampel kecil (100x), hasil dapat terlihat lebih bervariasi karena pengaruh peluang acak lebih besar.

  • Pada sampel besar (500x), distribusi lebih stabil dan seimbang, menunjukkan bahwa peluang lemparan koin ideal cenderung 50% untuk Heads dan 50% untuk Tails.

Ilustrasi 2

Sepasang suami istri berencana untuk memiliki anak sampai mereka mempunyai anak perempuan atau sampai mereka mempunyai empat anak, mana saja yang lebih dulu. Seberapa besar kemungkinan mereka akan mempunyai anak perempuan di antara anak-anak mereka?

Syntax R

Simulasi ini memodelkan situasi di mana sepasang suami istri berencana memiliki anak hingga mendapatkan anak perempuan (1) atau maksimal empat anak dengan kombinasi anak laki-laki (0) dan perempuan (1). Setiap kelahiran memiliki peluang 50% untuk anak laki-laki atau perempuan. Dengan menggunakan simulasi berbasis R, kita dapat menghitung probabilitas pasangan berhasil memiliki setidaknya satu anak perempuan.

set.seed(123)

# Fungsi simulasi untuk satu pasangan
simulasi_anak <- function() {
  anak <- c() # Vektor untuk menyimpan jenis kelamin anak
  while (length(anak) < 4) { # Maksimal 4 anak
    # Menambahkan anak baru (1 = perempuan, 0 = laki-laki)
    anak <- c(anak, sample(0:1, size = 1, replace = TRUE))
    # Berhenti jika ada anak perempuan
    if (1 %in% anak) break
  }
  return(1 %in% anak) # Mengembalikan TRUE jika ada anak perempuan
}

# Simulasi untuk banyak pasangan
n_ulangan <- 30 # Jumlah ulangan
hasil <- replicate(n_ulangan, simulasi_anak())

# Menghitung probabilitas
probabilitas <- mean(hasil)

# Menampilkan hasil
cat("Probabilitas memiliki anak perempuan:", probabilitas, "\n")
## Probabilitas memiliki anak perempuan: 0.8333333

Ilustrasi 3

  1. Use R to simulate an experiment of rolling a dice 200 times.

  2. Find the relative frequency of the numbers 1 to 6 in your experiment and fill in the table on the next page.

  3. Repeat 2 for rolling a dice 1000 times (do not print histogram)

200 kali pelemparan

# Agar hasil random yang dihasilkan sama
set.seed(123)

# Simulasi pelemparan dadu sebanyak 200 kali
d2 = sample(1:6, 200, replace = TRUE)
d2
##   [1] 3 6 3 2 2 6 3 5 4 6 6 1 2 3 5 3 3 1 4 1 1 5 3 2 2 1 6 3 4 6 1 3 5 4 2 5 1
##  [38] 1 2 3 4 5 5 3 6 1 2 5 5 4 5 2 1 1 3 1 6 5 1 2 4 4 6 6 3 6 6 1 6 2 1 2 4 5
##  [75] 5 6 3 1 4 6 1 6 1 3 6 4 1 6 6 3 6 5 3 6 2 5 5 3 2 2 2 4 2 2 6 4 4 6 1 6 6
## [112] 6 3 6 3 6 1 3 5 2 6 6 3 2 5 6 5 3 4 4 6 4 5 3 1 6 2 1 2 5 3 4 4 1 6 6 4 1
## [149] 6 3 4 3 5 4 4 4 6 1 2 3 4 3 1 6 5 5 2 3 5 6 6 1 4 2 4 5 5 6 5 5 1 2 1 2 5
## [186] 5 1 2 5 4 2 6 2 3 1 1 5 5 3 2

Kita sudah memiliki data pelemparan dadu sebanyak 200 kali. Selanjutnya, kita akan menghitung frekuensi munculnya angka 1 sampai 6, proporsi munculnya angka 1 sampai 6, dan membuat histogram.

# Menghitung frekuensi munculnya angka 1 sampai 6
table(d2)
## d2
##  1  2  3  4  5  6 
## 33 31 32 28 34 42
# Menghitung proporsi munculnya angka 1 sampai 6
prop.table(table(d2))
## d2
##     1     2     3     4     5     6 
## 0.165 0.155 0.160 0.140 0.170 0.210
# Membuat barplot
barplot(table(d2), main = "Barplot Pelemparan Dadu 200 Kali", xlab = "Angka Dadu", ylab = "Frekuensi", col = "lightblue")

1000 kali pelemparan

# Agar hasil random yang dihasilkan sama
set.seed(123)

# Simulasi pelemparan dadu sebanyak 1000 kali
d3 = sample(1:6, 1000, replace = TRUE)
d3
##    [1] 3 6 3 2 2 6 3 5 4 6 6 1 2 3 5 3 3 1 4 1 1 5 3 2 2 1 6 3 4 6 1 3 5 4 2 5 1
##   [38] 1 2 3 4 5 5 3 6 1 2 5 5 4 5 2 1 1 3 1 6 5 1 2 4 4 6 6 3 6 6 1 6 2 1 2 4 5
##   [75] 5 6 3 1 4 6 1 6 1 3 6 4 1 6 6 3 6 5 3 6 2 5 5 3 2 2 2 4 2 2 6 4 4 6 1 6 6
##  [112] 6 3 6 3 6 1 3 5 2 6 6 3 2 5 6 5 3 4 4 6 4 5 3 1 6 2 1 2 5 3 4 4 1 6 6 4 1
##  [149] 6 3 4 3 5 4 4 4 6 1 2 3 4 3 1 6 5 5 2 3 5 6 6 1 4 2 4 5 5 6 5 5 1 2 1 2 5
##  [186] 5 1 2 5 4 2 6 2 3 1 1 5 5 3 2 5 6 5 3 3 1 4 2 1 2 4 5 1 1 1 5 6 6 6 3 1 2
##  [223] 2 1 2 1 5 2 3 5 4 5 2 1 4 6 2 6 5 1 5 1 4 3 1 6 1 2 4 2 1 5 5 1 1 5 5 2 2
##  [260] 6 5 1 1 5 5 4 5 5 4 2 5 1 1 2 1 2 5 1 3 2 2 5 4 1 5 2 5 6 2 2 6 4 3 4 3 3
##  [297] 3 5 3 2 3 1 5 6 6 1 4 2 6 2 4 1 4 5 5 3 5 5 3 1 3 4 2 5 1 4 6 3 6 1 2 6 3
##  [334] 3 1 2 1 6 2 2 2 5 4 6 4 5 4 6 1 2 1 2 3 2 3 1 4 2 3 5 5 6 3 6 6 2 5 4 2 1
##  [371] 4 1 4 5 4 2 2 4 3 5 6 2 3 3 3 6 1 1 3 4 4 5 2 2 4 2 1 4 3 1 5 3 4 2 5 5 2
##  [408] 6 2 2 1 3 6 4 3 3 3 6 4 4 3 6 6 4 2 3 6 4 2 1 6 3 4 1 1 4 4 6 5 1 4 5 6 6
##  [445] 3 2 5 4 4 6 1 3 3 3 6 5 2 5 2 1 6 6 4 6 6 6 2 2 3 5 1 3 3 2 5 1 6 4 6 4 1
##  [482] 3 4 4 1 5 3 4 2 6 6 3 2 3 3 1 5 6 4 4 5 3 2 4 6 5 2 3 3 6 1 6 3 2 3 3 1 6
##  [519] 2 2 2 4 6 1 5 5 3 6 3 6 5 1 4 2 5 6 4 6 5 1 2 3 1 1 3 2 4 5 3 4 5 3 1 6 5
##  [556] 2 4 2 1 5 6 2 5 6 1 1 6 2 6 4 2 1 1 1 4 1 3 2 1 1 5 5 4 6 4 4 5 4 1 3 5 4
##  [593] 2 6 1 4 1 3 1 3 3 2 3 6 4 2 1 5 3 4 5 6 5 6 4 6 1 1 4 6 3 5 2 1 4 4 6 4 3
##  [630] 2 2 3 5 6 4 3 3 1 5 5 1 1 1 5 5 4 2 6 2 4 2 6 1 3 5 3 1 2 4 4 1 5 1 4 3 4
##  [667] 5 5 6 4 3 3 2 5 5 1 3 2 3 4 2 5 3 3 2 2 4 2 6 1 4 1 5 2 5 2 2 3 2 6 6 3 3
##  [704] 1 1 6 5 1 5 1 2 1 3 3 4 2 4 3 6 1 3 4 2 6 5 2 1 2 3 3 2 2 4 5 2 3 6 1 6 5
##  [741] 6 3 2 1 4 4 3 1 6 6 2 3 1 1 2 2 4 3 2 2 5 1 3 2 2 4 4 4 5 5 4 4 2 5 2 2 4
##  [778] 6 5 3 3 6 2 2 1 3 5 6 3 5 1 2 4 3 5 6 5 5 4 3 3 2 2 2 2 2 3 6 1 1 6 1 1 3
##  [815] 1 2 3 4 4 3 4 2 6 6 3 4 3 6 4 5 1 5 4 5 1 1 6 1 2 2 4 1 6 2 1 3 3 6 1 4 3
##  [852] 6 5 2 6 4 2 6 2 1 1 3 5 5 1 4 2 3 3 6 2 5 4 1 4 3 5 5 4 6 5 1 5 4 5 5 5 3
##  [889] 4 5 5 4 4 6 6 3 6 3 4 1 6 4 2 6 2 4 1 1 6 2 4 5 3 1 3 3 2 4 1 3 5 5 5 6 2
##  [926] 5 5 1 5 1 2 1 1 2 4 6 5 2 2 2 6 6 4 5 2 3 6 1 6 4 3 6 3 3 6 2 4 4 2 3 1 4
##  [963] 1 1 4 3 5 2 5 6 6 2 4 2 2 4 4 1 3 1 3 3 6 3 6 5 2 6 1 5 3 3 6 3 3 6 1 3 3
## [1000] 6
# Menghitung frekuensi munculnya angka 1 sampai 6
table(d3)
## d3
##   1   2   3   4   5   6 
## 170 176 171 157 162 164
# Menghitung proporsi munculnya angka 1 sampai 6
prop.table(table(d3))
## d3
##     1     2     3     4     5     6 
## 0.170 0.176 0.171 0.157 0.162 0.164

Menggunakan fungsi

# Fungsi untuk simulasi pelemparan dadu
SimulasiDadu = function(n, plot = FALSE) {
  set.seed(123)  # Untuk hasil yang sama setiap kali dijalankan
  hasil = sample(1:6, n, replace = TRUE)  # Simulasi pelemparan dadu
  
  # Menghitung frekuensi dan proporsi
  frekuensi = table(hasil)
  proporsi = prop.table(frekuensi)
  
  # Menampilkan hasil
  cat("Frekuensi munculnya angka dadu (1-6):\n")
  print(frekuensi)
  cat("\nProporsi munculnya angka dadu (1-6):\n")
  print(proporsi)
  
  # Membuat plot jika diinginkan
  if (plot) {
    barplot(frekuensi, 
            main = paste("Barplot Pelemparan Dadu", n, "Kali"), 
            xlab = "Angka Dadu", 
            ylab = "Frekuensi", 
            col = "lightblue")
  }
}
# Simulasi 200 kali
SimulasiDadu(200, plot = FALSE) # Jika ingin menampilkan plot, tinggal ganti jadi TRUE saja
## Frekuensi munculnya angka dadu (1-6):
## hasil
##  1  2  3  4  5  6 
## 33 31 32 28 34 42 
## 
## Proporsi munculnya angka dadu (1-6):
## hasil
##     1     2     3     4     5     6 
## 0.165 0.155 0.160 0.140 0.170 0.210
# Simulasi 1000 kali tanpa barplot
SimulasiDadu(1000, plot = FALSE)
## Frekuensi munculnya angka dadu (1-6):
## hasil
##   1   2   3   4   5   6 
## 170 176 171 157 162 164 
## 
## Proporsi munculnya angka dadu (1-6):
## hasil
##     1     2     3     4     5     6 
## 0.170 0.176 0.171 0.157 0.162 0.164

Latihan Mandiri

Soal 1

Dalam sebuah kelompok berisi 10 orang, terdapat 4 orang yang mahir dan 6 orang pemula. Sebuah tim dengan 5 anggota akan dipilih secara acak.

  1. Buat simulasi pemilihan tim sebanyak 1000 kali.
  2. Hitung rata-rata jumlah anggota mahir dalam tim berdasarkan simulasi tersebut.
  3. Gambarkan barchart hasil simulasi.
# Fungsi untuk simulasi pemilihan tim
SimulasiTim = function() {
  kelompok = c(rep("Mahir", 4), rep("Pemula", 6)) # Mahir = 4, Pemula = 6
  tim = sample(kelompok, 5, replace = FALSE)
  return(sum(tim == "Mahir")) # Jumlah anggota mahir dalam tim
}

# Jalankan simulasi 1000 kali
set.seed(123)
hasil = replicate(1000, SimulasiTim())
rata_rata_mahir = mean(hasil)

cat("Rata-rata jumlah anggota mahir dalam tim:", rata_rata_mahir, "\n")
## Rata-rata jumlah anggota mahir dalam tim: 2.009
# Membuat Barplot
barplot(table(hasil), main = "Histogram Jumlah Anggota Mahir dalam Tim", xlab = "Jumlah Anggota Mahir", ylab = "Frekuensi", col = "lightblue")

Soal 2

Dalam sebuah lotere, terdapat 100 tiket dengan nomor dari 1 hingga 100. Dari total tiket, hanya 10 tiket yang merupakan tiket pemenang.

  1. Simulasikan pengambilan tiket secara acak sebanyak 3 kali tanpa pengembalian.
  2. Tentukan apakah salah satu tiket yang diambil adalah tiket pemenang.
  3. Ulangi simulasi sebanyak 1000 kali, hitung peluang mendapatkan setidaknya 1 tiket pemenang.
# Fungsi untuk simulasi lotere
SimulasiLotere = function() {
  tiket = c(rep("Pemenang", 10), rep("Biasa", 90)) # 10 tiket pemenang, 90 tiket biasa
  pilihan = sample(tiket, 3, replace = FALSE)
  return(any(pilihan == "Pemenang")) # Apakah ada tiket pemenang
}

# Jalankan simulasi 1000 kali
set.seed(123)
hasil = replicate(1000, SimulasiLotere())
peluang_menang = mean(hasil)

cat("Peluang mendapatkan setidaknya 1 tiket pemenang:", peluang_menang, "\n")
## Peluang mendapatkan setidaknya 1 tiket pemenang: 0.261

Soal 3

Sebuah permainan domino menggunakan kartu bernomor 1 hingga 12. Saat kartu pertama diambil, kartu kedua runtuh jika nomor kartu pertama adalah kelipatan dari nomor kartu kedua.

  1. Buat simulasi mengambil 2 kartu acak dari tumpukan (tanpa pengembalian).
  2. Tentukan apakah kartu kedua akan runtuh.
  3. Ulangi simulasi sebanyak 500 kali, hitung berapa kali kartu kedua runtuh, dan hitung peluang runtuhnya kartu kedua.
# Fungsi untuk simulasi runtuhnya kartu domino
SimulasiDomino = function() {
  kartu = sample(1:12, 2, replace = FALSE)
  if (kartu[1] %% kartu[2] == 0) {
    return(1) # Kartu kedua runtuh
  } else {
    return(0) # Kartu kedua tidak runtuh
  }
}

# Jalankan simulasi 500 kali
set.seed(123)
hasil = replicate(500, SimulasiDomino())
peluang_runtuh = mean(hasil)

cat("Jumlah runtuhnya kartu kedua:", sum(hasil), "\n")
## Jumlah runtuhnya kartu kedua: 83
cat("Peluang kartu kedua runtuh:", peluang_runtuh, "\n")
## Peluang kartu kedua runtuh: 0.166