独学Common Lisp

逆行列と経済波及効果分析

概要

前回は今回の分析に備えて、事前に行列計算用のライブラリを作りました。

今回は線形代数の実践編として、産業連関分析に挑戦します。産業連関という言葉は聞き慣れないと思いますが、「経済効果」というとほとんどの人がニュースなどで耳にしたことがあると思います。より正確に言えば「経済波及効果」であり、あるイベントが発生した時にどのような経済的インパクトがもたらされるかを意味します。

今回は「トランプ大統領の誕生により米国経済が閉鎖的になり、日本国内で生産される乗用車のニーズが25%程度減少した場合、どのような経済的インパクトがあるか」という仮想的な事例を問題にしてみましょう。

産業連関表

ほとんどの人が「GDP」という言葉は聞いたことがあるでしょう。これは「国内総生産(Gross Domestic Product)」のことで、国内で生産された財・サービスの全ての「付加価値」の合計を意味します。付加価値とはその言葉の通り"Value Added"を日本語に訳した言葉で、生産量(産出量)から原材料(中間投入量)を引いた差分を指します。

GDPは一国経済における最も重要な統計の一つで、1年間の経済活動そのものを示す指標ですが、実はGDPは「国民経済計算」というより大きな統計の一部です。国民経済計算は「SNA (Systems of National Account)」の日本語訳で、国連が定めたルールに各国が則って作成している国の決算書ですが、GDPはその中の「損益計算書」にあたるものです。

GDPやSNAを策定する際には様々な統計をベースとして作成していきますが、その中でも最も重要な統計が「産業連関表」です。GDP(SNA)は内閣府が作成者ですが、産業連関表は総務省が代表作成者であり、10府省庁の共同作業という壮大なプロジェクトで策定されています。策定には実に5年もの歳月を要し、この産業連関表の更新が基準となってSNAの基準価格も改定されます。たまたまこのドキュメントを執筆している平成29年初頭は平成23年度の産業連関表に基づいた初めてのSNAが作られており、今回は総務省策定の平成23年度産業連関表を問題の対象にしたいと思います。

産業連関表は英語で"Input-Output Table"と呼ばれます。日本語よりも英語の方がその趣旨に近く、産業毎の「投入」と「販売」を「行列」の形で表示したものです。

経済活動は様々な産業の関係性の中で行われており、他の産業で生産された財やサービスを受け取って自らの財・サービスを生産し、その財・サービスは他の産業に販売されたり、あるいは最終消費者のもとへと販売されていったりします。つまり、「どこから購入して」「どこへ販売するか」というInputとOutputという二面から捉えることができる、ということです。

具体的なイメージを掴むために、e-statから「13部門分類」のエクセルシートをダウンロードして、見てみてください。各産業が並んでおり、下に見ていくと「粗付加価値部門」という言葉があったり、右に見ていくと「輸出」や「輸入」、そして「最終需要部門」という言葉があると思います。下の最後も、右の最後も、共に「国内生産額」になっているはずです。

実際の表を見ればわかる通り、タテ(列)に見るとInputで、ヨコ(行)に見るとOutputです。Inputの下の方にある「粗付加価値」というのはまさに細分化されたGDPであり、就業者に支払われる給料や企業の利益などが含まれます。一方、横に見ていった時の「最終需要」というのも細分化されたGDPであり、消費や投資などを示します。このように、産業連関表自体が非常に細分化され、しかも各産業(活動部門)の関連性が分かるように作られています。

実はこの産業連関表、単に細分化されたGDPという側面だけでなく、一国の産業構造そのものを示すという重要な特性から、一般的に「経済波及効果」と呼ばれるものの推計ではほぼ必ず用いられる重要なものです。その重要性、表を行列で表記することで分かります。次節で見ていきましょう。

投入係数表とレオンチェフの逆行列

先ほどの産業連関表をイメージして、その特性を詳しく知るために、産業Aと産業Bという2つの産業しか存在しない国をイメージしてください。

2つの産業しか存在しない国の産業連関表をヨコに見ていくと、以下の2つの方程式が成立します。

$$ \begin{eqnarray} A_A + A_B + A_F & = & A_X \\ B_A + B_B + B_F & = & B_X \end{eqnarray} $$

この時、ABはA産業からB産業への販売を意味し、AFはA産業の最終需要を、AXはA産業の国内生産額を意味します。以後、GDPと混乱するのを避けるため、「国内生産額」のことを「市場規模」と呼びます。

