Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード Twitter

2014-12-22

各国のGDPに占める製造業の割合を再現可能な形で可視化する

| 10:22 | 各国のGDPに占める製造業の割合を再現可能な形で可視化するを含むブックマーク

各国のGDPに占める製造業の割合を可視化する

製造業を愛する俺は

  • 「日本の〜製造業は衰退の〜一途であ〜る!」
  • ものづくり大国〜日本は変革の時ダーーーー」

ってな話をニュースやらで読み聞きした際、レポートや見解を出してくる所謂有識者諸氏が基本的にアレな方々だと思ってるので、「こっ、こいつら適当なことを脊髄反射で喋ってるだけなんじゃねーか?」と考え、きちんと再現可能な、Reproducible Researchな、文芸的プログラミングな形で、各国のGDPに占める製造業の割合を可視化してみた。これ大事。

結果は↓。チェックボックスでグラフをポチポチいじってみてください。ここに埋め込みたかったが、できなかった…

Rのコード付版は

この元となるRmarkdownは

ちなみにデータのソースは世銀です。

画像で見る

f:id:teramonagi:20141222083327p:image

お、おう、本当に日本の製造業の割合は下がっている。下がっているが、ドイツもそんな感じだし、どっかで見た「スイスは!製造業が強いから!みんな幸せ!」みたいな記事はてんで適当で、上のガジェットのスイスをクリックしてもらえばおわかりいただけると思うが、日本と大した変らないだろうと。

参考

2014-12-21

RFinanceJパッケージで振り返る日本の金融マーケット2014

| 07:48 | RFinanceJパッケージで振り返る日本の金融マーケット2014を含むブックマーク

この記事は

の21日めの記事です。詳しくは

をご覧ください、そして今年の相場で儲けた人は、ちゃんと私に申告して奢るようにしてください。


また、上記のドキュメントを作成する際に使用したR Markdownファイルは

です。dygraphsやrChartsの埋め込み、もろもろの設定などの参考になれば。

2014-12-19

kd木を作って、k次元空間上の点間の最近傍構造を抽出したい

| 00:42 | kd木を作って、k次元空間上の点間の最近傍構造を抽出したいを含むブックマーク

kd木*1という、k次元のユークリッド空間にある点の最近傍探索を分類する空間分割データ構造がある。学問分野では最近傍探索ってのに相当するそうだ。これをRでやりたい。

調べた所、以下3つのパッケージが見つかった。

この3つのライブラリ共、

というC++ライブラリに計算をブン投げるようになっていた。

RANNパッケージが一番作りがシンプルで、kd木を構成する関数しか機能として提供していない一方、FNN・yaImputeは機能が豊富で計算した最近接構造の"良さ"などを比較するためメソッドも提供されている。何個まで最近接を考慮したらいいのかなどの検証に使うわけですな。ちなみにFNNよりyaImputeの方が機能が更に豊富。パッケージのインストールと読み込みはinstall.packagesとlibrary関数でOK、dplyrとpipeRがないときはそれも入れておきましょう。

install.packages(c("FNN", "RANN", "yaImpute"))
library(FNN)
library(RANN)
library(yaImpute)
library(dplyr)
library(pipeR)

まず、ダミーデーターを以下のように作成して、表示しておく。

