knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
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
hist(nilai)
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
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 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
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:
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).