ところで、産業連関表は前節で述べた通り、タテに見ることもできます。タテに見ると最終需要は付加価値と一致しますから、上記の方程式をタテバージョンにすると以下のようになります。

$$ \begin{eqnarray} A_A + B_A + A_F & = & A_X \\ A_B + B_B + B_F & = & B_X \end{eqnarray} $$

行と列が転置していることに注意してください。この式は、Aという産業の産出総額AX(国内生産額=市場規模)が、A産業からA産業への中間投入AAとB産業からA産業への中間投入BAと労働及び資本の投入である付加価値AFの合計で生産されたことを意味します。

つまり、このタテバージョンの式は、ある産業の財やサービスを生産するのに必要な「生産要素」の量を示していることになります。

生産要素の量は、割合を取ることで相対化・標準化することができます。つまり、産出物1単位を生産するのにどの生産要素をどれだけ投入する必要があるかを求めることができます。計算は単純で、市場規模が1になるように割るだけです。

$$ \begin{eqnarray} \frac{A_A}{A_X} + \frac{B_A}{A_X} + \frac{A_F}{A_X} & = & 1 \\ \frac{A_B}{B_X} + \frac{B_B}{B_X} + \frac{B_F}{B_X} & = & 1 \end{eqnarray} $$

産業連関表の本体は「基本取引表」と呼ばれますが、このようにタテに見て生産要素の投入割合を相対化した数表を「投入係数表」と呼び、産業連関表の主要な一部となります。

このように計算された「投入係数表」は「安定的」であるという点で非常に重要です。ある産業の需要や生産量は景気変動などで大きく動きますが、ある財・サービスを生産するのに必要な生産要素の投入割合はイノベーションが起きて産業構造が変化しない限り、大きく変わることはありません。そこで、実際の生産量に基づく「基本取引表」は1年単位で大きく変化しますが、そこから計算される相対的な「投入係数表」は1年ではあまり変化しないため、この係数表で様々な分析や推計が可能になります。

投入係数表は再利用するため、新しい代数としてαABを導入します。これは、A産業からB産業への投入係数を示します。上の式を投入係数を用いて表記し直すと、以下のようになります。

$$ \begin{eqnarray} \alpha_{AA} + \alpha_{BA} + \beta_A & = & 1 \\ \alpha_{AB} + \alpha_{BB} + \beta_B & = & 1 \end{eqnarray} $$

これはタテバージョンの式なのですが、式としては横方向にしか書けないため、少し分かりにくいと思います。そこで、分かりやすく産業連関表のスタイルとして示すと、以下のような数表(投入係数表)になります。

$$ \left( \begin{array}{c c} \alpha_{AA} & \alpha_{AB} \\ \alpha_{BA} & \alpha_{BB} \\ \beta_A & \beta_B \\ 1 & 1 \end{array} \right) $$

この時、上2行分の中間投入の部分だけを指して「投入係数行列」と呼び、産業連関表の分野では特に"A"という記号で表します。(A産業ではありません。)

$$ A = \left( \begin{array}{c c} \alpha_{AA} & \alpha_{AB} \\ \alpha_{BA} & \alpha_{BB} \end{array} \right) $$

ここで、産業連関表はタテにもヨコにも見ることができることを思い出してください。産業連関表のヨコバージョンはこの節の一番上の式です。再掲すると、以下の式です。

$$ \begin{eqnarray} A_A + A_B + A_F & = & A_X \\ B_A + B_B + B_F & = & B_X \end{eqnarray} $$

この式は、「投入係数」を用いて以下のように表すことができます。

$$ \begin{eqnarray} \alpha_{AA} \cdot A_X + \alpha_{AB} \cdot A_X + A_F & = & A_X \\ \alpha_{BA} \cdot B_X + \alpha_{BB} \cdot B_X + B_F & = & B_X \end{eqnarray} $$

これは投入係数を求めた時の式とよく似ていますが、ヨコバージョンなので行と列が転置しています。タテバージョンで求めた投入係数を使ってヨコバージョンの式を表しているのです。

この式はつるかめ算と同じように、行列を用いて以下のように表すことができます。

