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")
