上級マクロ経済学

第10回 成長会計

Author

荻巣嘉高

1 成長会計

マクロ生産関数

マクロ経済学で最もよく用いられる生産関数は、コブ・ダグラス型生産関数 Y = F(K,L) = A K^{\alpha} L^{1-\alpha}

  • Y:GDP
  • K:資本
  • L:労働量
  • A:全要素生産性
  • \alpha \in (0,1):資本シェア

生産の効率を測る

  • 経済成長に最も重要と考えられているのが、全要素生産性(total factor productivity:TFP)A
  • イノベーションなどによって上昇すると考えられている。
  • ただし、直接観測できない。

推計するには:

  • GDPY、資本ストック量K、労働量Lはデータで観測できる。
  • 資本シェア\alphaが分かればOK。

推計のパターン

  1. 資本シェアをデータから計算する。
  2. 資本シェアを含めて、Aを回帰直線を用いて推計する。
  • ちなみに、内閣府、日本銀行が出しているTFP推計は1に基づいている。
  • ただしこの講義では、重回帰分析のエクササイズとして、2を行ってもらう。

推計式

Y = A K^{\alpha} L^{1-\alpha} について、両辺の対数をとると、 \log Y = \log A + \alpha \log K + (1-\alpha) \log L

これまで使ってきた回帰モデルと比較すると Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2

  • \log Aの部分が定数項\beta_0の部分として計算できる。
  • \alpha = \beta_11-\alpha = \beta_2として解釈できる。
    • \beta_0, \beta_1, \beta_2は回帰分析の係数として算出できる。
    • ただし、本来はもう一つ制約(\beta_1+\beta_2)があると考えるため、少しややこしい。一旦無視する。

推計