#N個点をばらまく
N <- 6
sample_data <- data.frame(x=rnorm(N), y=rnorm(N))
plot(sample_data)
text(sample_data$x, sample_data$y, 1:N, cex=1, pos=4, col=\"red\")

f:id:teramonagi:20141219221543p:image

この図に書いた点間の最近傍構造を取得したい、そういうことです。

で、実際に上記のFNN, RANN, yaImputeパッケージのそれぞれで計算させた結果が以下で、結論を先に書くと計算結果は一致している。読み方としては基本的に皆同じだが、説明を書いておくと

  • nn2関数(RANN package)
    • nn.idxの行方向が点の番号(sample_dataの行番号)、列方向が近い順に並べたsample_dataの行番号(ただし自分を含む)
    • nn.distsの行方向が点の番号(sample_dataの行番号)、列方向が近い順に並べたsample_dataの行番号に相当するデータとの距離(ただし自分を含む)
  • get.knn関数(FNN package):
    • nn.idxの行方向が点の番号(sample_dataの行番号)、列方向が近い順に並べたsample_dataの行番号
    • nn.distsの行方向が点の番号(sample_dataの行番号)、列方向が近い順に並べたsample_dataの行番号に相当するデータとの距離
  • ann関数(yaImpute package)
    • knnIndexDistの行方向が点の番号(sample_dataの行番号)、列方向が近い順に並べたsample_dataの行番号(ただし前半分の列)
    • knnIndexDistの行方向が点の番号(sample_dataの行番号)、列方向が近い順に並べたsample_dataの行番号に相当するデータとの距離(ただし後半分の列)

となっている。細かい仕様に違いはあるが、結果の読み方もだいたい同じだ。なので例えばnn2関数の結果をみると

  • nn.idxの2行目をみると、2(自分自身),1,5,6,3,4の順番で点が2の傍にある
  • nn.distsの2行目をみると、上に書いた点と2の点との距離は0, 0.7807924, 1.3328261, 1.3356298, 1.474876, 1.880671となっている

というように読めばよいわけです。実際、上の図の"2"の点に目視で見て一番近そうなのは1の点、その次が5の点のように見える(3もかなりいい線いってるが僅差で5の方が近いってのは出力された距離nn.distsを見ればわかる)ので、これでいいだろうと。

> #RANN(この関数しかない)
> nn2(sample_data)
$nn.idx
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    6    4    5    3
[2,]    2    1    5    6    3    4
[3,]    3    5    2    6    1    4
[4,]    4    6    1    5    2    3
[5,]    5    6    3    2    1    4
[6,]    6    4    5    1    2    3

$nn.dists
     [,1]      [,2]      [,3]      [,4]     [,5]     [,6]
[1,]    0 0.7807924 0.9674654 1.2762832 1.492233 2.067800
[2,]    0 0.7807924 1.3328261 1.3356298 1.474876 1.880671
[3,]    0 1.0764026 1.4748756 1.8956475 2.067800 2.571711
[4,]    0 0.6789893 1.2762832 1.5526944 1.880671 2.571711
[5,]    0 0.9114382 1.0764026 1.3328261 1.492233 1.552694
[6,]    0 0.6789893 0.9114382 0.9674654 1.335630 1.895648

> #FNN
> get.knn(sample_data, k=N-1)
$nn.index
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    6    4    5    3
[2,]    1    5    6    3    4
[3,]    5    2    6    1    4
[4,]    6    1    5    2    3
[5,]    6    3    2    1    4
[6,]    4    5    1    2    3

$nn.dist
          [,1]      [,2]      [,3]     [,4]     [,5]
[1,] 0.7807924 0.9674654 1.2762832 1.492233 2.067800
[2,] 0.7807924 1.3328261 1.3356298 1.474876 1.880671
[3,] 1.0764026 1.4748756 1.8956475 2.067800 2.571711
[4,] 0.6789893 1.2762832 1.5526944 1.880671 2.571711
[5,] 0.9114382 1.0764026 1.3328261 1.492233 1.552694
[6,] 0.6789893 0.9114382 0.9674654 1.335630 1.895648

> #yaImpute
> ann(as.matrix(sample_data), as.matrix(sample_data), k=N)
Target points completed: 

$knnIndexDist
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]      [,8]      [,9]     [,10]    [,11]    [,12]
[1,]    1    2    6    4    5    3    0 0.6096368 0.9359893 1.6288989 2.226759 4.275795
[2,]    2    1    5    6    3    4    0 0.6096368 1.7764254 1.7839069 2.175258 3.536924
[3,]    3    5    2    6    1    4    0 1.1586426 2.1752581 3.5934796 4.275795 6.613697
[4,]    4    6    1    5    2    3    0 0.4610265 1.6288989 2.4108599 3.536924 6.613697
[5,]    5    6    3    2    1    4    0 0.8307195 1.1586426 1.7764254 2.226759 2.410860
[6,]    6    4    5    1    2    3    0 0.4610265 0.8307195 0.9359893 1.783907 3.593480

...(途中省略)...

attr(,"class")
[1] "ann"

