Monte Carlo Yöntemi

Basit bir şekilde monte carlo yönteminin nasıl uygulandığını anlatmaya çalışayım. Eğer yanlışım olursa lütfen düzeltin.

Diyelim ki 5 aylık elektrik harcamanızın olduğu bir listeniz var. Normalde daha fazla değer olursa daha iyi sonuçlar alınır ama ben basit olsun diye 5 tane harcamayı ele aldım. Şu şekilde harcamamız olduğunu varsayalım

[100,90,80,90,95]

Yani 5 ay boyunca ilk ay 100 TL, 2. ay 90 TL gibi elektrik harcaması yapmışız. Öncelikle bu harcamaların frekansını elde etmemiz lazım. Yani bizim harcamalarımızın frekansını elde edecek olursak:

100   -> 1 defa
90    -> 2 defa
80    -> 1 defa
95    -> 1 defa

Toplam = 5

Ancak kesinlikle değerler sıralı olmalıdır. Yani harcamaları küçükten büyüğe sıralıyoruz. Yeniden düzenleyelim

80  -> 1 defa
90  -> 2 defa
95  -> 1 defa
100 -> 1 defa

Bu işlemlerden sonra, her harcamanın frekansını tek tek toplama bölerek olasılığını buluyoruz.

80  -> (1/5) -> 0.2
90  -> (2/5) -> 0.4
95  -> (1/5) -> 0.2
100 -> (1/5) -> 0.2

Şimdi kümülatif olasılık tablomuzu oluşturmamız gerekir. Bu olasılık dağılımını biz bu örnek için kolay olsun diye seçtik. Daha farklı olasılık dağılımları kullanarak tablonuzu oluşturabilirsiniz. Kümülatif dağılımı şu şekilde yapıyoruz. 0’dan 1’e doğru değerleri toplayarak ilerliyoruz. İlk değerimiz 80 için 0.2 olasılığımız var, bu durumda diyoruz ki 0 ve 0.2 aralığı 80 değerine denktir.

0.0 - 0.2 -> 80

Bir sonraki harcamanın aralığını ise şöyle hesaplıyoruz, önceki satırın kümülatif değeri ile sıradaki satırın değerini kullanıyoruz. Yani şöyle:

0.2 - (0.2 + 0.4) -> 0.2 kümülatif değerimizdi

0.0 - 0.2   -> 80
0.2 - 0.6   -> 90

Teker teker yaptığımızda karşımıza şöyle bir tablo çıkmalı

0 - 0.2    -> 80
0.2 - 0.6  -> 90
0.6 - 0.8  -> 95
0.8 - 1.0  -> 100

Artık elimizde karşılaştırma yapabileceğimiz bir tablomuz var. 0 ve 1 arasında rastgele sayılar üreterek bu tabloda hangi aralıkta olduğunu ve kaça denk geldiğini bularak hesaplama işlemimizi yapmış oluyoruz. Yalnız ne kadar çok rastgele sayı üretirseniz doğru tahmine o kadar ulaşırsınız. Python’dan yararlanarak önümüzdeki ay ne kadar harcama yapacağımızı tahmin edelim.

import random

def get_deger(sayi):
	if sayi>=0 and sayi<0.2:
		return 80
	elif sayi>=0.2 and sayi<0.6:
		return 90
	elif sayi>=0.6 and sayi<0.8:
		return 95
	else:
		return 100


sonuclar = {}

for i in range(1000):
	rand_sayi = random.random()
	deger = get_deger(rand_sayi)

	sonuclar[deger] = sonuclar.get(deger,0) + 1

print("Değerler: ",sonuclar)
print("Max olan değer: ",max(sonuclar,key=sonuclar.get))

Ben çalıştırdığımda şu sonuçları elde ettim

Değerler:  {80: 202, 90: 391, 100: 207, 95: 200}
Max olan değer:  90

Yani 391 kez gerçekleşen 90 değerine bakarak, önümüzdeki ay 90 lira elektrik parası ödeme ihtimalim olduğunu bulabilirim.

