knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)

Data Historis Acuan

Pertama-tama, saya akan membangkitkan secara random data nilai tugas seorang mahasiswa selama masa perkuliahannya sebanyak 500 dengan rentang nilai 0-100. Dengan kata lain, data nilai yang dibangkitkan adalah data berdistribusi UNIF~(0,100).

set.seed(048)
nilai=seq(0, 100, by=10)
nilai=sample(nilai, 500, replace = TRUE)
nilai
##   [1]  40  90  20  80  80  40  90  80  40  30 100  60  10  60  20  30  30  90
##  [19]  40 100  60  80  10 100  70   0  70  50  80 100  40  80  20  40   0  80
##  [37]   0   0  30  50  50  70  20  50  70  30 100  80  70  60  40  30  40  20
##  [55]  60  90  40  20  60  40  40  30  80  90  80   0 100   0   0  90  10  50
##  [73]  10  90  60 100 100 100  30  50 100  40  80  90  20  10  30  80   0  30
##  [91]  50  60  90  40  40  40  80 100  60  40  80  60  60 100  90  80  90  60
## [109] 100  50  60   0  30  30  80  60  60  50  90  90  80 100   0  10  60  30
## [127]  70   0   0 100  40  50  50  10  10  10  60  80 100   0  80  90  60  90
## [145]  70  20  70  40   0  20  30  50  90  60  20  80  20  40  60  60  70  70
## [163]   0  20  70   0  70  60  50  60  70  10  90  70  90   0  80  10  70  80
## [181]  60   0  30 100  10   0  40  90  70  40  70  60  40   0  30 100  20  10
## [199]  70  20  50  40  40 100  90  40  40  20  90  90  90 100  60  70  50  80
## [217]  50  10  40  30  40   0  80  50  80  30  40  30  60  30  80  40  60  20
## [235]  60  60  20  20  10  20  50  30  50  60  40  60 100  80  20  40  40  90
## [253]  70  50  60  50  90  20 100 100  30  80  20  60  20 100  50   0  50  50
## [271]  50  60  30  10  90 100  10  20  40  90  80  30   0  40  80  20   0  80
## [289] 100  60  70  80  90  10  50  20 100  30  40  60  50  90  40  30 100  70
## [307]  70  90  50  10  60  30 100  50  30  50  10  40 100  70  30  70  50  20
## [325]  50  90  40  80  50   0  70  80  90  50  20  80  60 100  20  60   0  60
## [343]   0  40   0  20  10   0  70  70  20  60  20  60  70  30  30  30   0  10
## [361]  70  60  90  70  80  60 100 100  40  10  40 100  10 100  20   0  50  80
## [379]  20  10   0  90  90  50  50   0   0  70  50  10  40  30 100  20  30  20
## [397]   0  20 100  20   0   0  90  40   0  50  20  90  20  70  30  20  80  20
## [415]  30  40  50  70  70  10  60  30  30   0 100  90  40  10  50 100  60  60
## [433]  90  60  20  90 100  60  20  30  50 100   0  40  90 100  90 100  30  60
## [451]  10 100  90  70  70  60  10  50  70 100  60  90  60  60  40  80  90 100
## [469]  90  60  30  10  70  40  10  90   0  20  80  70 100  30   0  90  30  30
## [487]  80  40  30  20  90   0 100  60  50  30  40   0  50  70

Histogram Nilai

hist(nilai)

Tabel Frekuensi

Selanjutnya, saya akan membuat sebuah data frame yang memuat tabel frekuensi dari data nilai yang dibangkitkan beserta peluang dan peluang kumulatifnya.

frek=table(nilai)

prob=frek/sum(frek)

kum=cumsum(prob)

#Data frame hasil
hasil = data.frame(
  Nilai = as.numeric(names(frek)),
  Frekuensi = as.numeric(frek),
  Peluang = as.numeric(prob),
  Kumulatif = kum
)

hasil
##     Nilai Frekuensi Peluang Kumulatif
## 0       0        44   0.088     0.088
## 10     10        32   0.064     0.152
## 20     20        46   0.092     0.244
## 30     30        46   0.092     0.336
## 40     40        51   0.102     0.438
## 50     50        45   0.090     0.528
## 60     60        57   0.114     0.642
## 70     70        41   0.082     0.724
## 80     80        41   0.082     0.806
## 90     90        49   0.098     0.904
## 100   100        48   0.096     1.000

Interval Random Number

Hasil dari peluang kumulatif data akan menjadi acuan dalam menentukan interval random number.

#Menghitung interval berdasarkan peluang kumulatif
for (i in 1:nrow(hasil)) {
  if (i == 1) {
    hasil$Interval[i] <- paste0("0-", round(hasil$Kumulatif[i] * 100, 0))
  } else {
    hasil$Interval[i] <- paste0(
      round((hasil$Kumulatif[i - 1] * 100) + 1, 0),
      "-",
      round(hasil$Kumulatif[i] * 100, 0)
    )
  }
}

hasil
##     Nilai Frekuensi Peluang Kumulatif Interval
## 0       0        44   0.088     0.088      0-9
## 10     10        32   0.064     0.152    10-15
## 20     20        46   0.092     0.244    16-24
## 30     30        46   0.092     0.336    25-34
## 40     40        51   0.102     0.438    35-44
## 50     50        45   0.090     0.528    45-53
## 60     60        57   0.114     0.642    54-64
## 70     70        41   0.082     0.724    65-72
## 80     80        41   0.082     0.806    73-81
## 90     90        49   0.098     0.904    82-90
## 100   100        48   0.096     1.000   91-100

Simulasi Prediksi Nilai

