公共財供給問題に関する3つのメカニズム

# はじめに
公共財供給問題に関するメカニズム
- 自発的供給メカニズム(VCM)
- リンダール・メカニズム
- ボーエン・メカニズム

について，Pythonの実装例を交えてまとめました．数理的は理論については記述しておりませんので，ご了承くださいませ．

また，内容に誤り等ございましたら，ご指摘いただけますと幸いです．

# 用語の整理

## 公共財
公共財とは，財やサービスの利用が**非排除的**かつ**非競合的**であるものを指します．（e.g: 道路や公園など）

非排除的とは「財やサービスに対する利用料を支払わない人の利用を（実質）排除できない状態」を意味し，非競合的とは「誰かがある財やサービスを利用しても，別の人がその財やサービスの利用に制限がかからない状態」を意味します．

## サミュエルソン条件
ある水準$G$の公共財が供給され，そのときの各プレイヤー$i$が便益（効用）が$v_i(G)$，供給費用は$c(G)$であるとします．このとき，すべてのプレイヤーが得られる便益（効用）の合計から公共財の供給費用を引いた値
$$\sum_iv_i(G) - c(G)$$を最大にする公共財の水準$G$の条件は，上の式の両辺を$G$で微分してゼロと置くことで求められ
$$\sum_i v'_i(G) = c'(G)$$となります．

これが，公共財を最適（パレート効率的）に供給するための条件であり，**サミュエルソン条件**と言います．

## 予算均衡条件
ある水準$G$の公共財の供給費用$c(G)$は（当然ながら）誰かが負担する必要があります．そのため，各プレイヤー$i$から$x_i$を公共財供給費用の負担額として徴収することを考えます．このとき，すべてのプレイヤーから徴収した負担額の合計が，公共財の供給費用と一致する必要があるので
$$\sum_ix_i = c(G)$$と表すことができます．これを**予算均衡条件**と言います．

## フリーライダー問題
実質的にはサミュエルソン条件と予算均衡条件の両方を満たすような水準の公共財を供給することが最適（パレート効率的）であるということになります．しかし「一度誰かの費用負担によって公共財が供給されると，費用を負担していない人もその公共財を利用できる」ため，誰も公共財供給の負担を行おうとしません．そのため，公共財が市場で私的に供給されることは現実的ではありません．これを**フリーライダー問題**と言います．

## 個人合理性
メカニズムに参加した場合の均衡における各プレイヤーの利得が参加する前と比べて小さくならないとき，そのメカニズムは個人合理性を満たすと言います．

## 耐戦略性
あるメカニズムのもとで他の人の選択に関係なく自身の選好を正直に表明することが支配戦略になっているとき，そのメカニズムは耐戦略性を満たすと言います．

# 自発的供給メカニズム(VCM)
自発的供給メカニズム（以下，VCM: Voluntary Contribution Mechanism）は，以下の3つのステップからなるメカニズムです．

1. 各プレイヤー$i$はそれぞれ初期保有$w_i$から公共財への貢献額$x_i$を決定する
1. 公共財供給量$G$は，公共財に貢献された額の総和$\sum_ix_i$と等しい値に決定される
1. 各プレイヤー$i$には公共財供給量$G$の$\alpha$倍（$\frac{1}{n} < \alpha < 1$）の便益（効用）がもたらされる．

:::note warn
VCMのもとでは，サミュエルソン条件は満たされないですが，予算均衡条件は満たされます．
:::

## Pythonによるシミュレーション

プレイヤーが4人いるとします．各プレイヤー$i$の私的財を初期保有を10とし，各プレイヤー$i$の便益は公共財供給量$G$の$\alpha$倍とします．ここで，各プレイヤー$i$の公共財への貢献をそれぞれ(5, 4, 0, 8)としたときの，公共財の供給水準$G$および各プレイヤー$i$の利得について計算します．