$$ \left( \begin{array}{c c} \alpha_{AA} & \alpha_{AB} \\ \alpha_{BA} & \alpha_{BB} \end{array} \right) \left( \begin{array}{c c} A_X \\ B_X \end{array} \right) + \left( \begin{array}{c c} A_F \\ B_F \end{array} \right) = \left( \begin{array}{c c} A_X \\ B_X \end{array} \right) $$

この行列による連立方程式は、要素の数(次元)に限らず以下のように一般化することができます。ただし、Aが投入係数行列、Fが最終需要の列ベクトル、Xが市場規模の列ベクトルです。

$$ AX + F = X $$

行列で一般化するととてもシンプルですね。

今回行うように、ある需要の変化でマーケットがどのように動くか、つまり「経済効果」を求めたいという場合、「最終需要」が説明変数(動かして調整する変数。関数におけるx)で、「市場規模」が被説明変数(説明変数を動かすことで自動的に動く変数。関数におけるy)ですので、この式を「市場規模」であるXについて解くと以下のようになります。

$$ \begin{eqnarray} AX + F & = & X \\ \Leftrightarrow AX - X & = & -F \\ \Leftrightarrow X - AX & = & F \\ \Leftrightarrow (1 - A)X & = & F \\ \Leftrightarrow X & = & \frac{F}{(1 - A)} \end{eqnarray} $$

AやFやXがスカラーならこれで正解なのですが、今回は全て行列なので、$ 1 $は単位行列$ I $でなければならず、また、行列には積はあっても割り算はないので、分数ではなく指数で表記します。

$$ X = (I - A)^{-1} F $$

この時登場する、行列の指数$ -1 $こそが「逆行列」であり、行列$ M $に対して$ M^{-1} $と表記されます。行列に対する負の指数は$ -1 $による逆行列だけです。前回の自作ライブラリにおいて「スカラーの逆数に相当する」と説明した通り、$ M^{-1} M = I $という関係が成立します。(なお、逆行列は常に存在するとは限りません。)

産業連関分析においては投入係数行列$ A $の逆行列$ A^{-1} $ではなく、単位行列$ I $から投入係数行列$ A $を引いた行列$ I-A $の逆行列$ (I - A)^{-1} $が使用され、産業連関分析でノーベル経済学賞を受賞した経済学者の名前を取って「レオンチェフの逆行列」と呼ばれます。

このように、レオンチェフの逆行列を求めることができれば、需要の変化予測に対して市場規模がどのように変化するかを推計することができます。このようにして求める「市場規模の変化」こそが、ニュースでよく聞く「経済(波及)効果」です。

産業連関表はまさに「行列」の形をしており、生産と販売の両面を同時に捉えることができるという特性から、ある産業での変化が他の産業にも影響を与えるという「波及(スピルオーバー)」を分析することが可能なのです。

なお、実際は分析分野に応じて投入係数行列から事前に輸入分を引いておくことがあります。輸入は国内生産ではないため、市場規模(マーケット)の変化より国内生産(例えば就業者数の変化など)に関心がある場合は輸入を控除します。ただし、輸入は行列ではなく列ベクトルとしてしか与えられませんから、産業ごとの違いがなく一定の割合で輸入されるとみなして控除することになります。これは比較的強い仮定ですから、市場規模の変化(経済波及効果)を調べる目的なら輸入分も控除せずに計算した方がいいでしょう。

「基本取引表」「投入係数表」「逆行列係数表(レオンチェフの逆行列)」の3つの数表が、「産業連関表」として作成される主要な表になります。

計算のステップとソースコード

実際の計算のステップもここで説明した通りの手順で行います。

  1. 産業連関表の基本取引表から、投入係数行列を計算する
  2. 単位行列から投入係数行列を引き、その逆行列を求める
  3. 元となる最終需要のベクトルに、調整係数を掛けて、試算上の最終需要を求める
  4. 逆行列に最終需要を掛け、試算上の市場規模を求める
  5. 計算した市場規模と元の市場規模の差が試算上の「経済効果」となる

ここまで分かれば、実際の計算とソースコードはとても単純なものです。以下で一例を示します。

今回は190の産業分類というかなり細かい調整が可能なものでやってみました。e-statからダウンロードしたエクセルファイルから、必要な部分だけを抽出してCSVファイルとしてエクスポートしておきます。ポイントは、全て小数点が付く状態で保存することです。Common Lispでは整数を読み込むと整数として保存されますが、前回紹介した:my-matrix-utilsでは基本的に'double-floatのデータとして扱うため、最初から小数点数にしておくことが必要です。今回は行なっていませんが、型の指定は最適化の際に威力を発揮するため、パフォーマンスが重要視される場合には型指定のdeclareを付けることで高速化が見込まれます。