エクササイズ: Penn World Tableのデータテーブルから、

  • 実質GDP(Y
  • 資本ストック(K
  • 労働投入量(L

を取得して、分析する。

rgdpna: 実質GDP(支出側、現地通貨単位)

emp: 被雇用者数(百万人)

avh: 平均労働時間

rnna: 資本ストック(百万円、現地通貨単位)

テーブルの読み込みとデータの整理

import numpy as np
import pandas as pd
import statsmodels.api as sm


## テーブルの読み込み
df = pd.read_excel("./pwt1001.xlsx", sheet_name="Data")

df_jp = df[df["country"] == "Japan"] # 日本のデータのみ抽出

df_tab = df_jp.loc[:,["year","rgdpna","emp", "avh", "rnna"]] # 関連する列だけ抽出

df_tab.head() # 表示
year rgdpna emp avh rnna
6090 1950 272826.00000 39.407654 2030.413757 790520.8125
6091 1951 297234.68750 40.384689 2012.990686 833484.4375
6092 1952 333982.59375 41.342064 1995.717124 865191.6875
6093 1953 356372.46875 42.261971 1978.591787 893951.9375
6094 1954 374102.46875 42.801991 2008.945400 929572.2500

労働投入量の計算

Linput = df_tab["emp"].values * df_tab["avh"].values # 労働投入量=労働者数 by 労働時間
df_tab["Linput"] = Linput # df_tabに新たに労働投入量の列を作成

df_tab.head()
year rgdpna emp avh rnna Linput
6090 1950 272826.00000 39.407654 2030.413757 790520.8125 80013.842415
6091 1951 297234.68750 40.384689 2012.990686 833484.4375 81294.003497
6092 1952 333982.59375 41.342064 1995.717124 865191.6875 82507.064882
6093 1953 356372.46875 42.261971 1978.591787 893951.9375 83619.187780
6094 1954 374102.46875 42.801991 2008.945400 929572.2500 85986.861942

推計

# 値の抽出
y = df_tab["rgdpna"].values # GDPをyとする

x = df_tab.loc[:,["rnna","Linput"]].values # 資本ストック、労働投入量の順で、その値のみ取り出してxとする

# y,xの全て値について対数を取る
lny = np.log(y) # yの対数がlny
lnx = np.log(x) # xの対数がlnx


lnX = sm.add_constant(lnx) # lnxに定数項を足す

# 説明変数(X)の中身をチェック
print("----------")
print("xのチェック")
print(lnX[:5])
print("----------")

result = sm.OLS(lny,lnX).fit(cov_type="HC0")  # 回帰分析の実行
print(result.summary()) #サマリの表示
----------
xのチェック
[[ 1.         13.58044726 11.28995493]
 [ 1.         13.63337031 11.30582754]
 [ 1.         13.67070637 11.3206392 ]
 [ 1.         13.70340729 11.33402829]
 [ 1.         13.74247981 11.3619498 ]]
----------
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.997
Model:                            OLS   Adj. R-squared:                  0.997
Method:                 Least Squares   F-statistic:                 1.059e+04
Date:                Sat, 13 Sep 2025   Prob (F-statistic):           1.60e-84
Time:                        13:13:07   Log-Likelihood:                 111.23
No. Observations:                  70   AIC:                            -216.5
Df Residuals:                      67   BIC:                            -209.7
Df Model:                           2                                         
Covariance Type:                  HC0                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const         -7.9731      1.170     -6.815      0.000     -10.266      -5.680
x1             0.6826      0.010     69.747      0.000       0.663       0.702
x2             1.0055      0.111      9.029      0.000       0.787       1.224
==============================================================================
Omnibus:                        1.375   Durbin-Watson:                   0.119
Prob(Omnibus):                  0.503   Jarque-Bera (JB):                1.133
Skew:                          -0.088   Prob(JB):                        0.567
Kurtosis:                       2.402   Cond. No.                     3.01e+03
==============================================================================

Notes:
[1] Standard Errors are heteroscedasticity robust (HC0)
[2] The condition number is large, 3.01e+03. This might indicate that there are
strong multicollinearity or other numerical problems.

結果の表示

\log Y = \log A + \beta_1 \log K + \beta_2 \log L の推計によって出てきた係数を入れると、 \log Y = -7.97 + 0.68 \log K + 1.00 \log L となっていることがわかる。

\log A = -7.97なので、 A = e^{-7.97}

lnA = result.params[0] # 定数項部分の値
A = np.exp(lnA)
print("Aの値:", A)
Aの値: 0.0003446107864493169
  • これがサンプル期間の間の平均的なTFPだと解釈できる。

各年のTFP

もとの生産関数が Y = A K^{\beta_1} L^{\beta_2} であったと考えれば、推計された係数を用いると、 A = \frac{Y}{K^{\beta_1} L^{\beta_2}} = \frac{Y}{K^{0.68}L^{1.00}} と計算できそう。

YKLについては各年の値がわかっているので、これらをもとに、各年のTFPが算出できる(はず)。

年次TFPの計算

import matplotlib.pyplot as plt 

year = df_tab["year"].values

Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量
year

beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数

A = Y/(K**beta1 * L**beta2)

plt.plot(year,A)
plt.title("TFP")
plt.show()

2025-09-13T13:13:07.299513 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

もう少し”一般的’’なTFP算出

実は、コブ・ダグラス生産関数を仮定するならば、次の関係が成立する。 \alpha = \frac{rK}{Y} 1-\alpha = \frac{wL}{Y}

rK/Y: 資本分配率

wL/Y: 労働分配率

  • これらはデータから算出できる。
  • 経験的に、労働分配率は安定して2/3程度と考えられている。
    • これに従えば、\alpha = 1/3

算出の比較

import matplotlib.pyplot as plt 

year = df_tab["year"].values

Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量

beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
alpha = 1/3 # 経験的なalpha値

A0 = Y/(K**beta1 * L**beta2) # 回帰でのTFP
A1 = Y/(K**alpha * L**(1-alpha)) # 経験的なalphaでのTFP


## プロット
plt.plot(year,A0, label="reg") 
plt.plot(year,A1, label="use_labor_comp")
plt.title("TFP")
plt.legend()
plt.show()

2025-09-13T13:13:07.342963 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

import matplotlib.pyplot as plt 

year = df_tab["year"].values

Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量

beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
alpha = 1/3 # 経験的なalpha値

A0 = Y/(K**beta1 * L**beta2) # 回帰でのTFP
A1 = Y/(K**alpha * L**(1-alpha)) # 経験的なalphaでのTFP


## プロット
## A0[-3], A1[-3]がそれぞれ2017年のTFP
plt.plot(year,A0/A0[-3], label="reg")
plt.plot(year,A1/A1[-3], label="use_labor_comp")
plt.title("TFP")
plt.legend()
plt.show()

2025-09-13T13:13:07.386518 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

import matplotlib.pyplot as plt 

year = df_tab["year"].values

Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量

beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
alpha = 1/3 # 経験的なalpha値

A0 = Y/(K**beta1 * L**beta2) # 回帰でのTFP
A1 = Y/(K**alpha * L**(1-alpha)) # 経験的なalphaでのTFP


## プロット
## 変化率 = x[t]/x[t-1] - 1 で算出
plt.plot(year[1:],A0[1:]/A0[:-1]-1, label="reg")
plt.plot(year[1:],A1[1:]/A1[:-1]-1, label="use_labor_comp")
plt.title("TFP")
plt.legend()
plt.show()

2025-09-13T13:13:07.430989 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

いくつかの論点

  • コントロール変数の問題
  • 推計モデルの問題

コントロール変数の問題

  • 本来コントロールされて然るべきのものがコントロールされていない。
    • 推計された絶対値は疑わしいと思った方がよい。
    • 傾向(増加や減少)はそれほど外していないと考えて良い。
  • TFPを使いたいならば、推計された値が提供されているので、そちらを使う方が安全。
    • ちなみに、PWTにも指数化したTFPがある(次ページ)。
    • 日本だと、日銀、RIETI、内閣府などが資産しているが、どこも成長率ベースでデータを公開している。
    • 絶対値を正確に推定することの困難さが背景に。
    • ソロー残差の概念(後述)。

推計されたTFPの比較

df = pd.read_excel("./pwt1001.xlsx", sheet_name="Data") # PWTデータの読み込み
df_jp = df[df["country"] == "Japan"] # 日本のデータの抽出
year = df_jp["year"].values
A_pwt = df_jp["rtfpna"].values # TFPの値が入っているのが"rtfpna"の列
plt.plot(year,A0/A0[-3], label="reg")
plt.plot(year,A1/A1[-3], label="use_labor_comp")
plt.plot(year, A_pwt, label="PWT")
plt.title("TFP (y2017=1)")

plt.legend()
plt.show()

2025-09-13T13:13:09.602804 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

ソロー残差

いくつかの期間が成長率ベースでTFPを測っているのは、ソロー残差の概念に基づいている。 GDPの成長率について、次のように分解ができるとされている。 \frac{\Delta Y}{Y} = \frac{\Delta A}{A} + \alpha \frac{\Delta K}{K} + (1-\alpha) \frac{\Delta L}{L} 整理すると、 \frac{\Delta A}{A} = \frac{\Delta Y}{Y} - \alpha \frac{\Delta K}{K} - (1-\alpha) \frac{\Delta L}{L} つまり、TFPの成長率がGDP、資本ストック、労働投入量の成長率および労働分配率から残差として計算できる、ということ。

  • \Delta A/Aがソロー残差

推計モデルの問題

  • 回帰ではOLSの性質上、残差の和がゼロになる。
    • 先の推定において大きな差が出た理由の一つ。
    • これが\log K\log Lの係数に与える影響は無視できなさそう。
  • 規模に関して収穫一定は満たされているか?
    • 回帰分析の結果では、K^{\beta_1}L^{\beta_2}のうち\beta_1+\beta_2=1になっているように見えない。
    • 生産関数の形状については当然議論があるが、残念ながら荻巣はそこまで詳しくない。

2 区間推定

回帰での推計で規模に関して収穫一定を課す例

Y = A K^{\alpha} L^{1-\alpha} を仮定すると、y\equiv Y/Lk \equiv K/Lとして、 y = A k^{\alpha} とできる。 両辺の対数を取って、 \log y = \log A + \alpha \log k となる。 このモデルでの推計は、暗に規模に関して収穫一定であることを課していると解釈できる。

\hat{\alpha}の計算

year = df_tab["year"].values

Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量

# 一人当たりに変換
y = Y/L
k = K/L
df_tab["k"] = k
x = df_tab.loc[:,["k","Linput"]].values

X = sm.add_constant(x)

result = sm.OLS(y,X).fit(cov_type="HC0")

print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.997
Model:                            OLS   Adj. R-squared:                  0.997
Method:                 Least Squares   F-statistic:                 1.332e+04
Date:                Sat, 13 Sep 2025   Prob (F-statistic):           7.53e-88
Time:                        13:13:09   Log-Likelihood:                -74.615
No. Observations:                  70   AIC:                             155.2
Df Residuals:                      67   BIC:                             162.0
Df Model:                           2                                         
Covariance Type:                  HC0                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const         -8.8124      0.705    -12.493      0.000     -10.195      -7.430
x1             0.1746      0.002    100.033      0.000       0.171       0.178
x2             0.0001   6.92e-06     18.361      0.000       0.000       0.000
==============================================================================
Omnibus:                        1.454   Durbin-Watson:                   0.277
Prob(Omnibus):                  0.483   Jarque-Bera (JB):                1.263
Skew:                           0.160   Prob(JB):                        0.532
Kurtosis:                       2.425   Cond. No.                     1.18e+06
==============================================================================

Notes:
[1] Standard Errors are heteroscedasticity robust (HC0)
[2] The condition number is large, 1.18e+06. This might indicate that there are
strong multicollinearity or other numerical problems.

\alphaはどこ?

t = \frac{\hat{\alpha} - \alpha}{\hat{SE}(\hat{\alpha})} \sim \mathcal{N}(0,1) であった。 左右に2.5%ずつ(閾値は1.96)の面積を取って除いてやれば、残りの区間の値が出る確率は95%。 -1.96 \le \frac{\hat{\alpha} - \alpha}{\hat{SE}(\hat{\alpha})} \le 1.96 なので、 \hat{\alpha} - 1.96\hat{SE}(\hat{\alpha}) \le \alpha \le \hat{\alpha} + 1.96\hat{SE}(\hat{\alpha}) このような推定を区間推定という。

推定された\alphaの区間

先の推計値を入れてみよう。 0.1882 - 1.96\times 0.003 \le \alpha \le 0.1882 + 1.96\times 0.003 0.1832 \le \alpha \le 0.1932 資本分配率がだいたいこのくらい。 労働分配率は 1- 0.1932 \le 1-\alpha \le 1 - 0.1832 0.8068 \le 1-\alpha \le 0.8168 なので、1/3よりは大きそう。

まとめ

  • 成長会計では全要素生産性(の成長率)を計算。
  • 同じ対象でも推計によって出る値は全く異なりうることを理解するべき。
    • どのような推計を行っているのか、推計手法はスタンダードか、変わった推計ならばなにが異なるのか、という点は常に意識しながら推計データを見るべし。