で、3つあるパッケージのうち

  • yaImputeパッケージは機能豊富なのはいいものの、肝心のann関数引数がmatrix限定(data.frame入れたら怒られた)
  • RANNパッケージは自分自身との距離の計算(つねに0)という冗長な結果が毎回帰ってくるので捌くのめんどい

という消去法的理由でとりあえずFNNパッケージを使わせていただくことにする。

dygraphsサイコォォォォオオオオオオオオオオオオオ!!!

| 23:23 | dygraphsサイコォォォォオオオオオオオオオオオオオ!!!を含むブックマーク

仕事が早いことで有名なRStudioがまた新しいライブラリを出したようだ

ここで紹介されているhtmlwidgets for Rパッケージは、javascript可視化ライブラリのRへのラッパーとなっているとのことだ。今のところ、

の5つが用意されている*2が、俺の興味があるところは時系列データの話なので、dygraphs for Rをいじりたい。javascriptライブラリとしてのdygraphsは

がご本家っぽい。このdygraphsパッケージを使うと以下のような簡単なコードで、美しく時系列データを可視化(with interactive)できる。

devtools::install_github("rstudio/dygraphs")
library(dygraphs)
dygraph(nhtemp, main = "New Haven Temperatures") %>% 
  dyRangeSelector(dateWindow = c("1920-01-01", "1960-01-01"))

実行結果をここに埋め込もうと思ったらうまくいかなかったので、以下のrpubsにUpした。

下部のバーで描画範囲を選定できるし、同様の操作はチャートを左クリックしながら適当にレンジを選択するでもOKだ。また、その描画範囲選択の解除は、チャートをダブルクリックでOKだ。

実は今度の日曜(12/21)にの担当になったのだが、そこで時系列の描画をrChartsでやろうとしたら結構苦労したので、これは大変ありがたい。もう時系列可視化はこれでいいんじゃないかという印象だ。

また、htmlwidgets for Rの最下部に、あのrChartsパッケージを作っているRamnath Vaidyanathan氏がコピーライトとして表示されていた。ということは…?

*1:k-dimensional treeが正式名称らしい

*2:に加えて、自分でも開発できる模様

2014-12-17

FsLab JournalでReproducible Research(レポート)を簡単に作りたい

| 06:48 | FsLab JournalでReproducible Research(レポート)を簡単に作りたいを含むブックマーク

はじめに

この記事は

の17日目の記事です。前日はpocketberserkerさんのFsAttoparsecについて - pocketberserkerの爆走でした。

今日は最近流行り?のリプロデューシブル・リサーチというか、クヌースのいう文芸的プログラミングをF#で簡単にやるための方法の紹介です。

F#でレポートを作りたい

最近は、プログラミング言語問わず、特に動的な言語方面において、コードと文章本文を混ぜこぜにしたドキュメンテーションが、Reproducible Researchの観点、あるいは単純にその便利さからか、よく用いられているように見えます。

私の十八番のR言語だとR Markdown*1

PythonだとiPython Notebook

がその環境に相当します。R言語を用いた例は以下の資料に詳しく載っています。

また、上で挙げたiPython NotebookをF#で使うこともできるようです。これは以前に雑にまとめました。

一方、F#で同様のことをやろうとすると、(ワタクシ調べの範囲で)「F# Formatting」というライブラリを使うとよさそうなのですが、その導入・使用について、ひと手間必要で、上述の2つに比べるとやや面倒な印象があります。実際にF# Formattingをどう使ったらいいかについては、ありがたいことに日本語の情報があり、以下のBLOG記事で丁寧に解説されているので、これを見てみると良いでしょう。

これを見ていて、「これはお気軽に使うにしてはちょっと面倒だぞと。どこかにテンプレート的なもんが転がってないかな?」と探していたら見つけたのがFsLab Jounalでした。

FsLab Journal

FsLab Jounalは、F#界の神・トマスピ氏が用意してくださっている、テンプレートです。

実はこのテンプレートVisual Studio Express版では使うことができませんでした。当時の私はこれを見つけた喜びに喚起する一方、使えないという現実に絶望を味わったものです。しかし、.NET大好きなF#界隈のみなさんならご存知のように、最近の.NETのオープンソース化に合わせ、Visual StudioもExpress版がCommunity版となり、ありがたいことにこのテンプレートインストールできるようになったのです!こいつを使うと、いちいちビルドスクリプトを書いたりしなくていい!とても簡単にF#のコードと本文を合わせたレポートを作成することができます。

