過去のトップページ日記2009.04.14
魔女の宅急便のキキのデザイン・カプチーノ。ジブリ美術館のカフェで出てくるそうですが、何だか職人芸。 今日、ちょっとデータ分析を見せてもらったのだが、どうコメントしようか考えさせられる研究になっていた。それなりテクニカルな分析で推計をかけており、確かに何か有意性のある分析結果が出てきている。しかし、理論的背景のある仮説が無いので、分析結果をどう解釈していいかが分からない。 データ分析には、仮説を特に置かないアプローチと、仮説を置くアプローチの二つがあると思う。前者は平均値や分散などの基本統計量やグラフを観察したりすることで、後者は仮説から導出される推計モデルを検定することだと言えるだろう。計量分析をかけるという事は、相関係数にしろ有意性にしろ、立てた仮説が成り立っているかチェックする意味合いがとても強く、そのチェックのための道具として計量分析が役立つことになる。理論や仮説があっての計量分析であって、「理論なき実証」は全く意味が無い。この意味で、理論なきテクニカルな実証研究よりも、理論あるシンプルな実証研究の方が価値があると言える。 とはいえ分析モデル無しでは計量分析がかけられないので、まったく理論や仮説が無い人はいないはずだ。しかし、よく話を聞いてみたが、あまりアイディアが練られているようには思えなかった。アイディアと分析手法はかけ離れており、そもそもそれを検証する価値があるのかも分からない。どの道、かなりの部分をやり直す必要があるのは明白だった。仮説、つまり方向性を立てずに作業に邁進したら、こういう結果になりがちだ。 彼は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種類の方法が用いられる。
北村(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の入れ替わりが起きるので、アンバランスド・パネルデータになっている。
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パッケージでパネルデータ分析が容易に行える事が示せたが、分析結果にどういう差が出るかを最後に確認しておきたい。
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のクラブの経営活路は無いように示唆されている。 参考ページ
注意
|
過去ログ |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||