Soal No 1

# Set seed untuk reproduktibilitas
set.seed(123)

# Parameter distribusi normal
n_pegawai <- 1000
rata_rata <- 10000000  # Rata-rata pendapatan (Rp)
std_deviasi <- 200000  # Standar deviasi pendapatan (Rp)

# Generate data pendapatan menggunakan distribusi normal
pendapatan <- rnorm(n_pegawai, mean = rata_rata, sd = std_deviasi)

# Tampilkan ringkasan statistik
summary(pendapatan)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  9438045  9874335 10001842 10003226 10132920 10648208
cat("Standar deviasi:", sd(pendapatan), "\n")
## Standar deviasi: 198339
# Visualisasi distribusi pendapatan
par(mfrow = c(2, 2))

# Histogram
hist(pendapatan, 
     main = "Histogram Pendapatan Bulanan Pegawai",
     xlab = "Pendapatan (Rp)",
     ylab = "Frekuensi",
     col = "skyblue",
     breaks = 30)

# Density plot
plot(density(pendapatan), 
     main = "Density Plot Pendapatan",
     xlab = "Pendapatan (Rp)",
     col = "blue")

# QQ plot untuk memeriksa normalitas
qqnorm(pendapatan)
qqline(pendapatan, col = "red")

# Boxplot
boxplot(pendapatan,
        main = "Boxplot Pendapatan",
        ylab = "Pendapatan (Rp)",
        col = "lightgreen")

# Reset layout plot
par(mfrow = c(1, 1))

# Hitung persentase pegawai dalam rentang tertentu
satu_std <- sum(pendapatan >= (rata_rata - std_deviasi) & pendapatan <= (rata_rata + std_deviasi)) / n_pegawai * 100
dua_std <- sum(pendapatan >= (rata_rata - 2*std_deviasi) & pendapatan <= (rata_rata + 2*std_deviasi)) / n_pegawai * 100
tiga_std <- sum(pendapatan >= (rata_rata - 3*std_deviasi) & pendapatan <= (rata_rata + 3*std_deviasi)) / n_pegawai * 100

cat("Persentase pegawai dalam 1 standar deviasi dari rata-rata:", satu_std, "%\n")
## Persentase pegawai dalam 1 standar deviasi dari rata-rata: 67.8 %
cat("Persentase pegawai dalam 2 standar deviasi dari rata-rata:", dua_std, "%\n")
## Persentase pegawai dalam 2 standar deviasi dari rata-rata: 95.3 %
cat("Persentase pegawai dalam 3 standar deviasi dari rata-rata:", tiga_std, "%\n")
## Persentase pegawai dalam 3 standar deviasi dari rata-rata: 99.9 %
# Hitung beberapa nilai pendapatan pada persentil tertentu
percentiles <- c(0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99)
percentile_values <- quantile(pendapatan, percentiles)
percentile_df <- data.frame(
  Persentil = paste0(percentiles * 100, "%"),
  Pendapatan = format(percentile_values, big.mark = ".", decimal.mark = ",")
)
print(percentile_df)
##     Persentil Pendapatan
## 10%       10%  9.746.534
## 25%       25%  9.874.335
## 50%       50% 10.001.842
## 75%       75% 10.132.920
## 90%       90% 10.250.950
## 95%       95% 10.335.227
## 99%       99% 10.479.529
# Identifikasi pendapatan minimum dan maksimum
min_pendapatan <- min(pendapatan)
max_pendapatan <- max(pendapatan)
cat("Pendapatan minimum:", format(min_pendapatan, big.mark = ".", decimal.mark = ","), "Rp\n")
## Pendapatan minimum: 9.438.045 Rp
cat("Pendapatan maksimum:", format(max_pendapatan, big.mark = ".", decimal.mark = ","), "Rp\n")
## Pendapatan maksimum: 10.648.208 Rp
# Hitung jumlah pegawai dengan pendapatan di bawah dan di atas rata-rata
jumlah_dibawah_rataan <- sum(pendapatan < rata_rata)
jumlah_diatas_rataan <- sum(pendapatan >= rata_rata)
cat("Jumlah pegawai dengan pendapatan di bawah rata-rata:", jumlah_dibawah_rataan, "\n")
## Jumlah pegawai dengan pendapatan di bawah rata-rata: 495
cat("Jumlah pegawai dengan pendapatan di atas rata-rata:", jumlah_diatas_rataan, "\n")
## Jumlah pegawai dengan pendapatan di atas rata-rata: 505

