パクチーとみたの備忘録

パクチーとみたの備忘録

備忘録and日記。誰かの役に立てばいいな。

R言語(プログラミング)を用いて非線形成長モデルの将来予測・考察をしてみた(エストニアの政府データを利用)

f:id:tommy-acoustic-7:20190427005557p:plain

Tere!🇪🇪

北欧はエストニアの、タルトゥ大学で計量経済学を学んでいるとみたです。

4月になり、エストニアは急に暖かくなってきました。
つい最近までコートで出かけていたのに、今じゃ半袖の人もちらほら見かけます。

ここ留学が決まった時は、色んなことをブログに書こうと思ったのですが、全然書けていませんね....(シンプル怠惰)


来月あたり、"エストニア留学生の1日”と題して、それっぽい動画をあげようかな...とは思っています。
(先に宣言して自分を追い込むタイプ。故に有言不実行が多い。良くない。)


ということで今回も、主に自分の備忘録として、ニッチなプログラミングと経済学に関する記事を書いていきます〜。

前回に引き続き、エクセルでも出来る事なのですが、
モデル作成から描画までR言語を用いるととてもスピーディーなので、個人的に良いなと思っています。

どっかのRを使われされている大学院生とかに役立てばいいなあ。

前置き

f:id:tommy-acoustic-7:20190427021433p:plain

今回のテーマは、エストニアの政府データを利用して、X-Roadの経済成長のForecasting(予測)を行なってみよう!といったところです。

X-Roadというのは、エストニア電子政府を根源で支えているとっっても重要なサービスです。

eID(日本でいうマイナンバー)にくくりつけられた、運転免許や処方箋と言った個人の様々な情報が、X-Roadという基盤を通して、必要とする機関に開示されます。その結果、個人は運転免許証やお薬手帳を持ち歩く必要がありませんし、納税もパソコンでサクッと行うことができます。

そんなことしたら、個人情報の安全性はどうなるの〜〜とお思いになるかもしれませんが、ここで肝なのが、X-Roadは、個人の情報を一括して保持しているのではなく、各機関がその情報を必要とし、情報開示の要求を発行した際に、情報を得る権利を各機関に与えるという役割を持っているという点です。これによって、情報は安全に透明性の高いシステムの中で運用されます。
(もっとうまく説明されている記事がたくさんあるので、気になった方はググってみてくださいね。)

説明が長引いて、ちょっと脱線してしまいましたね(汗)

今回は、そんなX-Roadの経済成長に関して、R言語を用いて予測・考察をしていきます。

目的

具体的に何を行うかというと、X-Roadに関する2種類の予測と考察をしていきます。

経済予想1(情報開示請求数)

データ公開時までの非線形成長モデル y=a \times b^xが維持された場合、例えば2020年12月にX-Roadにおいて行われる情報開示請求数はいくつになるだろうか。(データから成長モデルも求める)

経済予想2(サービス数)

データ公開時までの線形成長モデル y=a + b \times xが維持された場合、例えば2019年3月にX-Roadのサービス(例:医師と薬剤師間の患者の処方箋の共有サービス)の数のはいくつになるだろうか。(データから成長モデルも求める)

予測のプロセス

どちらの予測のプロセスも、大まかに以下の3つフェーズに分類できます。それぞれRを用いてスピーディーに行います。

①標本数と時間をインプットしプロットを作成
②成長モデルを求める(パラメーターを推定)
③予測を行う

考察(消費者数)

X-Roadの消費者数はどのように増加しているのか可視化した上で、線形または非線形に近い理由は何か考える。



ではまず、二つの予想を順番に行なっていきましょう。

2020年12月次の情報開示請求数の予測

標本数と時間をインプットしプロットを作成

まずは、データをインプットします。関数option()のscipenによって指数表記を回避しておきましょう。

options(scipen=100000)
xroad=read.table("http://www.ut.ee/kristjan.vassil/wp-content/Xroad_monthly.csv",,header = T,sep=",")

そうしたら、プロットする前に、表(ベクトル)を定義しましょう。
y軸を請求数、x軸をデータが始まっている2003年からの月数とします。

# Define vectors y (queries) and x (count of months from Jan, 2003)
y=xroad$Queries
x=1:length(y)

定義したら、プロットします。

plot(x,y,ylab="Queries",xlab="Month")  

するとこんな風に描かれます。
f:id:tommy-acoustic-7:20190427072046j:plain

成長モデルを求める(パラメーターを推定)

次に、 y=a \times b^xの成長モデルを求めていきます。

#Estimate parameters a and b for y=ab^x
exponent.queries=nls(y~a*b**x,start=list(b=1,a=21670))
exponent.queries

するとこんな風に係数が求まります。

Nonlinear regression model
  model: y ~ a * b^x
   data: parent.frame()
          b           a 
      1.023 1659219.979 
 residual sum-of-squares: 1929083179148436

