「RをWEBアプリケーションに」Shinyを使ってみた(お試し編)

こんにちは、mergyです。前回までテキスト自動要約の手法を書いていたのですが、一旦お休みして、今回は趣向を変えたテーマで書きたいと思います。
Rのpackage「Shiny」を紹介します。

Shinyとは

Rは解析をするのにとっても便利ですが、解析結果を誰かに見せるときに意外と不便だったりしますよね。
Shinyは、そんな悩みを解決する、Rで書いたスクリプトを簡単にWEBアプリに出来るパッケージです。

動作環境

Mac Yosemite 10.10.4
RStudio Version 0.98.1103
R version 3.2.0

Shiny使い方

RStudioのメニューから「File」→「New Project」を選択し、
「Create project from:」の画面が表示されたら「Shiny Web Application」を選びましょう。

new_project

その後はディレクトリ名を決めて「Create Project」を押すだけです。

directly_name

実はRstudioでは最初からサンプルが用意されており、projectを作成した後に以下のコマンドを入力するだけでサンプルを実行することが出来ます。

実行した結果が以下になります。

Old_Faithful_Geyser_Data

このようにブラウザでRの解析結果を見ることが出来ます。
Shinyは内部でtwitter bootstrapを利用しているのでUIもキレイです。

注目すべきは、左側のスライダーです。これを変更すると…

Old_Faithful_Geyser_Data2

動的にグラフが描画されます。とても便利ですね。

GithubにShinyのexampleがあるので、git cloneしておくとよいでしょう。
試しに「050-kmeans-example」を使ってみます。

Iris_k-means_clustering

「050-kmeans-example」の場合、X軸変数、Y軸変数、クラスター数を動的に変更することが出来ます。
このように簡単に解析結果をブラウザで表示し、直感的な操作で動的に結果を変更することが可能です。

まとめ

Rのpackage「Shiny」を試しに使ってみました。
次回はもう一歩踏み込んで、サーバーでの実行について書きたいと思います。

手がかり表現の自動取得方法

こんにちは、マージーです。引き続き、テキストの自動要約技術について書きたいと思います。
前回までで、「手がかり表現」を用いる事によってテキストの自動要約技術の一つである重要文抽出を行えるということを書きました。

前回のおさらい

軽く前回のおさらいをしたいと思います。前回は、「森のくまさん」を題材にしました。

image3

ここから『くまさん』『おじょうさん』という「手がかり表現」を用いることにより、以下のように重要文を抽出することが出来ました。

image6

手がかり表現の取得方法

ここまでが前回の内容です。今回は「ではどうやって、「手がかり表現」を取得するのか」という話です。

「森のクマさん」のような簡単な例だったら、『くまさん』『おじょうさん』という簡単な例で良いのですが、例えば判決文のような複雑な文章だと大量の「手がかり表現」が必要になります。しかし、「森のクマさん」のように手作業で「手がかり表現」を選別するのは大きな手間がかかります。

そこで登場するのが、CrossBootstrap法です。大分高専の野中先生らによって提案された「手がかり表現」を自動で取得するアルゴリズムです。

CrossBootstrap法

CrossBootstrap法の概要は以下のようになります。

1、 CrossBootstapに「初期集合」と「十分な量の該当データ(判決文の自動要約)なら判決文」を入力

MojarSeminarFeb.047

2、 CrossBootstrapが「手がかり表現の集合を出力」

MojarSeminarFeb.048

少々わかりづらいところもあると思うのですが、「森のくまさん」で言えば
1、で「初期集合」というのは、「くまさん」「お嬢さん」にあたり、手作業で見つけられる範囲の「手がかり表現」です。「十分な量の該当データ」というのは、もし今回が「童謡の要約をしたい」という目的だった場合、「数万件程度の童謡データ」となります。

2、「手がかり表現の集合」は「くまさん」「お嬢さん」以外の手がかり表現が大量に出力されることになります。(他の童謡の要約で使える手がかり表現が主に出力されるはずです)

まとめ

