3
3

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

Last updated at Posted at 2024-08-23

5877cab6-12b1-43ac-adbc-eb448e279f5f.png

ショートストーリー: 「データが語る、東京の米の未来」

東京の高層ビルの谷間にあるオフィスで、田中陽介はモニターに映し出されたコードに集中していた。彼の仕事は、未来の東京の食料供給を支える重要なプロジェクトだった。それは、東京に住む何百万人もの人々にとって最も重要な食料、つまり「米」の適正在庫量をデータに基づいて予測することだった。

日本の首都東京は、世界中のどの都市よりも多くの米を消費する。だが、都市化と人口の変動に伴い、米の需要は変わり続けていた。もし在庫が不足すれば、都市全体にパニックが広がるだろう。一方で、過剰な在庫は無駄なコストを生む。そこで陽介は、これらの複雑な問題を解決するために、モンテカルロシミュレーションを使ってデータを分析することにした。

「在庫量が変わるシナリオを無数にシミュレートし、最も適正な在庫量を割り出す」と陽介は自分に言い聞かせながら、Pythonのコードを丁寧に書き上げた。

彼のプログラムは、日々の米の需要と供給をランダムに生成し、それを1年間シミュレーションするものだった。需要は日々変動し、供給も安定しているわけではない。東京の米市場はボラティリティに満ちている。プログラムは、これらの変動を考慮しながら、在庫がどのように推移するかを追跡する。

陽介は「平均的な需要と供給だけではなく、時には需要が急増し、供給が途絶えることもある」というシナリオも組み込んだ。彼は数百回、いや数千回もシミュレーションを繰り返し、全てのシナリオを検討した。その結果として得られたのは、東京が年間どれだけの米を備蓄しておけば安全かという「適正な在庫量」だった。

深夜、オフィスに静寂が訪れる中、陽介はついに結果を得た。モニターに表示された数値は、統計的に最も安全かつ効率的な米の在庫量を示していた。それは単なる数字ではなく、東京の未来の食料安全保障を支える柱だった。

陽介は深く息をつき、椅子にもたれかかった。「これで、少しでも安心して米を買い求める人たちが増えるといいな」と独りごちる。彼の仕事が、東京の台所を守ることになるという誇りが胸に満ちていた。

翌日、彼のデータ分析は東京政府の担当者に届けられた。これからも陽介のプログラムは、東京の未来を見守り続けるだろう。データが語る未来のために。

こうして、東京の米の未来はデータとテクノロジーによって守られ続ける。陽介の仕事が、都市の人々の生活に安心をもたらすことを、彼は誰よりもよく知っていた。

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

初期設定:

initial_stock: 初期の在庫量を設定。

demand_volatility と supply_volatility: 需要と供給のボラティリティ(変動率)を設定。

time_periods: シミュレーションの期間(日数)を設定。

demand_mean と supply_mean: 需要と供給の平均値を設定。

シミュレーションの実行:

各日、正規分布に基づいてランダムな需要と供給の値を生成。
その日の供給から需要を引き、在庫を更新。

在庫がゼロ以下になると、シミュレーションは終了します。

実行結果。

シミュレーション結果 (回数: 1000)
平均在庫量: 830.43
中央値在庫量: 831.52
在庫量の標準偏差: 22.48

image.png

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
initial_stock = 100  # 初期在庫量
demand_volatility = 0.1  # 需要のボラティリティ
supply_volatility = 0.05  # 供給のボラティリティ
time_periods = 365  # シミュレーションの期間(日数)
demand_mean = 10  # 平均需要
supply_mean = 12  # 平均供給
num_simulations = 1000  # モンテカルロシミュレーションの実行回数

# 各シミュレーションの最終在庫量を記録するリスト
final_stocks = []

# モンテカルロシミュレーションの実行
for sim in range(num_simulations):
    stock = initial_stock
    for t in range(time_periods):
        # ランダムに需要と供給を生成
        demand = np.random.normal(demand_mean, demand_volatility * demand_mean)
        supply = np.random.normal(supply_mean, supply_volatility * supply_mean)

        # 在庫量を更新
        stock = stock + supply - demand

        # 在庫が負にならないように調整
        if stock < 0:
            stock = 0

        # 在庫が尽きたらシミュレーション終了
        if stock == 0:
            break

    # シミュレーション終了時の在庫量を保存
    final_stocks.append(stock)

# 統計的な分析を実施
final_stocks = np.array(final_stocks)
mean_stock = np.mean(final_stocks)  # 平均在庫量
median_stock = np.median(final_stocks)  # 中央在庫量
stock_std_dev = np.std(final_stocks)  # 在庫量の標準偏差

# 結果の表示
print(f"シミュレーション結果 (回数: {num_simulations})")
print(f"平均在庫量: {mean_stock:.2f}")
print(f"中央値在庫量: {median_stock:.2f}")
print(f"在庫量の標準偏差: {stock_std_dev:.2f}")

# ヒストグラムをプロットして在庫量の分布を確認
plt.hist(final_stocks, bins=30, edgecolor='k', alpha=0.7)
plt.axvline(mean_stock, color='r', linestyle='--', label=f'Average Stock Quantity: {mean_stock:.2f}')
plt.axvline(median_stock, color='g', linestyle='--', label=f'Median Stock Quantity: {median_stock:.2f}')
plt.xlabel("Final inventory quantity")
plt.ylabel("frequency")
plt.title("Distribution of final inventory (Monte Carlo simulation results))")
plt.legend()
plt.show()

説明:
モンテカルロシミュレーションの設定:

num_simulations: モンテカルロシミュレーションの実行回数を設定。これにより、シナリオの多様性を確保します。

シミュレーションの実行:

先ほどのシミュレーションを num_simulations 回繰り返し実行し、各シミュレーションの最終在庫量を記録します。
シミュレーション中に在庫がゼロになった場合は、その時点でシミュレーションを終了します。

統計的な分析:

シミュレーションで得られた全ての最終在庫量に対して、平均、中央値、標準偏差を計算します。
これにより、在庫量の統計的な分布を理解し、適正な在庫量を推定できます。
結果の可視化:

matplotlibを使って、全てのシミュレーションの最終在庫量の分布をヒストグラムで表示し、平均値と中央値をプロットして視覚的に確認します。

結果の解釈:
平均在庫量: シミュレーション結果の平均は、全体としてどの程度の在庫量を持つべきかの目安となります。

中央値在庫量: 中央値は、シミュレーションの半数がこの在庫量を下回り、半数が上回ることを示します。平均よりも極端な値に影響されにくいため、実務上の参考値として有効です。

標準偏差: 在庫量の変動の大きさを示し、在庫管理におけるリスクを評価する際に役立ちます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3