はじめに
電車の遅延シミュレーションをした記事をかきましたが、
数式を用いて解析を行っていくシミュレーションも存在します。
しばらく数式を使った解析をしていないので、勉強のために数式を使った簡単なシミュレーションをしたいと思います。
選挙の争点にはなっていませんが、選挙も近いのでお金のシミュレーションで、大企業にお金をいれたら本当に経済が回るのか計算していきます。
LLMに聞いて適当に作っているだけなので本格的な解析ではないですが、面白い内容になるかと思います。
モデル化
お金の流れを追う上で、大企業、中小企業、零細企業、大企業社員、中小企業社員というセグメントを作成します。
$x:\text{セクションの売り上げ}$、$A:\text{お金の回し方(誰がどこに何%払うかというルール)}$、$f: \text{外部からの刺激(今回のシミュレーションで投入する「100万円」)}$という感じで数式化します。
行列で、大企業から中小企業に払われるお金や大企業から中小企業への給料などを割合で表現していきます。
$$
x = Ax + f
$$
で、
$$
x = (I - A)^{-1}f
$$
を計算すると、
$x_2 = A(Ax_1 + f)$と繰り返し計算していく、
$$
x = f + Af + A^2f + A^3f + \dots
$$
を計算するのと同等になり、
最初に$f$で投入したお金が、最終的にどこにお金が偏っていくかわかります。
なぜ同等になるのか
$$
\begin{align}
x &= f + Af + A^2f + A^3 + \dots \\
Ax &= Af + A^2f + A^3 + \dots \\
x - Ax &= (f + Af + A^2f + A^3 + \dots) - (Af + A^2f + A^3 + \dots) \\
(I - A)x &= f \\
x &= (I-A)^{-1}f
\end{align}
$$
という感じで証明できます。
シミュレーション
'Large(大企業)', 'Medium(中小)', 'Small(零細)', 'Worker_L(大社員)', 'Worker_S(中零社員)'の5つのセクターを作成し、大企業に100万場合と零細企業に100万入れた場合で、最終的にどこにどれだけお金が使われるのか、計算してみました。
お金の出し入れの行列は以下のように設定しました。
$$
x =
\begin{pmatrix}
Large(大企業) \\
Medium(中小) \\
Small(零細) \\
Worker_L(大社員) \\
Worker_S(中零社員)
\end{pmatrix}
$$
$$
A=
\begin{pmatrix}
0.30 & 0.10 & 0.05 & 0.30 & 0.10 \\
0.10 & 0.20 & 0.20 & 0.10 & 0.30 \\
0.05 & 0.10 & 0.10 & 0.05 & 0.30 \\
0.20 & 0.00 & 0.00 & 0.00 & 0.00 \\
0.00 & 0.30 & 0.40 & 0.00 & 0.00
\end{pmatrix}
$$
簡単な図
計算時の注意点
必ず計算が収束するわけではないので、必ず逆行列が計算できているか確認してください。
このあたりの収束条件などをちゃんと勉強しているとプロっぽいですね。
(今回は、列方向の和が1を超えないようにしています。他にも詳しく見ていくと逆行列が生成で可能な条件あった気もするのですが。)
結果
各セクターと総額の消費額を下に示します。
--- 各セクターへの波及効果 (単位: 万円) ---
セクター 大企業へ投入時 中零社員へ投入時
0 Large(大企業) 167.135641 39.495542
1 Medium(中小) 38.241177 75.973828
2 Small(零細) 22.171746 60.006102
3 Worker_L(大社員) 33.427128 7.899108
4 Worker_S(中零社員) 20.341052 146.794589
--- 社会全体の総生産額 (経済の回りやすさ) ---
大企業に投入: 281.32 万円
中零社員に投入: 330.17 万円
この設定の場合、中小零細社員に100万上げた方が経済効果はあるという事になります。
100万を入れると、こうやってお金が回り使われていくようです。
解析結果の注意点
各セクターで消費した額の計算なので、この数字だけ儲かるといった計算ではありません。
おまけ
どれだけ儲かるのかも気になるので計算してみました。
大企業の方が儲かりますねやっぱり。
そして、総和は100万になります。足したお金が100万なので計算が合っている事の確認になります。
--- 各セクターの「手元に残った額(利益)」 ---
セクター 大企業投入時の利益 中零社員投入時の利益
0 Large(大企業) 58.497474 13.823440
1 Medium(中小) 11.472353 22.792148
2 Small(零細) 5.542937 15.001526
3 Worker_L(大社員) 18.384921 4.344510
4 Worker_S(中零社員) 6.102315 44.038377
全セクターの利益合計(大企業投入): 100.00
全セクターの利益合計(中零社員投入): 100.00
おわりに
勉強の為、数式を使ったモデル化を簡単に行ってみました。
数値等LLMが出してきたものをそのまま使用しているので、適当ですが何か参考になれば幸いです。
検証コード
import numpy as np
import pandas as pd
# 1. セクターの定義
sectors = ['Large(大企業)', 'Medium(中小)', 'Small(零細)', 'Worker_L(大社員)', 'Worker_S(中零社員)']
n = len(sectors)
# 2. 投入係数行列 A の設定 (ここをいじると結果が変わります)
# A[i][j] は「jが1単位生産するためにiからいくら買うか」
# 列(縦)の合計が1.0を超えないように設定(超えた分は貯蓄や外部流出扱い)
A = np.array([
[0.30, 0.10, 0.05, 0.30, 0.10], # 大企業へ流れる (内部留保、高級品、設備投資)
[0.10, 0.20, 0.20, 0.10, 0.30], # 中小へ流れる (下請け、生活サービス)
[0.05, 0.10, 0.10, 0.05, 0.30], # 零細へ流れる (地産地消、個人店)
[0.20, 0.00, 0.00, 0.00, 0.00], # 大社員へ流れる (給与)
[0.00, 0.30, 0.40, 0.00, 0.00], # 中零社員へ流れる (給与)
])
# 3. レオンチェフ逆行列の計算: (I - A)^-1
I = np.eye(n)
L_inv = np.linalg.inv(I - A)
# 4. シミュレーション:どこに100万円(f)を投入するか
# パターン1: 大企業に直接投入
f_large = np.array([100, 0, 0, 0, 0])
x_large = L_inv @ f_large
# パターン2: 中小・零細の社員(家計)に直接投入
f_workers = np.array([0, 0, 0, 0, 100])
x_workers = L_inv @ f_workers
# 5. 結果の表示
df_res = pd.DataFrame({
'セクター': sectors,
'大企業へ投入時': x_large,
'中零社員へ投入時': x_workers
})
print("--- 各セクターへの波及効果 (単位: 万円) ---")
print(df_res)
print("\n--- 社会全体の総生産額 (経済の回りやすさ) ---")
print(f"大企業に投入: {x_large.sum():.2f} 万円")
print(f"中零社員に投入: {x_workers.sum():.2f} 万円")
# 各セクターの付加価値率(列合計を1から引いたもの)
v = 1.0 - A.sum(axis=0)
# 利益の計算
# 産出額 x に 利益率 v を掛ける
profit_large = x_large * v
profit_workers = x_workers * v
# 結果表示用
df_profit = pd.DataFrame({
'セクター': sectors,
'大企業投入時の利益': profit_large,
'中零社員投入時の利益': profit_workers
})
print("\n--- 各セクターの「手元に残った額(利益)」 ---")
print(df_profit)
print(f"\n全セクターの利益合計(大企業投入): {profit_large.sum():.2f}")
print(f"全セクターの利益合計(中零社員投入): {profit_workers.sum():.2f}")
コードは GitHub に置いてあります: