過去のトップページ

日記

2009.04.14
魔女の宅急便のキキのlatte art

魔女の宅急便のキキのデザイン・カプチーノ。ジブリ美術館のカフェで出てくるそうですが、何だか職人芸。

今日、ちょっとデータ分析を見せてもらったのだが、どうコメントしようか考えさせられる研究になっていた。それなりテクニカルな分析で推計をかけており、確かに何か有意性のある分析結果が出てきている。しかし、理論的背景のある仮説が無いので、分析結果をどう解釈していいかが分からない。

データ分析には、仮説を特に置かないアプローチと、仮説を置くアプローチの二つがあると思う。前者は平均値や分散などの基本統計量やグラフを観察したりすることで、後者は仮説から導出される推計モデルを検定することだと言えるだろう。計量分析をかけるという事は、相関係数にしろ有意性にしろ、立てた仮説が成り立っているかチェックする意味合いがとても強く、そのチェックのための道具として計量分析が役立つことになる。理論や仮説があっての計量分析であって、「理論なき実証」は全く意味が無い。この意味で、理論なきテクニカルな実証研究よりも、理論あるシンプルな実証研究の方が価値があると言える。

とはいえ分析モデル無しでは計量分析がかけられないので、まったく理論や仮説が無い人はいないはずだ。しかし、よく話を聞いてみたが、あまりアイディアが練られているようには思えなかった。アイディアと分析手法はかけ離れており、そもそもそれを検証する価値があるのかも分からない。どの道、かなりの部分をやり直す必要があるのは明白だった。仮説、つまり方向性を立てずに作業に邁進したら、こういう結果になりがちだ。

彼は3か月ぐらいこの作業に従事しており、その間、他のタスクはほとんど止まっていた。1月目ぐらいに経過をチェックできれば、もうちょっといい方向にアドバイスできたかも知れない。自分で必死に走っているときは、往々にして根本的なところに気づかないものだ。もうちょっと早めに周囲を巻き込んで足元を確認していくことが、彼には必要な姿勢だと思う。

Trackback Ping-URL: http://uncorrelated.no-ip.com/cgi-bin/trackback/20090414

あらしの為のTips

(;゚д゚) R言語でパネルデータ・モデルを推計せよ!

ミクロ経済学の計量分析は、かなりの比率をパネルデータ分析で占められている。その応用であるパネル・トービットや、動学パネル・モデルを含めると、近年のデータ分析の半数以上がパネルかも知れない。今日は、Jリーグの各クラブ・チームの2003〜2008年の勝ち点と観客動員数の関係を、R言語のplmパッケージを用いて分析する。

まず、パネルという用語について確認しておこう。データ分析を行うときに、サンプルに複数時点のデータが含まれることは良くある。例えばJリーグのデータであれば、2003年にも、2004年にも浦和レッズのサンプルは存在する。複数年にわたるデータで、同一の個体が含まれるデータを、パネル・データという。

このパネル・データの分析には、ちょっとした注意が必要だ。個体間で歴然とした特性の違いがある場合、それを特殊な手法でコントロールした方が、より良い推計結果が得られる。浦和レッズのようなビッグ・クラブと、ジェフ千葉のような中小クラブがそもそも持つ特性が異なることは想像し難くはないであろう。浦和レッズに限らず、各クラブごとの何か特徴があるわけで、それをコントロールする手法が必要になる事が多い。パネルデータ分析では、これら各個体の差異の原因を特定することなく、差異があることだけを前提に計量分析をかけることができる。

実際には万能なコントロール手法は存在しないので、パネル・データの分析には大きく次の3種類の方法が用いられる。

(1) yit = ai + xitβ + εit
within推計(固定効果モデル)
個体ごとに切片項(ai)が異なる。個体ごとの平均値を算出し、説明・被説明変数をその平均値との乖離に変換(within変換)した後、OLSを用いて推計を行う。
(2) yit = a + xitβ + νi + εit
random推計(変量効果モデル)
個体ごとに誤差項の分散が異なる。pooling推計後に、個体ごとの誤差分散(νi)を計測し、誤差分散を除数としてGLSを用いて計測する。
(3) yit = a + xitβ + εit
pooling推計(一般最小二乗法)
個体ごとに平均値も、誤差項の分散も同一である。基本的にpooling推計はただのOLSになるが、他2つとの比較に用いることができるし、場合によってはpoolingが正しいと考えられる場合もある。

北村(2005)に従えば、この3つのモデルの選択は計量的な手法で特定されるべきだ。なぜならば、各個体の差異の原因を特定していないわけで、理論モデルなどから計量モデルを導出していない。理論的背景が明確でない以上、計量的な妥当性を統計量によって検定するのが適切と言えるだろう。

つまり、一般的なパネルデータ分析では、pooling推計、within推計、random推計の3推計を行った上で、それぞれの推計結果を検定していく必要がある。分析に必要な演算手順はテキストなどに明記されている事が多い。Farnsworth (2008)では、特別なパッケージに頼らない方法で推計することを示唆している(具体的な手順は述べられていない)。しかし、パッケージ無しでは推計回数、検定回数とも多くなるため、R言語の操作が煩雑になる上に、誤解を含めたミスを誘発する可能性がある。R言語にはplmパッケージという優秀なパッケージがあるので、それを使って分析をするのが合理的であろう。

以下ではplmパッケージを用いて、Jリーグの各クラブ・チームの2003〜2008年の勝ち点と観客動員数の関係を、pooling推計、within推計、random推計でそれぞれ推定したあとに、Pooling検定、Hausman検定、Breusch-Pagan検定を用いてモデルの特定化を行う。

1. インストール

インストールにちょっと落とし穴がある。R version 2.8.1 (2008-12-22)で試したところ、単にplmパッケージをインストールしただけではhas.intercept()関数が無いようなエラー・メッセージが出る。つまり、Formulaパッケージの最新版もインストールする必要があるようだ。

install.packages("Formula")
install.packages("plm")

なおパッケージ配布元は、日本のどこかのサーバーにしておけば良いはず。

2. データセット作成

Jリーグの公式ページから、J1の各クラブ・チームの2003〜2008年のホーム試合数、観客動員数、順位、勝ち点のデータを以下のような並びの、タブ区切りのデータとして作成した。ファイル名は、"J年間順位.txt"とつけている。

なお大宮が空白なのは、大宮アルディージャが2002年度はまだJ1のチームでなかったからだ。毎年J1とJ2の入れ替わりが起きるので、アンバランスド・パネルデータになっている。

データセット(抜粋)
クラブ 年度 試合数 観客動員数 順位 勝ち点
札幌 2002 15 287,098 16 15
仙台 2002 15 327,925 13 32
鹿島 2002 15 323,855 4 53
浦和 2002 15 394,445 11 35
大宮 2002
千葉 2002 15 118,460 7 41

R言語で取り込むのは以下のようにする。

jl <- read.table("J1Ranking.txt", header=TRUE, sep="\t")

ラベル付でデータフレームとして取り込まれる。

jl
     クラブ 年度 試合数 観客動員数 順位 勝ち点
1     札幌  2002     15    287,098   16     15
2     仙台  2002     15    327,925   13     32
3     鹿島  2002     15    323,855    4     53
4     浦和  2002     15    394,445   11     35
5     大宮  2002     NA              NA     NA
6     千葉  2002     15    118,460    7     41
(省略)

unique()関数とlength()関数を使って、サンプル種類(N)と年度(T)を確認。

# 分析する年度を確認
unique(jl$年度)
# チーム種類数を確認
length(unique(jl$クラブ))

欠損値を除外し、年次ダミーを作成し、文字列になってしまっている観客動員数のデータを数字型に変換する。

# 試合数が欠損値(NA)のサンプルは、J1にいないので除外する必要がある
# 変数adは、非欠損値がtrueのリスト
ad <- !is.na(jl$試合数)
# インデックス用にクラブ名を抽出
team <- jl$クラブ[ad]
# 年次ダミーを作る
year <- jl$年度[ad]
yd2003 <- ifelse(year==2003, 1, 0)
yd2004 <- ifelse(year==2004, 1, 0)
yd2005 <- ifelse(year==2005, 1, 0)
yd2006 <- ifelse(year==2006, 1, 0)
yd2007 <- ifelse(year==2007, 1, 0)
yd2008 <- ifelse(year==2008, 1, 0)
# コロン入りで文字列型の観客動員数を数値化する
noa <- as.integer(gsub(",","",jl$観客動員数[ad]))
# ホーム・ゲーム数
noh <- jl$試合数[ad]
# 試合数はホーム試合数の2倍
nom <- 2*noh
# 試合あたり平均勝ち点を計算
awp <- jl$勝ち点[ad]/nom
# 平均観客動員数を計算
aoa <- noa/noh
# データ・フレームを作成
df <- data.frame(aoa = aoa, awp = awp, id = team, year = year, yd2004 = yd2004, yd2005 = yd2005, yd2006 = yd2006, yd2007 = yd2007, yd2008 = yd2008)