Ek olarak bir tane program yazdım. Elimde 12 aylık harcamaların olduğu bir liste var ve buna göre hesaplama yaptım. İnceleyip fikir alışverişi yapabiliriz.

import random

giderler = ["elektrik","doğalgaz","su","internet"]
harcamalar = [
    {"elektrik":100,"doğalgaz":300,"su":80,"internet":40},
    {"elektrik":110,"doğalgaz":250,"su":90,"internet":40},
    {"elektrik":90,"doğalgaz":200,"su":70,"internet":40},
    {"elektrik":80,"doğalgaz":100,"su":80,"internet":40},
    {"elektrik":85,"doğalgaz":90,"su":85,"internet":40},
    {"elektrik":70,"doğalgaz":90,"su":70,"internet":40},
    {"elektrik":90,"doğalgaz":90,"su":60,"internet":40},
    {"elektrik":100,"doğalgaz":95,"su":50,"internet":40},
    {"elektrik":120,"doğalgaz":80,"su":60,"internet":40},
    {"elektrik":110,"doğalgaz":100,"su":70,"internet":40},
    {"elektrik":100,"doğalgaz":200,"su":80,"internet":40},
    {"elektrik":90,"doğalgaz":250,"su":90,"internet":40},
    ]

# Monte carlo yöntemine göre önce olasılık tablosu çıkarılır, sonra da kümülatif olasılık tablosu çıkarılır
# Sonuclar küçükten büyüğe sıralı olmalıdır, o yüzden sonucu döndürmeden önce sıralıyoruz
def olasilik_tablosu(veriler,harcama):
    olasilik_tablosu = {}
    for i in harcamalar:
        olasilik_tablosu[i[harcama]] = olasilik_tablosu.get(i[harcama],0) + 1

    return {i:olasilik_tablosu[i] for i in sorted(olasilik_tablosu,key=olasilik_tablosu.get)}

# Olasilik tablosundan kümülatif olasılık tablosu çıkarımı
def kumulatif_olasilik(veriler):
    total = sum(veriler.values())
    veriler = {x:veriler[x]/total for x in veriler}

    temp = 0
    result = {}
    generator = iter(veriler)

    for i in veriler:
        x = next(generator)
        aralik = []
        aralik.append(temp)
        temp = temp + veriler[x]
        aralik.append(temp)
        result[x] = aralik

    return result

# Üretilen random sayının verilen değerler arasında olup olmadığını kontrol etme
def between(liste,deger):
    return deger>liste[0] and deger<=liste[1]

def main():
    for gider in giderler:
        olasiliklar = kumulatif_olasilik(olasilik_tablosu(harcamalar,gider))
        sonuclar = {}
    
        for i in range(10000):
            sayi = random.random()
            for k in olasiliklar:
                x = olasiliklar[k]
                if between(x,sayi):
                    sonuclar[k] = sonuclar.get(k,0) + 1

        print("{} için tahmini harcama: {}".format(gider,max(sonuclar,key=sonuclar.get)))

if __name__ == "__main__":
    main()

Sonuclar:

elektrik için tahmini harcama: 90
doğalgaz için tahmini harcama: 90
su için tahmini harcama: 70
internet için tahmini harcama: 40

Elimden geldiği kadar anlattım. Eleştiri ve yorumlarınızı bekliyorum. İyi forumlar.

ekleme:

monte carlo ile pi sayısının bulunması örneği: https://tr.wikipedia.org/wiki/Monte_Carlo_benzetimi
monte carlo ile yapılmış başka bir örnek: https://bit.ly/30Z17Xe

10 Beğeni

İstatistik ve Ekonometri okuyanlar, bu iyiliğini unutmayacak. :slight_smile:

1 Beğeni

En ufak bir yardımı bile olacaksa ne mutlu bana, teşekkürler :slight_smile:

1 Beğeni

Ekonometri öğrencisi olduğum için, sayende kodu bir daha baştan yazmak zorunda kalmayacağım, elimde bir şablon var artık. Kesinlikle yardımcı oldu. Teşekkürler.

1 Beğeni