Daftar Anggota :

1 Pendahuluan

Halo!

Di dunia statistik, ada dua tokoh penting yang sering banget kita temui: Distribusi Normal dan Distribusi Eksponensial. Keduanya punya peran besar dalam berbagai analisis dan model.

Distribusi Normal dan Eksponensial adalah dua distribusi kontinu yang paling sering digunakan dalam statistika. Distribusi normal dikenal dengan bentuknya yang seperti lonceng dan simetris, serta digunakan untuk memodelkan data yang cenderung mengumpul di sekitar nilai tengah, seperti tinggi badan atau nilai ujian. Distribusi ini punya dua parameter: rata-rata (mean) dan simpangan baku (standard deviation), yang mengatur pusat dan sebaran datanya.

Sementara itu, distribusi eksponensial digunakan untuk menggambarkan waktu tunggu antar kejadian, misalnya waktu antar kedatangan pelanggan atau kerusakan mesin. Distribusi ini hanya punya satu parameter, yaitu laju kejadian (lambda), dan punya bentuk yang menurun tajam ke kanan. Salah satu ciri khasnya adalah sifat memoryless, artinya peluang suatu kejadian tidak dipengaruhi oleh waktu yang telah berlalu.

Di proyek kali ini, kami bikin sebuah mini-package R bernama DistCont yang isinya fungsi-fungsi kece buat ngitung PDF & CDF dan juga simulasi data semua untuk si Normal dan Eksponensial ini.

2 Fungsi-fungsi Utama

2.1 PDF Distribusi Normal

Rumus :

\[ f(x) = \frac{1}{\sigma \sqrt{2\pi}} \cdot e^{- \frac{(x - \mu)^2}{2\sigma^2} } \]

Fungsi R :

dnorm_manual <- function(x, mean = 0, sd = 1) {
  if (sd <= 0) stop("Standard deviation must be positive")
  constant <- 1 / (sd * sqrt(2 * pi))
  exponent <- exp(-((x - mean)^2) / (2 * sd^2))
  return(constant * exponent)
}

2.2 CDF Distribusi Normal

Rumus :

\[ F(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x} e^{ -\frac{(t - \mu)^2}{2\sigma^2} } \, dt \]

Fungsi R :

pnorm_manual <- function(q, mean = 0, sd = 1) {
  if (sd <= 0) stop("Standard deviation must be positive")
  # Using the Z-score and approximation
  z <- (q - mean) / sd
  t <- 1 / (1 + 0.2316419 * abs(z))
  d <- 0.3989423 * exp(-z * z / 2)
  p <- d * t * (0.3193815 + t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))))
  ifelse(z > 0, 1 - p, p)
}

2.3 Studi Kasus PDF dan CDF Distribusi Normal

Dalam penelitian pertumbuhan tinggi badan remaja putri usia 16 tahun, diperoleh data bahwa tinggi badan mengikuti distribusi normal dengan rata-rata mean = 158 cm dan standar deviasi sd = 6 cm.

  1. Berapa nilai fungsi kepadatan peluang (PDF) pada tinggi badan 162 cm?
  2. Berapa peluang seorang remaja putri memiliki tinggi badan ≤ 162 cm (CDF)?
library(DistCont)
## 
## Attaching package: 'DistCont'
## The following objects are masked _by_ '.GlobalEnv':
## 
##     dnorm_manual, pnorm_manual
# PDF pada x = 162 cm
pdf_remaja <- dnorm_manual(162, mean = 158, sd = 6)
pdf_remaja
## [1] 0.05324133
# CDF pada q = 162 cm
cdf_remaja <- pnorm_manual(162, mean = 158, sd = 6)
cdf_remaja
## [1] 0.7475076

2.4 PDF Distribusi Eksponensial

Rumus :

\[ f(x) = \begin{cases} \lambda e^{-\lambda x}, & x \geq 0 \\ 0, & x < 0 \end{cases} \]

Fungsi R :

dexp_manual <- function(x, rate = 1) {
  if (rate <= 0) stop("Rate must be positive")
  ifelse(x >= 0, rate * exp(-rate * x), 0)
}

2.5 CDF Distribusi Eksponensial

Rumus :

