Fungsi Peubah Acak Diskrit

Dalam analisis ini, kita akan mendefinisikan fungsi untuk menghasilkan sampel dari distribusi Bernoulli,binomial,poisson,geometri dan kemudian memanggil fungsi tersebut untuk menampilkan hasilnya.

Sebaran Bernoulli (Bernoulli distribution) adalah distribusi probabilitas diskrit yang sangat sederhana, digunakan untuk menggambarkan percobaan yang hanya memiliki dua hasil: “keberhasilan” (success) dan “kegagalan” (failure). Distribusi ini dinamai berdasarkan matematikawan Swiss, Jacob Bernoulli.

Distribusi binomial adalah distribusi probabilitas diskrit yang digunakan untuk memodelkan jumlah sukses dalam sejumlah percobaan yang independen, dimana setiap percobaan memiliki dua hasil (sukses atau gagal).

Distribusi geometri (geometric distribution) adalah distribusi probabilitas yang digunakan untuk menentukan jumlah percobaan yang diperlukan untuk mendapatkan keberhasilan pertama dalam suatu percobaan Bernoulli. Dalam konteks ini, setiap percobaan memiliki dua hasil: “keberhasilan” (success) dan “kegagalan” (failure).

Sebaran Poisson (Poisson distribution) adalah distribusi probabilitas diskrit yang sering digunakan untuk menggambarkan jumlah kejadian yang terjadi dalam suatu interval waktu atau ruang tertentu, dengan asumsi bahwa kejadian tersebut terjadi secara independen dan dengan rata-rata yang konstan.

##sebaran bernouli \[P(X = k) = (1-p)^{x} * p\]

#library yang dibutuhkan
library(dplyr)
library(ggplot2)
#fungsi sebaran acak
sebaran_bernouli <- function(n, p) {
  if (p < 0 || p > 1) {
    stop("Probabilitas p harus antara 0 dan 1.")
  } else if (p == 0 || p == 1) {
    message("Maka proses berlanjut karena p memenuhi syarat.")
  }
  samples <- rbinom(n, 1, p)  
  return(samples)
}
# Mengatur seed untuk reproduktifitas
set.seed(42)  
n_samples <- 1000  
prob_success <- 0.7  
#fungsi membuat plot bernouli
plot_bernoulli <- function(n, p) {
  samples <- sebaran_bernouli(n, p)
  df_samples <- as.data.frame(samples) %>%
    rename(value = samples) 
  ggplot(df_samples, aes(x = factor(value))) +
    geom_bar(aes(y = ..count..), fill = "blue", color = "black") +
    labs(title = "Distribusi Sampel Bernoulli",
         x = "Nilai (0 atau 1)",
         y = "Frekuensi") +
    theme_minimal() +
    scale_x_discrete(breaks = c(0, 1), labels = c("Gagal (0)", "Sukses (1)"))
}
# Memanggil fungsi plot_bernoulli dengan n_samples dan prob_success
plot_bernoulli(n_samples, prob_success)

# Memanggil fungsi dan menyimpan hasilnya
bernoulli_samples <- sebaran_bernouli(n_samples, prob_success)
print(bernoulli_samples)
##    [1] 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0
##   [38] 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0
##   [75] 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 0 1
##  [112] 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1
##  [149] 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0
##  [186] 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1
##  [223] 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1
##  [260] 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1
##  [297] 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0
##  [334] 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1
##  [371] 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [408] 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1
##  [445] 1 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1
##  [482] 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1
##  [519] 1 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1
##  [556] 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0
##  [593] 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1
##  [630] 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 1
##  [667] 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0
##  [704] 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1
##  [741] 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1
##  [778] 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1
##  [815] 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0
##  [852] 1 1 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1
##  [889] 1 0 0 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 1 1 1
##  [926] 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1
##  [963] 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1
## [1000] 0
# Menampilkan hasil
print(head(bernoulli_samples))
## [1] 0 1 0 1 1 1
print(table(bernoulli_samples)) 
## bernoulli_samples
##   0   1 
## 311 689

##sebaran binomial \[ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k}\]

