Excel と R と GAMS で産業連関分析

私は普段、CGE分析などのシミューレションをするのに基本的に GAMS というソフトウェアを利用しています。最近、簡単な産業連関分析を試しにしてみようとしたのですが、GAMS よりも他のソフトの方がやりやすいかもと思い、

  • Excel
  • 統計ソフトのR
  • GAMS

の3つを用いて、同じような産業連関分析をしてみました。3つのソフトを使って、同じような分析を

  • 4部門の仮想的な連関表
  • 日本の2011年の13部門表
  • 日本の2015年の185部門表

の3つの産業連関表を用いておこないました。

分析といっても、試しにやってみた程度のもので、

  • 1) 全ての財の最終需要が10%増加するシナリオ
  • 2) 建設という財への最終需要が500億円増加するシナリオ

というだけの本当に簡単な分析しかしていません(モデルも輸入を外生的にした最も単純なモデルです)。

Releases · ShiroTakeda/IO-analysis

プログラム、データは上の場所にある Source code (zip) というファイルにプログラムが入っています。

ファイルの解説

  • IO_analysis.xlsx

    • これが Excel を用いて分析しているファイルです。
  • IO_analysis_1.r、IO_analysis_2.r、IO_analysis_3.r

    • この3つが R を使ったプログラムです。
    • それぞれ、sample_IO_data_1.txt、sample_IO_data_2.txt、sample_IO_data_3.txt をデータに用いています。
  • IO_analysis_1.gms、IO_analysis_2.gms、IO_analysis_3.gms

    • この3つが GAMS を使ったプログラムです。
    • GAMS のプログラムは sample_IO_data.xlsx のデータを用いています。

どれも同じデータを使って、同じシミュレーションをしているので、当然ですが同じ結果が出てきます。

Excel

ここでの ExcelVBAは用いずに、関数だけを使っています。関数を使っているだけなので単純で、わかりやすいのですが、大規模なデータを用いる、あるいは複雑なシミュレーションをするのはやはり難しいと思います。Excel で複雑なシミュレーションをするのなら VBA が必要になると思います。日本で産業連関分析をおこなっている人の多くは以下の藤川先生の本を参考にしていると思いますが、この本は Excel + VBA で産業連関分析をする方法を解説していますので、産業連関分析をしている人の多くは Excel + VBA を用いているのかもしれません。

統計ソフトR

R は普段使うことがなく使い方をほとんど知らないので、(当たり前ですが)プログラムを書くのに手間がかかりました。特に行列のデータを外部のファイルから読み込む方法がなかなかわからず困りました。

Google で検索すると、データフレームの形式のデータを読み込む方法はたくさん見つかるのですが、行列のデータを読み込む方法はなかなか見つからなかったです。R は統計分析をすることが主な用途のソフトですから、行列の演算をする人はあまりいないのかもしれません(?)

R は無料ということもあってか、非常にユーザー数も多いようで、使い方を解説したウェブページが山ほどあります。ただ、同じような初歩的なことを解説したページが多いので、逆に検索しにくかったです。上で書いたように、外部のファイルにある行列データを読みこむ方法を探したのですが、なかなか見つからず、結局、英語のページを検索してやっと見つけました。

産業連関分析というと、モデルを行列で表現し、行列の演算を用いることが多いと思いますが、R で行列表現のデータが利用できるので、一度、データを行列に入れてしまえばあとは簡単です。例えば、A と B という行列があった場合、

A %*% B

で行列の積が計算できますし、

solve(A) 

でAの逆行列が計算できます。産業連関分析では行列の四則演算と逆行列の導出さえわかればだいたい済むと思います。

GAMS

GAMS におけるデータの型は基本的に「配列(もしくは、スカラー)」であって、直接行列を表現することはできないです。R では A や B という変数で行列を表し、A %*% B で行列の積を表すことができましたが、GAMS ではそういうことはできないです。

しかし、二次元の配列を使えば実質的に行列、及び行列の演算を表現できます。

例えば、a(i,j) と b(j,k) という二つの二次元の配列を定義し、a(i,j) は行列の (i,j) 要素、b(j,k) は行列の (j,k) 要素を保持するという形にすれば、a と b は実質的に行列です。

R のように「a x b」のような形で二つの行列の積を表現することはできないのですが、

c(i,k) = sum(j, a(i,j) * b(j,k)) 

という式によって、a と b の積である c という行列(の i-k 要素)を表すことができます。つまり、行列の積という演算もおこなえます。

三つの行列の積(a * b * c)となると

d(i,l) = sum(k, sum(j, a(i,j) * b(j,k)) * c(k,l))

のような式で計算できます。掛け合せる行列の数が増えるとちょっと式が長くなり大変ですが、二つ、三つくらいの行列の式でしたらそれほど複雑にはなりません。

また、産業連関分析では逆行列を計算する演算が必要になります。GAMS では直接逆行列の計算はできないのですが、付属の外部プログラムである invert.exe というプログラムを利用すれば計算ができます。

ですので、

  • GAMS のプログラムで行列を作成
  • その行列を GDX ファイルに出力
  • invert.exe を呼出して GDX ファイルの行列の逆行列を計算し、別の GDX ファイルに出力
  • GAMS のプログラムで GDX ファイルから逆行列を読み込む

というような手順を踏むことで、逆行列の計算という演算もおこなえます。ちょっと面倒に見えるかもしれませんが、実際のプログラムではたいしたことはないです(IO_analysis_1.gms などを見ればわかると思います)。

どれが使いやすいか?

産業連関分析というと

など、様々なソフトウェアが使われていると思います。上で書いたように「Excel + VBA」はよく使われていると思いますし、行列表現ができるので統計ソフトのRも使われているのではないかと思います(フリーソフトウェアですし)。GAMS は産業連関分析にはあまり向いていないかなと思っていたのですが、今回、プログラムを書いてみて、GAMS も案外連関分析には向いているのではなかと思いました。私は元々GAMSを使い慣れていることもあるのですが、それを差し引いても、言語の特徴などからしてGAMSで産業連関分析はかなりやりやすいように思いました。

CGE 分析をするために GAMS を持っている人は、連関分析をする場合にも GAMS を使うといいかもしれません。

[注] 上においてあるサンプルのプログラムは無料のデモバージョンのGAMSでも実行できます。GAMS は大きいモデルを扱う場合はデモバージョンでは解けないのですが、このプログラムではそもそもモデルを解いたりする作業(例えば、最適化問題を解くだとか、連立方程式を解くだとか)がないので、デモバージョンでも計算できてしまいます。