Kali ini akan lebih fokus dalam membahas analisis sensitivitas dan simulasi Monte Carlo.
Analisis sensitivitas mempelajari sebagaimana ketidakpastian sebuah output/hasil model matematika atau sistem (numeric atau lainnya) dapat dibagikan ke berbagai sumber ketidakpastian pada inputnya. Paket R lpSolveAPI akan digunakan.
Simulasi Monte Carlo memanfaatkan sampel acak berulang yang didapatkan dari dunia atau populasi untuk memperoleh hasil tertentu. Simulasi ini juga dikenal sebagai simulasi probabilistik sebagai lawan dari simulasi deterministik.
Salah satu simulasi Monte Carlo diterapkan untuk memperoleh nilai dari pi. Simulasi tersebut didasari dengan membuat titik secara acak dengan unit persegi dan melihat berapa banyak titik yang jatuh pada lingkaran dalam unit persegi (bertanda warna merah). Semakin tinggi angka dari titik sampel, semakin dekat hasilnya dengan hasil sebenarnya pi. Setelah diputuskan untuk menggunakan 30.000 titik secara acak, perkiraan pi semakin mendekati dengan nilai sebenarnya dengan ketepatan 4 desimal.
Pada pembelajaran ini akan diajarkan untuk membuat sampel acak dengan berbagai simulasi dan cara untuk menggunakan analisis sensitivitas pada kasus penggunaan pemasaran.
Selalu ingat untuk mengatur working directory untuk sumber lokasi file. Klik pada “Session”, pilih “Set Working Directory”, lalu klik “To Source File Location”. Baca dengan seksama instruksi untuk menyelesaikan tugas dan menjawab semua pertanyaan. Kirimkan pekerjaan anda pada RPubs.
Untuk tugas Anda, mungkin menggunakan kumpulan data yang berbeda dari yang disertakan. Tugas/pertanyaan yang harus diselesaikan/dijawab ditandai dengan huruf tebal yang lebih besar dan diberi nomor sesuai dengan penempatannya di bagian tugas.
Untuk menggunakan analisis sensitivitas, unduh paket lpSolveApi kecuali sudah terpasang pada R anda.
# Require will load the package only if not installed
# Dependencies = TRUE makes sure that dependencies are install
if(!require("lpSolveAPI",quietly = TRUE))
install.packages("lpSolveAPI",dependencies = TRUE, repos = "https://cloud.r-project.org")Kita akan membahas kembali kasus pemasaran yang telah dibahas.
# We start with `0` constraint and `2` decision variables. The object name `lpmark` is discretionary.
lpmark2 = make.lp(0, 2)
# Define type of optimization as maximum and dump the screen output into a `dummy` variable
dummy = lp.control(lpmark2, sense="max")
# Set the objective function coefficients
set.objfn(lpmark2, c(275.691, 48.341))
#Add all constraints to the model
add.constraint(lpmark2, c(1, 1), "<=", 350001)
add.constraint(lpmark2, c(1, 0), ">=", 15000)
add.constraint(lpmark2, c(0, 1), ">=", 75000)
add.constraint(lpmark2, c(2, -1), "=", 1)
add.constraint(lpmark2, c(1, 0), ">=", 0)
add.constraint(lpmark2, c(0, 1), ">=", 0)
#Show the problem setting in tabular/matrix form. It's useful to see if our contraints have been properly set.
lpmark2## Model name:
## C1 C2
## Maximize 275.691 48.341
## R1 1 1 <= 350001
## R2 1 0 >= 15000
## R3 0 1 >= 75000
## R4 2 -1 = 1
## R5 1 0 >= 0
## R6 0 1 >= 0
## Kind Std Std
## Type Real Real
## Upper Inf Inf
## Lower 0 0
## [1] 0
#The next two lines of codes will show the optimum results.
#Frist: Display the objective function optimum value i.e. the optimum sales value.
get.objective(lpmark2)## [1] 43443717
#Second: Display the decision variables optimum values i.e. the optimum values for radio and tv ads.
get.variables(lpmark2) ## [1] 116667.3 233333.7
Untuk bagian sensitivitas akan ditambahkan 2 kode untuk memperoleh hasil sensitivitas.
## $objfrom
## [1] -96.6820 -137.8455
##
## $objtill
## [1] 1e+30 1e+30
Tugas 1: Hasilnya memiliki 2 bagian yaitu: output yang ditandai objfrom menunjukkan batas bawah dari koefisien sedangkan output yang ditandai objtill menunjukkan batas atas. Jelaskan secara bersamaan apa yang diwakili oleh hasil sensitivitas dengan mengacu pada model pemasaran.
Jawaban Tugas 1: objfrom menunjukkan angka terendah dari tiap variabel agar persamaan tersebut dapat dipenuhi tanpa perlu dioptimalkan dan objtill angka besar yang tak terhingga.
#Display sensitivity to the CONSTRAINTS (or the right hand side values).
#There will be a total of m+n values where m is the number of contraints and n is the number of decision variables
get.sensitivity.rhs(lpmark2) ## $duals
## [1] 124.12433 0.00000 0.00000 75.78333 0.00000 0.00000 0.00000
## [8] 0.00000
##
## $dualsfrom
## [1] 1.125005e+05 -1.000000e+30 -1.000000e+30 -3.050010e+05 -1.000000e+30
## [6] -1.000000e+30 -1.000000e+30 -1.000000e+30
##
## $dualstill
## [1] 1.00000e+30 1.00000e+30 1.00000e+30 4.75002e+05 1.00000e+30 1.00000e+30
## [7] 1.00000e+30 1.00000e+30
Tugas 2: Untuk tugas ini kita hanya penasaran dalam output/hasil yang pertama yang ditandai dengan duals. Jelaskan secara bersamaan apa yang diwakili oleh kedua hasil sensitivitas bukan nol tersebut. Dalam jawaban Anda, bedakan antara batasan yang mengikat dan tidak mengikat, sertakan penjelasan tentang kelebihan/kekurangan, dan nilai-nilai marjinal.
Jawaban Tugas 2: hasil sensitivitas bukan nol itu mewakili kendala yang tidak mengikat yang berarti bahwa saat variabel meningkat, solusi optimal tidak terpengaruh, dalam kata lain, memiliki kelonggaran untuk “bergerak” sementara batasan pengikatan terbatas dan akan mempengaruhi solusi optimal jika ditingkatkan. Ini juga berarti bahwa ada nilai marjinal jika terikat dan oleh karena itu dipengaruhi oleh perubahan tersebut.
Untuk memahami lebih lanjut mengenai hasil sensitivitas dan untuk konfirmasi integritas kalkulasinya, uji independen dapat dilakukan.
Tugas 3: Gunakan penyelesaian program linier dari awal, dengan model baru lpmark1. Semuanya sama, hanya ganti batasan anggaran jadi $1 lalu selesaikan. Secara spesifik, batasan pertama \(X_1 +X_2 \le 350000\) menjadi \(X_1 +X_2 \le 350001\). Catatan: Nilai optimal untuk penjualan yang diberikan oleh fungsi objektif \(43443641\)
# Define a new model object called lpmark1
lpmark1 = make.lp(0, 2)
# Repeat rest of commands with the one constraint change for budget. Solve and display the objective function optimum valueTugas 4: Hitung perubahan diferensial dalam penjualan.
Jawaban Tugas 4: 43443641. Tidak ada perbedaan pada penjualan
Tugas 5: Gunakan penyelesaian program linier dari awal dengan model baru lpmark2. Semuanya sama, hanya ganti batasan keempat \(2X_1-X_2=0\) by only $1 lalu selesaikan. Batasan barunya menjadi \(2X_1-X_2=1\). Catatan: Nilai optimal untuk penjualan diberikan oleh fungsi objektif \(43443717\)
# Define a new model object called lpmark2
lpmark2 = make.lp(0, 2)
# Repeat rest of commands with the above constraint changed. Solve and display the objective function optimum valueTugas 6: Hitung perubahan diferensial dalam penjualan.
Jawaban Tugas 6: 43443717. Perbedaannya meningkat antara lpmark1 dan lpmark2
Untuk tugas ini kita akan menjalankan simulasi Monte Carlo untuk menghitung probabilitas bahwa pengembalian harian dari S&P akan \(>5%\). Kami akan mengasumsikan bahwa laba harian S&P historis mengikuti distribusi normal dengan pengembalian harian rata-rata \(0,03(%)\) dan standar deviasi \(0,97(%)\).
Untuk memulai akan dibuat 100 sampel acak dari distribusi normal. Kita akan hitung mean, standar deviasi, dan probabilitas kejadian dimana hasil simulasi lebih besar dari 5%.
Untuk membuat sampel acak dari distribusi normal gunakan fungsi rnorm(). Dalam contoh dibawah sampel dibawah diatur sampai 100.
# number of simulations/samples
runs2 = 10000
# random number generator per defined normal distribution with given mean and standard deviation
sims2 = rnorm(runs2,mean=0.03,sd=0.97)## [1] 0.03654807
## [1] 0.9720185
# probability of occurrence on any given day based on samples will be equal to count (or sum) where sample result is greater than 5% divided by total number of samples.
prob2 = sum(sims2 >=0.05)/runs2
prob2## [1] 0.4971
Tugas 7: Ulangi perhitungan diatas sampai simulasi ke-1000. Catat mean, standar deviasi dan probabilitasnya. Beri nama pada tiap variabel seperti runs1, sims1, average1, std1, dan prob1.
Tugas 8: Ulangi perhitungan diatas sampai simulasi ke-1000. Catat mean, standar deviasi dan probabilitasnya. Beri nama pada tiap variabel seperti runs2, sims2, average2, std2, dan prob2.
Tugas 9: Buat daftar dalam bentuk tabel nilai mean, deviasi standar, dan probabilitas untuk ketiga kasus: simulasi 100, 1000, dan 10000.
simulations <- c(100, 1000, 10000)
mean <- c(0.0205, 0.02989, 0.02195)
sd <- c(0.995, 0.9843, 0.9624)
prob <- c(0.457, 0.491, 0.4855)
sim <- data.frame(simulations,mean,sd,prob)
knitr::kable(sim)| simulations | mean | sd | prob |
|---|---|---|---|
| 100 | 0.02050 | 0.9950 | 0.4570 |
| 1000 | 0.02989 | 0.9843 | 0.4910 |
| 10000 | 0.02195 | 0.9624 | 0.4855 |
Tugas 10: Jelaskan bagaimana nilai berubah/berperilaku seiring bertambahnya jumlah simulasi. Apa taruhan terbaik Anda untuk kemungkinan terjadinya lebih besar dari 5% dan mengapa? Bagaimana ini mirip dengan kasus penggunaan gambar untuk menghitung pi yang disajikan di paragraf pengantar?
Jawaban Tugas 10: Secara umum, semakin banyak simulasi yang dilakukan, semakin akurat hasil prediksi yang berarti standar deviasi semakin mengecil dan probabilitas meningkat. sekitar separuh waktu pengembalian lebih besar dari 5%. Ini serupa dalam arti bahwa semakin banyak variabel ditambahkan, semakin akurat predisinya dan semakin representatif angkanya di dunia nyata.
Latihan terakhir 2C) boleh dikerjakan untuk yang penasaran dalam meningkatkan pembelajarannya dan menambah ketrampilan dalam R. Hasil anda akan dimasukkan namun tidak dinilai untuk latihan ini. Instruksi dipresentasikan dalam video excel [https://www.youtube.com/watch?v=wKdmEXCvo9s]
2C) Ulangi latihan untuk harian S&P dimana semua sama kecuali sekarang ingin mengetahui pengembalian kumulatif mingguan dan probabilitas pengembalian kumulatif mingguan lebih dari 5%. Atur jumlah simulasi jadi 10000.