RakutenMAによる形態素解析入門

概要

 本稿はRakutenMAというJavaScriptだけで動く学習器付きの形態素解析器を利用する入門記事です。本記事を読了すると、形態素解析の実行と形態素解析のモデルを作成・更新出来るようになります。
 また、本稿ははてな×PC工房との連動企画の補足をするべく書きました。
「あんちべさんと一緒に Rakuten MA で形態素解析」はてなニュース連動企画 第二弾! : パソコン工房

パソコン工房のPCで遊ぼう第2弾! あんちべさんと一緒に Rakuten MA で形態素解析 - はてなニュース

RakutenMAを利用したエディタ判定器デモ
エディタ判定器 :パソコン工房
【やじうまWatch】Emacs派とVim派の対立を煽る「エディタ判定器」が面白いと評判 -INTERNET Watch

はじめに

 近年、twitterFacebookなどのSNSAmazonのレビューなどから得られる様々なテキスト情報を解析して有効活用しようという取り組みが活発になってきています。例えばインフルくん(http://mednlp.jp/influ/)はtwitterから「インフルエンザ」に関するツイートを収集して解析することによりインフルエンザの流行地域を可視化します。テキスト情報を解析する際は、文章そのものではなく、単語ベースでテキストを扱うというアプローチがよく取られます。しかし、日本語は英語と違って単語と単語の間に空白を開けるなどの区切りがないため、一体どこからどこまでが単語なのかを機械で処理することは困難です。そこで、自然言語処理というテキスト情報を解析する分野で用いられる「形態素解析」という技術が役立ちます。形態素解析とは、モデルに基づいて文章を形態素(※厳密には違いますが、ここでは単語のようなものだとお考えください)に切り分け(※これを「分かち書き」と言います)、品詞を付与し、原型に復元するという処理のことです。ここで言う形態素解析におけるモデルとは、「与えられた文字列のどこからどこまでを形態素として切出すか」、更に「その単語に最もふさわしい品詞は何か」を推定して割り当てるための情報だとお考え下さい。この形態素解析を用いることによって様々な分析が可能になります。
 形態素解析を実現するツール形態素解析器といいます。有名な形態素解析器としてMeCab(http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html)やKyTea(http://www.phontron.com/kytea/index-ja.html)などがあります。但し、これらはユーザにインストール作業をして頂く必要があります。例えば社内でテキストを解析するツールを公開する際、沢山の(プログラマではない)一般ユーザに形態素解析器のインストール作業や後述する辞書やモデルの更新作業を行って頂くよう周知するのは中々大変です。そこで、出来ればブラウザでアクセスするだけで形態素解析が出来るとそれらの問題が解決し大変便利です。また、ブラウザだけで形態素解析が実行できるようになれば、PCではなくスマホタブレットでもそのページにアクセスするだけでテキスト解析が可能になります。その要望を実現出来るJavaScript製の(広義の)形態素解析器が幾つかあります。例えばTinySegmenter(http://chasen.org/~taku/software/TinySegmenter/)は良く知られたツールですが、これは分かち書き機能だけを提供するモノなので、「名詞だけを取得したい」、「形容詞と形容動詞の出現数の比を知りたい」などといった品詞情報まで含めた解析が出来ません。JavaScript製の形態素解析器として最近注目を集めているkuromoji.js(https://github.com/takuyaa/kuromoji.js)は形態素解析の全機能を実現しますが、大変残念ながら学習器が付いていません。
 学習器とは、形態素解析器に望ましい形態素解析を行わせるよう学習させるためのツールです。形態素解析器は必ずしも思うように形態素解析をしてくれるわけではありません。例えば大日本帝国陸軍が建造・運用した揚陸艦である我らが「あきつ丸」を含む次のような例文をMeCab形態素解析してみると、「あきつ丸」という一単語(名詞)として切出してくれるのではなく「あ/きつ/丸」と切り分けられてしまっているのがわかります。
f:id:AntiBayesian:20150108074700j:plain

このように形態素解析器の出力結果が望ましくない状態になってしまう事は頻繁に起こります。これを正しく「あきつ丸」で一単語の名詞であると形態素解析器に解釈して貰えるようにするのが学習器の役割です。どれだけ望ましい、言い換えると、人間が見て不自然ではない形態素解析が出来るかはどれだけ正しい学習を行うかに掛かってきます。Webで公開されている形態素解析の標準的なモデルは、新聞のような校正され整った文章に対しては高い精度で形態素解析を行ってくれます(なぜならそれを元にモデルを作ったため)が、ネットでよく見られるようなくだけた文章では誤まった解析をしがちです。また、解析しようとする対象分野特有の単語がある場合も正しく解析出来ないことが多くなります。そのため、実務で形態素解析を行う場合は解析対象分野に合わせた学習をすることが必須となります。
 本稿で紹介するRakutenMAは形態素解析器(※原型復元機能を持たないため、厳密には形態素解析器ではありません)としての機能だけではなく、学習器としての機能も持っています。そしてJavaScript製のツールで学習器までついている形態素解析器は他にありません。また、機能を提供しているというだけではなく、ツールそのものの使いやすさと整備されたドキュメントの存在が使い勝手を良くしています。本稿ではRakutenMAを簡単に説明し、形態素解析と学習を実践するための手順について紹介します。

RakutenMA

RakutenMAの技術的な中身や特徴はこの論文を読むのが一番確かです。
http://anthology.aclweb.org/C/C14/C14-2009.pdf
ざっくり説明すると、形態素解析部分は文字単位の系列ラベリングモデルを用い、学習の部分はSCWを利用しています。
使い方やライセンスなどの情報はこちらに日本語でまとめられています。
https://github.com/rakuten-nlp/rakutenma/blob/master/README-ja.md
また、簡単に形態素解析を試せるデモも用意されています。
http://rakuten-nlp.github.io/rakutenma/

形態素解析の実践

ブラウザで実行しても良いのですが、ここでは色々操作するためにnode.js上で実行します。
まずはnode.jsをインストールして下さい。
http://nodejs.org/

次にRakutenMA本体をインストールして下さい。
https://github.com/rakuten-nlp/rakutenma

インストールが完了したら、nodeのREPLを起動し、以下のコードを実行して下さい。

// RakutenMAの読み込みと諸々の初期設定
var RakutenMA = require('./rakutenma');
var fs = require('fs');
var model = JSON.parse(fs.readFileSync('model_ja.json'));
rma = new RakutenMA(model, 1024, 0.007812);
rma.featset = RakutenMA.default_featset_ja;
rma.hash_func = RakutenMA.create_hash_func(15);

// 形態素解析実行
rma.tokenize("あきつ丸改二で大発動艇もっと欲しい");
rma.tokenize("将校殿…いや、提督殿。このあきつ丸に御用でしょうか");

これを実行すると次のような結果が出力されます。
f:id:AntiBayesian:20150108074742j:plain


結果を見て分かるように、「あきつ丸」や「大発動艇」、「御用」などが意図したような単語として取り出されていません。学習を行うことによって意図通りの解析を実現しましょう。


学習の実践

学習には学習用のデータが必要です。下記のデータをコピペしてakitumaru.jsと名前を付けて保存して下さい。

[
  [
    ["あきつ丸","N-pn"],
    ["改二","N-pn"],
    ["で","P-k"],
    ["大発動艇","N-pn"],
    ["もっと","F"],
    ["欲しい","A-c"]
  ],
  [
    ["自分","N-nc"],
    ["あきつ丸","N-pn"],
    ["で","P-k"],
    ["あり","X"],
    ["ます","X"]
  ],
  [
    ["この","R"],
    ["あきつ丸","N-pn"],
    ["に","P-k"],
    ["御用","N-nc"],
    ["で","X"],
    ["しょう","X"],
    ["か","X"]
  ],
  [
    ["陸軍","N-nc"],
    ["あきつ丸","N-pn"],
    ["ここ","D"],
    ["に","P-k"],
    ["あり","V-c"]
  ]

RakutenMAの学習用のデータは

[
  [学習データ],
  [学習データ],
  [学習データ], 
  ...,
  [学習データ]
]

という構造で、各学習データは["形態素", "品詞"]という形式で与えます。品詞は下記のページの「日本語品詞リストと対応する BCCWJ の品詞名」の節を参照して下さい。
https://github.com/rakuten-nlp/rakutenma/blob/master/README-ja.md

上記の学習データが用意出来たら次のコードをnode.jsで実行して下さい。

var RakutenMA = require('./rakutenma');
var fs = require('fs');
var model = JSON.parse(fs.readFileSync('model_ja.json'));
rma = new RakutenMA(model);
rma.featset = RakutenMA.default_featset_ja;
rma.hash_func = RakutenMA.create_hash_func(15);
var rcorpus = JSON.parse(fs.readFileSync("akitumaru.js")); // 今回学習させるデータ
for (var i in rcorpus) {
    rma.train_one(rcorpus[i]);
}
fs.writeFile('akitumaru-model.json', JSON.stringify(rma.model));

これでakitumaru-model.jsonという学習済みの形態素解析用モデルが出来ました。これを利用することで意図通りの形態素解析を実現します。実際に意図通りの挙動をするか確認してみましょう。

var RakutenMA = require('./rakutenma');
var fs = require('fs');
var model = JSON.parse(fs.readFileSync('akitumaru-model.json'));
rma = new RakutenMA(model, 1024, 0.007812);
rma.featset = RakutenMA.default_featset_ja;
rma.hash_func = RakutenMA.create_hash_func(15);

rma.tokenize("あきつ丸改二で大発動艇もっと欲しい");
rma.tokenize("将校殿…いや、提督殿。このあきつ丸に御用でしょうか");

f:id:AntiBayesian:20150108074803j:plain

ということで、意図通りの形態素解析結果になりました。

終わりに

 ご覧頂いたように、RakutenMAでは形態素解析も学習もとても簡単に実行できます。特に、学習が大変簡単なのが大変素晴らしいと思います。実務で形態素解析を行う場合はモデルを解析対象の分野に適合するよう学習する必要があり、これを分野適応と言います。RakutenMAの学習器はオンライン学習という、既存のモデルを逐次で追加・補正出来る性質になっています。この特性により、日々登場する新語・未知語へ継続的に対応出来ます。今回は学習データが小規模だったので大したことは無かったのですが、実務で利用する学習データは遥かに大規模で、学習に大変時間が掛かります。バッチ学習という学習の度に1から再学習をする方式では非常に学習に掛かるコストが高く、そのために日々のモデル更新がままならないことすらあります。形態素解析の精度は学習によって大幅に変わるため、テキスト解析をする人間にとってはこの学習をいかにうまく行うかが腕の見せ所になっています。ぜひ皆さんもRakutenMAで学習にチャレンジして下さい!

お詫びとかなんか色々なアレ

 本来であればkuromoji.jsとの形態素解析部分の比較や学習データの作り方について解説したかったのですが、今回ちょっと時間が足りませんでした…。多分この記事を読んでも「で、結局どうやって学習データ作るの?」って感じになると思います、すみません…。ざっくり言うと、twitterwikipediaから取ってきたデータをMeCabに掛けて半教師有学習でちょっとずつ精度上げていき、目標水準達成したところでRakutenMA用のモデルに変換しました。今回そうした理由は、RakutenMAの学習の速度がMeCabに比べると流石に遅いのと私がMeCabに慣れていたからです。詳細はまた別の機会にご紹介できればと思います。特にkuromoji.jsはこの企画の記事を書き終わって、さぁ公開するかという直前にその存在を知り、「JavaScript製で品詞付与まで出来るのはRakutenMAしかない(断言)」などという感じの解説を書いていたので、色々大変更することになり泣きながら修正しました。kuromoji.jsはJavaScript製だとは信じられない速度と軽さを実現しており、正直度胆を抜かれました。このデモを見ればその驚きを分かち合えるのではないかと思われます。
kuromoji.js demo
 kuromoji.jsを開発なさった @takuya_a 様には今後是非ともkuromoji.jsの学習器も作って欲しいなと思いました、いや、きっと作って下さると私は信じています。
 私は普段python/MeCabclojure/kuromoji(JavaScript版ではなくJava版)を使っているのですが、今回様々な形態素解析器を試した結果、各々かなり挙動が違うことを体感出来て楽しかったです。特にRakutenMAの学習部分の挙動はMeCabと全然違っていたので新鮮でした。MeCabに慣れている方はちょっと試して見て下さい。
 最後になりましたが、はてなの皆さん、PC工房の皆さん、楽天研究所NYの@mhagiwaraさんには大変お世話になりました。ありがとうございました。



2015/01/10 追記
エディタ判定器で結構遊んで頂けたようで嬉しい限りです!
皆さんも下記URLから試してみて下さい!
エディタ判定器 :パソコン工房











統計屋のためのAWK入門

はじめに

本稿はAWKという言語を用いて、
ごく簡単にデータ分析用の前処理*1をするための解説記事です。

AWKは短いコマンドを記述するだけで多様なデータ処理を可能にします。
特にデータの抽出に関して恐るべき簡易さを提供します。
具体的には、input.txtというファイルの中から
"fail"という文字列を含む行を抽出したければ次のように書くだけです。

awk /fail/ input.txt

つまり、スラッシュ記号で文字列を指定するだけで
その文字列を含む行を抽出できるのです。
大変簡単ですね!
また、awkLinuxMacには標準で入っており、
Windowsでもawk.exeを一つ用意するだけなので、
面倒なインストール作業や環境構築は不要で誰でも即座に使えるため、
自分で書いた処理を他人に渡したり*2各サーバに仕込むなども簡単に出来ます。

複雑な処理をする場合はPythonRubyなどの言語を用いた方が良いと思いますが、
簡易な処理をするケースではAWKの手っ取り早さが大変便利です。
Excelではちょっと厳しい数百万行以上のデータでも
サクサク処理してくれるのが魅力です。

本稿の対象者はプログラミング未経験~初心者、対象環境はwindows7以降です。
AWKはほんの少し勉強するだけで
プログラミング未経験な文系統計屋でも簡単に使えるようになります。
このドキュメントも15分あれば読めると思います。チャレンジしてみましょう!

なお、本稿ではAWKの言語仕様や文法などについては触れていません。
悪しからず。

下準備

AWKをインストールする

Linux, macであれば標準で入っています。
Windowsの場合は、下記から(2014/09/15時点での)最新版のgawk-4.1.0をダウンロードし、
パスの通ってるフォルダにgawk.exeを置きます。
私はC:\Windows\System32に置いています。
Downloads - gnu-on-windows - GNU tools for win32 - Google Project Hosting
ついにで、exe名をgawk.exeからawk.exeに変えておきます*3
コマンドプロンプトawkと打ち込み、
次のようなヘルプが表示されたらインストール作業終了です。
f:id:AntiBayesian:20140915160301j:plain

サンプルデータ

以下動作確認用のサンプルデータとして
treesというデータセットを一部加工したものを用います。
コピペしてtrees.txtと名前を付けて保存して下さい。
私はc:\直下にawkフォルダを作り、c:\awk\trees.txtとしました。

Girth Volume
8.3 10.3
8.3 10.3
8.8 10.2
10.5 16.4
10.7 18.8
10.8 19.7
11 15.6
11 18.2
11.1 22.6
11.2 19.9
11.3 24.2
11.4 21
11.4 21.4
11.7 21.3
12 19.1
12.9 22.2
12.9 33.8
13.3 27.4
13.7 25.7
13.8 24.9
14 34.5
14.2 31.7
14.5 36.3
16 38.3
16.3 42.6


17.3 55.4
17.5 55.7
17.9 58.3
18
18 51
20.6 77

これで下準備完了です。
ではAWKによる前処理を学びましょう。

AWKによるデータ抽出

指定条件を満たす行を抽出する基本
awk /10/ trees.txt
>8.3     10.3
>8.3     10.3
>8.8     10.2
>10.5    16.4
>10.7    18.8
>10.8    19.7

これで"10"を含む各行を抽出できます。
複数条件で抽出したい場合は以下のように&&や||で条件を連結します。
条件を連結する場合はどこからどこまでが条件なのかを明示するために
""で囲みます*4

# && 両方の条件を満たす行だけを抽出
awk "/10/ && /16/" trees.txt
>10.5    16.4
# || 片方どちらかでも条件を満たした行を抽出
awk "/10/ || /16/" trees.txt
>8.3     10.3
>8.3     10.3
>8.8     10.2
>10.5    16.4
>10.7    18.8
>10.8    19.7
>16      38.3
>16.3    42.6

今までの抽出法では各行の全ての列を対象としていました。
n列目だけを対象にしたければ"$n"と指定します
($0にはその行の全ての列が格納されています)。

awk $1~/10/ trees.txt
>10.5    16.4
>10.7    18.8
>10.8    19.7
# && 両方の条件を満たす行だけを抽出
awk "$1~/10/ && $2~/18/" trees.txt
>10.7    18.8
# || 片方どちらかでも条件を満たした行を抽出
awk "$1~/10/ || $2~/18/" trees.txt
>10.5    16.4
>10.7    18.8
>10.8    19.7
>11      18.2

逆に指定した文字列を含まない行のみを抽出する場合は条件の前に!を付けます。

awk !/10/ trees.txt
>Girth   Volume
>11      15.6
>11      18.2
>11.1    22.6
> ... #長いため省略

抽出条件の指定は文字列の一致だけではありません。
数値の範囲指定なども可能です。

awk "$1<10" trees.txt
>8.3     10.3
>8.3     10.3
>8.8     10.2

面白い範囲指定として/start/, /end/という方法があります。
これは/start/条件に一致する行から/end/までの範囲を抽出するというものです。

awk /12/,/14/ trees.txt
>12      19.1
>12.9    22.2
>12.9    33.8
>13.3    27.4
>13.7    25.7
>13.8    24.9
>14      34.5

更に、正規表現と言う複雑な条件指定も可能です。
但し本稿の範囲を超えるため取り扱いません。

次は、このデータ抽出を更に強化するための便利な機能を紹介します。

組込変数を用いたデータ抽出

AWKには様々な組込変数(AWKが事前に用意してくれた便利な変数)があります。
その中でも特に頻繁に用いるモノを紹介します。

# 組込変数
NR #現在読み込んでいる行数
NF #現在読み込んでいる行の列数
-F #ファイルセパレータ指定。デフォルトは半角スペースかタブ。,を指定することでCSVファイルに対応
length #現在読み込んでいる行の文字数

これらをこれまで学んだ抽出条件指定に活用することが出来ます。

# CSVファイルを読む
# -Fオプションを用いてセパレータを,(カンマ)に変更する事で
# CSVファイルのN列目を指定出来る
awk -F , $1~/10/ trees.txt
# 3行目以下を取り出す
awk "NR<=3" trees.txt
>Girth   Volume
>8.3     10.3
>8.3     10.3
# 列数が2未満の行を取り出す
# これを用いれば、「N列ある筈のデータからN列未満しかデータが入っていない行、
# つまり欠損値を含む行が何行目にありどのようなデータかを洗い出す」
# という処理が可能になります。
awk "NF<2 {print NR, $0}" trees.txt
>27
>28
>32 18
# lengthが0より上、つまり空行以外を抽出します。
awk "length>0" trees.txt
>Girth   Volume
>8.3     10.3
>8.3     10.3
> ... 省略

重複行を除外することも可能です。
これはちょっと難しいのでこんなことも出来るんだなー程度に眺めて下さい。

awk "before != $0 {print; before = $0}" trees.txt
>Girth   Volume
>8.3     10.3 # 重複行が消えている
>8.8     10.2
>10.5    16.4

ファイルの行数を出します。

# ENDはファイルを読み終わった後に実行される処理を指定する方法です。
# 他に、BEGINというファイルを読み込む前に実行される処理を指定する方法もあります。
awk "END{print NR}" trees.txt
> 36


欠損値を含んだ行や空行、重複行の抽出や削除の方法を学びました。
現時点でも色々便利なデータ抽出が出来るようになりましたね。
これに加え、さらにデータを加工する手法を学び、
前処理をより簡単にしましょう。

AWKによるデータ加工

AWKは awk /条件/ 入力データ
とするだけで条件に沿ったデータを出力出来ます。
但しこれだけでは条件に合致した行がそのまま出力されるだけです。
printを使ってデータを簡単に加工・整形することが出来ます。

# 1列目だけを出力します
awk "{print $1}" trees.txt
>Girth
>8.3
>8.3
>8.8
> ... 省略

# 1列目と2列目を入れ替えて表示します。
awk "{print $2,$1}" trees.txt
>Volume Girth
>10.3 8.3
>10.3 8.3
>10.2 8.8
> ... 省略

# 1列目と2列目で計算した結果を出力します。
# 掛け算は*, 割算は/で表現します。
awk "{print $0,$1*$2}" trees.txt
# 1行目は文字列同士なので掛け算の結果は0になります。
# 数値以外で計算すると0となることがわかります。
>Girth   Volume 0
>8.3     10.3 85.49
>8.3     10.3 85.49
>8.8     10.2 89.76
> ... 省略

# 消費税を掛けるなどの計算も可能です
awk "{print $1*1.08}" trees.txt
>0
>8.964
>8.964
>9.504
> ... 省略

# 各行に行数を付与する
awk "{print NR, $0}" trees.txt
>1 Girth Volume
>2 8.3   10.3
>3 8.6   10.3
>4 8.8   10.2

# 組込変数を用いてデータを加工する。
# 今回は各行の先頭にファイル名を付与します。
# よくあるケースとして、ファイル名に日付は入っているが
# データの中身に日付が入っておらず、
# 後でマージしようとして困る時があります。そういう時に便利です。
awk "{print FILENAME, $0}" trees.txt
>trees.txt Girth Volume
>trees.txt 8.3   10.3
>trees.txt 8.3   10.3
>trees.txt 8.8   10.2

# 組込関数を用いたデータ加工。
# gsubという関数を用いて文字列の置換が可能です。
# gsubで置換する場合は
# gsub(置換対象の文字列,置換後の文字列,置換対象の列)
# と指定します。
# ここでは$0(行全体)の8をxxxという文字列に置換し、
# その後変換済みのデータを表示しています。
# 複数の処理を行う場合は;で繋ぎます。
# この文字列の置換は指定が複雑ですが、
# 強力かつ本当に良く使うため是非覚えて下さい。
awk "{gsub(8,\"xxx\",$0);print $0}" trees.txt
>Girth   Volume
>xxx.3   10.3
>xxx.3   10.3
>xxx.xxx 10.2

AWKでデータを整形・加工する方法を学びました。
ここまでの内容を組み合わせるだけで
本当に多様な前処理が可能になります。
皆さんの前処理ライフが幸あるものになりますよう!






落穂広い

AWKのあんまりドキュメントに載って無さそうなことをつらつらと。

#標準入力を用いる
awk "{print $2}" -
#とすると、標準入力に打ち込んだ2列目だけ表示されます。
# 組込変数いろいろ
# ARGC:コマンドライン引数の数
" ARGV:コマンドライン引数の配列
awk "BEGIN{print ARGV[3]}" p 100 200 300
>200

# FNRとNRの違い。複数ファイルを入力としたときに挙動が異なる
# FNR:読み込んでる現ファイルのみの現在行
# NR:読み込んだ全てのファイルの現在行

# ファイル入出力のあれこれ
# FS:入力区切り文字(デフォ=半角スペースかタブ)
# OFS:出力区切り文字(デフォ=半角スペース)
# RS:入力行区切り(デフォ:復帰改行=\n)
# ORS:出力行区切り(デフォ:復帰改行=\n)
# 配列
a[i] = x
a[i, j] = x
# で多次元配列定義可能。
awk "BEGIN{a[0,1,2,3,4,5,6,7,8,9]=100}{print a[0,1,2,3,4,5,6,7,8,9]}" p
# と何次元でもOK
delete a[0]
# で配列の中身を消せる

AWKでなんか色々統計処理をやってみた

AWKと言えば1ライナー。
1ライナーで統計処理やりたいなーと思ってたので書いてみた。

# ランダムサンプリング
awk "BEGIN{srand()} {line[NR] = $0} END{for(;i<100;i++){print line[1+int(rand()*NR)]}}" p
# シャッフル
awk "BEGIN{srand()} {line[NR] = $0} END{for(;i<1000;i++){r=1+int(rand()*NR);s=1+int(rand()*NR);tmp=line[r];line[r]=line[s];line[s]=tmp};for(t in line)print line[t]}" p
# シャッフルを用いた重複なしランダムサンプリング
awk "BEGIN{srand()} {line[NR] = $0} END{for(;i<1000;i++){r=1+int(rand()*NR);s=1+int(rand()*NR);tmp=line[r];line[r]=line[s];line[s]=tmp};for(t in line)print line[t]}" p | awk "NR <= 5"
# max, min
awk "NR==1{min=$1;max=$1}{if(max<$1)max=$1;if(min>$1)min=$1}END{print max,min}" p
# 算術平均、中央値(偶数考慮無し)、最頻値
awk "{avg+=$1;median[NR]=$1;mode[$1]++}END{asort(mode, keys);asort(median);max=keys[length(keys)];print \"mean\",avg/NR;print \"median\",median[int(NR/2)];for(i in mode){if(max==mode[i])print \"mode\",i}}" p
# 五数要約(箱ひげ図用)
awk "NR==1{min=$1;max=$1}{if(max<$1)max=$1;if(min>$1)min=$1;percentile[NR]=$1}END{asort(percentile);print max,percentile[int(NR*0.75)],percentile[int(NR*0.5)],percentile[int(NR*0.25)],min}" p
# 偏差平方和
awk "{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print s}" p
# 分散
awk "{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print s/(NR-1)}" p
# 偏差積和
awk "{dx[NR]=$1;dy[NR]=$2;avg_x+=$1;avg_y+=$2}END{ax=avg_x/NR;ay=avg_y/NR;for(i=1;i<=NR;i++){s+=(dx[i]-ax)*(dy[i]-ay)};print s}" p
# 共分散
awk "{dx[NR]=$1;dy[NR]=$2;avg_x+=$1;avg_y+=$2}END{ax=avg_x/NR;ay=avg_y/NR;for(i=1;i<=NR;i++){s+=(dx[i]-ax)*(dy[i]-ay)};print s/(NR-1)}" p
# 標準偏差
awk "{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print sqrt(s/(NR-1))}" p
# ピアソンの積率相関係数
awk "{dx[NR]=$1;dy[NR]=$2;avg_x+=$1;avg_y+=$2}END{ax=avg_x/NR;ay=avg_y/NR;for(i=1;i<=NR;i++){s+=(dx[i]-ax)*(dy[i]-ay);sx+=(dx[i]-ax)^2;sy+=(dy[i]-ay)^2};print s/(NR-1)/sqrt((sx/(NR-1))*(sy/(NR-1)))}" p
# 度数分布。binを適当に調整してね
awk "BEGIN{bin=1.0}{f[int($1/bin)]++}END{for(i in f)print i*bin,f[i]}" p
# 単回帰
awk "{dx[NR]=$1;dy[NR]=$2;avg_x+=$1;avg_y+=$2}END{ax=avg_x/NR;ay=avg_y/NR;for(i=1;i<=NR;i++){s+=(dx[i]-ax)*(dy[i]-ay);sx+=(dx[i]-ax)^2;sy+=(dy[i]-ay)^2};print \"回帰係数\",s/sx,\"切片\",ay-s/sx*ax,\"決定係数\",(s/(NR-1)/sqrt((sx/(NR-1))*(sy/(NR-1))))^2}" p
# ワードカウント
awk "{for(i=NF;i;i--)a[$i]++}END{for(w in a)print w,a[w]}" p

感想。
統計処理1ライナーで書くなアホか見辛い。

参考文献

AWKの古典的なテキストです。
AWKの詳細な文法だけではなく、
ランダムな文章を生成したり、ワードカウントやKWIC検索など
テキストマイニング的な処理を実装したり、
何とインタプリタを実装したりします!
流石に内容古いですが、今読んでも面白い記述が沢山あります。

プログラミング言語AWK

プログラミング言語AWK

  • 作者: A.V.エイホ,P.J.ワインバーガー,B.W.カーニハン,足立高徳
  • 出版社/メーカー: USP研究所
  • 発売日: 2010/01/01
  • メディア: 単行本(ソフトカバー)
  • クリック: 1回
  • この商品を含むブログを見る
AWKについてまとまったページ数割いた解説記事があります。
安くて入手しやすくて分かり易いの3拍子揃っています。
AWKで3Dグラフィックを描画するとか凄まじい内容もあります。日本語で読めるAWKまとめサイトです。
有益な情報が沢山掲載されているので、
基本的な使い方を理解してAWKの深淵を覗きたくなったら
隅々まで読んで感嘆しましょう。
AWK Users JP :: 日本の AWK ユーザのためのハブサイト
sed & awkプログラミング 改訂版 (A nutshell handbook)

sed & awkプログラミング 改訂版 (A nutshell handbook)

アルゴリズムのはなし
AWKの覚書き -
https://www.gnu.org/software/gawk/manual/gawk.pdf
AWK Users JP :: ある平均値の正規分布のサンプル
AWK Users JP :: 重みを付けて乱択する
AWK Users JP :: 簡易ダウンローダー
AWK Users JP :: 中置記法から S 式への変換
AWK Users JP :: awk でアスキーアート画像を生成する

*1:データ抽出、加工

*2:他人にexeとスクリプトぽいっと渡すだけで実行して貰えるようになるの、かなり重要なことです。Windows環境ですと、エンジニアでもないとRubyPythonなどの処理系がインストールされてないため、手元で便利なスクリプトを作っても他人に利用して貰いにくい場合があります。Webツール化する程のものでもない使い捨ての処理する場合特に有益です

*3:この改名は別にする必要は全く無いのですが、単にタイプ数減らしたいので私はそうしてます

*4:実はawkにも色々あって(今回使ってるgawk以外にnawkなど)、"ではなく'で囲むケースもあります

ブラウザ上でデータ分析が出来る!Clojure/Gorilla入門

f:id:AntiBayesian:20140907214031j:plain
f:id:AntiBayesian:20140907201052j:plain

概要

この記事は、Gorillaという
ブラウザ上でClojureという言語を利用出来るライブラリを利用し、
ブラウザ上でデータ分析環境を構築するための入門記事です。
Clojureの事前知識は一切不要で、
ClojureやGorillaのインストールから、ブラウザ上で各種手法を
コピペだけで実践出来るになるまでを説明しています。
なお、各種分析手法の詳細には言及しておりません。

とにかくGorillaを動かす

「説明は良いから、とにかく動かしたい」
という方向けに要点だけ説明します。

leiningenをインストールし、作業フォルダにてlein new gorillaでプロジェクトを作り、
生成されたgoraillaフォルダ直下にあるproject.cljに下記をコピペし保存、
lein gorillaと打ち込み、少し待つと
Running at http://localhost:XXXXX/worksheet.html
と表示されるので、そのURLを叩くとこんな感じのページが表示されます。
以上。

(defproject gorilla-test "0.1.0-SNAPSHOT"
  :description "A test project for Gorilla REPL."
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [incanter "1.5.5"]
                 [incanter-gorilla "0.1.0"]
                 [cc.artifice/clj-ml "0.6.0-SNAPSHOT"]
                 [org.atilika.kuromoji/kuromoji "0.7.7"]]
  :main ^:skip-aot gorilla-test.core
  :target-path "target/%s"
  :repositories [["Atilika Open Source repository" "http://www.atilika.org/nexus/content/repositories/atilika"]]
  :plugins [[lein-gorilla "0.3.3"]]
  :profiles {:uberjar {:aot :all}})

Clojure/Gorillaとは

Clojureとは、JVM上で動くプログラミング言語の一種です。
Clojureには統計解析ライブラリIncanter機械学習ライブラリclj-mlなど、
継続して開発されているデータ分析用のライブラリが用意されています。
また、同じくJVM上で動くHadoopやHBaseなどのシステムとも親和性が高く、
それらを利用して大規模なデータ分析を行うのに適しています。
しかし、Clojureをいつでもどこでも誰にでも利用して貰うためには、
各端末にJDKのインストールやパスを通すなどの環境構築が必要であり、
各種ライブラリの更新の度全端末にそれを適用し続けるのは
ハードルが高いと言わざるを得ません。
また、データを個々の端末に移動するのも非常にコストがかかります。
勿論これはClojureに限った話ではなく
他の処理系においても同じ問題ではありますが。
そこで、ブラウザ上で誰でもアクセス出来て、
直ちにデータ分析を行えるようなシステムを簡単に構築出来れば
上記のハードルをクリアできます。
つまり、誰でも色んな端末(スマホタブレットでも!)アクセス出来て、
最新のバージョンを利用したければサーバ側で更新を掛ければ済み、
データはサーバ上に置いたままなので一々解析するのに
全データをローカルに落とす必要も無く、
解析用の処理を送り結果を受け取るだけでよくなります。
そのような要望によって生み出されたのがGorillaです。
下記のGollira本家サイト、また、
GorillaにIncanterを組み込んだincanter-gorillaのサイトを
ご覧頂ければどのようなものかがご理解頂けると思います。
Gollira本家
incanter-gorilla
同様のプロジェクトはPythonやRにも存在しています。
特にIPython notebookはかなりの出来栄えですので、
特にJVM環境以外でも問題無く、
かつPythonに慣れ親しんでいる方は
そちらを利用するのも良いと思われます。

Clojureのインストール

主にWindows7向けのインストール方法について説明します。

まず最新のJavaSDK(Javaの開発環境)を入れる必要があります。
下記からご自分の端末に合わせたモノをインストールしてください。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

次に、下記のページを参考にPath, JAVA_HOMEを設定します(windows向け)。
http://www.javadrive.jp/install/jdk/index4.html

次に、Clojureの開発ツールであるleiningenをインストールします。
公式サイトからlein.batをダウンロードして下さい。
http://leiningen.org/
(あるいはこれを利用)

最後に、パスの通っている作業フォルダ(例:c:\lein)にlein.batを移動して、
コマンドプロンプトから
lein self-install
を実行。
あとはインストール処理が自動で行われますので、終了するまで待ちます。
終了したら
lein -version
と打ち込み、2014/09/07時点では
Leiningen 2.4.3
と表示されればインストール作業終了です。

Gorillaを起動してみる

作業フォルダにて、コマンドプロンプト
lein new <プロジェクト名>
と打ち込むと新規プロジェクトを作成出来ます。
新規プロジェクトには最低限必要なファイルや設定が自動で生成されています。
ここでは
lein new gorilla
と打ち込んでみましょう。
するとgorillaというフォルダ名の直下に
project.cljというファイルが生成されています。
これはこのプロジェクトの設定ファイルです。
設定を変更する場合はこのファイルを編集します。
ここでは下記のように編集して下さい。

(defproject gorilla-test "0.1.0-SNAPSHOT"
  :description "A test project for Gorilla REPL."
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [incanter "1.5.5"]
                 [incanter-gorilla "0.1.0"]
                 [cc.artifice/clj-ml "0.6.0-SNAPSHOT"]
                 [org.atilika.kuromoji/kuromoji "0.7.7"]]
  :main ^:skip-aot gorilla-test.core
  :target-path "target/%s"
  :repositories [["Atilika Open Source repository" "http://www.atilika.org/nexus/content/repositories/atilika"]]
  :plugins [[lein-gorilla "0.3.3"]]
  :profiles {:uberjar {:aot :all}})

ここで重要なのはdependenciesとpluginsです。
dependenciesに利用するライブラリを記載します。
ここに記載されたライブラリをleiningenが
依存関係などを自動解決してインストールしてくれます。
ここではincanterとincanter-gorilla、clj-ml、そしてkuromoji*1
という形態素解析器を指定しています。
形態素解析器についてはこちらをご覧ください。
pluginsにlein-gorillaを記載し、gorillaを使えるようにしています。*2

これらが全部終わったら
lein gorilla
コマンドプロンプトに打ち込むと
Running at http://localhost:xxxxx/worksheet.html
とURLが表示されるので、そのアドレスをブラウザで見ると
Clojure実行環境が表示されます。
f:id:AntiBayesian:20140907202323j:plain

なお、アドレスのxxxxxの部分はランダムで決まりますが、ipやportを指定したい場合は
lein gorilla :ip xxxxx :port yyyyy
とします。詳細なオプションは下記に記載されています。
http://gorilla-repl.org/configuration.html

動作するか確かめてみましょう。
f:id:AntiBayesian:20140907202437j:plain
表示された画面の灰色のブロックに
(+ 1 2 3)
と打ち込み、ShiftとEnterキーを同時押しすると処理が実行されます。
実行結果が6になったら成功!
これにてGorillaの設定作業は終わりです!お疲れ様でした!

Gorillaで統計量を求めてみる

(use '(incanter core stats charts datasets)) ;統計解析ライブラリIncanterを使う指定
(def iris (get-dataset :iris)) ;サンプルデータセットの中からirisを選択し、その内容をirisに束縛
iris ;irisの中身を見てみる。
; :column-names から[:Sepal.Length :Sepal.Width :Petal.Length :Petal.Width :Species]
; という列があることが分かる。
; irisとはあやめのデータで、sepalはがく、petalは花びら、speciesはあやめの種類である
(mean ($ :Petal.Length iris)) ;花びらの長さの平均値を求める
(sd ($ :Petal.Length iris)) ;花びらの長さの標準偏差を求める

f:id:AntiBayesian:20140907202646j:plain

Gorilla上で可視化してみる

(use '(incanter core stats charts datasets))
(use 'incanter-gorilla.render) ;Incanterで可視化したモノをGorilla上で表示するライブラリを指定

(def iris (get-dataset :iris))
(chart-view (histogram :Petal.Width :data iris)) ;chart-view関数でヒストグラムをGorilla上に表示
(view (histogram :Petal.Width :data iris)) ;view関数でヒストグラムをGUIで表示

f:id:AntiBayesian:20140907202748j:plain
こちらに掲載した可視化のviewの部分を
chart-viewに置き換えれば、全てブラウザ上で実行可能です

Gorilla上で機械学習してみる

(use 'clj-ml.classifiers 'clj-ml.utils 'clj-ml.io 'clj-ml.data)
; weka特有のデータ形式arffを利用します。
(def iris  (-> (load-instances :arff "http://repository.seasr.org/Datasets/UCI/arff/iris.arff") (dataset-set-class :class)))
; サーバ上にあるCSV形式を読み込む場合は次のようにします。
; (def iris  (-> (load-instances :csv "iris.csv") (dataset-set-class :class)))
; 決定木(c4.5)を作ってみる
(def decision-tree (-> (make-classifier :decision-tree :c45) (classifier-train iris)))
; 作成した決定木の中身を見てみます
decision-tree
;クロスバリデーションに掛けてみます
(def decision-tree-evaluation (classifier-evaluate decision-tree :cross-validation iris 10))
;クロスバリデーションの結果を確認します
(println (:summary decision-tree-evaluation))
(println (:confusion-matrix decision-tree-evaluation))

f:id:AntiBayesian:20140907203011j:plain
f:id:AntiBayesian:20140907203017j:plain
こちらに掲載した機械学習手法も
全てブラウザ上で実行可能です。RandomForestやK-meansなどもお試しください。
但し、ファイルを読み込む際、サーバ上でGorillaを立ち上げている場合はファイルパスにご注意ください。
ローカルファイル指定は自分の端末ではなくサーバ上で探索します。

Gorilla上で形態素解析してみる

(import [org.atilika.kuromoji Token Tokenizer])
(def tokenizer (.build (Tokenizer/builder)))
(defn ma [sentence] 
  (doseq [^Token token (.tokenize tokenizer sentence)] 
      (println (str (.getSurfaceForm token) "\t" (.getAllFeatures token))))) 
(ma "あきつ丸改二で大発動艇欲しい")
; (ma "あきつ丸改二で大発動艇欲しい")
; の形態素解析結果が望みの結果になってないので
; 形態素解析用の辞書を整備する必要がある

; 以下の内容を記載したファイルを用意し、適当なファイル名を付ける
; ここでは一旦userdict.txtと名付ける。
; -- ファイル内容ここから -- 
; 大発動艇,大発動艇,ダイハツドウテイ,固有名詞
; あきつ丸改二,あきつ丸 改二,アキツマル カイニ,カスタム名詞
; -- ファイル内容ここまで -- 
; 1列目:表層, 
; 2列目:1列目をどう区切るか。区切りたい位置に半角スペースを入れる
; 3列目:読み(カタカナ)
; 4列目:品詞情報
; ※windowsの場合はファイルのエンコードをSJISにする必要有り
; ファイルをc:\\lein\\gorilla\\userdict.txtに置いたとした場合、
; 以下のようにすると望みの結果が得られる。

(def dic "c:\\lein\\gorilla\\userdict.txt")
(def tokenizer (.build (.userDictionary (Tokenizer/builder) dic)))
(defn ma [sentence] 
  (doseq [^Token token (.tokenize tokenizer sentence)] 
      (println (str (.getSurfaceForm token) "\t" (.getAllFeatures token))))) 
(ma "あきつ丸改二で大発動艇欲しい")

f:id:AntiBayesian:20140907203143j:plain
f:id:AntiBayesian:20140907204502j:plain
形態素解析の結果を用いてワードカウントなどをする場合は
こちらをご覧ください。
ここで紹介している内容もブラウザ上で実行可能です。

終わりに

ブラウザ上で様々な分析が出来る便利な時代になってきました。
外出先の貧弱な端末や回線からでも、インタラクティブなデータ分析が可能になり、
例えばMTGの最中に「あのデータってどうなってるんだっけ?」
って話題に上がったその場ですぐ集計・可視化して確認出来るなど夢が広がりまくりです。

実務上データ分析しててかなり面倒だと思うのがデータサイズです。
数十GB単位になるとファイルの移動だけで面倒なことになりますし、
ローカルに持ってくるとそれだけでSSD空き容量死ぬケースがあります。

あと分析ツールの更新管理は多分皆さんが想像するのの27倍ダルいです。
一つのユースケースとして想像して欲しいのですが、
分析チームに30人くらい人がいて、
そのうちの半分がコンサルやマーケター的な方、
残り半分がエンジニアだったとしましょう。
大体前半の方々は「更新したのでアップデートしてくださーい」
とアナウンスしても、面倒なので無視します。
だって現状で使えてるもん。慣れてるのが一番だよね!
大体後半の方々は「更新したのでアップデートしてくださーい」
とアナウンスすると、既に自力拡張してるので、
それが動かなくなると嫌だから無視します。
こういう時システム提供側が取り得る選択肢は
更新しない同僚をハンマーで一人ずつ殴って回るか
あるいはブラウザで実行できるようにするかです。
非常に僅差ですが二個めの方がまだ若干マシかなと思わなくもないです。

ブラウザ上での分析環境構築は、
同時接続数とか認証周りとかにまだまだ機能不足や問題があります。
これはClojure/Gorillaだけではなく、
RのShinyやPythonのIPython notebookでも同じ問題は生じています。*3
とはいえ、ブラウザ上で分析可能なメリットは結構大きい上に、
Clojure/GorillaはJVM環境で簡単に構築できるツールなので
是非チャレンジしていきたい+皆さんもチャレンジして欲しいなと思います。
f:id:AntiBayesian:20140907214043p:plain
それでは皆様、よきGorillaライフを!!

素敵なLispエイリアンイラストをマルタコEX@marutakoEX様からお借りしました!
マルタコEX様、利用のご快諾、誠に有難うございます!!!

*1:ちなみにここで指定しているのは最新版ではありません。これは単に私が今まで利用してて動作が理解出来てるというので、今回も惰性で指定しているだけです。Lucene Kuromojiの最新版を使う方が良いです

*2:私は「何でこれがdependenciesで何でこれがpluginsなの?」っていうのがいまいちわかってないんですが、その切り分けをご存知の方いらっしゃったら教えてください…。まぁとりあえず公式サイトの指示に従って設定すれば動きます

*3:IPython notebookは一応パスワード設定出来ますが、ここでいう認証は「Aさんはこのデータとこのデータにアクセス出来て、Bさんはさらにあのデータにもアクセス出来て、あ、Cさんは異動したからこのデータへのアクセス禁止して」とかやりたいって意味です。まぁ他で認証機能別途付けろと言われたらそりゃそうなんですが

新宿高島屋のピンボールワンダーランド行ったらクッソ楽しかったので皆さんも行かねばならぬ

新宿高島屋で80~90年代のピンボールを遊びまくれるイベントが
5/6の18時まで開催しています。
詳細は下記
ゴールデンウイークフェスティバル☆ピンボール ワンダーランド!のイベント情報|ウォーカープラス
f:id:AntiBayesian:20140505235240j:plain


5/5に行ってみたらクッソ楽しくてゲラゲラ笑いまくってたので、
皆さんにその楽しさをお伝えして、一人でも多くイベント行って
ピンボール楽しい!!!!」って思って頂きたい!!
もう、本当に楽しかった!!!

お薦めポイントは以下。

  1. ピンボール全盛期の80~90年代の台が遊びまくれる、その数18台!!
  2. 2プレイ100円と安い。しかもプレイする度高島屋のどの店でも「複数枚」利用できる100円割引チケットが付くので実質無料で遊べる
  3. プレイ用のメダルは受付で2枚(=2プレイ)100円で販売されてて一度に何枚も買うことは出来ない。結果購入の度受付行くの面倒だが、そのお陰で厄介な台専有が発生しなくて快適。また、煙草の煙がまとわりつくバーやゲーセンではなく高島屋の敷地で安全に遊べる

つまりは実質無料でエキセントリックな台が快適に遊べるんだよ!
行くしかない!

f:id:AntiBayesian:20140505235352j:plain
さーて、今日行って面白かった台を紹介しよう!!
f:id:AntiBayesian:20140505235652j:plain
何と言っても一番のお薦め台は
1986年に発売されたこの「HIGH SPEED」である。
80年代ピンボール全盛の時代はコイツによって
切り開かれたと言っても過言ではない*1
そもそもピンボールは60~70年代爆発的に流行したものの、
80年代初頭ビデオゲームが流行して一気に下火になった。
そのままピンボールは消えていくのだろうか…
と思われた最中、若者を再びピンボールの熱狂に叩き込んだのがコイツだ!
その特徴は大きく言うと次の二つだろう。
ジャックポット」と「ハイスコア」である。
ジャックポットは今のゲーム風に言うと、
「コンボを決めると大量得点が発生」する仕組みだ。
ボールをどこかのオブジェクトにぶつけて点を稼ぎスコアを積上げていく
というのがピンボールの基本ではあるが、
そこに「この台は警察から逃げ切るギャングの物語だ。
逃げ切るためにはまず○○をして、
次に△△をクリアし…」
というストーリー性を持たせた条件を設定し、
その条件をクリアすると凄まじい高得点が発生する。
これがピンボールをフリッパー*2の操作で
線形に得点を積上げる集中力途切れさせない我慢比べのような単調さから脱却させ、
その後続く様々なストーリーとそれに因んだギミックを満載させるようになった要因だ。
そしてもう一つの熱狂の要因であるハイスコア機能は、
最高得点を取った人がイニシャルを登録できる仕組みだ。
これのお陰でピンボールは一人遊びから明確に他人とのスコアを競い合う性質を強め、
「俺こそがこの台のチャンプになる!」と若者達の熱狂を駆り立てたのだった*3
その他、立体的に交差するレーン、ど派手な演出と効果音、
細かく散りばめられたギミックの数々、
そして「ぶっちゃけ難易度はそれ程でもないのに」気持ち良く決まる大技達。
やってみればわかるけど、台上部の高得点を得られる複雑な軌道を描くレーン、
実は割と簡単にホールド*4
→ホールド解除
→フリッパーの先端にボールが来た瞬間思いっきりフリップ*5
するだけで結構放り込めるのだ。
しかし扇情的なアクションと一見複雑なレーン構成のため、
端で見てる分には、そして自分自身としてもめっちゃ凄いことしてる気になる!
難しいコンボ達成すれば大量得点を得られるというやり甲斐、
ストーリー性、他人とのスコアバトル。
熱狂するなと言う方が無理だ。
とにかくコイツは面白い。
後継機のTOMCATも素晴しい台だが、私の中ではダントツでコイツが好きだ。
これ以上「俺SUGEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!」感漂わせる台無いと思う。
これがTOMCAT、普通に良い。
多分こっちの方がルールわかりやすいのでまずこれからやるのが良いかな?
f:id:AntiBayesian:20140506010408j:plain
あとこのXENON、マジ絵が気色悪くて良い。
子供が嫌そうな顔で見てた。
f:id:AntiBayesian:20140506010730j:plain

そしてFLASH
これはプランジャー*6がちょいと特殊で、
大抵はプランジャーから発射されたボールって台上部を這うように進むっていう
ゲームスタートを切ることが多いんだけど、
これは初手から台を斜めに走るようプランジャーレーンが設置されている。
f:id:AntiBayesian:20140506015431j:plain
そして右上のフリッパーが*7絶妙な位置に付いてて、
上手いことやるとプランジャー
→右上フリッパーで叩き上げる
→左上の高得点レーンを回る
→右上フリッパーにボールが戻ってくる
→右上フリッパーで叩上げる…
の無限ループが発生する。
何回ループできるか挑戦してみよう、私は結構上手いこといって楽しかった。


さぁ、80年代のてんこ盛り台もいいけど、70年代のレトロな台も遊ぼう*8
まずはレトロ台の風情を楽しんで欲しい。
f:id:AntiBayesian:20140506012411j:plain
f:id:AntiBayesian:20140506012428j:plain
f:id:AntiBayesian:20140506012551j:plain
f:id:AntiBayesian:20140506012609j:plain
レトロ台はあまりギミックも凝ってないし演出も特に無い、
落ち着いてプレイすればよい。
…が、コイツにはかなり「ムキー!!!」となりながらプレイした。
f:id:AntiBayesian:20140506012746j:plain
おわかり頂けるだろうか、このフリッパーの短さ、
そしてフリッパー同士のだだっ広い間隔…。
「こんなんまともにプレイできるか!!」
って感じなんだけど、よく見るとフリッパーの付け根になんか穴が空いてる。
そして台の中央部のホールを見て貰うと「CLOSE FLIPPERS」の文字。
そう、この台は中央ホールにボールを放り込むと
フリッパーが中央に移動して、今度は逆に
ほぼボールが落ちないような間隔になるのだ。
但し、この中央ホールに上手いこと入れるにはそれなりの精度が必要で、
上手い人ならポンポン弾きながら狙えるのかもしれないが、
私のような下手くそでは一旦ホールドしてからでないと辛い…。
んだけど、このあまりに短いフリッパーではホールドもかなり辛いのだ。
ちょっとスピードがあるとフリッパーの長さを飛び越えてしまう。
なので上から勢いよく落ちてきた場合は、
微妙なフリッパー制御でショックを吸収するようにしないといけない。
まぁそれが言うのは簡単だけどやるのは…。
本当にコイツはムキーとなりながらプレイした。
ちくしょう苛ついて仕方ない、再プレイだ!!

と言うわけで兎に角楽しくてハッピーだった。
閉まる19時ギリギリまで居て、
終わったら冒頭で述べたように複数枚利用可能な割引券が貰えるから
それを利用して高島屋で値の張る弁当を購入。
と言っても割引券があるからポケットから出したのは端数の数十円だけ。
実質無料で遊べている。
そしてこのイベント、運営の方がよく分かっていらっしゃる。
BGMが80年代の名曲、マイケル・ジャクソンだったり
Queenだったりサバイバーだったり。
マイケルのBADが大音量で響く中、
HIGH SPEEDのフリッパーボタンを叩く is 最高。
本当に良い。
良かったではない、良い。なぜならまだ5/6も遊べるからだ!

長々紹介したけど、皆さん、こんなイベント中々無いですよ!!
ピンボールって生産中止で、ゲーセンとか行っても
私の知る限り殆ど置いてる店無いよ!
GWの締めくくりをピンボールに捧げてみても良いんじゃないかな。あ
最後にお薦めピンボール漫画を置いておきます。

FLIP-FLAP (アフタヌーンKC)

FLIP-FLAP (アフタヌーンKC)

これ読んだら「ピンボールやりたいー!!」ってなると思います。
是非明日は新宿高島屋で僕と握手!


■追記
めっちゃルーズティルト。

■追記2
5/6も結局行ってしまいました!!!
超楽しい!!
そして5/5は諸般の事情で撤去されてたあのモンスターが帰ってきた!
その名はBlack Knight2000!
f:id:AntiBayesian:20140506211630j:plain
(ちなみに2000って名乗ってるけど、発売されたのは1989年だぜ!!)
今回のイベントの最新機種である。
盤面はこんな感じ。
f:id:AntiBayesian:20140506143248j:plain
驚きの「2階建て」仕様である。
盤面上部の2階と下部の1階は勿論リンクし、
ジャックポットをキメるには連携させなければならない。
右フリッパーから思い切り跳ね上げることによって左上部のランプ*9を駆け上がる、
すると2階の右端からボールが出現するので、
それを2階の右フリッパーで弾いて2階の上部ループを回す。
コイツがうまいこと決まればアドレナリンは溢れまくりである。
2階建てなのは伊達じゃない、1階部分で弾かれたボールは当然上部に飛んでいくのだが、
そのほとんどが2階の部分に隠れてしまい、見えなくなる。
プレーヤーはどこにどう落ちてくるか予測しつつ待ち構えないとならない。
気を抜くと「え、そっちから来るの???」ってことになる。
特にマルチボールになるともう完全に制御出来なくてパニックに陥る。
僕は姿勢をかなり低くしてすかして見るようにして
出来る限り早めに球の出所を探りながらフリップしてた。
ボールがグルングルン立体的な経路を動き回る様は見てて最高にハイになる。
いやーたのしーなー…。
と言いたいところだったんだけど…。
こっから先はただの愚痴(?)
なんかこの台にアレがそれなプレーヤーがコレしたみたいで、
これだけ異様にティルト設定がタイトになってた。
揺らしどころではない、奥に叩きこもうと強めにフリップするだけでティルト発生するのだ!
これは幾らなんでも厳しすぎるだろ…。
僕だけじゃなくて他の人もガンガン発生してた。
このイベントは家族連れとか一般向けのものだと思うんだけど、
多分皆さんティルトとかご存知ないと思われるので、
突然電光掲示板が得点ではなく「TILT」の文字表示して台が停止してし
フリッパーが動かなくなるの、何らかのエラーが発生したのかと
思われたんじゃないかな~って心配になりました。
一般向けのピンボール、とりあえず球を落とさないよう弾きまくってたら
時々高得点が出て台がビカビカ光ってウッヒョー楽しーって感じでいいと思う、
テクがどうとか台ごとのフィーチャーがどうとか言い出す必要は無いと思う。
にしてもTILTの説明くらいは入り口とかに書いてた方が良かったんじゃないかな…。

後はレトロ台を堪能。
お気に入りはやっぱりLIBERTY BELL*10

f:id:AntiBayesian:20140506145151j:plain
f:id:AntiBayesian:20140506145154j:plain
f:id:AntiBayesian:20140506145200j:plain

オーソドックスな作りで誰でも楽しめる。
凝ったギミックは無いんだけど、センタートップに位置するバンパー*11
とスコア入る様々なホールやターゲット*12が多彩で、
色々狙えるし、特にストレスになる要素がなんもないのが良い。
落ち着く。

DJブースも活況。
f:id:AntiBayesian:20140506145835j:plain
あと球が詰まったかなんかで整備中の光景も見られたぜ!
f:id:AntiBayesian:20140506165151j:plain


最後にもう一回Black Knight2000打って終了。
クロージングに立ち会い盛大な拍手とともにお別れ。
参加者の皆さんもスタッフの皆さんも新宿高島屋の方も皆さんお疲れ様でしたー!
本当に楽しかったです!
「知らなくて参加出来なかったけど、是非行ってみたかった!」
って声も僕のTLでは良く上がってたので、
何とかまた開催して頂けると大変ハッピーです!

終了後、まだ展示してた各ピンボール台広告の展示場に。
f:id:AntiBayesian:20140506191946j:plain
ストレス溜まりまくりの憎き4queens(本文で紹介してるフリッパーの間隔代わるヤツ)。
コイツは本当に最後の最後までどうしていいかわからなかった!
むずい!
f:id:AntiBayesian:20140506192014j:plain
レトロSF感漂うSPACE MISSION。
これは本当に盤面も宇宙SFっぽい良い感じだしてて好き。
f:id:AntiBayesian:20140506192051j:plain
上でも紹介したLiberty Bell。
これイラストとしては特にって感じなんだけど、
説明書きが台の特徴を的確に表してて
「ふむ~これは新しい風を感じる、やりたい!」
って気持ちにさせてくれる。


広告も80年代になるとグッとかっこよくなる!!
f:id:AntiBayesian:20140506192154j:plain
XENON、盤面にケツが出てたりセクスィーな感じしますね。
なんか高得点とると女性の声が出るとか聞いた気がするんだけど、
僕は聞けませんでした…。
f:id:AntiBayesian:20140506192210j:plain
そしてNo1カッコイイのがこのTOMCATだ!
硬質で複雑に絡み合う立体的なレーンが与える視覚的衝撃は半端無い。
TOMCATの一番かっこいい部分を「これでもか!」とばかり
前面に押し出したこの迫力が凄い。


ヒャー、遊んだ遊んだ。
さて、割引券何枚溜まったかなー。
…21枚。
えーと昨日14枚で…。
合計35枚。そして1枚2プレイだから70プレイもしたのか!??
お陰様で右手がジンジンする。
ピンボールを心行くまで堪能できた素晴らしいGWでした。
もしこの記事読んでピンボール打ちたくなった方、
下記のピンボールマップなどをご参照頂き、
お住まい近くのピンボール場を探し出して打ちましょう!
https://maps.google.co.jp/maps/ms?msa=0&msid=107170734824212273699.0004695f6dd6a429a51ee&dg=feature

他、ピンボール置いているお店など。
東京豊田のゲームセンター、ネバーランド
http://azuma802.co.jp/nl/
高田馬場ゲーセン ミカド(Medieval Madness, Monster Bash, Attack from Mars)
http://mi-ka-do.net/baba/gameinfo/
タイトーイン神田(ジュラシックパーク、リーサルウェポン、アダムスファミリーの3台)
http://www.taito.co.jp/gc/details/tokyo/tokyo/sgc00367/index.html
ザ・シルバープラネット(大阪)
http://big-step.co.jp/shop/detail/44/
日本ピンボール博物館(愛知)
http://www.one-more-time.jp/pinball/


いつかどこかのピンボール場で僕と握手!!

*1:「SPACE SHUTTLEだろ!」とか言われたら返す言葉も御座いません

*2:あのボールを弾いたりするバーのこと

*3:初めて知ったとき「あ、ソシャゲの原型っぽい」と思った

*4:フリッパーを上げてボールを保持するテク

*5:フリッパーでボールを弾くこと

*6:最初にボールを弾いてレーンに放り込む装置。70~80年代は大体手動バネ式。90年代はボタン式。手動バネ式の方が強弱自分で調整できて楽しいと思うんだけどなぁ

*7:この台は左に一つ、右に二つフリッパーが付いてる

*8:80年代も十分レトロだけど

*9:傾斜を上るレーンのこと

*10:Williams社の作品が好きです。特にスティーブ・リッチ―のが。これはリッチ―作品じゃないけど

*11:画面黄色いキノコみたいなヤツ。ボールに触れると強い勢いで弾く

*12:当たるとスコア入るオブジェクト。センタートップの星条旗のオブジェの内側に色々仕込まれてる

統計屋による新社会人のための統計系入門書お薦め一覧

本稿では統計学データマイニング機械学習関連書籍について

  • 内容が易しいこと。数学力(特に微積線形代数)を求められないこと
  • 入手しやすいこと。絶版や学会に入らないと入手不可などではない、値段が安いこと
  • 実務に繋げやすいこと。
  • 持ち運びしやすいこと。忙しい新社会人が通勤中や休み時間ポケットからさっと取り出し、継続して勉強出来ること

を主眼に選定したお薦め書籍を紹介します。
(満たせない要望も多いですが)

主な対象者は、文系で数学や統計学をやってこなかった、
プログラミングもわからない(Excelで四則演算やマウス操作くらいは使える)
けどいつかマーケティングやデータマイニングやってやるぜ!
って考えてる新卒の方です。

筆者自身は経済学科出身の文系で、あまり数学力に自信がないなりに
Web企業でデータマイニングをしているという人間です。

ここで紹介している内容で
統計学機械学習データマイニング
という言葉が出ていますが、ここでは

  • 統計学:分析計画を立てたりデータを要約する集計値を出したりサンプルに差や偏りがあるか検定・推定したり
  • 機械学習:データから何らかのパターンを見出して分類したりパラメタを求めたり
  • データマイニング:データに色んな手法適用してとにかく価値を得る行為全部を指す

程度に認識して下さい。

では始めましょう。

まずは勉強の前に読み物でデータ分析が
どのように実社会で使われているのかを事例を確認してみましょう。

会社を変える分析の力 (講談社現代新書)

会社を変える分析の力 (講談社現代新書)

誤解されがちなことですが、データ分析するだけでは意味はなく、
分析結果を元に何らかの改善策を生み出し、
その策を実践することによってようやく価値に繋がります。
よくある「データ分析したけど何の価値も生まなかった」という嘆きは、
本当に手元のデータの分析しかしていないケースが殆どです。
本書は「データ分析する前に、
まず必要なデータをどうやって入手するか、
データ入手するためには色んな部署の協力が必要だったりするがどうやってきたか、
分析結果を現場で活用して貰うためにはどうアプローチするか」
という泥臭いリアルな話を赤裸々に書いた名著です。
色んな分析手法やツールの使い方について学ぶことよりも、
分析から価値を得るにはどうすれば良いかを考える方が先です。
実務で分析を価値に繋げた経験を知ることが出来る本なので是非読んで頂きたいです。


なるほどー、データ分析ってこんな風に役立てればいいのかー
というのがわかったところで、統計学入門しましょう。

マンガでわかる統計学

マンガでわかる統計学

マンガでわかる統計学 回帰分析編

マンガでわかる統計学 回帰分析編

マンガでわかる統計学 因子分析編

マンガでわかる統計学 因子分析編

本書の特色はストーリー仕立てで統計学が学べることです。
統計学は多岐に渡る手法があり、各々使いどころ目的や性質が異なります。
統計学の書籍を読めば各々の手法は身につきますが、
具体的に目の前のタスクに対しどの手法をどのように適用すればよいかは
それなりの経験と手法への深い理解、そして統計学の体系的な認識が求められます。
それを独学で身につけるのは非常に困難です。
そこでお薦めなのが本書です。
この本は少女が必要に迫られて統計学を学ぶという展開で、
タスクの明示→目的の明確化→手法の紹介→分析結果の説明→結果の活用
という流れを漫画で追いかけることが出来ます。
これによりどういう時に何をすればよいかがまるで研究室の先輩から教わるように学べます。
よくある説明がだらだら続いてたまーに漫画美少女の挿絵が入るとかいうものではなく、
「なるほどー分析ってこういう流れでやればいいのかー」というのを
きちんと漫画の形式で紹介しているので、勉強するぞ!と気合いを入れることなく
とても気軽に読めます。
本書で分析の流れを掴むと良いでしょう。
このシリーズの漫画パートだけでも全部読めば分析の流れを知ることが出来ます。
出来れば全部読みましょう、最低一冊目だけでもお読み下さい。
統計手法の説明としても、まぁそんなに悪くはないです。
あとこれは文庫ではなく大版本なので持ち運びしづらいです。
薄くて軽いけど。


統計分析の実務への活用、データ分析の流れを知った所で、
今度は統計屋の心構えを学びましょう。

統計学 (サイエンス・パレット)

統計学 (サイエンス・パレット)

データ分析というと、まるで目の前にあるデータに
統計手法を適用するのが全てというような誤解されるケースもありますが、
そもそもデータは天から降ってきたり誰かが綺麗な形で
分析目的に沿うよう用意してくれるものではありません。
目的をきちんと策定し、その目的に沿ったデータを設計・実装し、
そこからようやくデータ分析に入れます。
統計屋の仕事とは、データを分析ツールに放り込むオペレータ業ではありません。
大目的(売上向上や品質改善)のために分析目的を設定し、
それを実現すべくデータを設計し、手法を選択し、分析結果を伝えることまで含みます。
とはいえデータ設計の話は非常に複雑で難解です。
本書はデータ設計の意義と初歩を簡単に紹介し、
逆にデータが不十分だとどのように困るかの説明があります。
それだけではなく、各種統計手法の概要説明も普通にわかりやすいです。
非常に完成度が高い素晴しい一冊で強くお薦めです。
とりあえずこれは読みましょう。
統計でウソをつく法―数式を使わない統計学入門 (ブルーバックス)

統計でウソをつく法―数式を使わない統計学入門 (ブルーバックス)

挑発的なタイトルですが、中身はむしろ
統計学を正しく活用するためにダメなパターンを学ぶ」
というものです。
皆さんも目にしたことがある珍妙なグラフや実感に合わない数値、
あれがどのようなトリック、あるいは分析者の錯誤により生み出されているかを
説明しています。
古い本ですが今なお統計屋の間で我が身の戒めとして愛される名著です。
集計一つするにしても繊細な注意をもってしなければ、
簡単に誤った結論を招く実例を多数紹介し、
何より最後にそのような誤った統計活用をしないようにするには
どうすれば良いかを指南しています。
受け継がれるだけのことはある内容です。
面白い読み物として肩肘張らずに読んで頂ければ幸いです。


データ分析について俯瞰する本を紹介してきました。
徐々に分析手法の詳細について説明している本の紹介に移ります。

品質管理のための統計手法 (日経文庫)

品質管理のための統計手法 (日経文庫)

この本は単純に統計手法の数理について分かり易く解説しているという面だけでも
優れていますが、品質管理入門としてもお薦めの一冊です。
品質管理は工場で不良品がどれだけ混入しているかチェックして
要求される品質水準を満たしているかなどの検証に使われる分野です。
最近データ分析と言えばWebサービスという風潮があるように見受けられますが、
遙か昔、百年以上前から工場での品質管理に統計学が用いられてきました。
品質管理には長い歴史に裏付けられた非常に高度な分析技術体系があります。
一般のWebサービスのデータ分析とは異なり
(と言ってもタスク次第であるのは勿論ですが)、
品質管理では非常に厳密な精度が求められます。
例えばWebサービスの優良顧客推定に95%の精度が得られるなら大万歳ですが、
工場から出荷される椅子や缶詰が一定品質をクリアしているかどうかの判定を
5%も失敗して不良品が混じってしまうと大問題になります。
本書はそんな品質管理に用いられる統計手法を分かり易く説明した本です。
仮にあなたがWeb企業で良くある最近の分析手法を使うにしても、
極限の精度を求める品質管理の話を知っておくのは非常に有意義でしょう。
永田先生の本は本当にどれも外れがないので、迷ったら永田本買えばいいです。

さらに統計学手法の本を。こちらは電子書籍もあって便利です。

入門 統計学 −検定から多変量解析・実験計画法まで−

入門 統計学 −検定から多変量解析・実験計画法まで−

大変わかりやすい説明で、カバー範囲も
ノンパラやクラスタ分析・主成分分析などの多変量解析まで幅広くおさえています。
最近の統計学の手法を説明する本としては一番良い出来ではないかと思います。
教科書的な統計学を体系的に一通り学んでみたいぞーって方は頑張ってコレを読みましょう。


分析結果を活かすためには、アウトプットを客に見せなければなりません。
その時誤った見せ方をしてしまえば誤った結論に陥ってしまいます。
正しいデータの可視化を学びましょう。

最初に言っておきますが、これ私が書いた本なので完全なる宣伝やで。
内容は

  • こんな可視化手法がありこういう風に使い分けるよという一覧
  • こういう可視化したら誤解を招くからしちゃダメだよという説明
  • 3D円グラフを使う奴は殺す

という感じです。
可視化は非常にインパクトが強いので扱いは繊細にならねばなりません。
同じデータでも全く違う印象を与えることが出来ます。
本書は誠実にデータを見るにはどうすれば良いか、
そもそもデータをどのように設計すれば良いか
について語っています。
ただ、統計面に関してはわかりやすく書いたつもりですが、
ぶっちゃけた話D3本として入門書かと言われると微妙に高度です…。
あと「D3で可視化?ってことは3Dグラフを
リアルタイムでぐりぐり動かすとかそういう内容なの?」
と期待された方にはご免なさい、
そういうのは一切載ってないどころか
そういうのやる奴は死ねと書いてます。
私の知る限り、本書ほど特定対象について
殺意を向けて書かれた本はありません。


ここまで頑張って読み切れば、あとは先輩や上司に付いて
色々教わるのもスムーズに行くでしょう。
お疲れ様でした。


さらに「私は機械学習までやってみたい!数学もちょっとは頑張る!!」
と意欲ある方向けに、機械学習系の理論を説明する本を紹介します。
今までは数学知識を要求されませんでしたが、
ここから先はそれなりの数学力、
微積と行列計算くらいは求められます。

フリーソフトでつくる音声認識システム - パターン認識・機械学習の初歩から対話システムまで

フリーソフトでつくる音声認識システム - パターン認識・機械学習の初歩から対話システムまで

タイトルは音声認識システムと書いていますが、
基本的な機械学習手法の説明がなされています。
まともな機械学習系の本の中では最も本書が易しいです。
機械学習入門はまずここから始めるのがよいでしょう。
説明自体も易しいのですが、実数値を使って計算の経過を
逐次実行して見せたり、ツールを使って実際の処理内容を見せたり、
理解させるために多大なる労力を払った素晴しい本です。
勿論音声認識の入門書としても、具体的なツールの使い方まで
説明しててわかりやすいです。
データマイニングと集合知 ―基礎からWeb,ソーシャルメディアまで― (未来へつなぐ デジタルシリーズ 11)

データマイニングと集合知 ―基礎からWeb,ソーシャルメディアまで― (未来へつなぐ デジタルシリーズ 11)

機械学習の各手法を俯瞰出来る入門書です。
数式も出てきますが、文章で各手法の原理や性質を説明しているため、
数学力に自信が無くても文章だけでも読んでおいた方が良いでしょう。
数式出ているとはいえ、機械学習系の手法を紹介している
書籍の中ではかなり平易に書かれています。
フリーソフトではじめる機械学習入門

フリーソフトではじめる機械学習入門

これまた機械学習の各手法を俯瞰するための入門書です。
データマイニング集合知に比べて

  • 最新のトピックスを扱っている
  • Wekaという機械学習ライブラリを用いて実際に動かせる
  • 数学的にちょっと高度

な点が違います。
どっちでも好きな方を読んで下さい。


ここまでで理論をおさえたので、
次は実際手を動かして処理する本を読みましょう。
データマイニング系で用いられるメインのツールは

などがあります。
ここではExcelでデータ分析をする本と
Rで統計解析をする本を紹介します。

知識ゼロからのExcelビジネスデータ分析入門 (ブルーバックス)

知識ゼロからのExcelビジネスデータ分析入門 (ブルーバックス)

本当に統計知識不要、それでいて実践的なマーケティング手法を紹介する本です。
Excelにはピボットテーブルという非常に強力な集計機能があります。
それを用いてデータを分析するにはどうすればいいか、
豊富な画像を用いて解説しています。
これ読むと一通りのマーケティング手法使えるようになるので中々の良書です。
これが気に入れば同著者の大判の本も読んでみると良いでしょう。
統計的な説明は一切触れてません。
EXCELマーケティングリサーチ&データ分析[ビジテク]2013/2010/2007対応

EXCELマーケティングリサーチ&データ分析[ビジテク]2013/2010/2007対応

同じくExcelでマーケティング手法利用する本です。
先程の本と違い(そこまで酷くない)最低限の統計の説明を入れています。
学んだ理論をExcelで実践する時に本書片手にやると覚えが早いでしょう。
統計学:Rを用いた入門書

統計学:Rを用いた入門書

Rで統計入門という本は結構出てるのですが、説明がやばい本結構多いです。
その点本書は統計学の説明に関してかなり良いです。
但し、Rを使いこなすぞ!という本ではありません。
Rのための本ではなく、
統計学の説明するときの処理系として
たまたまRを選んだっていう感じの本です。
Rをしっかり勉強したいという場合は別の本を読んで下さい。
データマイニング入門

データマイニング入門

Rで機械学習系のよく使われる手法を説明しています。
数式はそこそこ出てきます。
文章でもかなり説明してくれているのと、
Rで処理の動きを見ることが出来るので、
頑張れば数学力無くても各手法がどのような特性あるか把握出来ると思います。


「入門者が春に読む本」って話なら上記まで読めれば大変素晴しいと思います。
世の中には「いやいや実務ではもっと高度な手法を使うよプゲラ」
とか言ってくる人も居るでしょうが、焦らず基礎を積みましょう。
人生は長い。

余力がある、数学力に自信があるという方には
更に発展的な本として次を挙げておきます。

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

自然言語処理で用いられる機械学習手法に絞った解説書です。
と言っても自然言語処理の部分は僅かで、
真っ当な機械学習入門書として読めばよいでしょう。
機械学習で独学しづらい部分をピンポイントで解説している素晴しい本です。
これが出るまでは広範な数学力がある人か
先輩や先生が教えてくれるような環境を持ってないと
理解出来なかった部分もありました。
本書は個人的に人生を変えた本で、
コレがないと私は挫折して今機械学習やってなかったと思います。
これ読んで線形代数の本読み切ればPRMLという
機械学習系のバイブル的な本に進めると思います。


もっと高度なことをやりたいぞ!
と思ったら、最終的には数学力が必要になるときもあるでしょう。
具体的には微積分、線形代数、確率論あたりを押えておくと良いです。
特に線形代数をきちんとやっておかないと割と早い内に詰まります。
下記の本をお薦めします

統計学のための数学入門30講 (科学のことばとしての数学)

統計学のための数学入門30講 (科学のことばとしての数学)

統計的データ解析入門 線形代数

統計的データ解析入門 線形代数

キーポイント線形代数 (理工系数学のキーポイント 2)

キーポイント線形代数 (理工系数学のキーポイント 2)

はじめてのルベーグ積分

はじめてのルベーグ積分

上二冊は統計学で必要な部分だけに話題を絞った
独学の最短ルートを提供してくれる有り難い本です。
私も大変お世話になりました。
更にキーポイント線形代数まで読んで
言語処理のための機械学習入門読み切れば
相当数の論文を読むことが出来るでしょう。
最後のルベーグ積分は必須ではありません。
ただ、あなたが分析経験を積み、確率論が必要になった、
あるいは確率論に興味が出て学び始めた時、
手強い壁として立ちはだかるのがルベーグ積分でしょう。
本書はルベーグ積分本の中で一際易しい本です。
とは言え十分難しい内容です。
どうしても確率論に真正面からぶつからないといけなくなったときに
本書を参照すると良いでしょう。
余力があれば是非読んでおいて下さい。


最後に、統計学の手法ではなく、
統計学の歴史や哲学について書かれた本を紹介します。
なぜ統計学史や哲学について知るべきなのか?
それは、数々の統計手法はどのような要望で生まれたのか
という背景を知ることが、数式から手法の挙動を読み解くのと
同じくらい価値あることだからです。

統計学を拓いた異才たち(日経ビジネス人文庫)

統計学を拓いた異才たち(日経ビジネス人文庫)

科学と証拠-統計の哲学 入門-

科学と証拠-統計の哲学 入門-

上記2冊は統計学史と統計哲学の入門書です。
たまに数式も出てきますが、基本的に読み物です。
統計学者達の意見の対立の話も出てきます。
実際皆さんがデータ分析をするにあたって、
同僚と手法やデータの扱いについて意見が異なるかも知れません。
データ分析は何を一番大切にし何を懸念しているか、
一言で言えば立場によって用いる手法やデータが異なります。
過去の統計学の異才たちがどのような意見相違をしたか知ることで
己の統計屋としての哲学を確立していきましょう。


皆さんが良き統計屋になれますよう、心から願っております。

良き統計屋とは3D円グラフを使ってるプレゼンターを
その場で殴りに行く人のことです。
質疑応答の際、司会者からマイクを奪ってあらん限りの数学力で殴りましょう。