以上がCrossbootstrap法の概要になります。次回はCrossBootstrap法のアルゴリズムの内容について書けたら書きたいと思います。難しそうだったら別のテーマにするかもです笑

よろしくお願いします。

自動で文章を要約するには

こんにちは、mergyです。先週に引き続き、テキストの自動要約手法について書きたいと思います。

前回から

前回、テキスト自動要約には、「抽出型要約」と「生成型要約」があり、抽出型要約にはさらに、『重要文抽出』と『文短縮』があることを説明しました。
では、実際には、どうやって自動で要約するのでしょうか?

自動要約手法の使い分け

まず最初にネガティブな話になってしまうのですが、「生成型要約」はとても難しいです。現在の自然言語処理の研究では、実用に耐えうる結果を出せていないと思います。一方で『重要文抽出』と『文短縮』は良い成果も出せているのですが、文章のジャンルによって使い分けが必要です。

『文短縮』は、修飾子が多い小説などの文章に向いており、intronworksで取り扱っている判決文など、表現を豊かにする必要のない文章は『重要文抽出』が向いていると言えます。

image1

手がかり表現

今回は『重要文抽出』に的を絞って説明したいと思います。
『重要文抽出』で一般的に用いられている一つの手法として「手がかり表現」があります。
「手がかり表現」とは”特定の文章箇所を見つける上で手がかりとなる表現”のことです。

この説明だけだとよくわからないと思いますので、実際の例で見てみましょう。
例で用いるのは前回と同じ童謡「森のクマさん」です。

image3

皆さんお馴染みの「森のクマさん」ですが、歌詞を読んでいると、以下のフレーズが重要であることがわかります。

「くまさん」
「お嬢さん」

当たり前なのですが、物語の主役は「くまさん」と「お嬢さん」なので、それ以外の部分は物語の主軸には関係がないという考え方です。

では、「くまさん」「お嬢さん」という”手がかり表現”を用いて『重要文抽出』を行いたいと思います。
image5

要約結果

”手がかり表現”を用いて『重要文抽出』を行うと、以下の文だけが残ります
image6

いかがでしょうか?
文章量は半分になったのにかかわらず、歌詞のストーリーは大体理解できますね。これが『重要文抽出』の一つの手法である”手がかり表現”を用いた要約です。

まとめ

「森のクマさん」はかなり簡単な例ですが、このように適切な”手がかり表現”を設定しておくことで、人手を解することなく自動で文章を要約することが出来ます。

次回は”手がかり表現”の収集方法について書きたいと思います

自然言語処理を用いたテキスト自動要約の手法

こんにちは、mergyです。3月まで大学院生で今は港区のIT企業に勤務しています。
blog投稿は初めてになります。よろしくお願いします。

今回はテキスト自動要約の手法について書かせていただきます。

intronworksの判決文検索サービスleaglesプロジェクトで用いられている技術です。
とりあえず、今回はソースコードなどは出てきませんので、非エンジニアの方も是非読んでいただければと思います。

テキスト自動要約とは

まず、例を見てみましょう
20150717.002
これはlivedoorニュースですが、皆さんも上記の画像のようなニュースサイトを見たことがあるのではないでしょうか?テキスト自動要約はこのように、「長い文章も読まなくても良いように、最低限の必要な情報だけを自動で抽出する」技術です。(livedoorニュースが手動か自動かはわかりませんが)

テキスト自動要約手法

実際にどのようにテキスト要約を自動で行うか、という話ですが、ざっくり分類すると以下のようになります
20150717.001

まず大きく2つ「抽出型要約」「生成型要約」があり、さらに「抽出型要約」には「重要文抽出」と「文短縮」の2つの種類があります。

実際に体験してみる

手法名だけ見てもピンとこないので、具体例で試したいと思います。本来はニュース記事、新聞記事などが対象となることが多いのですが、今回はわかりやすさのため以下の例を使います。
20150717.003

そうです。森のくまさんです。
子供の頃は楽しく聞いていたのですが、大人になって読んでみるとやや冗長な表現が多く、テキスト要約の例にはピッタリです。笑

重要文抽出