導入〜チュートリアルコンパイル

以下、使い方をざっくりと示します。

まず、上記のリンクよりFsLab Jounalをダウンロードすると、自動でVisual Studioに組み込まれ、プロジェクトを新規作成する画面で「FsLab Jounal」が選択できるようになるので、これを使います。

f:id:teramonagi:20141125141240p:image

そして、作成されたプロジェクトに対して、何も考えずにビルド&実行(F5)すると結果として、チュートリアルとして用意されているレポートがHTML形式で出力されます*2

f:id:teramonagi:20141125141241p:image

あとはチュートリアルのfsxなんかを見ながら独自のドキュメント&コードを書いていけば「やった!これで簡単にF#でReproducible Researchが出来るぞ!」となるわけです。

以下、ハマった点などをまとめます。

レポート内で日本語を使いたい

(私だけなのかもしれないが)デフォルトだとfsxがshift-jis文字コードで保存されており、このままだと日本語が正しく表示されません。なので、fsxファイルの文字コードUTF-8にして再保存しておく必要があります。

レポートのひな型を修正したい

レポート&コードはfsxに書いたものがHTMLなる一方、レポートの外面を決めているひな型は、プロジェクトフォルダ下の

  • packages\FsLab.Runner.XXX\styles

にある*3、template.htmlです。なので、レポートの"見てくれ"を変えたければ、これに手を入れればOKです。あるいは、プロジェクト内にあるMain.fs内で呼ばれているJournal.Process関数のtemplateLocation引数にファイルパスを指定してテンプレートを変更することもできます。このとき、ファイルパスとして指定する先には、デフォルトでついてくるテンプレートのフォルダ構成同様に、cssからその他html, jsファイルまで入ったフォルダとすることが必要です。

その他

Main.fsにあるように"--latex"オプションを指定するとpdfでの出力も可能だそうですが、試していません*4

まとめ

この記事ではF#でReproducible Researchを行うための環境としてFsLab Jounalというテンプレートを使うという方法を紹介しました。「新しい項目」を追加する際には「FsLab Tutorial(using R)」なんてのもあり、RTypeProviderを用いてF#とRを連携させる方法についても簡単に試すことができます。

*1:これに加えてknitrというパッケージ

*2:正確には、プロジェクトのルート直下にあるすべてのfsxファイルが自動的にHTMLレポートへと変換されます

*3:XXXはライブラリのバージョン番号

*4:多分TeXの環境周りでハマってひどいめにあうことは目に見えているので…

2014-12-15

今日も1日がんばるぞい!

| 22:07 | 今日も1日がんばるぞい!を含むブックマーク

こういう話がある

これをF#でやりたい。

open System
let dic = [ [|"今日"; "ぞい"|]; [|"も"|]; [|"1"; "ぞい"|]; [|"日"; "ぞい"|]; [|"がん"; "ぞい"|]; [|"ばる"; "ぞい"|]; [|"ぞい!"|]]
let rnd = new System.Random()
let make_zoi (x : string [] list) =
    let rec make_zoi_inner (lst : string [] list) = 
        match lst with
        | head::tail ->
            head.[rnd.Next(Array.length head)] + make_zoi_inner(tail)
        | [] -> ""
    make_zoi_inner x  
let count_zoi(x : string [] list) = 
    let rec count_zoi_inner count = 
        let zoi = make_zoi(x)
        printfn "%s" zoi
        match zoi with
        | "今日も1日がんばるぞい!" -> count + 1
        | _ ->     count_zoi_inner(count+1)
    count_zoi_inner 0

printfn "&#127775; がんばるまで %d zoiでした&#127775;" (count_zoi dic)

実行すると以下。

> 
ぞいもぞいぞいがんぞいぞい!
ぞいも1日ぞいばるぞい!
今日も1日ぞいばるぞい!
今日もぞい日ぞいぞいぞい!
ぞいもぞい日ぞいばるぞい!
今日もぞいぞいぞいぞいぞい!
今日も1日がんばるぞい!
&#127775; がんばるまで 7 zoiでした&#127775;
val it : unit = ()