抽出したデータは以下の3つのファイルに保存します。

市場規模は投入係数行列を作る際に必要です。もしこれを用意しない場合は、基本取引表の列和に最終需要の該当列の値を加算し、自分で産業ごとの市場規模を計算する必要があります。

最終需要は実額の実績データを準備し、それに掛目を掛けることで試算に対応します。つまり、既存の実績値に対して今回ならば「乗用車」の産業部門を0.75倍することで、仮想的な最終需要を計算します。本来ならば直近のGDPを使って実績の最終需要の列ベクトルそのものを推計してから掛目を掛けるべきですが、今回は平成23年度の産業連関表からそのまま最終需要を抽出しました。

以下が、ソースコードです。前回作成した自作の行列計算ライブラリがASDFでロードできる状態になっている必要があります。

(setf *read-default-float-format* 'double-float)
(require :my-matrix-utils)

(defvar basic-io (mat:mload "basic-io.csv"))
(defvar demand (mat:mload "demand.csv"))
(defvar product (mat:mload "product.csv"))

(defvar tonyu (mat:mzero 190))
(dotimes (col 190)
  (let ((p (aref product 0 col)))
    (unless (zerop p)
      (dotimes (row 190)
        (setf (aref tonyu row col) (/ (aref basic-io row col) p))))))

(defvar inv (mat:minv (mat:m- (mat:mident 190) tonyu)))

(defparameter tyousei (mat:mzero 190 1))
(dotimes (row 190)
  (setf (aref tyousei row 0) 1.0d0))
(setf (aref tyousei 117 0) 0.75d0) ;; Automobile = row117

(defparameter output (mat:m. inv (mat:m* tyousei demand)))

(defparameter shock (- (clnu:sum output) (clnu:sum product)))

投入係数行列の作り方は様々ありますが、列・行の順でループしながら計算するのがもっとも早いと思います。ベクトル単位で計算したければ、基本取引表を列ベクトルで抽出して、最終需要の対応するスカラーで割る処理になりますが、求めた取引係数行列の列ベクトルを再び行列に戻していかなければなりませんから、ソースコードの行数は逆に増えるかもしれません。また、基本取引表をよく確認して、列和が0になる列が存在することも確認する必要があり、単純に割るだけではエラーになります。

tyouseiという変数が、実際の経済効果の説明変数になっています。今回であれば「乗用車」の最終需要を0.75倍にして、残りは全て1.0にしています。この掛目を元となる最終需要の列ベクトルdemandに乗じて試算上の最終需要を計算し、レオンチェフの逆行列と掛けることで、試算上の市場規模であるoutputを計算しています。

今回、outputproductの差shockは$ -10 $兆円程度でしたので、想定される経済効果は「マイナス10兆円程度」ということになります。

なお、ここでは「産業」という言葉をそのまま使いましたが、産業連関表において産業とは「活動部門」を指します。例えば、トヨタ自動車という会社は一般に乗用車の製造産業に分類されますが、企業内の活動も多岐に渡っており、乗用車の製造以外の分野の活動はそれぞれの「活動部門」に属します。他の例では、町の豆腐屋などは「食料品の製造」と「食料品の小売」という二つの経済活動を行なっていますので、二つの活動部門に計上されることになります。このような分類を「アクティビティベース」と呼び、産業連関表では一般に「一社一産業」ではなく経済活動で細分化して分類するスタイルが採用されています。これは感覚的には「製品分類」に近く、例えば農機具メーカーが建設機械を製造した場合は建設機械の活動部門に属することになるため、実際上は産業分類(活動部門)を製品分類のようにみなして分析を行います。

表計算ソフトに対する利点

一連の計算は、表計算ソフトでも実装できます。ただし、表計算ソフトを使う場合は以下のデメリットに注意が必要です。

普段使い慣れているソフトウェアが、普段触れていない問題を解くのにも有効である保証はどこにもありません。ある程度複雑な計算を行う際に、表計算ソフト以外を選択する余地があるのなら、何らかのプログラミング言語・数値計算ソフトウェアの使用を検討してみてください。きっと、よりスマートに問題を解くことができるはずです。


Copyright © 2017- satoshiweb.net All rights reserved.