20150717.004
まず重要文抽出を行った場合、上記のようになります。
「花咲く森の道 くまさんに 出会った」のような重複した表現が含まれる文、
「スタコラ サッササノサ スタコラ サッササノサ」のような本文の意味を理解する上では不要な文が取り除かれていることがわかります。

重要文抽出&文短縮

20150717.005
次に重要文抽出した文に続けて文短縮を行います。既存研究を見る限り文短縮は重要文抽出と同時に行われることが多そうです。
「ところが」のような接続詞、「ちょっと」のような副詞が取り除かれていることがわかります。

生成型要約

20150717.006

最後に生成型要約です。これは重要文抽出・文短縮とは全く異なったアプローチで行われます。
元々存在した表現とは全く異なっていることがわかります。
生成型要約はこのように、意味を解釈して、文章を再構築・生成する手法です。
この技術はとても難易度が高く、テキスト自動要約技術の中で最も研究が進んでいない分野と言われています。

まとめ

テキスト自動要約の技術を紹介させていただきました。
次回は、実際にどうやって自動で要約を行うかを紹介させていただこうと思います!

それでは失礼します。

Microsoft Project Oxford の Face API で顔認識をしてみる

少し前にHow-Old.netがバズっていましたね。
How-Old.netはProject OxfordのFaceAPIを使っているらしいです。

本日は、この Project Oxford の FaceAPI を使って顔写真から顔を認識する方法を紹介したいと思います。

subscription-keyを取得する

Azureのアカウントが必要になりますので、登録しましょう。
AzureのMarket PlaceよりFaceAPIを追加します。

face_api_on_azure

追加が完了するとsubscription-keyが取得できます。

サンプルコード(PHP)

画像のurlをGETで渡して顔認識するサンプルコードです。
FaceAPIへのリクエストにはPEARのHTTP_Request2を使ってます。
11行目のsubscription-keyは上記で取得したものに置き換えてください。

実行結果

上記のサンプルコードを実行すると下記のような形で結果が返ってきます。
http://[your_serve_address]/face_api_sample.php?url=[img_url]

faceRectangle は認識した顔の画像上の位置です。
attributes内のgenderは性別、ageは年齢ですね。

いろんな人を認識してみた

face_api_female

Photo by tommerton2010


varanasi - uttar pradesh - india

Photo by nevil zaveri


face_api_kids

Photo by ND Strupler

おわりに

ざっと見る感じ、そこそこ良い精度で認識できていそうですね。
最後の子供2人の写真は両方ともfemaleで認識されていますが…

顔認識のといえば、AlchemyAPI Face DetectionFace++が有名でしたが、
MSのAPIの登場で勢力が一変しました。

Project Oxfordは顔認識以外にも面白そうなAPIが多いので色々いじってみたいと思います。

階層ベイズモデルでサッカーチームの攻撃力と守備力を推定する【リーガ・エスパニョーラ編】

以前プレミアリーグの主要チームの攻撃力・守備力の推定を行いました。
今回はリーガ・エスパニョーラのチームの攻撃力と守備力を以前と同様の階層ベイズモデルで推定を行いたいと思います。

はじめに

利用したデータ

前回と同様、データは football-data.co.uk のデータを10年分使用しています。

team_participation_laliga

各チームごとに1部リーグに参加した年は黒丸をプロットしています。
X軸に記載されている年は、その年から始まるリーグを意味しています。2005だったら、2005-2006シーズンのデータです。

分析対象とするチーム

今回は10年間1部リーグでプレイし続けているチームに関して、チームの攻撃力と守備力の推定結果を紹介します。
該当するチームはAthletic Bilbao、Atlético Madrid、Barcelona、Espanol、Getafe、RealMadrid、Sevilla、Valencia の8チームでした。
今回はこの8チームに関して、攻撃力と守備力を定量的に見てましょう。

その他細かい点

その他、モデルのコードや数値の見方等は前回の記事を参照してください。
今回はn.iter=10000, n.burnin=1000, n.chains=3で全てのパラメータが収束しました。

 

分析結果

アスレティック・ビルバオ

AthBilbaoAttackStrength
AthBilbaoDefenseStrength

 