Soal Nomer 2

# Simulasi kedatangan pelanggan restoran menggunakan distribusi Poisson
# Parameter: lambda (rata-rata kedatangan) = 35 pelanggan per hari

# Set seed untuk reproduktifitas hasil
set.seed(123)

# Jumlah hari yang akan disimulasikan
jumlah_hari <- 30

# Mensimulasikan jumlah kedatangan pelanggan per hari
kedatangan <- rpois(n = jumlah_hari, lambda = 35)

# Menampilkan hasil simulasi
data_simulasi <- data.frame(
  Hari = 1:jumlah_hari,
  Jumlah_Pelanggan = kedatangan
)

# Mencetak data simulasi
print(data_simulasi)
##    Hari Jumlah_Pelanggan
## 1     1               31
## 2     2               42
## 3     3               25
## 4     4               35
## 5     5               45
## 6     6               37
## 7     7               27
## 8     8               24
## 9     9               42
## 10   10               37
## 11   11               37
## 12   12               35
## 13   13               31
## 14   14               42
## 15   15               39
## 16   16               34
## 17   17               30
## 18   18               28
## 19   19               33
## 20   20               28
## 21   21               31
## 22   22               34
## 23   23               28
## 24   24               28
## 25   25               33
## 26   26               27
## 27   27               40
## 28   28               40
## 29   29               39
## 30   30               39
# Statistik deskriptif
cat("\nStatistik Deskriptif:\n")
## 
## Statistik Deskriptif:
cat("Rata-rata kedatangan per hari:", mean(kedatangan), "\n")
## Rata-rata kedatangan per hari: 34.03333
cat("Variansi:", var(kedatangan), "\n")
## Variansi: 32.99885
cat("Standar deviasi:", sd(kedatangan), "\n")
## Standar deviasi: 5.744463
cat("Minimum:", min(kedatangan), "\n")
## Minimum: 24
cat("Maksimum:", max(kedatangan), "\n")
## Maksimum: 45
# Visualisasi hasil simulasi
par(mfrow = c(2, 1), mar = c(4, 4, 2, 1))

# Histogram
hist(kedatangan, 
     breaks = seq(min(kedatangan)-0.5, max(kedatangan)+0.5, by=1), 
     col = "skyblue", 
     main = "Histogram Kedatangan Pelanggan Restoran", 
     xlab = "Jumlah Pelanggan per Hari", 
     ylab = "Frekuensi")

# Plot deret waktu
plot(1:jumlah_hari, 
     kedatangan, 
     type = "o", 
     col = "blue", 
     main = "Kedatangan Pelanggan per Hari", 
     xlab = "Hari", 
     ylab = "Jumlah Pelanggan",
     ylim = c(min(kedatangan)-2, max(kedatangan)+2))
abline(h = 35, col = "red", lty = 2)
legend("topright", legend = c("Observasi", "Lambda=35"), 
       col = c("blue", "red"), lty = c(1, 2), cex = 0.8)

# Perbandingan dengan distribusi Poisson teoritis di jendela grafik baru
par(mfrow = c(1, 1), mar = c(4, 4, 2, 1))
x <- 20:50  # Range untuk nilai-nilai poisson
prob_teoritis <- dpois(x, lambda = 35)

barplot(prob_teoritis, names.arg = x, col = "salmon",
        main = "Distribusi Poisson Teoritis (lambda = 35)",
        xlab = "Jumlah Pelanggan", 
        ylab = "Probabilitas")

