# ==============================================================================
# DISTRIBUSI PELUANG DISKRIT & KONTINU DALAM R
# ==============================================================================

# ------------------------------------------------------------------------------
# 1. Distribusi Binomial
# Soal: Dari 10 kali pelemparan koin seimbang (p = 0.5), hitung peluang tepat 3 kali,
# maksimal 3 kali, dan bangkitkan 5 data acak.
# ------------------------------------------------------------------------------

# Peluang tepat 3 kali (P(X = 3))
dbinom(x = 3, size = 10, prob = 0.5)
## [1] 0.1171875
# Output: 0.1171875

# Peluang maksimal 3 kali (P(X <= 3))
pbinom(q = 3, size = 10, prob = 0.5)
## [1] 0.171875
# Output: 0.171875

# Membangkitkan 5 data acak percobaan binomial (n=10, p=0.5)
rbinom(n = 5, size = 10, prob = 0.5)
## [1] 6 4 3 4 5
# ------------------------------------------------------------------------------
# 2. Distribusi Poisson
# Soal: Rata-rata kedatangan pembeli adalah 4 orang per jam (lambda = 4).
# Hitung peluang tepat 2 pembeli dan peluang lebih dari 5 pembeli.
# ------------------------------------------------------------------------------

# Peluang tepat 2 pembeli (P(X = 2))
dpois(x = 2, lambda = 4)
## [1] 0.1465251
# Output: 0.1465269

# Peluang lebih dari 5 pembeli (P(X > 5))
ppois(q = 5, lambda = 4, lower.tail = FALSE)
## [1] 0.2148696
# Output: 0.2148696


# ------------------------------------------------------------------------------
# 3. Distribusi Normal
# Soal: Tinggi badan berdistribusi normal dengan rata-rata mu = 170 cm dan sd = 10 cm.
# Hitung peluang tinggi <= 165 cm dan nilai kuantil untuk persentil ke-95.
# ------------------------------------------------------------------------------

# Peluang tinggi badan <= 165 cm (P(X <= 165))
pnorm(q = 165, mean = 170, sd = 10)
## [1] 0.3085375
# Output: 0.3085375

# Nilai tinggi badan pada persentil ke-95 (P(X <= x) = 0.95)
qnorm(p = 0.95, mean = 170, sd = 10)
## [1] 186.4485
# Output: 186.4485

# Membangkitkan 5 data tinggi badan acak
rnorm(n = 5, mean = 170, sd = 10)
## [1] 174.7142 178.1526 185.4509 168.9730 151.4991
# ------------------------------------------------------------------------------
# 4. Distribusi Eksponensial
# Soal: Waktu tunggu layanan berdistribusi eksponensial dengan rate = 0.2 per menit.
# Hitung peluang pelanggan dilayani dalam waktu <= 3 menit.
# ------------------------------------------------------------------------------

# Peluang waktu tunggu <= 3 menit (P(X <= 3))
pexp(q = 3, rate = 0.2)
## [1] 0.4511884
# Output: 0.4511884


# ------------------------------------------------------------------------------
# 5. Distribusi Uniform Kontinu & t-Student
# Soal: Generasi data acak Uniform [10, 50] dan cari nilai kritis t (alpha = 0.05, df = 20).
# ------------------------------------------------------------------------------

# Membangkitkan 3 angka acak Uniform [10, 50]
runif(n = 3, min = 10, max = 50)
## [1] 13.48706 35.93524 33.95429
# Kuantil distribusi-t untuk ekor kanan (P(T > t) = 0.05)
qt(p = 0.05, df = 20, lower.tail = FALSE)
## [1] 1.724718
# Output: 1.724718















y=rpois(n=10, lambda=4)
print(y)
##  [1] 7 3 4 6 4 3 4 6 5 3
set.seed(123)
y=rpois(n=10, lambda=4)
print(y)
##  [1] 3 6 3 6 7 1 4 7 4 4
set.seed(1)
y=rpois(n=10, lambda=4)
print(y)
##  [1] 3 3 4 7 2 7 7 5 5 1
set.seed(2)
y=rpois(n=10, lambda=4)
print(y)
##  [1] 2 5 4 2 7 7 2 6 4 4
set.seed(0123)
y=rpois(n=10, lambda=4)
print(y)
##  [1] 3 6 3 6 7 1 4 7 4 4
set.seed(123)
y <- rpois(n = 10, lambda = 4)
print(y)
##  [1] 3 6 3 6 7 1 4 7 4 4
set.seed(123)
z = rbinom(n = 10, size = 1, prob = 0.7)
print(z)
##  [1] 1 0 1 0 0 1 1 0 1 1
set.seed(123)
z = rbinom(n = 10, size = 1, prob = 0.5)
print(z)
##  [1] 0 1 0 1 1 0 1 1 1 0
# Data
set.seed(123)
y <- rpois(n = 10, lambda = 4)
print(y)
##  [1] 3 6 3 6 7 1 4 7 4 4
# 1. Plot Diagram Batang (Barplot) - Cocok untuk data diskrit
barplot(
  table(y),
  col = "skyblue",
  border = "black",
  main = "Frekuensi Data Distribusi Poisson (lambda = 4)",
  xlab = "Nilai y",
  ylab = "Frekuensi"
)

frekuensi <- table(y)
persen <- round(100 * frekuensi / sum(frekuensi), 1)
label_pie <- paste(names(frekuensi), "-", persen, "%")

pie(
  frekuensi,
  labels = label_pie,
  main = "Proporsi Nilai Data Poisson",
  col = c("lightblue", "mistyrose", "lightcyan", "magenta", "cornsilk")
)
legend("topright", legend = names(frekuensi), title = "Nilai y", fill = c("lightblue", "mistyrose", "lightcyan", "lavender", "cornsilk"))