Number of iterations to convergence: 11 
Achieved convergence tolerance: 0.0000009646

そうしたら、このモデルを描画させましょう。

#Plot fitted line
plot(x,y,ylab="Queries",xlab="Month")
lines(x,coef(exponent.queries)["a"]*coef(exponent.queries)["b"]**x,lwd=2)

すると、こんな図ができます

f:id:tommy-acoustic-7:20190427073808j:plain

予測を行う

では、最後に予測を行なっていきます。

months2=1:216 # 予測をする分の216ヶ月目まで範囲を延ばす
plot(months2,coef(exponent.queries)["a"]*coef(exponent.queries)["b"]**months2,type="l",ylab="Queries",xlab="Month",lwd=2,lty=2) # draw a line using the above sepcified function with estimated parameters
points(x,xroad$Queries) # add actual data
lines(x,coef(exponent.queries)["a"]*coef(exponent.queries)["b"]**x,lwd=2) # mark prediction line with dashed line
queries216=(coef(exponent.queries)["a"]*coef(exponent.queries)["b"]**months2) # calculate predicted values for all months
sum(queries216[months2>=216]) # 216ヶ月目の月間合計予測データを計算
 ||<

[f:id:tommy-acoustic-7:20190427075034j:plain]

こんな予測グラフが出力されました。


結果としては、
>|r|
[1] 215047461

より、データ公開時までの非線形成長モデルが維持された場合、2020年12月にX-Roadにおいて行われる情報開示請求数は215047461になることがわかった。

2019年3月次のサービス数の予測

ほとんど上記と同じ流れで行なっていきます。違うのは線形か非線形かの違いくらい。

標本数と時間をインプットしプロットを作成

すでにインプットは行われているので、いきなりプロットを描画しちゃいます。

#Step 1 - plot the relationship
plot(x,xroad$Services,ylab="Services",xlab="Month") #Plot services over time

こんな感じですね。

f:id:tommy-acoustic-7:20190427075118j:plain

成長モデルを求める(パラメーターを推定)

そしたら、線形モデルを求めましょう。

#Step 2 - Estimate parameters a and b for y=a+bx
linear.services=lm(xroad$Services~x)
linear.services

すると係数が求まります。

Call:
lm(formula = xroad$Services ~ x)

Coefficients:
(Intercept)            x  
      55.80        10.27  
 ||<

では、グラフを出力していきます!
>|r|
#Plot fitted line
plot(x,xroad$Services,ylab="Services",xlab="Month")
abline(linear.services,lwd=2)

f:id:tommy-acoustic-7:20190427080148j:plain

予測を行う

実際、手作業でもできちゃうレベルなのですが、まあここは基礎を学ぶ意味も込めてR言語で予測していきます。

months2=1:195 
plot(months2,predict(linear.services,newdata=data.frame(x=months2)),type="l",ylab="Services",xlab="Month",lwd=2,lty=2) # draw a line using the above sepcified function with estimated parameters
points(x,xroad$Services) # add actual data
lines(x,predict(linear.services,newdata=data.frame(x=x)),lwd=2) # mark prediction line with dashed line
linear.services=55.79820+10.26877*months2  # calculate predicted values for all months
linear.services[181:195]
 ||<

このコードによって、181ヶ月目から195ヶ月目までのy切片(サービス数)の値を出力してくれますね。
>|r|
[1] 1914.446 1924.714 1934.983 1945.252 1955.521 1965.789 1976.058 1986.327 1996.596 2006.864 2017.133 2027.402 2037.671 2047.940 2058.208

したがって、2058.208個のサービスが利用されるという予測が立ちました。

図はこんな感じになります。
f:id:tommy-acoustic-7:20190427080940j:plain



考察(消費者数)

ここまではX-Roadの成長の予測を行なってきたのですが、ここではついでに消費者数のプロットを打って、得られる図から考察を行います。

既にインプットしてあるデータから、消費者数の推移を描画させます。

このコードから、

plot(x,xroad$Consumers,ylab="Consumers",xlab="Month")


f:id:tommy-acoustic-7:20190427081712j:plain


明らかに線形モデルだとフィットしませんね。

消費者の増加がこのような曲線になる理由は、イノベーター理論が説明可能でしょう。

イノベーター理論とは、1962年に米・スタンフォード大学社会学者、エベレット・M・ロジャース教授(Everett M. Rogers)が提唱したイノベーション普及に関する理論で、新しいサービスがどのように消費者の間で普及していくかという説明をするものです。

以下のグラフのように、最初は新しいもの好きのイノベーティブな消費者からゆっくり広まり、みんながやっているならやるか、という人たちの間でグッと広がり、最後にまあシャーなしでやるかという風に変化をあまり好かない人たちの間で広まっていきます。

f:id:tommy-acoustic-7:20190427082108j:plain


現実に、社会科学の理論が成り立っているのを観察することのできる面白い一例ですね。