アトレティコ・マドリード

AthMadridAttackStrength
AthMadridDefenseStrength

 

バルセロナ

BarcelonaAttackStrength
BarcelonaDefenseStrength

 

エスパニョール

EspanolAttackStrength
EspanolDefenseStrength

 

ヘタフェ

GetafeAttackStrength
GetafeDefenseStrength

 

レアル・マドリード

RealMadridAttackStrength
RealMadridDefenseStrength

 

セビージャ

SevillaAttackStrength
SevillaDefenseStrength

 

バレンシア

ValenciaAttackStrength
ValenciaDefenseStrength

やはり、バルセロナ、レアル・マドリードが圧倒、次いでアトレティコ・マドリードですね。
今季の攻撃力・守備力のチーム間比較は下記の通り。

2014-2015シーズンの攻撃力・守備力のチーム間比較

LaligaAttack2015
LaligaDefense2015

レアル・マドリード、バルセロナの攻撃力は群を抜いています。
また、守備はバルセロナ、次いでアトレティコ・マドリードが抜けています。
攻撃のレアル、守備のアトレティコ、高いレベルでバランスの良いバルセロナと言えそうですね。

優勝争いはバルセロナとレアルになりそうですが、残り5節。要注目です。

AzureのVirtual Machineで大規模データ解析もサクサクこなせるR環境を構築する

分析を進めるにあたって試行錯誤のスピードを上げるのって大事ですよね。

そこそこのマシンでも、ちょっとした集計なんかは対して時間がかかりませんが、
機械学習やMCMCなどの計算処理をブン回したいときは非力なマシンだと時間がかかってしょうがないです。

計算処理の高速化はそれこそ様々な手法がありますが、
今回はAzureを使って計算リソースのスケールアップすることができるRStudio Server環境の構築方法を紹介したいと思います。

Ubuntu14.04で構築することを前提に進めていきます。

 

1. Virtual Machineを作成する

Azureの管理ポータルからVirtual Machineを作成します。
DNA NAME, SIZE, NEW PASSWORD, CONFIRM, REGION の各項目を入力して、CREATE A VIRTUAL MACHINE をクリックします。

create-virtual-machine

2. SSHでログインする

Virtual Machineを作る際に設定したパスワードを入力し、ログインします。

 

3. Rのインストール

あとは、分析の際に使うパッケージを入れてください。
Ubuntuの場合

で大体入ります。

見つからない場合は、下記レポジトリを追加してみましょう。

 

4. Rstudio Serverのインストール

バージョンは今日現在の情報ですので、最新版はこちらを参考にしてください。

 

5. ポート開放

Rstudio Server はデフォルトで8787ポートを使います。
Azureでは管理ポータルからポート開放をする必要があります。
open-port

6. Rstudio Server にログインする

login-to-rstudio
Rstudio Server には Linux のユーザーアカウントでログインできます。
ID : azureuser
Pass : {Virtual Machine 作成時に設定した PASSWORD}
ですね。

 

7. 計算リソースのスケールアップの仕方

Virtual Machineを停止させ、CONFIGURE画面から、VIRTUAL MACHINE SIZE を変更することができます。
適したサイズを選んで、再度 Virtual Machine を起動させましょう。
試しに、D14インスタンス(CPU 16コア、Memory 112GB)を立ち上げてみます。
scale-up

CPUコア数

cpu-cores
 

メモリ容量

memory-amount
 

という感じでスケールアップが自由自在な分析マシンが構築できました。
インスタンスサイズには注意しつつ、使いましょう!


参考サイト
cran2deb4ubuntu | The Ubuntu R Blog
RStudio – Download RStudio Server
Getting Started – RStudio Support

階層ベイズモデルでサッカーチームの攻撃力と守備力を推定する【プレミアリーグ編】

階層ベイズモデルを用いて、プレミアリーグの主要チームの攻撃力と守備力を時系列で推定しました。
過去に書いた、一般化線形モデルのポアソン回帰を用いて攻撃力と守備力を推定した記事と、サッカーの勝敗予想をベイズモデル化した記事の合わせ技 + αな内容となっております。