```py
# VCM

# プレイヤーの数
N = 4

# 各プレイヤーの初期保有
w = np.array([10, 10, 10, 10])

# 各プレイヤーの貢献額
x = np.array([5, 4, 0, 8])

# 公共財供給水準
G = x.sum()
print(f"公共財供給水準: {G} \n")

# 公共財からの限界便益
alpha = 0.6

# 各プレイヤーの利得
payoffs = w - x + alpha*G
for i, payoff in enumerate(payoffs):
    print(f"プレイヤー{i+1}の利得: {payoff}")
```
（出力結果）
```
公共財供給水準: 17 

プレイヤー1の利得: 15.2
プレイヤー2の利得: 16.2
プレイヤー3の利得: 20.2
プレイヤー4の利得: 12.2
```

# リンダール・メカニズム
リンダール・メカニズムは，以下の3つのステップからなるメカニズムです．

1. 政府は各プレイヤー$i$に対して個別に，公共財供給費用$c(G)$に対する負担割合$q_i(\sum_iq_i=1)$を提示する
1. 各プレイヤー$i$は負担割合$q_i$を所与として，自分にとって望ましい公共財の供給水準$G_i$について政府に伝える
1. 政府は，各プレイヤー$i$が表明した公共財供給量$G_i$がすべて一致した場合，すなわち，$G_1 = G_2 = ... = G_n=G^* $のとき，$G^* $という水準の公共財を供給することを決定し，各プレイヤー$i$からは$x_i=q_ic(G^*)$の負担額を徴収して終了．もし，1人でも異なる公共財供給量$G_i$を表明した場合には，プレイヤーの負担割合を変更してステップ1に戻る

:::note warn
リンダール・メカニズムのもとでは，サミュエルソン条件および予算均衡条件が共に満たされます．一方で，各プレイヤー$i$には公共財に対する需要を過少申告するインセンティブが生じるため耐戦略性を満たしません．
:::

## Pythonによるシミュレーション

一般に$n$人のプレイヤーがいる場合，各プレイヤー$i$の公共財からの便益が2次関数
$$v_i(G) = G - 0.5a_iG^2$$で表され，公共財供給費用が
$$c(G) = G$$であるとすると，公共財供給費用$G^* $および各プレイヤー$i$の費用負担割合$q^* $は
$$G^* = \frac{n-1}{\sum_ia_i}, \ q^*_i = 1 - a_iG^\* $$となることが知られています．

ここで，プレイヤーの人数を2人，パラメータを$(a_1, a_2) = (1, 1)$とするときの，公共財供給水準および各プレイヤー$i$の費用負担割合と利得を計算します．

```py
# リンダール・メカニズム

# プレイヤーの数
N = 2

# 便益関数のパラメータ
a = np.array([1, 1])

# 公共財供給水準
G = (N-1)/a.sum()
print(f"公共財供給水準: {G}　\n")

# 費用負担割合
q = 1 - G*a
for i in range(N):
    print(f"プレイヤー{i+1}の費用負担割合: {q[i]}")
print()

# 各プレイヤーの利得
payoffs = G - 0.5*a*G**2 - q*G
for i, payoff in enumerate(payoffs):
    print(f"プレイヤー{i+1}の利得: {payoff}")
```
（出力結果）
```
公共財供給水準: 0.5　

プレイヤー1の費用負担割合: 0.5
プレイヤー2の費用負担割合: 0.5

プレイヤー1の利得: 0.125
プレイヤー2の利得: 0.125
```

# ボーエン・メカニズム
ボーエン・メカニズムは，以下の3つのステップからなるメカニズムです．

1. 政府は$n$人の各プレイヤー$i$に対して個別に，公共財供給費用$c(G)$に対する負担割合$q_i(q_i = \frac{1}{n})$を提示する．
1. 各プレイヤー$i$は負担割合$q_i$を所与として自分にとって望ましい公共財の供給水準$G_i$について政府に伝える
1. 政府は，各プレイヤー$i$が表明した公共財供給量${G_1, G_2, ..., G_n}$を候補の集合とし，任意の2つを取り出し多数決投票によってどちらが選ばれるかを決定する．さらに選ばれた候補とまた別の候補とについて多数決投票を実施し，最終的に他のどの候補に対しても多数決投票で勝利するような公共財供給量に決定して終了