Simulasi monte carlo akan dilakukan untuk memprediksi 50 data nilai tugas yang akan didapatkan oleh mahasiswa di kemudian hari dengan langkah-langkah berikut.

1. Membangkitkan angka random sebanyak 50 data dengan rentang nilai 0-100

set.seed(048)
random = runif(50, 0, 100)
random
##  [1] 57.9166205  3.3829413  0.2716767 37.7331126 24.3292001 11.8880020
##  [7] 98.1025261  3.8310307 78.5301141 46.3556413 68.7880259 33.9175065
## [13] 90.5081604 51.4351496 59.4720186 90.7868248 66.0141646 80.2932073
## [19] 34.5649934 50.7416924 38.4004425 25.8815709 99.1559346 48.6847937
## [25] 81.6624750 96.1837991 45.1852571  8.8345680 95.8672750 52.3408665
## [31]  0.2246516 42.1929036 20.4574744  2.4803258 42.6097613 43.6004154
## [37] 75.0153025 87.9326487 50.9864222 21.8874997 73.7327999 28.0438359
## [43] 52.3303877 77.6618229 72.4841965 15.2945092 49.9106196 76.8439003
## [49] 71.5498959 59.0024232

2. Memprediksi nilai berdasarkan angka random yang dibangkitkan

Dari langkah pertama, akan dihasilkan 50 angka random pada rentang 0-100. Hasil angka random ini kemudian yang akan digunakan sebagai acuan simulasi nilai prediksi yang akan didapatkan. Sebelumnya, saya akan mencocokkan angka random yang dibangkitkan dengan kategori interval angka random yang sesuai yang telah ditentukan sebelumnya.

Sebagai contoh, apabila angka random yang dihasilkan adalah 26, maka akan termasuk pada interval (25-34) sehingga nilai prediksi yang didapatkan adalah 30.

simulasi <- data.frame(
  Angka_Random = round(random)
)

for (i in 1:nrow(simulasi)) {
  angka <- simulasi$Angka_Random[i]
  if (angka >= 0 & angka <= 9) {
    simulasi$Prediksi_Nilai[i] <- 0
  } else if (angka >= 10 & angka <= 15) {
    simulasi$Prediksi_Nilai[i] <- 10
  } else if (angka >= 16 & angka <= 24) {
    simulasi$Prediksi_Nilai[i] <- 20
  } else if (angka >= 25 & angka <= 34) {
    simulasi$Prediksi_Nilai[i] <- 30
  } else if (angka >= 35 & angka <= 44) {
    simulasi$Prediksi_Nilai[i] <- 40
  } else if (angka >= 45 & angka <= 53) {
    simulasi$Prediksi_Nilai[i] <- 50
  } else if (angka >= 56 & angka <= 64) {
    simulasi$Prediksi_Nilai[i] <- 60
  } else if (angka >= 65 & angka <= 72) {
    simulasi$Prediksi_Nilai[i] <- 70
  } else if (angka >= 73 & angka <= 81) {
    simulasi$Prediksi_Nilai[i] <- 80
  } else if (angka >= 82 & angka <= 90) {
    simulasi$Prediksi_Nilai[i] <- 90
  } else {
    simulasi$Prediksi_Nilai[i] <- 100  
  }
}

#Tabel Simulasi Prediksi Nilai
simulasi
##    Angka_Random Prediksi_Nilai
## 1            58             60
## 2             3              0
## 3             0              0
## 4            38             40
## 5            24             20
## 6            12             10
## 7            98            100
## 8             4              0
## 9            79             80
## 10           46             50
## 11           69             70
## 12           34             30
## 13           91            100
## 14           51             50
## 15           59             60
## 16           91            100
## 17           66             70
## 18           80             80
## 19           35             40
## 20           51             50
## 21           38             40
## 22           26             30
## 23           99            100
## 24           49             50
## 25           82             90
## 26           96            100
## 27           45             50
## 28            9              0
## 29           96            100
## 30           52             50
## 31            0              0
## 32           42             40
## 33           20             20
## 34            2              0
## 35           43             40
## 36           44             40
## 37           75             80
## 38           88             90
## 39           51             50
## 40           22             20
## 41           74             80
## 42           28             30
## 43           52             50
## 44           78             80
## 45           72             70
## 46           15             10
## 47           50             50
## 48           77             80
## 49           72             70
## 50           59             60

Histogram Data Prediksi Nilai

hist(simulasi$Prediksi_Nilai)

3. Mengecek distribusi dari data prediksi nilai

Untuk mengecek apakah data prediksi nilai yang dihasilkan telah mengikuti distribusi acuan pada data historis yaitu distirbusi UNIF~(0,100), saya akan menggunakan Uji Kolmogorov-Smirnov yang tersedia pada library(fitdistrplus). Adapun hipotesis dari uji KS adalah sebagai berikut:

  • H0 : Data yang diamati berasal dari distribusi yang diharapkan
  • H1 : Data yang diamati tidak berasal dari distribusi yang diharapkan
library(dplyr)
library(fitdistrplus)

uji_ks = ks.test(simulasi$Prediksi_Nilai, "punif", 0, 100)
uji_ks
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  simulasi$Prediksi_Nilai
## D = 0.12, p-value = 0.4676
## alternative hypothesis: two-sided

Berdasarkan uji Kolmogorov-Smirnov yang telah dilakukan pada data prediksi nilai, didapatkan hasil p-value > 0.05 yang berarti Gagal Tolak H0 dan dapat disimpulkan bahwa data prediksi nilai memiliki distribusi yang sama dengan asumsi distribusi pada data acuan yaitu UNIF~(0,100).