# Diagram Lingkaran
pie(
  frekuensi,
  labels = label_pie,
  main = "Diagram Lingkaran Distribusi Binomial (Bernoulli)",
  col = c("coral", "lightgreen")
)

# Tambahkan legend
legend(
  "topright", 
  legend = c("Nilai 0", "Nilai 1"), 
  fill = c("coral", "lightgreen")
)

# Data Multinomial (3 Kategori)
# n = 100 percobaan, probabilitas 3 kategori = c(0.2, 0.5, 0.3)
set.seed(123)
data_mult <- rmultinom(n = 1, size = 100, prob = c(0.2, 0.5, 0.3))

# Ubah menjadi matriks 1D/vektor frekuensi
frekuensi <- as.vector(data_mult)
names(frekuensi) <- c("Kategori A", "Kategori B", "Kategori C")

print(frekuensi)
## Kategori A Kategori B Kategori C 
##         18         45         37
# Output: Kategori A: 19, Kategori B: 53, Kategori C: 28

# Diagram Batang (3 Batang)
barplot(
  frekuensi,
  main = "Diagram Batang Distribusi Multinomial (3 Kategori)",
  xlab = "Kategori",
  ylab = "Frekuensi",
  col = c("skyblue", "lightgreen", "coral"),
  border = "black",
  ylim = c(0, max(frekuensi) + 10)
)

# Menambahkan angka jumlah di atas setiap batang
text(
  x = barplot(frekuensi, plot = FALSE),
  y = frekuensi + 3,
  labels = frekuensi
)

# Data Multinomial: Pendidikan 10 Responden di Kampung
# 3 Kategori: SD, SMP, SMA
# Probabilitas populasi diset: SD = 0.4, SMP = 0.35, SMA = 0.25
set.seed(123)
data_pendidikan <- rmultinom(n = 1, size = 10, prob = c(0.4, 0.35, 0.25))

# Konversi ke vektor frekuensi dan beri nama kategori
frekuensi <- as.vector(data_pendidikan)
names(frekuensi) <- c("SD", "SMP", "SMA")

print(frekuensi)
##  SD SMP SMA 
##   3   3   4
# Output: SD: 3, SMP: 4, SMA: 3

# Diagram Batang (3 Batang)
bp <- barplot(
  frekuensi,
  main = "Tingkat Pendidikan 10 Responden Kampung",
  xlab = "Tingkat Pendidikan",
  ylab = "Jumlah Responden (Orang)",
  col = c("coral", "khaki", "lightgreen"),
  border = "black",
  ylim = c(0, max(frekuensi) + 2)
)

# Menambahkan angka jumlah responden di atas setiap batang
text(
  x = bp,
  y = frekuensi + 0.3,
  labels = frekuensi
)

# Data Multinomial: Pendidikan 10 Responden di Kampung
# 3 Kategori: SD, SMP, SMA
set.seed(123)
data_pendidikan <- rmultinom(n = 1, size = 10, prob = c(0.4, 0.35, 0.25))

# Konversi ke vektor frekuensi
frekuensi <- as.vector(data_pendidikan)
names(frekuensi) <- c("SD", "SMP", "SMA")

# Hitung persen untuk label
persen <- round(100 * frekuensi / sum(frekuensi), 1)
label_pie <- paste(names(frekuensi), "\n", frekuensi, "orang (", persen, "%)", sep = "")

# Diagram Lingkaran
pie(
  frekuensi,
  labels = label_pie,
  main = "Persentase Tingkat Pendidikan 10 Responden Kampung",
  col = c("coral", "khaki", "lightgreen")
)

# Tambahkan legend
legend(
  "topright",
  legend = names(frekuensi),
  fill = c("coral", "khaki", "lightgreen"),
  title = "Tingkat Pendidikan"
)

# ------------------------------------------------------------------------------
# STACKED BARPLOT: Pendidikan vs Pekerjaan (10 Responden)
# ------------------------------------------------------------------------------

# 1. Membuat Matriks Data (Baris = Pekerjaan, Kolom = Pendidikan)
# Kategori Pekerjaan: Petani & Buruh
# Kategori Pendidikan: SD, SMP, SMA
data_gabungan <- matrix(
  c(2, 1,   # SD  : 2 Petani, 1 Buruh
    1, 3,   # SMP : 1 Petani, 3 Buruh
    2, 1),  # SMA : 2 Petani, 1 Buruh
  nrow = 2,
  byrow = FALSE,
  dimnames = list(
    Pekerjaan = c("Petani", "Buruh"),
    Pendidikan = c("SD", "SMP", "SMA")
  )
)

print(data_gabungan)
##          Pendidikan
## Pekerjaan SD SMP SMA
##    Petani  2   1   2
##    Buruh   1   3   1
# 2. Membuat Diagram Batang Bertumpuk (Stacked Barplot)
bp <- barplot(
  data_gabungan,
  main = "Tingkat Pendidikan dan Pekerjaan 10 Responden",
  xlab = "Tingkat Pendidikan",
  ylab = "Jumlah Responden (Orang)",
  col = c("forestgreen", "orange"), # Warna untuk Petani & Buruh
  border = "black",
  ylim = c(0, max(colSums(data_gabungan)) + 2)
)

# 3. Menambahkan Legend (Keterangan Warna Pekerjaan)
legend(
  "topright",
  legend = rownames(data_gabungan),
  fill = c("saddlebrown", "burlywood3"),
  title = "Pekerjaan"
)

# 4. Menambahkan Label Total Responden di Atas Setiap Batang
text(
  x = bp,
  y = colSums(data_gabungan) + 0.3,
  labels = colSums(data_gabungan)
)