目次

 

はじめに

利用したデータ

データは football-data.co.uk のプレミアリーグのデータを10年分使用しています。
どの国のリーグでも言えることですが、下位チームの降格、下位リーグの上位チームの昇格があります。
下図の通り、シーズンごとにプレミアリーグに参加しているチームが異なっています。

team_participation

各チームごとにプレミアリーグに参加した年は黒丸をプロットしています。
X軸に記載されている年は、その年から始まるリーグを意味しています。2005だったら、2005-2006シーズンのデータです。
また、今シーズンのデータに関しては、2015年3月22日に行われた試合までを対象としています。

分析対象とするチーム

今回は10年間プレミアリーグでプレイし続けているチームに関して、チームの攻撃力と守備力の推定結果を紹介します。
該当するチームはArsenal、Aston Villa、Chelsea、Everton、Manchester City、Manchester United、Tottenham の7チームでした。
この7チームに関して、攻撃力と守備力を定量的に見てましょう。
 

モデル

前提

以前の記事と同様、ゴール数はポアソン分布に従うという前提のもとモデルを構築しています。
ポアソン分布のパラメータであるλをいかに推定するかという問題になるわけですが、
ざっくり表現すると、

LambdaHome = exp(Baseline + HomeAttack - AwayDefense + HomeEffect)\\LambdaAway = exp(Baseline + AwayAttack - HomeDefense)

という形でλを推定しています。

このモデルの前提として、
・各チームの攻撃力・守備力は前年の攻撃力・守備力を平均とする正規分布に従う(分析初年度の2005年を除く)
・各チームの攻撃力・守備力のばらつきはチームごとに定義され、10年間で一定である
・各チームの攻撃力・守備力はシーズン中の変化しない

詳しくは下記コードで。

モデルのJAGSコード

RからJagsを叩いており、Rから下記のパラメータを投げています。

YH ホームチームの得点数
YA アウェイチームの得点数
XHT ホームチーム
XAT アウェイチーム
XS シーズン
XNG 10年間の総試合数
XNT 10年間にプレミアリーグでプレーしたチーム数
XNS シーズン数


MCMCの計算と結果

n.iter=105000, n.burnin=5000, n.chains=3で収束しました。※1


分析結果の見方

結果のサンプル

ArsenalAttackStrength



こんな感じで10年分の変化をプロットします。

Y軸の数値の意味

上で紹介したホームチームのλの計算式を分解すると、

LambdaHome\\= exp(Baseline + HomeAttack + AwayDefense + HomeEffect)\\= exp(Baseline)\times exp(HomeAttack)\times exp(AwayDefense)\times exp(HomeEffect)
ここでBaselineは

2005 0.04590155
2006 0.019349518
2007 0.047285737
2008 0.021237398
2009 0.059335881
2010 0.10370445
2011 0.123273471
2012 0.112604102
2013 0.082352007
2014 0.045952234



という結果になっています。
話を単純化するため、BaselineとHomeAttackだけを見てみましょう。
今年の攻撃力の値を見るとして、2014年のBaselineを仮定します。

exp(Baseline)\times exp(HomeAttack)\\= exp(0.045952234)\times exp(HomeAttack)
でホームチームの攻撃力が0.5だとすると

= exp(0.045952234)\times exp(0.5)\\\approx 1.047 \times 1.648
λを押し上げる分だけを考慮すると

\approx 1.047 \times 0.648= 0.678
となり、攻撃力が0.5ということはλを0.678だけ押し上げる要因となります。

λってなんだったっけ

今回のモデルは最終的にはλを推定しているわけですが、このλが何だったか、今一度確認しておきましょう。
推定しているのはポアソン分布のパラメータであるλです。

ポアソン分布は下記の式で定義される確率分布です。
P(X = k) = \frac{\lambda^k\mathrm{e}^{-\lambda}}{k!}
「単位時間中に平均で λ 回発生する事象がちょうど k 回発生する確率」
今回のケースにあてはめて意訳すると
「90分間に平均で λ 得点するチームがちょうど k 点いれる確率」
つまり、1試合で期待される得点数ですね。(実際ポアソン分布の期待値はλです)