3. パネルデータ分析

3.1. パッケージのロード

まず最初に、plmパッケージをロードする。

# plmパッケージを利用
library(plm)

3.2. パネルデータ・セット作成

個体方向(クロス方向)と、時系列方向のインデックスを指定して、データフレームをパネルデータ・セットに変換しておく。

# index にidとyearを指定して、パネルデータ・セットを作成
plmdata <- plm.data(df, index=c("id", "year"))

3.3. パネル推計

poolingも、withinも、randomも1行で終わる。なお、summary(rpl)などと言う風に、summary()関数で推計結果を確認することができる。

# 推定モデルはモデル式frmlに代入しておく
frml <- aoa ~ awp + yd2004 + yd2005 + yd2006 + yd2007 + yd2008
# pool推計をかけてみる。これは検定用
rpl <- plm(frml, model="pooling", data = plmdata)
# within推計をかけてみる
rfe <- plm(frml, model="within", data=plmdata)
# random推計をかけてみる
rre <- plm(frml, model="random", data=plmdata)

3.4. 検定によるモデル選択

まず、pooling vs withinのF検定を行う。

> pooltest(rpl, rfe)

        F statistic

data: frml
F = 42.8094, df1 = 23, df2 = 90, p-value < 2.2e-16
alternative hypothesis: unstability

H0(全ての定数項と傾きが共通、つまり固定効果が無いという帰無仮説)が棄却され、within推計が支持されている。

次に、within vs randomのHausman検定を行う。

> phtest(rfe, rre)

        Hausman Test

data: frml
chisq = 0.4841, df = 6, p-value = 0.998
alternative hypothesis: one model is inconsistent

H0(ランダム効果νが誤差項εと独立という帰無仮説)を棄却できないので、random推計が支持されている。

最後に、random vs poolingのBreusch-Pagan検定を行う。ここの検定方法は、計量的には色々とオプションが取れる。

> plmtest(rre, "individual", "bp")

        Lagrange Multiplier Test - (Breusch-Pagan)

data: frml
chisq = 658.804, df = 1, p-value < 2.2e-16
alternative hypothesis: significant effects

H0(ランダム効果νが統計的に有意ではないという帰無仮説)が棄却されたので、random推計が支持されている。

F検定、Hausman検定、Breusch-Pagan検定の結果、変量効果モデルがもっとも妥当な推計モデルであることが示された。よって、変量効果モデルの推計結果の詳細を見ておこう。