:::note warn
ボーエン・メカニズムのもとでは予算均衡条件が満たされ，すべてのプレーヤーの選好が単峰的であるならば耐戦略性も満たされます．一方で，一般的にはサミュエルソン条件は満たされません．
:::

## Pythonによるシミュレーション

一般に$n$人のプレイヤーがいる場合，各プレイヤー$i$の公共財からの便益が2次関数
$$v_i(G) = G - 0.5a_iG^2$$で表され，公共財供給費用が
$$c(G) = G$$であるとすると，各プレイヤー$i$は
$$G^\*_i = \frac{1-q_i}{a_i}$$と表明し，中位投票者$m$に対応する公共財供給水準$G^*_m$が選ばれることが知られています（各プレイヤー$i$の費用負担割合は，みな均等に$q_i=\frac{1}{n}$となります．）

ここで，プレイヤーの人数を3人，パラメータを$(a_1, a_2, a_3) = (1, 2, 3)$とするときの，公共財供給水準および各プレイヤー$i$の費用負担割合と利得を計算します．

```py
# ボーエン・メカニズム

# プレイヤーの数
N = 3

# 便益関数のパラメータ
a = np.array([1, 2, 3])

# 費用負担割合: q=1/N（均一）
q = np.ones(N) * (1/N)
print(f"各プレイヤーの費用負担割合: {1/N:.3f} \n")

# 各プレイヤーの表明する公共財供給水準
x = (1-q)/a
for i in range(N):
    print(f"プレイヤー{i+1}の表明する公共財供給水準: {x[i]:.3f}")
print()

# 公共財供給水準の決定
G = np.median(x)
print(f"公共財供給水準: {G:.3f} \n")

# 各プレイヤーの利得
payoffs = G - 0.5*a*G**2 - q*G
for i, payoff in enumerate(payoffs):
    print(f"プレイヤー{i+1}の利得: {payoff:.3f}")
```
（出力結果）
```
各プレイヤーの費用負担割合: 0.333 

プレイヤー1の表明する公共財供給水準: 0.667
プレイヤー2の表明する公共財供給水準: 0.333
プレイヤー3の表明する公共財供給水準: 0.222

公共財供給水準: 0.333 

プレイヤー1の利得: 0.167
プレイヤー2の利得: 0.111
プレイヤー3の利得: 0.056
```

# 公共財供給メカニズムの比較

公共財供給に関する各メカニズムと持つべき望ましい4つの性質の対応は下記のとおりです．

||サミュエルソン条件|予算均衡条件|個人合理性|耐戦略性|
|-|-|-|-|-|
|自発的供給メカニズム(VCM)|満たさない|満たす|満たさない|満たさない|
|リンダール・メカニズム|満たす|満たす|満たす|満たさない|
|ボーエン・メカニズム|満たさない|満たす|満たさない|満たす|

:::note warn
公共財供給メカニズムが持つべき望ましい性質を4つとも満足できるメカニズムは設計できないと結論づけられています．
:::

# おわりに
最後まで読んでいただきありがとうございました．

Zennにて「Python×データ分析」をメインテーマに記事を執筆しているので，ご一読いただけますと幸いです．

https://zenn.dev/s1ok69oo 

また，過去にLTや勉強会で発表した資料が下記リンクにてまとめられておりますので，こちらもぜひご一読くださいませ．

https://speakerdeck.com/s1ok69oo

## 参考文献
- 川越，基礎から学ぶマーケット・デザイン，有斐閣，2021
- 神取，ミクロ経済学の力，日本評論社，2021
- 坂井，マーケットデザイン入門，ミネルヴァ書房，2022
- レヴィット，ミクロ経済学発展編，東洋経済，2018