というわけで、「攻撃力が0.5ということは、λを0.678だけ押し上げる」ということは
「攻撃力が0.5ということは、1試合で期待される得点数を0.678点押し上げる効果がある」
という意味です。

これは単純化した話なので、実際にはこれらに加え、相手チームの守備力・ホームチームの効果が加味されます。

濃いグレー・薄いグレー

図中の黒実線のまわりの濃いグレーはMCMCによって推定されたパラメータの50%区間、
さらにその外側の薄いグレーの部分は95%区間を示しています。

 
図の前提の説明が長くなりましたが、結果をみてみましょう。

 

分析結果

Arsenal

ArsenalAttackStrength
ArsenalDefenseStrength

今シーズンは攻撃が過去最高クラスになっている模様。
また、2012シーズンには前年に比べ、守備が結果を出しています。
2012シーズンってコシールニーがフェルメーレンからレギュラーを勝ち取ったシーズンです。

 

Aston Villa

AstonVillaAttackStrength
AstonVillaDefenseStrength

緩やかに衰退しています。特に攻撃。
守備力は2012シーズンから徐々に上がっています。
2012シーズンの夏って現主将でディフェンダーのロン・フラールが加入した年なんですよね。

 

Chelsea

ChelseaAttackStrength
ChelseaDefenseStrength

近年チェルシーといえば、2009シーズンですね。
リーグ戦優勝、FAカップ優勝と2冠を達成した年です。シーズン通算で103得点し、当時の最高記録を塗り替えました。
その後に低迷し、徐々に盛り返している模様。
今シーズンはジエゴコスタ等、攻撃陣の補強がうまくいき、2009シーズンに近い水準の攻撃力となっています。

 

Everton

EvertonAttackStrength
EvertonDefenseStrength

順調に伸び、2012シーズン、2013シーズンあたりがピークです。
今シーズンは良くないですね。

 

Liverpool

LiverpoolAttackStrength
LiverpoolDefenseStrength

攻撃は2,3シーズンごとに好不調を繰り返しています。守備は徐々に衰退。
2012シーズンと2013シーズンは攻撃力が大きく伸びていますが、完全にスアレスの仕業です。

 

Manchester City

ManCityAttackStrength
ManCityDefenseStrength

攻撃・守備ともに0付近だったのが、今や、リーグトップクラスです。
そもそも2005シーズンとか15位ですから、わりと降格ギリギリなわけです。
皆さんご存知の2008年にUAEの投資グループ、アブダビ・ユナイテッド・グループに買収されてからの躍進が凄いですね。

 

Manchester United

ManUnitedAttackStrength
ManUnitedDefenseStrength

昨シーズンは結果を残せませんでした。とは言え、2005シーズンとほぼ同等の実力となっています。
チェルシーやシティなどがこれを上回る実力をつけているため、リーグ内の順位という結果には結びついていないようです。
今期は攻撃陣を大型補強したにも関わらず、守備陣の方が結果をだしているように見えますね。

 

Tottenham

TottenhamAttackStrength
TottenhamDefenseStrength

守備力は2011シーズンを境に絶賛下落中です。
2013シーズンが始まる前の夏に大型補強を行なったにも関わらず、2013シーズンは結果が出ていませんね。

 

おわりに

というわけでプレミアリーグ編でした。
次回は別のリーグのチームごとの能力を推定します。
Jリーグも分析したい。乞うご期待!



参考サイト
http://www.sumsar.net/blog/2013/07/modeling-match-results-in-la-liga-part-one/
http://heartruptcy.blog.fc2.com/blog-entry-68.html

サッカーの勝敗予測モデルをベイズモデル化する

以前、サッカーの試合の勝敗をポアソン回帰を使って予測を行いました。
今回は上記モデルをベイズモデル化し、今後の発展的分析につなげていきたいと思います。

 

ベイズ統計と頻度統計の違い

厳密ではありませんが、おおざっぱに言うと下記です。
データの捉え方と母数の捉え方が違います。
 

