全然ムズカシくない経済学プログラミング

# はじめに

経済学を履修してこんなにも数学が多いのか、、、と心が折れた人は少なくないと思います。今回はそんな経済学の勉強方法としてプログラミングを併用することのお誘いをしていこうと思います。

プログラミングを使って勉強するメリットの一つに、関数を自分で実装したりすることになるので、より深い理解につながります。（普段変数をみてサイズとか気にしないですよね？）
デメリットとしては、プログラミングの力が必要であるということです。

ただ、これに関してですが、そこまで気にしなくていいと思います。最後にまたご紹介しますが、昨今Pythonで学ぶ○○のような教材はいたるところにありますので、そういったものを利用すれば好きな分野を勉強しつつプログラミングも覚えていけるといった具合です。

本記事では詳しくプログラミングの方法などを伝えることはしません。経済学の基礎であるコブ・ダグラス型生産関数を例に、プログラムに落として関数の動きを実際に確認してみるということを、さらっとご紹介させていただきます。

ソースコードと推定に用いたデータは[Gist](https://gist.github.com/takahashi-r/86bf225db67f6478e629418d9dbf1f56)で公開しております。

https://gist.github.com/takahashi-r/86bf225db67f6478e629418d9dbf1f56

# Julia言語

今回使用する言語はJulia言語といいます。[wiki](https://ja.wikipedia.org/wiki/Julia_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))によると

>Julia（ジュリア）は、汎用プログラミング言語水準から高度の計算科学や数値解析水準まで対処するよう設計された高水準言語かつ仕様記述言語、及び動的プログラミング言語である[2][3][4]。

要は計算得意だよって話です。ところでPythonは使わないのかって話が聞こえてくるんですが（Rも忘れてないよ？）実は、Julia言語はPythonもRも呼び出すことができるんです。Julia言語は適当に書いても割とちゃんとした速度がでるので、そういった点でストレスフリーな感じ。なので、PythonやRしか使ったことないよって人も気軽にJulia言語を使って、使いづらいところはPythonやRで補えばいいんです。

ちなみにここまでの話でJulia言語に興味あるなぁって人は、[こちら](https://www.amazon.co.jp/1%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%80%B2%E8%97%A4-%E8%A3%95%E4%B9%8B/dp/433902905X/ref=asc_df_433902905X/?tag=jpgo-22&linkCode=df0&hvadid=342518373760&hvpos=&hvnetw=g&hvrand=6243598926682304156&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009050&hvtargid=pla-900212121772&psc=1&th=1&psc=1)の本がおすすめです。文法が一通り載っていて且つ、Pythonの呼び出し方法など多言語との連携も記載されています。一冊持っておいて損はないのかなと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272355/fc35961a-8609-b45b-6978-d251903fdbad.png)


# コブ・ダグラス型生産関数

今回扱う関数は、コブ・ダグラス型生産関数です。生産関数の一種で設備投資と労働投入量によって生産量があらかた決まるという考えをもとに設計されたモデルです。

Y: 生産額 K: 資本 L: 労働投入量

```math
\begin{align}
Y = \alpha K^\beta L^\gamma \tag{1} \\
\log{Y} = \alpha' + \beta \log{K} + \gamma \log{L} \tag{2} 
\end{align}
```

(1)の式が元の式で、両辺を対数変換することで、(2)のような簡単な一次関数になります。

ちなみに生産要素の係数である$\betaと\gamma$はそれぞれ生産額に及ぼす弾力性を表していて、弾力性とは資本Kを1%増やしたときの生産量の増加%を表しています。これは後半に推定を行った結果に対して使うから覚えておいてください。

生産関数を表すコードはこんな感じです。簡単でしょ？

```cobb.jl
Y( α, β, γ, K, L ) = α*K^β*L^γ
```

## 収穫の不変性

生産関数のインプットである資本と労働投入量を定数倍したときのアウトプットの増加倍数を問うのが「収穫の不変性」といいます。

コブ・ダグラス生産関数においてインプットをc倍してみると

$$ 
\begin{align}
Y = \alpha (cK)^\beta (cL)^\gamma = c^{\beta + \gamma} \lbrace \alpha K^\beta L^\gamma  \rbrace \tag{3}
\end{align}
$$

$\beta + \gamma$ が1ならアウトプットも定数倍になります。このように資本と労働投入量をともにc倍したときに産出量が同じくc倍になることを「収穫不変」といい、1以上なら「収穫逓増」、1以下なら「収穫逓減」となります。  
※製造業では収穫逓減が通常で、農業は収穫不変に近いとされる。通常収穫逓増は起こらないと考えられている。

収穫不変が成立していれば式(2)は次のように書き直されます。

```math
\begin{align}
\log{Y} &= \alpha' + \beta \log{K} + (1 - \beta) \log{L} \tag{4} 
\end{align}
```

## 生産規模と収穫の関係

さて、ここで、片方の生産要素を一定にして、もう片方の生産要素を増加させていくとどのような状態になるのか確認してみましょう。この時の生産能力を「限界生産力」といいます。
例えば、労働者を増やすが、設備投資はしないといった感じです。簡単のため、生産関数を(1)式から係数αは取り除き、$\gamma = 1-\beta$としました。

$$
生産関数: K^{\beta} L^{1-\beta}
$$

この生産関数をそれぞれの生産要素で偏微分する以下の式になります。

```math
\begin{align}
MP_k &= \beta K^{\beta-1} L^{1-\beta} \tag{5} \\
MP_l &= (1 - \beta) K^\beta L^{-\beta} \tag{6} \\
\end{align}
```

コードで表すとこんな感じ。
```cobb2.jl
# 資本の限界生産力
MPₖ( β, K, L ) = Y( β, β-1, 1-β, K, L ) 
# 労働投入量の限界生産力
MPₗ( β, K, L ) = Y( 1-β, β, -β, K, L )
```

式(5)(6)はそれぞれ生産要素を少しだけ増やしたときの生産額を表しています。これらをグラフに起こしてみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272355/b2416d41-1a29-160d-f8cc-d4d81319a245.png)

このようになります。つまり生産要素を増やし続けると生産額は逓減していくということがわかります。

グラフはこれだけ！

```plot_cobb2.jl
xs = range(0, 1, 100)

p1 = plot(xs, MPₖ.( 0.5, 1, xs ), xlabel="L: 労働投入量", ylabel="Y: 生産額", label="MPₖ")
p2 = plot(xs, MPₗ.( 0.5, xs, 1 ), xlabel="K: 資本", ylabel="Y: 生産額", label="MPₗ")
plot(p1, p2, layout=(2, 1))
```

## 製造業の生産関数を求める

最後にコブ・ダグラス型生産関数にデータを当ててみてみましょう。

データは内閣府の統計情報から取得したデータです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272355/74e78428-3909-eddf-fb98-5da23b30fb75.png)

各データのグラフの概形です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272355/f1e4cf87-49cc-10df-d28a-cf1828071332.png)

