# Bersihkan environment
rm(list = ls())
# Panggil package
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
# Import data CSV
df <- read.csv2(file.choose("data/data_kedatangan_pelanggan_per_jam.csv"))
df
## tanggal jam_mulai jam_selesai jumlah_pelanggan
## 1 2026-01-06 10:00 11:00 9
## 2 2026-01-06 11:00 12:00 33
## 3 2026-01-06 12:00 13:00 26
## 4 2026-01-06 13:00 14:00 17
## 5 2026-01-07 10:00 11:00 10
## 6 2026-01-07 11:00 12:00 19
## 7 2026-01-07 12:00 13:00 21
## 8 2026-01-07 13:00 14:00 14
## 9 2026-01-08 10:00 11:00 12
## 10 2026-01-08 11:00 12:00 24
## 11 2026-01-08 12:00 13:00 25
## 12 2026-01-08 13:00 14:00 16
## 13 2026-01-09 10:00 11:00 13
## 14 2026-01-09 11:00 12:00 14
## 15 2026-01-09 12:00 13:00 35
## 16 2026-01-09 13:00 14:00 16
## 17 2026-01-10 10:00 11:00 14
## 18 2026-01-10 11:00 12:00 23
## 19 2026-01-10 12:00 13:00 23
## 20 2026-01-10 13:00 14:00 22
# Lihat struktur data
head(df)
## tanggal jam_mulai jam_selesai jumlah_pelanggan
## 1 2026-01-06 10:00 11:00 9
## 2 2026-01-06 11:00 12:00 33
## 3 2026-01-06 12:00 13:00 26
## 4 2026-01-06 13:00 14:00 17
## 5 2026-01-07 10:00 11:00 10
## 6 2026-01-07 11:00 12:00 19
str(df)
## 'data.frame': 20 obs. of 4 variables:
## $ tanggal : chr "2026-01-06" "2026-01-06" "2026-01-06" "2026-01-06" ...
## $ jam_mulai : chr "10:00" "11:00" "12:00" "13:00" ...
## $ jam_selesai : chr "11:00" "12:00" "13:00" "14:00" ...
## $ jumlah_pelanggan: int 9 33 26 17 10 19 21 14 12 24 ...
n_data <- nrow(df)
min_x <- min(df$jumlah_pelanggan)
max_x <- max(df$jumlah_pelanggan)
mean_x <- mean(df$jumlah_pelanggan)
median_x<- median(df$jumlah_pelanggan)
var_x <- var(df$jumlah_pelanggan)
sd_x <- sd(df$jumlah_pelanggan)
cat("=== DESKRIPSI DATA ===\n")
## === DESKRIPSI DATA ===
cat("Jumlah data (n) =", n_data, "\n")
## Jumlah data (n) = 20
cat("Min =", min_x, "\n")
## Min = 9
cat("Max =", max_x, "\n")
## Max = 35
cat("Mean =", mean_x, "\n")
## Mean = 19.3
cat("Median =", median_x, "\n")
## Median = 18
cat("Varians =", var_x, "\n")
## Varians = 50.95789
cat("SD =", sd_x, "\n\n")
## SD = 7.13848
#rungkasan
summary(df$jumlah_pelanggan)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.00 14.00 18.00 19.30 23.25 35.00
#ggplot(df, aes(x = jumlah_pelanggan)) +
# geom_histogram(aes(y = after_stat(density)),
# binwidth = 1, boundary = -0.5) +
# labs(title = "Histogram Jumlah Kedatangan Pelanggan per Jam",
# x = "Jumlah pelanggan", y = "Kepadatan")
hist(df$jumlah_pelanggan,main="Histogram jumlah pelanggan", xlab="jumlah pelanggan")

boxplot(df$jumlah_pelangga, main="boxplot jumlah pelanggan", ylab="jumlah pelanggan")