\[ F(x) = \begin{cases} 1 - e^{-\lambda x}, & x \geq 0 \\ 0, & x < 0 \end{cases} \]

Fungsi R :

pexp_manual <- function(q, rate = 1) {
  if (rate <= 0) stop("Rate must be positive")
  ifelse(q >= 0, 1 - exp(-rate * q), 0)
}

2.6 Studi Kasus PDF dan CDF Distribusi Eksponensial

Di sebuah ruang pelayanan SIM keliling, rata-rata waktu antar kedatangan pemohon SIM baru adalah 20 menit. Diasumsikan waktu antar kedatangan mengikuti distribusi eksponensial.

  1. Hitung nilai fungsi kepadatan peluang (PDF) untuk waktu antar kedatangan 10 menit.
  2. Hitung peluang ada pemohon datang dalam waktu ≤ 10 menit (CDF).
library(DistCont)
# PDF pada x = 10 menit
pdf_sim <- dexp_manual(10, rate = 0.05)
pdf_sim
## [1] 0.03032653
# CDF pada q = 10 menit
cdf_sim <- pexp_manual(10, rate = 0.05)
cdf_sim
## [1] 0.3934693

3 Ayo Coba Simulasi!

3.1 Load Package

library(DistCont)
ls("package:DistCont")
##  [1] "dexp_manual"         "dnorm_manual"        "memoryless_property"
##  [4] "normality_test"      "pexp_manual"         "plot_cdf"           
##  [7] "plot_pdf"            "pnorm_manual"        "rexp_manual"        
## [10] "rnorm_manual"

3.2 Random Generator Distribusi Normal dan Eksponensial

Distribusi Normal:

rnorm_manual <- function(n, mean = 0, sd = 1) {
  if (sd <= 0) stop("Standard deviation must be positive")
  # Box-Muller transform
  u1 <- runif(n)
  u2 <- runif(n)
  z0 <- sqrt(-2 * log(u1)) * cos(2 * pi * u2)
  return(mean + sd * z0)
}

Distribusi Eksponensial:

rexp_manual <- function(n, rate = 1) {
  if (rate <= 0) stop("Rate must be positive")
  # Inverse transform method
  u <- runif(n)
  return(-log(1 - u) / rate)
}

3.3 Simulasi Distribusi Normal

Seorang peneliti ingin mempelajari kebiasaan tidur mahasiswa Universitas Islam Indonesia. Berdasarkan studi sebelumnya, waktu tidur mahasiswa per malam mengikuti distribusi normal dengan: - Rata-rata (mean) = 6,5 jam - Simpangan baku (sd) = 1 jam Untuk keperluan analisis, peneliti ingin melakukan simulasi data waktu tidur dari 100 mahasiswa kemudian Menghitung proporsi mahasiswa dengan tidur < 6 jam yang di indikasikan sebagai “tidur kurang dari ideal”.

# 1. Simulasi 100 data waktu tidur
set.seed(123)  # Untuk hasil yang bisa direplikasi
tidur <- rnorm_manual(n = 100, mean = 6.5, sd = 1)

# 2. Hitung proporsi tidur < 6 jam
prop_kurang_6 <- mean(tidur < 6)
prop_kurang_6
## [1] 0.35
plot_pdf(dist = "normal", params = list(mean = 6.5, sd = 1),
         main = "Kurva PDF Teoritis Waktu Tidur Mahasiswa")
abline(v = 6, col = "blue", lty = 2)  # Batas tidur < 6 jam

plot_cdf(dist = "normal", params = list(mean = 6.5, sd = 1),
         main = "Kurva CDF Teoritis Waktu Tidur Mahasiswa")
abline(v = 6, col = "blue", lty = 2)  # Batas tidur < 6 jam

3.3.1 Normality test

Normality Test dilakukan untuk mengetahui apakah suatu data mengikuti distribusi normal atau tidak. Dengan melakukan uji kenormalan, peneliti dapat memastikan bahwa metode analisis yang digunakan sesuai dengan karakteristik data yang dianalisis. Jika data ternyata tidak terdistribusi normal, maka penggunaan metode statistik parametrik dapat menghasilkan kesimpulan yang menyesatkan, sehingga diperlukan pendekatan non-parametrik atau transformasi data. Oleh karena itu, uji kenormalan tidak hanya penting sebagai formalitas, tetapi juga sebagai bentuk validasi asumsi sebelum melangkah ke tahap analisis lebih lanjut.