#library yang dibutuhkan
library(ggplot2)
library(ggplot2)
# Mengatur seed untuk reproduktifitas
set.seed(123)
# Menghasilkan satu nilai acak dari distribusi binomial dengan n=10, p=0.5
n <- 10
p <- 0.5
hasil <- rbinom(1, size = n, prob = p)
# Struktur kendali if untuk mengevaluasi hasil
if (hasil > 5) {
  print("Banyak sukses!")
} else {
  print("Sedikit sukses!")
}
## [1] "Sedikit sukses!"
# Menghasilkan 10 nilai acak dari distribusi binomial
hasil_vector <- rbinom(10, size = n, prob = p)
# Gunakan ifelse untuk mengevaluasi tiap hasil
label <- ifelse(hasil_vector > 5, "Banyak sukses", "Sedikit sukses")
# Tampilkan hasil dan label
data.frame(Hasil = hasil_vector, Label = label)
##    Hasil          Label
## 1      6  Banyak sukses
## 2      5 Sedikit sukses
## 3      7  Banyak sukses
## 4      7  Banyak sukses
## 5      2 Sedikit sukses
## 6      5 Sedikit sukses
## 7      7  Banyak sukses
## 8      5 Sedikit sukses
## 9      5 Sedikit sukses
## 10     8  Banyak sukses
# Inisialisasi variabel untuk menyimpan total sukses
total_sukses <- 0
# Loop untuk 10 percobaan
for (i in 1:10) {
  sukses <- rbinom(1, size = n, prob = p)
  total_sukses <- total_sukses + sukses
}
# Inisialisasi variabel
sukses <- 0
counter <- 0
# Loop hingga sukses > 5
while (sukses <= 5) {
  sukses <- rbinom(1, size = n, prob = p)
  counter <- counter + 1
}
# Tampilkan hasil
cat("Diperlukan", counter, "percobaan untuk mendapatkan lebih dari 5 sukses.\n")
## Diperlukan 1 percobaan untuk mendapatkan lebih dari 5 sukses.
# Inisialisasi variabel
sukses <- 0
counter <- 0
# Looping dengan repeat
repeat {
  sukses <- rbinom(1, size = n, prob = p)
  counter <- counter + 1
  if (sukses > 5) {
    break
  }
}
# Tampilkan hasil
cat("Diperlukan", counter, "percobaan untuk mendapatkan lebih dari 5 sukses.\n")
## Diperlukan 1 percobaan untuk mendapatkan lebih dari 5 sukses.
# Menghasilkan data untuk distribusi binomial
x <- 0:n
prob <- dbinom(x, size = n, prob = p)
# Memastikan data sudah benar
print(data.frame(x = x, prob = prob))
##     x         prob
## 1   0 0.0009765625
## 2   1 0.0097656250
## 3   2 0.0439453125
## 4   3 0.1171875000
## 5   4 0.2050781250
## 6   5 0.2460937500
## 7   6 0.2050781250
## 8   7 0.1171875000
## 9   8 0.0439453125
## 10  9 0.0097656250
## 11 10 0.0009765625
# Membuat plot distribusi binomial
ggplot(data.frame(x, prob), aes(x=factor(x), y=prob)) +
  geom_bar(stat="identity", fill="lightblue") +
  labs(title="Distribusi Binomial (n = 10, p = 0.5)",
       x="Jumlah Sukses", y="Probabilitas") +
  theme_minimal()

##sebaran geometri \[P(X = x) = (1 - p)^{x - 1} *p\]

# Fungsi custom untuk menghitung distribusi geometrik
seb_geo <- function(x, p) {
  # Memeriksa bahwa input probabilitas valid (antara 0 dan 1)
  if (p <= 0 || p > 1) {
    stop("Probabilitas p harus di antara 0 dan 1.")
  }
  
  # Memeriksa bahwa x adalah bilangan bulat non-negatif
  if (!is.numeric(x) || x < 0 || x != floor(x)) {  
    stop("x harus bilangan bulat non-negatif.")
  }
  
  # Menghitung probabilitas berdasarkan rumus umum distribusi geometrik
  result <- (1 - p)^x * p
  return(result)  # Mengembalikan hasil perhitungan
}

# Parameter untuk menghitung probabilitas
p <- 0.3  # Probabilitas keberhasilan
x <- 4    # Jumlah kegagalan sebelum keberhasilan pertama
prob_custom <- seb_geo(x, p)
prob_custom
## [1] 0.07203

##sebaran poisson \[P(X = x) = \frac{\lambda^x e^{-\lambda}}{x!}\]

# Library yang diperlukan
library(stats)
library(ggplot2)
# Parameter
lambda <- 4  
x <- 2 
# Menghitung probabilitas densitas
probabilitas <- dpois(x, lambda)
print(probabilitas)
## [1] 0.1465251
# Menghitung probabilitas densitas untuk p(x=0), p(x=1), dan p(x=2)
probabilitas_all <- dpois(0:2, lambda)
sum(dpois(0:2, lambda))
## [1] 0.2381033
print(probabilitas_all)
## [1] 0.01831564 0.07326256 0.14652511
# Menghitung probabilitas kumulatif untuk x < 3 atau x <= 2
probabilitas_kumulatif <- ppois(2, lambda)
print(probabilitas_kumulatif)
## [1] 0.2381033
# Menghitung nilai p(x>=2)
probabilitas_gte_2 <- ppois(2, lambda, lower.tail = FALSE)
print(probabilitas_gte_2 )
## [1] 0.7618967
# Menghasilkan 10 nilai acak dari distribusi Poisson
nilai_acak <- rpois(10, lambda)
print(nilai_acak)
##  [1] 10  5  5  4  4  3  2  8  7  5
# Menghasilkan probabilitas untuk x = 0:15
x_values <- 0:15
probs <- dpois(x_values, lambda)
print(probs)
##  [1] 1.831564e-02 7.326256e-02 1.465251e-01 1.953668e-01 1.953668e-01
##  [6] 1.562935e-01 1.041956e-01 5.954036e-02 2.977018e-02 1.323119e-02
## [11] 5.292477e-03 1.924537e-03 6.415123e-04 1.973884e-04 5.639669e-05
## [16] 1.503912e-05
# Menghasilkan dataframe untuk plotting
data_plot <- data.frame(x = x_values, probs = probs)
ggplot(data_plot, aes(x = x, y = probs)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(title = "Distribusi Poisson", x = "Jumlah Kesalahan", y = "Probabilitas")