summary(rre)
Oneway (individual) effect Random Effect Model 
   (Swamy-Arora's transformation)

Call:
plm(formula = frml, data = plmdata, model = "random")

Unbalanced Panel: n=24, T=1-7, N=120

Effects:
                     var    std.dev  share
idiosyncratic  6759299.5     2599.9 0.0968
individual    63099201.5     7943.5 0.9032
theta  : 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.6889  0.8552  0.8772  0.8596  0.8772  0.8772 

Residuals :
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-7330.0 -1420.0  -146.0    30.7  1100.0 11100.0 

Coefficients :
            Estimate Std. Error t-value  Pr(>|t|)    
(Intercept) 13114.68    2058.53  6.3709 1.879e-10 ***
awp          2690.88     951.77  2.8272  0.004695 ** 
yd2004       1093.09     803.45  1.3605  0.173671    
yd2005       1621.69     781.60  2.0748  0.038002 *  
yd2006       1064.63     806.42  1.3202  0.186771    
yd2007       1956.94     805.37  2.4299  0.015105 *  
yd2008       1870.51     774.49  2.4151  0.015729 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Total Sum of Squares:    855780000
Residual Sum of Squares: 735760000
F-statistic: 3.07224 on 6 and 113 DF, p-value: 0.0080078

本当は自動計算されるはずの、multiple R-squaredが表示されないので、(Residual Sum of Squares)/(Total Sum of Squares)を計算して、R2の0.8597537を得る。

4. 推計結果の比較

R言語とplmパッケージでパネルデータ分析が容易に行える事が示せたが、分析結果にどういう差が出るかを最後に確認しておきたい。

3種類の推計方法の推計結果の比較
Pooling Within Random
推定量 P値 推定量 P値 推定量 P値
切片 8157.9 0.006979 ** 13114.68 1.88E-10 ***
勝ち点 6386.4 0.001124 ** 2510.99 0.01135 * 2690.88 0.004695 **
2004年度 2079.5 0.396936 1076.09 0.18926 1093.09 0.173671
2005年度 1925.5 0.414991 1621.8 0.04207 * 1621.69 0.038002 *
2006年度 1191.3 0.614194 1105.03 0.18042 1064.63 0.186771
2007年度 2011.4 0.394661 1995.34 0.01546 * 1956.94 0.015105 *
2008年度 2271.1 0.336425 1877.02 0.01751 * 1870.51 0.015729 *
R2 0.9021885 0.8527932 0.8597537

pooling推計では、勝ち点の係数が他の2倍以上と大きくなっている。つまり、浦和レッズなどのビッグ・クラブの観客動員数の変動幅が大きいため、poolingでは正しく推計を行えない可能性が高いことが分かる。また、年次ダミーの有意性が無い。Jリーグの観客動員数は近年は増加しているとされているので、プールドの推計結果は、分析結果の解釈で重大なミス・リードを招く可能性がある事が分かる。

5. データ不整合

何かの事情で複数の同一固体・同一年の観測値がある場合、以下のようなエラー・メッセージが出る。

duplicate couples (time-id)
 以下にエラー pdim.default(id, time)

この場合は、以下のように固体と年を連結したベクトルを作り、重複がないかduplicated()関数で確認すると、データの異常部分がすぐに見つかる。

dlst <- paste(unlist(data["id"]), unlist(data["year"]))
dlst[duplicated(dlst)]

6. おわりに

plmパッケージでは、なぜか相関係数や予測値が出ないので、推定量から作成しないといけない。fixef(rfe)とすれば、固定効果のリストは得られたりするが、TSP等に比べると、ちょっと使いづらい面はまだある。しかし、動学パネル・モデルがサポートされていたりと調べるといろいろと便利な事が分かるので、最初に必要な情報を手早く収集できるようにマニュアルを読み込むことが重要なようだ。


最後に、せっかく実データで推計を行ったので、Jリーグの各チームの振興策についてインプリケーションを述べたい。1試合あたりの平均勝ち点を1伸ばすには、年間で勝ち点を34点程度増やす必要がある。これは中堅チームが余裕をもって優勝できるだけの力をつけることを意味するが、それでも観客動員数は1試合あたり2,690人しか増えない。放映権料は分配制であり、観客動員数やグッズ販売が収益の柱である事を考慮すると、この値は強さに見合ったものではないだろう。つまり、Jリーグに関して言えば、スター選手を集めて強いチームを作っても、収益力のあるクラブになる見込みは薄い。分析結果からは、クラブ・チームのある地域のサッカー人口やサポーターを地道に増加させるしか、Jのクラブの経営活路は無いように示唆されている。

参考ページ

  1. パネルデータ分析 - 土壇場の経済学
  2. 北村 行伸 (2005) 『パネルデータ分析』 一橋大学経済研究叢書,岩波書店
  3. Grant V. Farnsworth (2008) "Econometrics in R"
  4. Yves Croissant and Giovanni Millo (2009?) "Panel Data Econometrics in R: The plm Package"

注意

  1. 本ページは、本当に投げやりに書いています。
  2. 本サイトは、24時間運用ですが、事前に告知無くサーバーが停止するときもあります。必要な情報はメモをしてください。
  3. チャット友達へのページです。不愉快な思いをしても著者は責任を負いません。

過去ログ
最新版
09.14
08.03
07.31
06.29
05.29
04.17
04.14
04.13
...MORE!

全文検索
掲示板
画像板
投票CGI
ゲーム
パズル
マーカー
会員登録
会員専用

RSS1.0
RSS 1.0