# Fungsi R Normality Test
normality_test <- function(x, alpha = 0.05) {
  # Check input
  if (!is.numeric(x)) {
    stop("Input must be a numeric vector")
  }

  # Remove NA values
  x <- x[!is.na(x)]

  # Calculate sample mean and sd for KS test
  mu <- mean(x)
  sigma <- sd(x)

  # Perform tests
  shapiro_test <- shapiro.test(x)
  ks_test <- ks.test(x, "pnorm", mean = mu, sd = sigma)
  ad_test <- nortest::ad.test(x)

  # Create results list
  results <- list(
    Shapiro_Wilk = list(
      statistic = shapiro_test$statistic,
      p.value = shapiro_test$p.value,
      conclusion = ifelse(shapiro_test$p.value > alpha,
                          "Data is normally distributed",
                          "Data is not normally distributed")
    ),
    Kolmogorov_Smirnov = list(
      statistic = ks_test$statistic,
      p.value = ks_test$p.value,
      conclusion = ifelse(ks_test$p.value > alpha,
                          "Data is normally distributed",
                          "Data is not normally distributed")
    ),
    Anderson_Darling = list(
      statistic = ad_test$statistic,
      p.value = ad_test$p.value,
      conclusion = ifelse(ad_test$p.value > alpha,
                          "Data is normally distributed",
                          "Data is not normally distributed")
    ),
    alpha = alpha
  )

  # Add summary conclusion
  p_values <- c(shapiro_test$p.value, ks_test$p.value, ad_test$p.value)
  results$overall_conclusion <- ifelse(all(p_values > alpha),
                                       "All tests indicate normal distribution",
                                       "At least one test indicates non-normal distribution")

  class(results) <- "normality_test"
  return(results)
}

print.normality_test <- function(x, ...) {
  cat("Normality Test Results\n")
  cat("----------------------\n")
  cat("Significance level (alpha):", x$alpha, "\n\n")

  cat("Shapiro-Wilk Test:\n")
  cat("  W =", x$Shapiro_Wilk$statistic, ", p-value =", x$Shapiro_Wilk$p.value, "\n")
  cat("  Conclusion:", x$Shapiro_Wilk$conclusion, "\n\n")

  cat("Kolmogorov-Smirnov Test:\n")
  cat("  D =", x$Kolmogorov_Smirnov$statistic, ", p-value =", x$Kolmogorov_Smirnov$p.value, "\n")
  cat("  Conclusion:", x$Kolmogorov_Smirnov$conclusion, "\n\n")

  cat("Anderson-Darling Test:\n")
  cat("  A =", x$Anderson_Darling$statistic, ", p-value =", x$Anderson_Darling$p.value, "\n")
  cat("  Conclusion:", x$Anderson_Darling$conclusion, "\n\n")

  cat("Overall Conclusion:\n")
  cat("  ", x$overall_conclusion, "\n")
}
#Normality test
library(DistCont)
normality_test(tidur)
## Normality Test Results
## ----------------------
## Significance level (alpha): 0.05 
## 
## Shapiro-Wilk Test:
##   W = 0.992442 , p-value = 0.8522473 
##   Conclusion: Data is normally distributed 
## 
## Kolmogorov-Smirnov Test:
##   D = 0.06308021 , p-value = 0.8210662 
##   Conclusion: Data is normally distributed 
## 
## Anderson-Darling Test:
##   A = 0.2964003 , p-value = 0.5863249 
##   Conclusion: Data is normally distributed 
## 
## Overall Conclusion:
##    All tests indicate normal distribution