# Membuat fungsi untuk validasi model - perhitungan goodness of fit
cat("\nGoodness of Fit - Chi-Square Test:\n")
## 
## Goodness of Fit - Chi-Square Test:
observed_freq <- table(kedatangan)
x_range <- as.numeric(names(observed_freq))
expected_prob <- dpois(x_range, lambda = 35)
expected_freq <- expected_prob * jumlah_hari

# Menampilkan hasil perbandingan
comparison <- data.frame(
  Nilai = x_range,
  Frekuensi_Observasi = as.numeric(observed_freq),
  Probabilitas_Teoritis = dpois(x_range, lambda = 35),
  Frekuensi_Harapan = expected_prob * jumlah_hari
)
print(comparison)
##    Nilai Frekuensi_Observasi Probabilitas_Teoritis Frekuensi_Harapan
## 1     24                   1            0.01160434         0.3481303
## 2     25                   1            0.01624608         0.4873824
## 3     27                   2            0.02834964         0.8504892
## 4     28                   4            0.03543705         1.0631115
## 5     30                   1            0.04989699         1.4969098
## 6     31                   3            0.05633532         1.6900595
## 7     33                   2            0.06535110         1.9605330
## 8     34                   2            0.06727319         2.0181958
## 9     35                   2            0.06727319         2.0181958
## 10    37                   3            0.06186911         1.8560734
## 11    39                   3            0.05114013         1.5342038
## 12    40                   2            0.04474761         1.3424283
## 13    42                   3            0.03183265         0.9549795
## 14    45                   1            0.01603036         0.4809108
# Membuat tabel frekuensi kumulatif
kumulatif <- data.frame(
  Nilai = 0:max(kedatangan),
  PMF_Observasi = rep(0, max(kedatangan) + 1),
  CDF_Observasi = rep(0, max(kedatangan) + 1),
  PMF_Teoritis = dpois(0:max(kedatangan), lambda = 35),
  CDF_Teoritis = ppois(0:max(kedatangan), lambda = 35)
)

for (i in 1:nrow(kumulatif)) {
  kumulatif$PMF_Observasi[i] <- sum(kedatangan == (i-1)) / jumlah_hari
  kumulatif$CDF_Observasi[i] <- sum(kedatangan <= (i-1)) / jumlah_hari
}

# Menampilkan hasil terakhir
cat("\nRingkasan Model:\n")
## 
## Ringkasan Model:
cat("Distribusi Poisson dengan lambda =", 35, "\n")
## Distribusi Poisson dengan lambda = 35
cat("Rata-rata pelanggan =", mean(kedatangan), "\n")
## Rata-rata pelanggan = 34.03333
cat("Teori: Rata-rata pelanggan = Variansi =", 35, "\n")
## Teori: Rata-rata pelanggan = Variansi = 35
cat("pelanggan: Variansi =", var(kedatangan), "\n")
## pelanggan: Variansi = 32.99885

Soal No 3

Kasus 1: Simulasi Pelemparan Dadu

# Set seed untuk hasil yang konsisten
set.seed(123)

# Simulasi pelemparan dadu 6 sisi sebanyak 1000 kali
n_lemparan <- 1000
hasil_dadu <- sample(1:6, n_lemparan, replace = TRUE)

# Hitung frekuensi kemunculan setiap angka dadu
frekuensi <- table(hasil_dadu)
proporsi <- prop.table(frekuensi)

# Visualisasi hasil simulasi
barplot(frekuensi, 
        main = "Frekuensi Hasil Pelemparan Dadu",
        xlab = "Angka Dadu", 
        ylab = "Frekuensi",
        col = rainbow(6))

# Perbandingan dengan distribusi teoritis (seragam)
prob_teoritis <- rep(1/6, 6)
plot(1:6, prob_teoritis, type = "h", lwd = 2, col = "blue",
     main = "Distribusi Teoritis vs Simulasi",
     xlab = "Angka Dadu", ylab = "Probabilitas",
     ylim = c(0, 0.25))
