ショートストーリー: 「データが語る、東京の米の未来」
東京の高層ビルの谷間にあるオフィスで、田中陽介はモニターに映し出されたコードに集中していた。彼の仕事は、未来の東京の食料供給を支える重要なプロジェクトだった。それは、東京に住む何百万人もの人々にとって最も重要な食料、つまり「米」の適正在庫量をデータに基づいて予測することだった。
日本の首都東京は、世界中のどの都市よりも多くの米を消費する。だが、都市化と人口の変動に伴い、米の需要は変わり続けていた。もし在庫が不足すれば、都市全体にパニックが広がるだろう。一方で、過剰な在庫は無駄なコストを生む。そこで陽介は、これらの複雑な問題を解決するために、モンテカルロシミュレーションを使ってデータを分析することにした。
「在庫量が変わるシナリオを無数にシミュレートし、最も適正な在庫量を割り出す」と陽介は自分に言い聞かせながら、Pythonのコードを丁寧に書き上げた。
彼のプログラムは、日々の米の需要と供給をランダムに生成し、それを1年間シミュレーションするものだった。需要は日々変動し、供給も安定しているわけではない。東京の米市場はボラティリティに満ちている。プログラムは、これらの変動を考慮しながら、在庫がどのように推移するかを追跡する。
陽介は「平均的な需要と供給だけではなく、時には需要が急増し、供給が途絶えることもある」というシナリオも組み込んだ。彼は数百回、いや数千回もシミュレーションを繰り返し、全てのシナリオを検討した。その結果として得られたのは、東京が年間どれだけの米を備蓄しておけば安全かという「適正な在庫量」だった。
深夜、オフィスに静寂が訪れる中、陽介はついに結果を得た。モニターに表示された数値は、統計的に最も安全かつ効率的な米の在庫量を示していた。それは単なる数字ではなく、東京の未来の食料安全保障を支える柱だった。
陽介は深く息をつき、椅子にもたれかかった。「これで、少しでも安心して米を買い求める人たちが増えるといいな」と独りごちる。彼の仕事が、東京の台所を守ることになるという誇りが胸に満ちていた。
翌日、彼のデータ分析は東京政府の担当者に届けられた。これからも陽介のプログラムは、東京の未来を見守り続けるだろう。データが語る未来のために。
こうして、東京の米の未来はデータとテクノロジーによって守られ続ける。陽介の仕事が、都市の人々の生活に安心をもたらすことを、彼は誰よりもよく知っていた。
モンテカルロシミュレーション。
初期設定:
initial_stock: 初期の在庫量を設定。
demand_volatility と supply_volatility: 需要と供給のボラティリティ(変動率)を設定。
time_periods: シミュレーションの期間(日数)を設定。
demand_mean と supply_mean: 需要と供給の平均値を設定。
シミュレーションの実行:
各日、正規分布に基づいてランダムな需要と供給の値を生成。
その日の供給から需要を引き、在庫を更新。
在庫がゼロ以下になると、シミュレーションは終了します。
実行結果。
シミュレーション結果 (回数: 1000)
平均在庫量: 830.43
中央値在庫量: 831.52
在庫量の標準偏差: 22.48
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を使って、全てのシミュレーションの最終在庫量の分布をヒストグラムで表示し、平均値と中央値をプロットして視覚的に確認します。
結果の解釈:
平均在庫量: シミュレーション結果の平均は、全体としてどの程度の在庫量を持つべきかの目安となります。
中央値在庫量: 中央値は、シミュレーションの半数がこの在庫量を下回り、半数が上回ることを示します。平均よりも極端な値に影響されにくいため、実務上の参考値として有効です。
標準偏差: 在庫量の変動の大きさを示し、在庫管理におけるリスクを評価する際に役立ちます。