Berdasarkan hasil uji normalitas yang dilakukan dengan tiga metode, yaitu Shapiro-Wilk, Kolmogorov-Smirnov, dan Anderson-Darling, seluruh nilai p-value yang diperoleh berada di atas tingkat signifikansi 0,05. Hal ini menunjukkan bahwa tidak terdapat cukup bukti untuk menolak hipotesis nol yang menyatakan bahwa data berasal dari distribusi normal. Uji Shapiro-Wilk menghasilkan nilai W sebesar 0,992 dan p-value sebesar 0,852, sedangkan uji Kolmogorov-Smirnov memberikan nilai D sebesar 0,063 dengan p-value sebesar 0,821. Sementara itu, uji Anderson-Darling menunjukkan nilai A sebesar 0,296 dengan p-value sebesar 0,586. Ketiga hasil ini secara konsisten mengindikasikan bahwa data simulasi yang dianalisis dapat dianggap berdistribusi normal. Oleh karena itu, asumsi kenormalan terpenuhi dan penggunaan metode statistik parametrik pada data ini dapat dibenarkan.

3.4 Simulasi Distribusi Eksponensial

Sebuah tempat layanan pelanggan mencatat bahwa rata-rata terdapat satu pelanggan yang datang setiap 3 menit, yang dapat dimodelkan dengan distribusi eksponensial dengan laju kedatangan (rate) λ = 1/3. Berdasarkan informasi tersebut, lakukan simulasi sebanyak 50 waktu antar kedatangan pelanggan menggunakan fungsi distribusi eksponensial. Selain itu, hitunglah peluang bahwa seorang pelanggan akan datang dalam waktu kurang dari atau sama dengan 2 menit.

library(DistCont)  # Paket kamu sendiri

set.seed(123)
n <- 50
rate <- 1/3  # 1 pelanggan tiap 3 menit

# Simulasi data waktu antar kedatangan
interarrival <- rexp_manual(n, rate)

# Waktu kedatangan kumulatif
arrival <- cumsum(interarrival)

# Probabilitas pelanggan datang dalam <= 2 menit
prob_2_menit <- pexp_manual(2, rate)
cat("P(Pelanggan datang dalam ≤ 2 menit):", round(prob_2_menit,4),"\n")
## P(Pelanggan datang dalam ≤ 2 menit): 0.4866
plot_pdf(dist = "exponential", params = list(rate = 1/3),
         main = "Kurva PDF Teoritis Waktu Antar Kedatangan")
abline(v = 2, col = "blue", lty = 2)  # Batas ≤ 2 menit

plot_cdf(dist = "exponential", params = list(rate = 1/3),
         main = "Kurva CDF Teoritis Waktu Antar Kedatangan")
abline(v = 2, col = "blue", lty = 2)  # Batas ≤ 2 menit

3.4.1 Memoryless Property

Sifat tanpa ingatan (memoryless property) merupakan karakteristik unik yang hanya dimiliki oleh distribusi eksponensial. Sifat ini menyatakan bahwa peluang kejadian di masa mendatang tidak bergantung pada apa yang telah terjadi sebelumnya. Pengujian sifat ini penting dalam konteks model sistem yang bergantung pada waktu tunggu atau jarak antar kejadian, seperti antrian, keandalan mesin, atau kedatangan pelanggan. Dengan menguji apakah data hasil simulasi atau data empiris memenuhi sifat ini, kita dapat menilai apakah distribusi eksponensial memang cocok digunakan untuk merepresentasikan fenomena tersebut.

#Fungsi R Memoryless Property
memoryless_property <- function(data, t, rate = NULL) {
  # Check input
  if (!is.numeric(data)) {
    stop("Data must be a numeric vector")
  }
  if (t <= 0) {
    stop("t must be positive")
  }

  # Remove NA values and negative values
  data <- data[!is.na(data) & data > 0]

  # Estimate rate if not provided
  if (is.null(rate)) {
    rate <- 1 / mean(data)
  }

  # Calculate theoretical probabilities
  P_X_gt_t <- pexp(t, rate = rate, lower.tail = FALSE)
  P_X_gt_s_plus_t <- pexp(t + 1, rate = rate, lower.tail = FALSE) # using s=1 for example
  theoretical_ratio <- P_X_gt_s_plus_t / P_X_gt_t

  # Calculate empirical probabilities
  empirical_P_X_gt_t <- mean(data > t)
  empirical_P_X_gt_s_plus_t <- mean(data > (t + 1))
  empirical_ratio <- empirical_P_X_gt_s_plus_t / empirical_P_X_gt_t

  # Create results
  results <- list(
    rate = rate,
    t = t,
    theoretical = list(
      P_X_gt_t = P_X_gt_t,
      P_X_gt_s_plus_t = P_X_gt_s_plus_t,
      ratio = theoretical_ratio
    ),
    empirical = list(
      P_X_gt_t = empirical_P_X_gt_t,
      P_X_gt_s_plus_t = empirical_P_X_gt_s_plus_t,
      ratio = empirical_ratio
    ),
    difference = abs(theoretical_ratio - empirical_ratio),
    conclusion = ifelse(abs(theoretical_ratio - empirical_ratio) < 0.1,
                        "Memoryless property holds",
                        "Memoryless property may not hold")
  )

  class(results) <- "memoryless_test"
  return(results)
}

