Karar vericiler, stratejik veya taktiksel bir hamlenin etkisini önceden değerlendirebilmek ve böylece hedeflerine ulaşmak için en uygun stratejileri planlayabilmek için güvenilir tahmin sistemlerine ihtiyaç duyarlar. Eğer-ise (What-if) analizi, amacı kurumsal işletme veya onun bir parçası gibi karmaşık bir sistemin davranışını senaryo adı verilen bazı hipotezler altında incelemek olan veri yoğun bir simülasyondur. Özellikle, eğer-ise analizi bir dizi bağımsız değişkendeki değişikliklerin bir dizi bağımlı değişkeni belirli bir simülasyon modeline referansla nasıl etkilediğini ölçmektedir. Uygulamada, bir senaryonun formüle edilmesi, analistin daha sonra sorgulayabileceği ve gezinebileceği varsayımsal bir dünyanın oluşturulmasını sağlamaktadır.
Eğer-ise analizi yapmanın metodolojik bir yaklaşımı olarak kabul edilen Monte Carlo simülasyonu, belirsiz senaryoları analiz etmek ve birden fazla farklı senaryonun derinlemesine analizini sağlamak için oldukça kullanışlı bir istatistiksel araçtır. Monte Carlo yöntemi veya çoklu olasılık simülasyonu olarak da bilinen Monte Carlo Simülasyonu, belirsiz bir olayın olası sonuçlarını tahmin etmek için kullanılan matematiksel bir tekniktir. Monte Carlo yöntemi, II. Dünya Savaşı sırasında belirsiz koşullar altında karar vermeyi geliştirmek amacıyla John von Neumann ve Stanislaw Ulam tarafından geliştirilmiştir. Adını, özünde şans unsuru barındırdığından Monaco’ya bağlı Monte Carlo kasabasından almıştır.
Monte Carlo simülasyonu, bir deneyi birçok kez tekrarlayan ve sistemi daha iyi tanımlamak için büyük miktarda rastgele veri üreten bir süreçtir. Monte Carlo simülasyonları, yapay zeka, hisse senedi fiyatları, satış tahmini, proje yönetimi ve fiyatlandırma gibi birçok gerçek hayat senaryosunda riskin etkisini değerlendirmede kullanılmaktadır. Ayrıca, sabit girdili tahmin modellerine göre duyarlılık analizi yapma veya girdilerin korelasyonunu hesaplama yeteneği gibi bir dizi avantaj da sağlamaktadır. Duyarlılık analizi, karar vericilerin bireysel girdilerin belirli bir sonuç üzerindeki etkisini görmelerine olanak tanımaktadır.
Monte Carlo yöntemleri, genellikle bir fonksiyonun belirli bir bölgedeki integralinin değerlendirilmesinin söz konusu olduğu durumlarda uygulanır. Bu tür fonksiyonların özellikleri genellikle karmaşıktır ve/veya bilinmezdir. Bu nedenle kapalı form çözümler geliştirmek zor olabilir. Monte Carlo yöntemleri dışındaki sayısal teknikler de değerlendirilen fonksiyonun karmaşıklığı nedeniyle kullanışlı olmayabilir. Bu tür durumlarda, Monte Carlo yöntemleri problemi çözmek için basit ancak etkili bir araç sunmaktadır. Yukarıda tanımlanan türdeki problemler neredeyse her bilimsel disiplinde bulunduğundan Monte Carlo yöntemlerinin kimya, mühendislik, yöneylem araştırması, fizik ve istatistik dahil olmak üzere birçok bilimsel disiplinde etkin bir şekilde kullanılması şaşırtıcı değildir.
Monte Carlo simülasyonu nasıl çalışır?
Normal bir tahmin modelinden farklı olarak Monte Carlo simülasyonu, bir dizi sabit girdi değerine karşı tahmini bir değer aralığına dayalı bir dizi sonuç tahmin eder. Başka bir deyişle, Monte Carlo simülasyonu, doğası gereği belirsizliğe sahip herhangi bir değişken için tekdüze (uniform) veya normal dağılım gibi bir olasılık dağılımından yararlanarak olası sonuçların bir modelini oluşturur. Daha sonra, her seferinde minimum ve maksimum değerler arasında farklı bir rastgele sayı kümesi kullanarak sonuçları tekrar tekrar hesaplar. Tipik bir Monte Carlo deneyinde bu denemeler binlerce kez tekrarlanarak çok sayıda olası sonuç elde edilebilir.
Monte Carlo simülasyonları, doğrulukları nedeniyle uzun vadeli tahminler için de kullanılmaktadır. Monte Carlo simülasyonlarında girdi sayısı arttıkça tahminlerin sayısı da artış göstermektedir. Bu da sonuçları zaman içinde daha uzun dönemlere daha doğru bir şekilde yansıtmanıza olanak tanımaktadır. Monte Carlo simülasyonu tamamlandığında her sonucun gerçekleşme olasılığıyla birlikte bir dizi olası sonuç elde edilmektedir.
Monte Carlo simülasyonunun basit bir örneği, iki hilesiz standart zarın atılma olasılığının hesaplanmasıdır. İki zarın 36 (62) atılma kombinasyonu bulunmaktadır. Bu sonuca bağlı olarak belirli bir sonucun olasılığını manuel olarak hesaplayabilirsiniz. Monte Carlo simülasyonunu da kullanarak, daha doğru tahminler elde etmek için zarların 10.000 kez (veya daha fazla) atılmasını simüle edebilirsiniz.
Monte Carlo yöntemleri nasıl kullanılır?
Hangi aracı kullanırsanız kullanın Monte Carlo yöntemleri üç temel uygulama adımını içermektedir:
- Hem tahmin edilecek bağımlı değişkeni hem de tahmini yönlendirecek bağımsız değişkenleri (girdi, risk veya tahmin değişkenleri olarak da bilinir) tanımlayarak tahmine dayalı model kurulur.
- Bağımsız değişkenlerin olasılık dağılımları tanımlanır. Olası değerlerin bir aralığını tanımlamak ve her birine olasılık ağırlıkları atamak için geçmiş verileri ve/veya analistin öznel yargısı kullanılır.
- Bağımsız değişkenlerin rastgele değerlerini üreterek simülasyonları tekrar tekrar çalıştırılır. Neredeyse sonsuz sayıdaki olası kombinasyonların temsili bir örneklemini oluşturmak için yeterli sonuç toplanana kadar bu işlem yapılır.
Verileri simüle etmek için kullandığınız temel parametreleri değiştirerek istediğiniz kadar Monte Carlo simülasyonu çalıştırabilirsiniz. Bununla birlikte, yaygın olarak kullanılan yayılma ölçüleri olan varyans ve standart sapmayı hesaplayarak bir örneklem içindeki varyasyon aralığını da hesaplamak isteyeceksiniz. Verilen değişkenin varyansı, değişken ile beklenen değeri arasındaki farkın karesinin beklenen değeridir. Standart sapma ise varyansın kareköküdür. Tipik olarak daha küçük farklılıklar, diğer bir ifadeyle sapmalar daha iyi kabul edilmektedir.
Bu çalışma kapsamında R programlama dili kullanarak yazılan alternatif uygulama algoritmaları ile temel düzeyde Monte Carlo simülasyonları adım adım gösterilmiştir. Ele alınan örnek uygulama başlıkları şöyledir:
- Normal dağılım simülasyonu
- Üstel dağılım simülasyonu
- Kar-zarar örneği
Yüklenen Kütüphaneler
Bu kısımda ilk olarak R fonksiyonunun çalıştırılması ve elde edilen bulguların görselleştirilmesi için gerekli kütüphaneler verilmiştir. Kolaylık sağlaması açısından yukarıda kütüphanelerin yüklenmesini gösterir tabloyu da elde etmek ve daha kolay okumanız için aşağıda R kod bloğu yazılmıştır. Aşağıdaki R kod bloğunun çalıştırılmasından sonra kütüphanelerin yüklenip yüklenmediğine dair aşağıdaki gibi mantıksal vektör sonuçları gelecektir. Eğer mantıksal vektör sonuçlarının hepsi TRUE ise kütüphanelerin hepsi yüklenmiştir. Bu durumda aşağıdaki tabloda “Yüklendi” ifadesi gelecektir. Eğer ilgili kütüphane yüklenmemiş olursa “Paket Kurulumu Gerekli” ifadesi tablonun satırlarında yazacaktır. Bu durumda ise ilgili kütüphanelerin kurulması gerekmektedir. İlgili kütüphane veya kütüphaneler kurulduğunda tabloda “Paket Kurulumu Gerekli” ifadesi yerine “Yüklendi” ifadesi gelecektir.
kütüphane<-c("dplyr","tibble","ggplot2","ggthemes", "gt", "flextable", "report", "citation", "ggpubr")
yükle<-sapply(kütüphane, require, character.only = TRUE, warn.conflicts = FALSE)
Kütüphane Yüklenme Durumunu Gösteren Tablo
tibble(Sıra=1:length(kütüphane), Kütüphane=names(yükle), Durumu=as.logical(yükle)) %>% mutate(Durumu=if_else(Durumu==TRUE, "Yüklendi", "Paket Kurulumu Gerekli")) %>%
flextable() %>%
bold(i = 1, bold = TRUE, part = "header") %>%
align_text_col(align = "center", header = TRUE, footer = TRUE) %>%
autofit()
Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen kütüphane yüklenme durumunu gösteren tablo aşağıda verilmiştir.
Normal Dağılım Simülasyonu Fonksiyonu Oluşturma
Aşağıdaki yazılan nds() fonksiyonu ile normal dağılıma uygun değerler üretilerek normal dağılım simülasyonu oluşturulmuştur. Fonksiyon biçiminde yazılarak sizlerin sonsuz kez deneme yapması amaçlanmıştır.
nds<-function(tekrar=rep(NA, NULL), orneklem=NULL, ortalama=NULL, ssapma=NULL){
for(i in 1:tekrar){
orneklem_buyuklugu<-rnorm(n=orneklem, mean=ortalama, sd=ssapma) # normal dağılıma uygun veri üretmek
orneklem_ortalaması<-mean(orneklem_buyuklugu)
tekrar[i]<-orneklem_ortalaması
}
return(tekrar)
}
Normal Dağılım Simülasyonu Örnek Uygulaması
İlk örneğimizde normal dağılımdan örneklem büyüklüğü (n) 100, ortalaması (mean) 80, standard sapması (sd) 7 olan değerler üretilmiştir. Ardından bu örneklemden edilen edilen değerlerin ortalaması alınmıştır. En son durumda ise elde edilen değerler 1.000 kez üretilmiştir. Burada sizler nds() fonksiyonuna farklı parametre değerleri girerek farklılaşmaları görebilirsiniz. nds() fonksiyonunun çalıştırılması ile elde edilen İlk 20 değer aşağıda tablo üzerinde verilmiştir.
set.seed(61) # aynı değerleri üretmek için
sonuc<-nds(tekrar=1000, orneklem=100, ortalama=80, ssapma=7)
tibble("Sıra"=1:20, "Normal Dağılım Değerleri"=head(sonuc, 20)) %>%
flextable() %>%
bold(i = 1, bold = TRUE, part = "header")
Normal Dağılım Simülasyonu Sonuçlarının Görselleştirilmesi
Aşağıdaki grafikte nds() fonksiyonunun çalıştırılması ile normal dağılımdan elde edilen 1.000 simülasyonun sonucu histogram üzerinde Stata teması (theme_stata()) ile verilmiştir. Grafiğin ortasında yer alan dikey kesikli kırmızı çizgi sonuçların ortalamasını göstermektedir.
ggplot(data.frame(sonuc), aes(sonuc)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(sonuc),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(title="Monte Carlo Normal Dağılım Simülasyonu",
subtitle="Sentetik Veriler Üzerinde Bir Deneme",
caption="NDS by Tevfik Bulut") +
theme_stata()
# ggsave("nds.png", dpi = 300) # grafik rmd dosyası içerisine kaydedilmek istenirse
Normal Dağılım Simülasyonu Sonuçlarının Karşılaştırmalı Görselleştirilmesi
Aşağıda nds() fonksiyonu ile diğer parametre değerleri sabit kalmak koşuluyla simülasyon sayısı ikinci örnekte 1.000’den 10.000’e yükseltilmiştir. Literatürde belirsizliklerin tam olarak ortaya konulabilmesi için Monte Carlo yönteminden üretilmesi gereken simülasyon sayısının genelde 10.000 olduğu görülmektedir.
set.seed(61) # aynı sonuçları almak için
sonuc1<-nds(tekrar=1000, orneklem=100, ortalama=80, ssapma=7) # 1.000 simülasyon
sonuc2<-nds(tekrar=10000, orneklem=100, ortalama=80, ssapma=7) # 10.000 simülasyon
## ilk grafik: simülasyon sayısı 1.000
g1<- ggplot(data.frame(sonuc1), aes(sonuc1)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(sonuc1),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(title="Monte Carlo Normal Dağılım Simülasyonu",
subtitle="Sentetik Veriler Üzerinde Bir Deneme (Simülasyon=1.000)")+
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))
## ikinci grafik: simülasyon sayısı 10.000
g2<-ggplot(data.frame(sonuc2), aes(sonuc2)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(sonuc2),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(subtitle="Sentetik Veriler Üzerinde Bir Deneme (Simülasyon=10.000)")+
theme(plot.subtitle = element_text(hjust = 0.5))
ggarrange(g1, g2, nrow = 2) +
theme_stata()
Alternatif Yaklaşım: Normal Dağılım Simülasyonu Fonksiyonu Oluşturma
Konu programlama diliyle fonksiyon oluşturma olunca birçok alternatif önümüze çıkmaktadır. Aşağıdaki R’da tanımlana sapply() fonksiyonu ile normal dağılıma uygun değerler üretilerek normal dağılım simülasyonu oluşturulmuştur.Aşağıda sapply() fonksiyonu ile diğer parametre değerleri sabit kalmak koşuluyla simülasyon sayısı ikinci örnekte 1.000’den 10.000’e yükseltilmiş ve ilk uygulamadaki aynı parametre değerleri baz alınmıştır. Bunun nedeni daha önce yazılan nds() fonksiyonu ile aynı sonuçların üretilmek istenmesidir. Siz dilerseniz farklı parametrelerle farklı sonuçları aşağıdaki fonksiyonla üretebilirsiniz.
set.seed(61) # aynı sonuçları üretmek için.
alsonuc1<-sapply(1:1000, function(x) mean(rnorm(n=100, mean=80, sd=7)))
alsonuc2<-sapply(1:10000, function(x) mean(rnorm(n=100, mean=80, sd=7)))
## ilk grafik
ag1<- ggplot(data.frame(alsonuc1), aes(alsonuc1)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(alsonuc1),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(title="Alternatif Yaklaşım: Monte Carlo Normal Dağılım Simülasyonu",
subtitle="Sentetik Veriler Üzerinde Bir Deneme (Simülasyon=1.000)")+
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))
## ikinci grafik
ag2<-ggplot(data.frame(alsonuc2), aes(alsonuc2)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(alsonuc2),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(subtitle="Sentetik Veriler Üzerinde Bir Deneme (Simülasyon=10.000)")+
theme(plot.subtitle = element_text(hjust = 0.5))
ggarrange(ag1, ag2, nrow = 2) +
theme_stata()
Üstel Dağılım Simülasyonu Fonksiyonu Oluşturma
Aşağıdaki yazılan üds() fonksiyonu ile üstel dağılıma uygun değerler üretilerek üstel dağılım (exponential distribution) simülasyonu oluşturulmuştur. Fonksiyon biçiminde yazılarak sizlerin sonsuz kez deneme yapması amaçlanmıştır.
üds<-function(tekrar=rep(NA, NULL), orneklem=NULL, lambda=NULL){
for(i in 1:tekrar){
orneklem_buyuklugu<-rexp(n=orneklem, rate=lambda) # üstel dağılıma uygun veri üretme
orneklem_ortalaması<-mean(orneklem_buyuklugu)
tekrar[i]<-orneklem_ortalaması
}
return(tekrar)
}
Üstel Dağılım Simülasyonu Örnek Uygulaması
İlk örneğimizde üstel dağılımdan örneklem büyüklüğü (n) 100, lambda değeri 2 olan değerler üretilmiştir. Ardından bu örneklemden edilen edilen değerlerin ortalaması alınmıştır. En son durumda ise elde edilen değerler 1.0000 kez üretilmiştir. Burada sizler üds() fonksiyonuna farklı parametre değerleri girerek farklılaşmaları görebilirsiniz. üds() fonksiyonunun çalıştırılması ile elde edilen İlk 20 değer aşağıda tablo üzerinde verilmiştir.
set.seed(61) # aynı değerleri üretmek için
udssonuc<-üds(tekrar=10000, orneklem=100, lambda=2)
tibble("Sıra"=1:20,"Üstel Dağılım Değerleri"=head(udssonuc, 20)) %>%
flextable() %>%
bold(i = 1, bold = TRUE, part = "header")
Üstel Dağılım Simülasyonu Sonuçlarının Görselleştirilmesi
Aşağıdaki grafikte üds() fonksiyonunun çalıştırılması ile üstel dağılımdan elde edilen 10.000 simülasyonun sonucu Stata teması (theme_stata()) ile verilmiştir. Grafiğin ortasında yer alan dikey kesikli kırmızı çizgi sonuçların ortalamasını göstermektedir.
alt_baslik<-paste("Sentetik Veriler Üzerinde Bir Deneme (Simülasyon:10.000,","
Ortalama:",round(mean(udssonuc),3),")", sep="")
ggplot(data.frame(udssonuc), aes(udssonuc)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(udssonuc),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(title="Monte Carlo Üstel Dağılım Simülasyonu",
subtitle=paste(alt_baslik),
caption="ÜDS by Tevfik Bulut") +
theme_stata()
Alternatif Yaklaşım: Üstel Dağılım Simülasyonu Fonksiyonu Oluşturma
Aşağıdaki üds() fonksiyonuna alternatif olarak R’da yer verilen sapply() fonksiyonu ile üstel dağılıma uygun değerler üretilerek üstel dağılım simülasyonu oluşturulmuştur. Ardından elde edilen simülasyon sonuçları histogram üzerinden gösterilmiştir. Simülasyonun sonuçları theme_igray() ile verilmiştir.
set.seed(61)# aynı sonuçları üretmek için.
aluds<-sapply(1:1000, function(x) mean(rexp(n=100, rate=2)))
alt_baslik<-paste("Sentetik Veriler Üzerinde Bir Deneme (Simülasyon:10.000,"," Ortalama:",round(mean(aluds),3),")", sep="")
ggplot(data.frame(aluds), aes(aluds)) +
geom_histogram(bins = 10, color = "black", fill = "steelblue")+
geom_vline(xintercept = mean(aluds),
col = "red",
lwd = 3, linetype = "dashed", size = 1)+
xlab("Sonuç") +
ylab("Frekans")+
labs(title="Monte Carlo Üstel Dağılım Simülasyonu",
subtitle=paste(alt_baslik),
caption="ÜDS by Tevfik Bulut") +
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
theme_igray()
Monte Carlo Simülasyonu: Satış-Kar Örneği
Bu örneğimizde bir ABC firmasının yıllık temel verilerine bağlı olarak Monte Carlo simülasyonunu oluşturalım. Elimizde simülasyonda baz alınacak olan girdi ve çıktı değişkenleri aşağıda verilmiştir.
Verilenler
Girdi (G) ve çıktı (Ç) değişkenleri
- (G) satış tutarı: 2.500.000 TL, satış tutarlarının standart sapması (sd): 420.000 TL
- (G) değişken maliyetler: 1.600.000 TL, değişken maliyetlerin standart sapması (sd): 250.000 TL
- (G) sabit maliyetler: 450.000 TL, sabit maliyetlerin standart sapması (sd): 58.000 TL
- (Ç) Kar: 450.000 TL
İstenenler
- Monte Carlo simülasyonu kullanılarak değişkenlere göre üretilen 10.000 simülasyondan en yüksek kar değerine ulaşılan kombinasyonları grafik üzerinde gösteriniz.
- Monte Carlo simülasyonu kullanılarak değişkenlere göre üretilen 10.000 simülasyondan en yüksek kar değerine ulaşılan ilk 10 kombinasyonu tablo gösteriniz.
options(scipen = 999) # sayı görünümünde bilimsel notasyonu önlemek için
# temel girdi değişkenleri
satis<-c(satis_tutarı=2500000, sd=420000) # satış verilerini vektör içerisinde tanımlama
dm<-c(degisken_maliyet=1600000, sd=250000) # değişken maliyetleri vektör içerisinde tanımlama
sm<-c(sabit_maliyet=450000, sd=58000) # sabit maliyetleri vektör içerisinde tanımlama
kar<-satis-dm-sm
paste("Temel girdi değişkenlerine göre ABC şirketinin yıllık karı:",kar[1], "TL'dir.")
Temel girdi değişkenlerine göre ABC şirketinin yıllık karı: 450000 TL’dir.
Simülasyon için fonksiyon oluşturma
Bu kısımda sapply() fonksiyonu içerisinde parametre değerleri girilerek normal dağılıma uygun veriler üretilmiştir. Ardından her bir değişkene dair 10.000 simülasyon değeri üretilmiştir.
set.seed(61) #aynı sonuçları üretmek için
satis1<-sapply(1:10000, function(x) mean(rnorm(n=100, mean=satis[1], sd=satis[2])))
dm1<-sapply(1:10000, function(x) mean(rnorm(n=100, mean=dm[1], sd=dm[2])))
sm1<-sapply(1:10000, function(x) mean(rnorm(n=100, mean=sm[1], sd=sm[2])))
Simülasyon sonuçlarının tablolaştırılması
Bu kısımda bir önceki kısımda kod bloğunun çalıştırılmasından sonra üretilen sonuçlar tablolaştırılmış, ardından ilk 10 kayıt tabloda verilmiştir.
sdata<-tibble(simulasyon=1:10000, satıs=satis1, degisken_maliyet=dm1, sabit_maliyet=sm1, kar=satis1-dm1-sm1)%>% mutate_at(2:5, round, 0) # veri setinde nicel değişkenlerdeki değerlerin küsüratları 0'a yuvarlanmıştır.
# ilk 10 kayıt
head(sdata, 10) %>%
flextable() %>%
colformat_double(big.mark = ".", digits = 0, na_str = "N/A") %>%
align(align ='center', part = 'all')%>%
bold(i = 1, bold = TRUE, part = "header")
Tablodaki değişkenleri sütunlardan satırlara taşıma
Bu işlem pratik ızgara grafik oluşturulması için yapılmıştır. Böylece değişkenlerin daha yakından ve daha net görülmesi hedeflenmiştir.
df <- sdata %>%
select(simulasyon, satıs, degisken_maliyet, sabit_maliyet, kar) %>%
gather(key = "degisken", value = "deger", -simulasyon)
# ilk 10 kayıt
head(df, 10) %>%
flextable() %>%
colformat_double(big.mark = ".", digits = 0, na_str = "N/A") %>%
align(align ='center', part = 'all')%>%
bold(i = 1, bold = TRUE, part = "header")
Simülasyon sonuçlarının görselleştirilmesi
Burada üretilen 10.000 simülasyon sonucunun değişkenlere göre değerleri grafik üzerinde ortalama değerleriyle verilmiştir.
#değişkenlerin standard saplamaları
ortalama <- df %>%
group_by(degisken) %>%
summarise(ort = mean(deger))
labels=c(degisken_maliyet="Değişken Maliyet", kar="Kâr", sabit_maliyet="Sabit Maliyet", satıs="Satış")
ggplot(df, aes(x = simulasyon, y = deger)) +
geom_point(aes(color = degisken), show.legend = FALSE) +
scale_color_manual(name="Değişkenler",values = c("brown", "steelblue", "red", "orange"))+
xlab("Simülasyon Sayısı") +
ylab("Değer (TL)")+
labs(title="Monte Carlo Satış-Kâr Örneği",
subtitle="Simülasyon Sayısı:10.000",
caption="Satış-Kâr Örneği by Tevfik Bulut") +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = "."))+
scale_x_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = "."))+
facet_wrap(~ degisken, scales = "free_y", labeller=labeller(degisken=labels))+
geom_hline(data = ortalama, aes(yintercept = ort), colour = "black", linetype = 'dashed') +
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
theme(strip.text = element_text(face = "bold")) +
theme_hc()
ggsave("ilk10000.png", dpi = 300) # grafik rmd dosyası içerisine kaydedilmek istenirse
Grafikte yatay eksene paralel kesikli çizgi değişkenlerin ortalama değerlerini göstermektedir.
Karı maksimize eden ve 450.000 TL kar değerinin üzerinde değerlerinin görselleştirilmesi
Bu kısımda üretilen simülasyon sonuçlarına göre yıllık kâr değeri 450.000 TL üzerinde değerler değişken kombinasyonlarına göre verilmiştir.
## karı maksimize eden ve 450.000 kar değerinin üzerinde değerleri içeren tabloyu oluşturma
ilk450<-sdata %>% arrange(desc(kar)) %>% filter(kar>450000)
df450 <- ilk450 %>%
select(simulasyon, satıs, degisken_maliyet, sabit_maliyet, kar) %>%
gather(key = "degisken", value = "deger", -simulasyon)
##ortalama değerler
ortalama1 <- df450 %>%
group_by(degisken) %>%
summarise(ort = mean(deger))
alt_baslik<-paste("Simülasyondaki Uygun Kombinasyon Sayısı:",nrow(ilk450), sep="")
labels=c(degisken_maliyet="Değişken Maliyet", kar="Kâr", sabit_maliyet="Sabit Maliyet", satıs="Satış")
ggplot(df450, aes(x = simulasyon, y = deger)) +
geom_point(aes(color = degisken), , show.legend = FALSE) +
scale_color_manual(name="Değişkenler",values = c("brown", "steelblue", "red", "orange"), labels=c("Değişken Maliyet", "Kâr", "Sabit Maliyet", "Satış"))+
xlab("Simülasyon Sayısı") +
ylab("Değer (TL)")+
labs(title="Monte Carlo Satış-Kâr Örneği",
subtitle= paste(alt_baslik),
caption="Satış-Kâr Örneği by Tevfik Bulut") +
facet_wrap(~ degisken, scales = "free_y", labeller=labeller(degisken=labels))+
geom_hline(data = ortalama1, aes(yintercept = ort), colour = "black", linetype = 'dashed') +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = "."))+
scale_x_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = "."))+
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
theme(strip.text = element_text(face = "bold"))+
theme_hc()
ggsave("ilk450000.png", dpi = 300) # grafik rmd dosyası içerisine kaydedilmek istenirse
Karı maksimize eden en yüksek 1000 kar değeri olan kombinasyonların görselleştirilmesi
## karı maksimize eden en yüksek 1000 kar değeri olan kombinasyonlar
ilk1000<-sdata %>% arrange(desc(kar))%>% head(1000)
df1000 <- ilk1000 %>%
select(simulasyon, satıs, degisken_maliyet, sabit_maliyet, kar) %>%
gather(key = "degisken", value = "deger", -simulasyon)
# ortalama
ortalama2 <- df1000 %>%
group_by(degisken) %>%
summarise(ort = mean(deger))
alt_baslik<-paste("Simülasyondaki Uygun Kombinasyon Sayısı:",nrow(ilk1000), sep="")
labels=c(degisken_maliyet="Değişken Maliyet", kar="Kâr", sabit_maliyet="Sabit Maliyet", satıs="Satış")
ggplot(df1000, aes(x = simulasyon, y = deger)) +
geom_point(aes(color = degisken), , show.legend = FALSE) +
scale_color_manual(name="Değişkenler",values = c("brown", "steelblue", "red", "orange"), labels=c("Değişken Maliyet", "Kâr", "Sabit Maliyet", "Satış"))+
xlab("Simülasyon Sayısı") +
ylab("Değer (TL)")+
labs(title="Monte Carlo Satış-Kâr Örneği",
subtitle= paste(alt_baslik),
caption="Satış-Kar Örneği by Tevfik Bulut") +
facet_wrap(~ degisken, scales = "free_y", labeller=labeller(degisken=labels))+
geom_hline(data = ortalama2, aes(yintercept = ort), colour = "black", linetype = 'dashed') +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = "."))+
scale_x_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = "."))+
theme(strip.text = element_text(face = "bold"))+
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
theme_hc()
ggsave("ilk1000.png", dpi = 300) # grafik rmd dosyası içerisine kaydedilmek istenirse
Tanımlayıcı istatistikler
Aşağıda ilk 10.000 simülasyonun tanımlayıcı istatistiklerine yer verilmiştir. Tabloya göre satışların maksimum değeri 2.647.629 TL, maksimum kar değeri ise 643.623 TL’dir.
library(pastecs)
is<-stat.desc(sdata[,-1])
etiket<-row.names(is)
as_tibble(is) %>%
add_column(istatistik=etiket, .before="satıs") %>%
mutate_at(2:5, round, 2)%>%
flextable() %>%
colformat_double(big.mark = ".", digits = 2, na_str = "N/A") %>%
align(align ='left', part = 'all') %>%
bold(i = 1, bold = TRUE, part = "header")
istatistik | satıs | degisken_maliyet | sabit_maliyet | kar |
nbr.val | 10.000.00 | 10.000.00 | 10.000.00 | 10.000.00 |
nbr.null | 0.00 | 0.00 | 0.00 | 0.00 |
nbr.na | 0.00 | 0.00 | 0.00 | 0.00 |
min | 2.342.103.00 | 1.506.675.00 | 428.756.00 | 245.910.00 |
max | 2.647.629.00 | 1.697.258.00 | 474.319.00 | 643.623.00 |
range | 305.526.00 | 190.583.00 | 45.563.00 | 397.713.00 |
sum | 25.004.018.095.00 | 15.999.330.648.00 | 4.500.304.913.00 | 4.504.382.529.00 |
median | 2.500.978.00 | 1.600.062.50 | 450.056.00 | 450.642.50 |
mean | 2.500.401.81 | 1.599.933.06 | 450.030.49 | 450.438.25 |
SE.mean | 422.67 | 250.84 | 57.71 | 492.63 |
CI.mean.0.95 | 828.51 | 491.69 | 113.13 | 965.65 |
var | 1.786.460.588.06 | 629.190.573.17 | 33.309.263.59 | 2.426.834.500.67 |
std.dev | 42.266.54 | 25.083.67 | 5.771.42 | 49.262.91 |
coef.var | 0.02 | 0.02 | 0.01 | 0.11 |
Simülasyona göre artı kar şansı ve kardan zarar riski yüzdesi
İlk 10.000 simülasyon üzerinden 450.000 TL üzerinde kar şansı ve 450.000 TL altında kar riski aşağıda hesaplanmıştır.
karsim<-nrow(sdata[,-1] %>% filter(kar>450000))
paste("Monte Carlo yönteminden üretilen 10.000 simülasyona göre ABC şirketinin yıllık 450.000 TL üzerinde kar elde etme şansı ", "%",round(karsim/10000*100, 2), ", 450.000 TL altında kar riski ise ", "%", round((10000-karsim)/10000*100, 2),"'dır." , sep="")
Monte Carlo yönteminden üretilen 10.000 simülasyona göre ABC şirketinin yıllık 450.000 TL üzerinde kar elde etme şansı %50,54, 450.000 TL altında kar riski ise %49,46’dır.
En iyi satış rakamına ulaşılan kombinasyonlar
Bu kısımda ABC şirketinin normal dağılıma uygun olarak değişkenlere ait üretilen 10.000 simülasyon içerisinde en yüksek kar değerine ulaşılan ilk 10 simülasyon tabloda verilmiştir. Elde edilen verilere göre ABC şirketi yıllık karını 643.623 TL’ye yükseltmek istiyorsa satış miktarı 2.647.629 TL, değişken maliyetleri 1.553.390 TL ve sabit maliyetleri ise 450.616 TL olması gerekir. Tabi biz burada girdi değişkenlerinin normal dağılım gösterdiği varsayımından ve 10.000 simülasyondan bu sonuca ulaştık. Girdi verileri gerçek hayat problemlerinde farklı farklı olasılık dağılımları gösterebilmektedir. Bu durumda girdi verilerinin olasılık dağılımları belirlenip, simülasyon yapılmalıdır. Bu durumda çok daha gerçekçi senaryolar elde edebilir.
# En yüksek ilk 10 kombinasyon
sdata %>% arrange(desc(kar)) %>%
head(10) %>%
flextable() %>%
colformat_double(big.mark = ".", digits = 0, na_str = "N/A") %>%
align(align ='center', part = 'all') %>%
bold(i = 1, bold = TRUE, part = "header")
simulasyon | satıs | degisken_maliyet | sabit_maliyet | kar |
9631 | 2.647.629 | 1.553.390 | 450.616 | 643.623 |
8528 | 2.610.112 | 1.535.426 | 445.341 | 629.345 |
7542 | 2.624.999 | 1.550.533 | 447.503 | 626.962 |
4259 | 2.607.566 | 1.547.554 | 434.932 | 625.080 |
3677 | 2.646.885 | 1.578.489 | 456.369 | 612.027 |
4257 | 2.610.977 | 1.551.351 | 451.167 | 608.459 |
2368 | 2.629.924 | 1.578.477 | 445.850 | 605.597 |
3679 | 2.625.034 | 1.570.385 | 449.413 | 605.236 |
1324 | 2.605.856 | 1.557.808 | 442.960 | 605.088 |
5784 | 2.604.216 | 1.557.928 | 443.497 | 602.791 |
Özetle, yapılan çalışmada sürekli olasılık dağılımlarından normal ve üstel dağılımlar ile kar-satış örneği üzerinden kullanım alanı oldukça yaygın olan Monte Carlo simülasyonu uygulamaları gösterilmiştir. Bu sayede veri bilimiyle ilgilenen akademi ve saha çalışanlarına farkındalık oluşturulması amaçlanmıştır.
Faydalı olması ve farkındalık oluşturması dileğiyle.
Bilimle ve teknolojiyle kalınız.
Not
- Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.
Yararlanılan Kaynaklar
- Arnold J (2021). ggthemes: Extra Themes, Scales and Geoms for ‘ggplot2’. R package version 4.2.4, .
- Dietrich J, Leoncio W (2023). citation: Software Citation Tools. R package version 0.6.4.
- Gohel D, Skintzos P (2023). flextable: Functions for Tabular Reporting. R package version 0.8.5, .
- Iannone R, Cheng J, Schloerke B, Hughes E, Seo J (2022). gt: Easily Create Presentation-Ready Display Tables. R package version 0.8.0, .
- Kassambara A (2022). ggpubr: ‘ggplot2’ Based Publication Ready Plots. R package version 0.5.0, .
- Makowski D, Lüdecke D, Patil I, Thériault R (2023). “Automated Results Reporting as a Practical Tool to Improve Reproducibility and Methodological Best Practices Adoption.” CRAN. .
- Müller K, Wickham H (2022). tibble: Simple Data Frames. R package version 3.1.8, .
- R Core Team (2021). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. .
- Wickham H (2016). ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. ISBN 978-3-319-24277-4, .
- Wickham H, François R, Henry L, Müller K, Vaughan D (2023). dplyr: A Grammar of Data Manipulation. R package version 1.1.0.
- IBM. What is Monte Carlo simulation? https://www.ibm.com/topics/monte-carlo-simulation
- Krishnamurty Muralidhar, in Encyclopedia of Information Systems, 2003 https://www.sciencedirect.com/topics/computer-science/monte-carlo-simulation.
- Ana M. Sousa, … Henrique A. Matos, in Computer Aided Chemical Engineering, 2020 https://www.sciencedirect.com/topics/computer-science/monte-carlo-simulation.
- A Monte Carlo approach applied to sensitivity analysis of criteria impacts on solar PV site selection. Hassan Z. Al Garni, Anjali Awasthi, in Handbook of Probabilistic Models, 2020 https://www.sciencedirect.com/topics/computer-science/monte-carlo-simulation
- https://www.alexkaizer.com/bios_6611/files/bios6611/W1/Simulations.pdf
- Rizzi, S. (2009). What-If Analysis. In: LIU, L., ÖZSU, M.T. (eds) Encyclopedia of Database Systems. Springer, Boston, MA. https://doi.org/10.1007/978-0-387-39940-9_466.