points(1:6, as.vector(proporsi), type = "p", col = "red", pch = 16)
legend("topright", legend = c("Teoritis", "Simulasi"), 
       col = c("blue", "red"), pch = c(NA, 16), lty = c(1, NA))

# Statistik deskriptif
cat("Statistik Deskriptif Simulasi Dadu:\n")
## Statistik Deskriptif Simulasi Dadu:
cat("Mean (rata-rata):", mean(hasil_dadu), "\n")
## Mean (rata-rata): 3.457
cat("Median:", median(hasil_dadu), "\n")
## Median: 3
cat("Modus:", names(which.max(frekuensi)), "\n")
## Modus: 2
cat("Standar deviasi:", sd(hasil_dadu), "\n")
## Standar deviasi: 1.71204

Kasus 2: Simulasi Tinggi Badan Populasi

# Set seed untuk hasil yang konsisten
set.seed(456)

# Parameter distribusi tinggi badan (dalam cm)
mean_tinggi <- 165  # Rata-rata tinggi badan
sd_tinggi <- 8      # Standar deviasi tinggi badan
n_orang <- 200      # Jumlah orang dalam sampel

# Simulasi tinggi badan dari distribusi normal
tinggi_badan <- rnorm(n_orang, mean = mean_tinggi, sd = sd_tinggi)

# Statistik deskriptif
cat("\nStatistik Deskriptif Tinggi Badan:\n")
## 
## Statistik Deskriptif Tinggi Badan:
cat("Mean (rata-rata):", mean(tinggi_badan), "cm\n")
## Mean (rata-rata): 165.0155 cm
cat("Median:", median(tinggi_badan), "cm\n")
## Median: 164.7017 cm
cat("Standar deviasi:", sd(tinggi_badan), "cm\n")
## Standar deviasi: 7.930649 cm
cat("Minimum:", min(tinggi_badan), "cm\n")
## Minimum: 146.4305 cm
cat("Maksimum:", max(tinggi_badan), "cm\n")
## Maksimum: 183.2403 cm
# Visualisasi histogram
hist(tinggi_badan, 
     main = "Distribusi Tinggi Badan",
     xlab = "Tinggi Badan (cm)", 
     ylab = "Frekuensi",
     col = "lightblue", 
     border = "blue",
     breaks = 20)

# Tambahkan kurva distribusi normal teoritis
curve(dnorm(x, mean = mean_tinggi, sd = sd_tinggi) * n_orang * (max(tinggi_badan) - min(tinggi_badan)) / 20,
      add = TRUE, col = "red", lwd = 2)

# Proporsi orang dengan tinggi dalam rentang tertentu
rentang_min <- mean_tinggi - sd_tinggi
rentang_max <- mean_tinggi + sd_tinggi
proporsi_dalam_rentang <- sum(tinggi_badan >= rentang_min & tinggi_badan <= rentang_max) / n_orang

cat("Proporsi orang dengan tinggi dalam rentang", 
    round(rentang_min, 1), "hingga", round(rentang_max, 1), "cm:",
    round(proporsi_dalam_rentang * 100, 1), "%\n")
## Proporsi orang dengan tinggi dalam rentang 157 hingga 173 cm: 63 %
# Percentile untuk tinggi badan
q_25 <- quantile(tinggi_badan, 0.25)
q_50 <- quantile(tinggi_badan, 0.50)
q_75 <- quantile(tinggi_badan, 0.75)

cat("\nPercentile Tinggi Badan:\n")
## 
## Percentile Tinggi Badan:
cat("25th percentile:", round(q_25, 1), "cm\n")
## 25th percentile: 159.4 cm
cat("50th percentile (median):", round(q_50, 1), "cm\n")
## 50th percentile (median): 164.7 cm
cat("75th percentile:", round(q_75, 1), "cm\n")
## 75th percentile: 171.5 cm
# Tes normalitas dengan Q-Q plot
qqnorm(tinggi_badan, main = "Q-Q Plot Tinggi Badan")
qqline(tinggi_badan, col = "red")