# 2) Analisis Probabilitas & Variabel Acak
# Variabel acak: X = jumlah pelanggan per jam (diskrit)
# Estimasi peluang empiris (PMF empiris)
pmf_emp <- df %>%
count(jumlah_pelanggan) %>%
mutate(p_emp = n / sum(n)) %>%
arrange(jumlah_pelanggan)
cat("\n=== PMF EMPIRIS (beberapa baris) ===\n")
##
## === PMF EMPIRIS (beberapa baris) ===
print(head(pmf_emp, 10))
## jumlah_pelanggan n p_emp
## 1 9 1 0.05
## 2 10 1 0.05
## 3 12 1 0.05
## 4 13 1 0.05
## 5 14 3 0.15
## 6 16 2 0.10
## 7 17 1 0.05
## 8 19 1 0.05
## 9 21 1 0.05
## 10 22 1 0.05
# 3) Estimasi Parameter Distribusi Poisson
# Untuk Poisson, lambda = E[X] -> estimasi pakai rata-rata sampel
lambda_hat <- mean_x
cat("\n=== ESTIMASI PARAMETER ===\n")
##
## === ESTIMASI PARAMETER ===
cat("Estimasi lambda (λ^) =", lambda_hat, "\n")
## Estimasi lambda (λ^) = 19.3
# 4) Uji Kesesuaian Asumsi Proses Poisson
# 4a) Cek ciri Poisson: mean ~ varians (diagnostik awal)
cat("\n=== CEK CIRI POISSON (diagnostik awal) ===\n")
##
## === CEK CIRI POISSON (diagnostik awal) ===
cat("Mean =", mean_x, "\n")
## Mean = 19.3
cat("Varians =", var_x, "\n")
## Varians = 50.95789
cat("Selisih |Mean - Varians| =", abs(mean_x- var_x), "\n")
## Selisih |Mean - Varians| = 31.65789
# Indeks dispersi: var/mean
dispersion_index <- var_x / mean_x
cat("Dispersion index (Varians/Mean) =", dispersion_index, "\n")
## Dispersion index (Varians/Mean) = 2.640305
if (dispersion_index > 1.2) {
cat("Indikasi: OVERDISPERSION (data lebih bervariasi dari
Poisson)\n")
} else if (dispersion_index < 0.8) {
cat("Indikasi: UNDERDISPERSION\n")
} else {
cat("Indikasi: Mendekati Poisson (sekitar 1)\n")
}
## Indikasi: OVERDISPERSION (data lebih bervariasi dari
## Poisson)
# 4b) Visual perbandingan data vs Poisson teoretis
df_pois <- data.frame(
k = 0:max(df$jumlah_pelanggan),
prob = dpois(0:max(df$jumlah_pelanggan), lambda = lambda_hat)
)
ggplot(df, aes(x = jumlah_pelanggan)) +
geom_histogram(aes(y = after_stat(density)),
binwidth = 1, boundary = -0.5) +
geom_point(data = df_pois, aes(x = k, y = prob)) +
geom_line(data = df_pois, aes(x = k, y = prob)) +
labs(title = "Perbandingan Data dengan Distribusi Poisson Teoretis",
x = "Jumlah pelanggan", y = "Probabilitas/Kepadatan")

# 5) Proses Pembaharuan (Renewal) / Waktu Antar Kejadian
cat("\n=== PROSES PEMBAHARUAN (RENEWAL) ===\n")
##
## === PROSES PEMBAHARUAN (RENEWAL) ===
cat("Data saat ini agregat per jam (jumlah pelanggan per interval),\n")
## Data saat ini agregat per jam (jumlah pelanggan per interval),
cat("bukan waktu kedatangan tiap pelanggan.\n")
## bukan waktu kedatangan tiap pelanggan.
cat("Sehingga interarrival time empiris tidak bisa dihitung langsung.\n")
## Sehingga interarrival time empiris tidak bisa dihitung langsung.
cat("Namun secara teori: jika proses Poisson berlaku,\n")
## Namun secara teori: jika proses Poisson berlaku,
cat("waktu antar kedatangan ~ Eksponensial(rate = λ).\n")
## waktu antar kedatangan ~ Eksponensial(rate = λ).