モンテカルロシミュレーションとは?

Pythonで学ぶモンテカルロ・シミュレーション

Izzy Weber

Curriculum Manager, DataCamp

シミュレーションとモンテカルロ法

シミュレーション:
  • 現実を模倣する実験
  • しばしばコンピュータを使用

 

モンテカルロシミュレーション:
  • ランダム変数の影響を受ける複数の結果の確率を予測
  • 繰り返しの乱数サンプリングで数値結果を得る
  • 乱数サンプリングに依存するため結果は確率的
Pythonで学ぶモンテカルロ・シミュレーション

シミュレーション例

6面サイコロを振る
  • トムは公平な6面サイコロを $n$ 回振る
  • 各回の出目を記録する
  • サイコロを袋に入れ、次の回は新しいサイコロを選ぶ

質問

  1. $n$ 回後、トムの袋のサイコロは何個か?
  2. $n$ 回後の出目の平均は?

 

サイコロを振る手

Pythonで学ぶモンテカルロ・シミュレーション

トムの出目をシミュレート

  • total_dice:$n$ 回後にトムの袋にあるサイコロの数
  • mean_point_dice:$n$ 回の出目の平均
import random
import numpy as np

def roll_dice(n, seed): random.seed(seed) total_dice = 0 point_dice = []
for i in range(n): total_dice += 1 point_dice.append(random.randint(1, 6))
mean_point_dice = np.mean(point_dice)
return([total_dice, mean_point_dice])
Pythonで学ぶモンテカルロ・シミュレーション

シミュレーション結果

シミュレーション1:

seed=1231

print(roll_dice(10, seed))
print(roll_dice(100, seed))
print(roll_dice(1000, seed))
print(roll_dice(10000, seed))

シミュレーション2:

seed=3124
print(roll_dice(10, seed))
print(roll_dice(100, seed))
print(roll_dice(1000, seed))
print(roll_dice(10000, seed))

結果:

[10, 3.6]

[100, 3.5]
[1000, 3.495]
[10000, 3.503]

結果:

[10, 3.8]
[100, 3.28]
[1000, 3.474]
[10000, 3.5508]
Pythonで学ぶモンテカルロ・シミュレーション

大数の法則

同一分布の乱数変数の数が増えると、標本平均は理論平均に近づく。

シミュレーション3seed = 3124):

print(roll_dice(100000, seed))
print(roll_dice(500000, seed))
print(roll_dice(1000000, seed))

結果:

[100000, 3.51344]
[500000, 3.50428]
[1000000, 3.501995]
Pythonで学ぶモンテカルロ・シミュレーション

練習しましょう!

Pythonで学ぶモンテカルロ・シミュレーション

Preparing Video For Download...