ここで、生産額は製造業GDP、資本は資本ストック、労働投入量は労働者数×労働時間として推定を行います。推定結果はこちらです。

$$
労働投入量：0.857002 \\
資本：0.154591
$$

ここで、最初に説明した弾力性を用いて係数推定値を見ていきます。
労働投入量の係数が0.85であるとは、1%労働投入量を増やせば生産量が85%増えるということです。同様に資本を考えると、1%資本を増やせば生産量が15%増えるということになります。

この結果を見ると生産額を効率的に増やすには、資本よりも労働投入量を増やしたほうがいいことがわかります。ただし、限界生産力があるので労働投入量だけを増やし続けてもいいというわけではないことに注意です。

推定はなんと三行でできちゃう。
```est.jl
ols = lm(
    @formula(log(製造業GDP) ~ log(就業者数*労働時間) + log(資本ストック)), # 式(2)
    jldf # データ
)
```

最後に注意していただきたいことは、我々が集めたデータを我々が仮定した統計モデルにおいて、はじき出した結果に過ぎないということです。
つねにモデルが間違っている（現実を表しているわけではない）ということは、頭に入れておきましょう。

# もっと経済学をプログラミングで学びたい方へ

プログラミングで経済学を勉強してみようと思った人はこちらのサイトがおすすめです。本記事ではJulia言語を使用していますが、紹介するサイトはPythonを使用しています。PythonはJulia言語よりも検索時の情報量も多く何より日本語記事が多いので、より経済学の勉強に集中できると思います。

下記のサイトは[神戸大学の春山先生](http://www.econ.kobe-u.ac.jp/faculty/fields/theory/haruyama.html)が公開しているものです。近年オープンな教材が増えてきてすごく勉強がしやすい環境にどんどん変わってきていると思います。ぜひ、経済学の勉強で行き詰ってる人は、別な視点から学んでみると、もしかしたらすんなり理解ができるかもしれません。

https://py4basics.github.io/

https://py4etrics.github.io/index.html#

https://py4macro.github.io/

# 参考
- [基礎コース 計量経済学 森棟 広夫](amazon.co.jp/基礎コース-計量経済学-基礎コース経済学-森棟-公夫/dp/4883840816)
- [なぜ生産関数はCobb-Douglas型
になるのか？
ー実データによる生産関数の直接観測－](http://www2.kanazawa-gu.ac.jp/~ishikawa/20190914_,meiji.pdf)
- [「生産者行動の理論」のポイント](http://www2.toyo.ac.jp/~kawano/lec-semi/mat/mic3.pdf)
- [生産関数と潜在GDP](http://www2.toyo.ac.jp/~mihira/keizaitoukei2014/08_production/08_production_slides.pdf)
- [terasakisatoshi/Pandas.jl_example.ipynb Gist](https://gist.github.com/terasakisatoshi/23b7b69af2893691a992fb7263e185c9)