print.memoryless_test <- function(x, ...) {
  cat("Memoryless Property Test for Exponential Distribution\n")
  cat("----------------------------------------------------\n")
  cat("Rate parameter (lambda):", x$rate, "\n")
  cat("Conditioning time (t):", x$t, "\n\n")

  cat("Theoretical Probabilities:\n")
  cat("  P(X > t) =", x$theoretical$P_X_gt_t, "\n")
  cat("  P(X > t + s) =", x$theoretical$P_X_gt_s_plus_t, "(with s=1)\n")
  cat("  P(X > t + s | X > t) =", x$theoretical$ratio, "\n\n")

  cat("Empirical Probabilities:\n")
  cat("  P(X > t) =", x$empirical$P_X_gt_t, "\n")
  cat("  P(X > t + s) =", x$empirical$P_X_gt_s_plus_t, "(with s=1)\n")
  cat("  P(X > t + s | X > t) =", x$empirical$ratio, "\n\n")

  cat("Difference between theoretical and empirical ratios:", x$difference, "\n")
  cat("Conclusion:", x$conclusion, "\n")
}
#Memoryless Property
library(DistCont)
memoryless_property(data = interarrival, t = 2)
## Memoryless Property Test for Exponential Distribution
## ----------------------------------------------------
## Rate parameter (lambda): 0.306655 
## Conditioning time (t): 2 
## 
## Theoretical Probabilities:
##   P(X > t) = 0.5415554 
##   P(X > t + s) = 0.398533 (with s=1)
##   P(X > t + s | X > t) = 0.7359045 
## 
## Empirical Probabilities:
##   P(X > t) = 0.5 
##   P(X > t + s) = 0.4 (with s=1)
##   P(X > t + s | X > t) = 0.8 
## 
## Difference between theoretical and empirical ratios: 0.06409552 
## Conclusion: Memoryless property holds

Berdasarkan hasil pengujian sifat tanpa ingatan (memoryless property) pada distribusi eksponensial, diperoleh bahwa nilai rasio peluang teoritis dan empiris cukup dekat satu sama lain. Dengan parameter laju kedatangan (rate) sebesar 0,3067 dan waktu kondisi \(t = 2\), peluang teoritis untuk \(P(X > t)\) adalah 0,5416, sedangkan untuk \(P(X > t + 1)\) sebesar 0,3985. Dari nilai tersebut, diperoleh peluang bersyarat teoritis \(P(X > t + 1 \mid X > t) = 0{,}7359\). Sementara itu, dari data simulasi diperoleh peluang empiris \(P(X > t) = 0{,}5\) dan \(P(X > t + 1) = 0{,}4\), sehingga menghasilkan rasio empiris \(P(X > t + 1 \mid X > t) = 0{,}8\). Selisih antara rasio teoritis dan empiris adalah sebesar 0,0641. Karena selisih ini cukup kecil, maka dapat disimpulkan bahwa sifat tanpa ingatan pada distribusi eksponensial terpenuhi dalam data simulasi ini. Hal ini menunjukkan bahwa peluang terjadinya kejadian di masa depan tidak bergantung pada berapa lama waktu telah berlalu sebelumnya, sesuai dengan karakteristik distribusi eksponensial.

4 Kesimpulan

Jadi, lewat package DistCont ini kita bisa dengan mudah:

  1. Menghitung PDF dan CDF untuk distribusi Normal dan Eksponensial
  2. Melakukan simulasi data acak untuk distribusi Normal dan Eksponensial.

Cocok banget buat keperluan belajar, eksplorasi data, sampai penelitian ringan.