頻度統計の考え方

・唯一無二のパラメータが決まっている(パラメータ=固定)
・得られたデータはサンプリングの結果たまたま得られたものとして扱う(データ=確率変数)
・得られたデータよって唯一無二のパラメータを推定する

 

ベイズ統計の考え方

・得られたデータを変更のしようがない唯一のものと考える (データ=固定)
・パラメータが確率的に変動するものとする(パラメータ=確率変数)
・得られたデータと事前分布によってパラメータを分布として推定する

 

分析内容

データ

プレミアリーグ2013-2014シーズンの全試合、2014-2015シーズンの1-19節
 

モデル

今回用いたJAGSコードは下記の通りです。

前回の記事同様、baselineと攻撃力・守備力・ホーム効果によってポアソン分布のパラメータであるラムダを推測するモデルです。
各パラメータの事前分布に関して、平均0の正規分布を仮定しています。

結果

結果は下記の通りです。いずれもRhat < 1.1となっているので収束していると判断することができます。  

攻撃力

attack

守備力

defense

その他のパラメータ

other

 
各チームの攻撃力・守備力をキャタピラプロットしてみると下記のようになっています。
一般化線形モデルで予測したものとほぼ同等の値となっています。
大きく違うのは、パラメータを唯一の値ではなく、分布として推定している点です。
下図の細線は2.5%-97.5%区間、太線は25%-75%区間、点は中央値です。
 

攻撃力

attack2

守備力

defense2

 
今回は事前分布の平均を0と仮定しています。
が、今回得られた値を事前分布に組み込むことで、
チームごとの各能力の推移を時系列でプロットできそうですね。
今後もベイズ統計の思想を使いながら、分析を掘り下げていきたいと思います。

Ruby + NokogiriでWebスクレイピング入門

Webスクレイピングとは ※1

ウェブスクレイピング(Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー(Web crawler) あるいはウェブ・スパイダー(Web spider)とも呼ばれる。

Webサイト上のテキストデータを活用したいけど、APIやCSV等が提供されていないというケースは結構多いですよね。
今回はウェブサイトからテキストデータを取得する方法を紹介をしたいと思います。

RubyのNokogiriというライブラリを使います。

 

環境構築

構築環境はUbuntu 14.04です。

という環境が構築できました。

Nokogiriの1.6系のものが入ります。
1.5系まではlibxml2やlibxsltも自分でインストールする必要があったのですが、
libxml2やlibxsltのバージョンの関係で動作しないケースが多々あったみたいです。
1.6系から依存ライブラリを同梱し、Nokogiriのインストール時に環境に合わせてビルドされるようになりました。※2

 

とりあえず動かしてみる

Yahooファイナンスから日経平均株価のヒストリカルデータを取得し、
CSVとして保存するサンプルです。

1-3行目:

必要ライブラリを読み込み

5行目:

スクレイピング先のURLを指定

7-11行目:

スクレイピング先の文字コードとHTMLの取得

13行目:

取得したHTMLをパースしてDOM化

15-23行目:

必要なデータの取得し、CSV化
必要データの抽出にはxpathで指定する方法※3とcssセレクタ※4で指定する方法の大きく2つの方法があります。上記ではxpath方式を使ってDOMを取得しています。

25-27行目:

CSVファイルの出力

 

Nokogiriを使ったWebスクレイピングまとめ

Nokogiriを使ったWebスクレイピングは下記プロセスでほとんど対応できるかと。

スクレイピング先のURLの指定
 ↓
HTMLの取得
 ↓
取得したHTMLをDOM化
 ↓
必要情報の抽出
 ↓
データの保存

あとは、xpathなりcssセレクタを良い感じに書くこと。
各方式の書き方は下記※3※4を参考にしてください。


※1 Wikipedia – ウェブスクレイピング
※2 http://qiita.com/suu_g/items/fcf549e16c797a9d7dc0
※3 実際に書くにあたってはこのサイトや、チートシートが大変役に立ちます。
※4 CSSセレクタの基本的な内容はこのサイトとかを参考に。