Sublime Text 2をWindowsに入れてごにょごにょ

宗教論争には飽き飽きしたので(嘘)、これからはSublime Text 2を使おうと思います。
すでにSublimeTextの情報は満ち溢れてて、今更ここに詳しく書いたって人様の役に立たないと思うんであくまで自分用に、簡単にメモ。

インストール

http://www.sublimetext.com/2

から「Windows 64 bit」をダウンロード

実行して指示に従うだけ

パッケージ管理システム(Package Control)の導入

http://wbond.net/sublime_packages/package_control/installation

ここを参考に。

自分の環境だと何故かCtrl + Shift + @でコンソール開けなかったので、メニューから View > Show Console で開く。

開いたら上記ページに書いてあるやつをコピペ。すると再起動求められるので一旦閉じて開き直し。

インラインで日本語入力できるように

IME Supportとかいうのを入れればいいらしい。上で入れたPackage Controlを使います。

Ctrl + Shift + p でパレット開いて「Package Control: Install Package」を選択。「IME Support」を選んでインストール。

エディタ設定いじる

Preference > Color Scheme から選べる。

とりあえず「Solarized (Light)」にしといた。

Preference > Setting User で設定ファイル開く。

とりあえず

"ignored_packages": [],
"font_face": "VL Gothic",
"translate_tabs_to_spaces": true

だけ入れといた。

Ubuntu 12.04にpipでmatplotlibを入れようとしたら詰まった件

タイトルの通りです。Pythonのバージョンは2.7.3

pip install matplotlib

したらなんかエラー吐きやがりました。よく見たら

src/ft2font.h:16:22: 致命的エラー: ft2build.h: そのようなファイルやディレクトリはありません

とか言いやがります。
ft2build.hってなんやねん。

調べたらFreeType2とかいうやつのヘッダファイルらしいです。なんなのかよくわかりませんが。
てなわけで

sudo apt-get install libfreetype6 libfreetype6-dev

すればおk

今年のカープはなんで点が取れなかったのか検証してみた

広島東洋カープ Advent Calendar 2012」の12月21日担当です。
なんか一人だけ空気読まずにガチでコード書いてもにょもにょしてますが、まあスルーの方向でw

2012年、例によって9月に大失速して4位に終わったカープですが、シーズン通しての敗因として「得点力不足」が挙げられると思います。野村なんて防御率1点台なのに9勝ですよ!! あやまれ打撃陣!!! あやまれ!!!!

てなわけで、なんで今年こんなに点取れなかったのか分析しましょう。

1. 得点推定モデルをつくる

一般的に、あるチームの得点力が少ない原因として「出塁できない」「長打が出ない」「機動力が使えない」「チャンスに弱い」などさまざまな要因が考えられます。これをきちんと分析するには、主観じゃなくてしっかりデータで客観的に捉えないといけません。

で、普通に各種チーム成績(チーム打率とかチーム本塁打とか)を平均と比べて、「カープはチーム打率が低いから点が取れんのだ!」とか言ってもいいんですが、もうちょっと面白いことをやりましょう。
てなわけで、今回は重回帰分析により安打数や本塁打数、盗塁数などがチームの得点にどれくらい寄与しているかを明らかにします。これによって「盗塁が1つ増えるとチーム得点が0.2点増えるのに対し、ホームラン1本だと1点増える。つまり盗塁5個とホームラン1本の価値は等しい」みたいなことがわかるので「松井とイチローどっちが凄い?」的な質問にも答えられるわけです。

1-1. データの収集

NPB公式サイトで取ってこれる、2005年〜2012年のチーム別個人成績を使います。手入力だと死んでしまうので、クローラースクレイパー書いて自動でcsv化しました。

設定ファイル
https://gist.github.com/4353340

クローラー
https://gist.github.com/4353334

スクレイパー
https://gist.github.com/4353286

ベイスターズがああなって球団名が変わった関係で、URLが一部変わってるのに注意ですね。

1-2. サンプルの単位は?

取得したデータをもとに、得点が従属変数、安打・二塁打三塁打、、、が独立変数として重回帰をやります。当たり前ですが得点は個人で取るものではなくチームで取るものなので、サンプルは個人単位ではなくチーム単位です。
「2005年のカープのチーム打撃成績は安打が1374本で二塁打が221本で、、、」が1サンプルなので、サンプル数は8年×12チームで96となります。

1-3. 計算しよう!

PandasというPythonのものすごいライブラリを使えば一瞬です。
コードはたったのこれだけ
https://gist.github.com/4353349

結果はこれです。

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
        安打     0.4170     0.0430       9.70     0.0000     0.3327     0.5012
     二塁打     0.4232     0.1257       3.37     0.0012     0.1769     0.6695
     三塁打     1.1368     0.4284       2.65     0.0095     0.2971     1.9765
     本塁打     0.9864     0.0936      10.54     0.0000     0.8030     1.1698
        盗塁     0.2402     0.1065       2.26     0.0267     0.0316     0.4489
--------------------------------------------------------------------------------
     盗塁刺    -0.3303     0.3275      -1.01     0.3163    -0.9722     0.3117
        犠打    -0.0435     0.0905      -0.48     0.6323    -0.2208     0.1339
        犠飛     0.9788     0.4034       2.43     0.0174     0.1881     1.7695
        四球     0.3236     0.0543       5.96     0.0000     0.2172     0.4299
        死球     0.1745     0.1943       0.90     0.3717    -0.2063     0.5554
--------------------------------------------------------------------------------
        三振    -0.0654     0.0335      -1.95     0.0546    -0.1311     0.0004
     併殺打    -0.1494     0.1843      -0.81     0.4199    -0.5105     0.2118
     intercept  -275.8241    59.6665      -4.62     0.0000  -392.7704  -158.8778
---------------------------------End of Summary---------------------------------

つまり、「ヒット1本はチーム得点を0.42点上げるのに貢献する」「盗塁1つはチーム得点を0.24点上げるのに貢献する」といった意味です。
一見したところ、安打と二塁打がほぼ同じだったり、三塁打本塁打より上だったり、犠打がマイナスだったり、犠飛がやたら高かったりといろいろ怪しいところがあって、そのうちのいくつかは説明できるんですが、ここでは割愛します。

2. で、結局のところカープは何がいけなかったのか

モデルができたので、本題に入りましょう。まずは12球団平均の打撃成績の平均とカープの打撃成績を比べてみます。

得点 安打 二塁打 三塁打 本塁打 盗塁 盗塁刺 犠打 犠飛 四球 死球 三振 併殺打
12球団平均 469 1166 186 20 73 82 40 141 31 390 50 898 91
カープ 427 1077 192 13 76 79 39 175 26 374 57 912 86
-42 -89 +6 -7 +3 -3 -1 +34 -5 -16 +7 +24 -5

平均より40点も得点が少ないですね。このマイナス40点にノムスケや(シーズン序盤の)バリントンは泣いたわけです。カープは投手陣がいい(と言われている)ので、チーム得点が平均並みになれば十分Aクラス入りは可能なはずです。じゃあ、得点を40点増やすにはどうすればいいんでしょう?

1. ヒットを100本増やす

ヒットが1本増えるとチーム得点がちょうど0.4点増えるので、チーム得点が40点増えるにはヒットが100本増えればいいです。ちなみに今季のカープのチーム打率は.233ですが、打数が同じでヒットが100本増えたと仮定すると、チーム打率は.255になります。これは今季の巨人とほぼ同じ水準。

2. ホームランを40本増やす

ホームラン1本はほぼ1点の貢献度です(本当はもっと大きいのですが、理由は割愛、、)なんで40本増えればOKですね。
ちなみに40本もチーム本塁打増えたら12球団でダントツの本塁打数になりますね、、、


えーっと、なんつーか、まともな分析になってませんねw データ集めて重回帰やったところで力尽きましたww(Pandasまともに触ったの初めてだったので)

他に気になるデータとしては

  • なんでズムスタなのに三塁打数が平均より7本も少ないの?
  • 犠打多すぎじゃね?

といったあたりでしょうか。今回、数字出してみて意外だったのは、純粋な長打の数では他球団に決して劣ってない、というところですね。二塁打本塁打は平均上回ってますし。ただしヒットの数が圧倒的に少ない。
犠打に関してはセイバーな方々の間でも意見が別れるところです。ですが「ヒットは少ないけど長打はそこそこ出る」チームなら、バントで塁進めるよりランナー溜めて長打に期待した方が点取れそうな気がするんですが。どうなんでしょうノムケンさん。

Ubuntu 12.04にYesodを入れた

「すごいH本」こと『すごいHaskellたのしく学ぼう!』を読み終えたので、今度はHaskellのWebフレームワークであるYesodをやってみようと思います。

手元にはASUSのZenbookを買って速攻Windows消してUbuntu入れたやつがあるので、こいつにYesodをインストールします。

まあ公式見れば一発なんですがw

apt-get install haskell-platform

は既にしてある前提で、

cabal install yesod-platform

と叩けばインスコ完了です。大量のライブラリをインストールしてるんで、結構時間かかります。

インストールされたYesod本体は、デフォルト設定だと~/.cabal/bin以下にあるんでパス通しておきましょう。でもって

yesod init

を叩くと、プロジェクト名と使用するDBを聞かれます。適当に答えるとプロジェクト出来上がるので、プロジェクトのフォルダに移動して

cabal install && yesod devel

でサーバ立ち上がります。http://localhost:3000にアクセスするとなんか出てるはずです。
最後だけ微妙に公式のチュートリアルと違うんですが、どうやらinitで答えたDBを操作するためのライブラリが最初は入ってないんで cabal install する必要があるっぽいです。2回目以降は yesod devel だけでおk

PyCon Jp 2012 の「Top of Pythonista」で2位になりました!

PyCon JP 2012内で開催されたTop of Pythonista決定戦にて、なんと2位になってしまいましたw
単純に「スコア効率(単位面積当たりのスコア)の高い順に左上から配置」するだけで、もろもろ洗練されてなくてすっげー重いコードなんですが、まあ実装した者勝ちということでw

てなわけで恥ずかしいですがコードを

# -*- coding: utf-8 -*-

import json
import random
import sys

def arrange(area, item):
    for i in range(len(area)):
        for j in range(len(area[0])):
            if area[i][j] == 0:
                judged = judge(area, item,i, j)
                if judged[0]:
                    put(area, item, i, j)
                    return {'id': item['id'], 'x': j, 'y': i}
                elif judged[1]:
                    continue
                else:
                    print('break!')
                    break
    return None

def judge(area, item, i, j):
    if not (len(area) > (i+item['height']) \
            and len(area[0]) > (j+item['width'])):
        return (False, False)

    for y in range(i, i+item['height']):
        for x in range(j, j+item['width']):
            if area[y][x] == 1:
                return (False, True)
    return (True, False)

def put(area, item, i, j):
    for y in range(i, i+item['height']):
        for x in range(j, j+item['width']):
            area[y][x] = 1

def efficiency(item):
    return 1.0 * item['score'] / (item['height'] * item['width'])

ifname = sys.argv[1]
ofname = sys.argv[2]
width = int(sys.argv[3])
height = int(sys.argv[4])

items = json.load(open(ifname))
items = sorted(items, key=lambda x: -efficiency(x))

area = [[0 for j in range(width)] for i in range(height)]
result = []
for item in items:
    matchItem = arrange(area, item)
    if matchItem:
        result.append(matchItem)

json.dump(result, open(ofname, 'w'))
The Zen of Python, by Tim Peters

...中略...
Flat is better than nested.
...後略...


ごめんなさいネストしまくりですorz

Twitterのエゴネットワーク描いてみた

Twitterのfriends間のフォロー関係をAPI叩いて取得(今回はTweepyを使用)。
networkxとmatplotlib使って描画します。

コードはここよ
https://github.com/who-you-me/twitter-friends-network

描画するだけでもアレなんで、中心性指標も計算してみました。

まずは次数(無向グラフなんで入次数+出次数)

なまえ 次数
@knighthalt 131
@NHK_PR 122
@shuumai 106
@HikaruIjuin 96
@Holly_carp_10 95
@shuzo_matsuoka 95
@nurenure_opanty 92
@Mr_Mikan00 88
@faridyu 86
@yukari_tamura 82

入次数

なまえ 入次数
@NHK_PR 121
@shuumai 105
@shuzo_matsuoka 95
@HikaruIjuin 89
@yukari_tamura 80
@buzztter 80
@faridyu 79
@TMR15 73
@KITAxERI 63
@twj 58

出次数

なまえ 出次数
@knighthalt 88
@Mr_Mikan00 58
@Holly_carp_10 57
@kabutoyama 55
@nurenure_opanty 54
@Musha_360 49
@yumeto_sft 47
@yumeto_hmc 45
@hirokira 43
@dOsOn711 40

近接中心性

なまえ 近接中心性
@knighthalt .412
@Musha_360 .362
@esehara .355
@Musha360 .354
@ecoloji .354
@nurenure_opanty .353
@dOsOn711 .352
@hirokira .350
@kabutoyama .349
@foxnumber6 .348

媒介中心性

なまえ 媒介中心性
@knighthalt .114
@Holly_carp_10 .062
@esehara .061
@h_ototake .058
@Baseball_LAB .055
@python_alert_ja .054
@Carp_Jikkyo .045
@nurenure_opanty .043
@Gafu_UW .042
@twj .040

固有ベクトル中心性

なまえ 固有ベクトル中心性
@knighthalt .224
@yumeto_sft .187
@nurenure_opanty .184
@yumeto_hmc .177
@Holly_carp_10 .167
@MataAnimeMiteru .166
@wigglen .161
@52sauaa .159
@kotoki_ .152
@Musha_360 .151

『オープンソースで学ぶ社会ネットワーク分析』を読むための環境設定(Windows7 64bit)

勉強会やってます。『オープンソースで学ぶ社会ネットワーク分析』という本の読書会です。

社会ネットワーク分析勉強会 #1 : ATND
社会ネットワーク分析勉強会 その2 : ATND

何でもそうですが、最初の環境設定が一番面倒ですよね。
というわけで、Python初心者がこの本のサンプルコードを実行できるようになるための環境設定です。当方の環境はWindows7 Professional 64bitですが、Windowsならだいたい同じかと。

Pythonのインストール

http://www.python.org/download/
から各自の環境に合ったものを落としましょう。Pythonのバージョンには二系統(2.x系と3.x系)あるのですが、現状では2.x系の方が無難です。
なんで、この場合は
Python 2.7.3 Windows X86-64 Installer」
を落としましょう。
落としたファイルを実行するとインストーラが立ち上がるんで、適当にポチポチ押してインスコしてください。
コマンドプロトンプトを起動して「python」と入力します。

C:\Users\hoge>python
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

と表示されればインスコ成功です。

easy_installのインストール

これから必要なライブラリのインストールに移るわけですが、その前にPythonのパッケージ管理ツールであるeasy_installがあると便利です。
http://peak.telecommunity.com/dist/ez_setup.py
上のリンクを右クリック→「名前をつけて保存」で適当な場所に保存します。
保存したら再びコマンドプロンプトを立ち上げ、保存場所に移動しましょう。そうしたら

C:\Users\hoge>python ez_setup.py

で実行するとインストールされます。使い方は、コマンドプロンプトから(Pythonインタラクティブシェルじゃないので注意!)

C:\Users\hoge>easy_install (パッケージ名)

と打ち込むだけです。簡単ですね!
(C:\Python27\Scripts にパスを通す必要があったような……パスの設定の仕方は自分で調べてね☆)

IPython, networkxのインストール

easy_installで一発です。それぞれ

C:\Users\hoge>easy_install ipython
C:\Users\hoge>easy_install networkx

でOK

numpy, matplotlibのインストール

上の2つはPythonのみで書かれたライブラリなんで簡単にインスコできますが、numpyとmatplotlibに関してはCで書かれたライブラリなので、インストールする際にはコンパイルする必要があります。
ですがWindowsは糞なのでデフォルトだとコンパイル環境がありません。糞です。氏ねばいいのに。
自前でコンパイルできる環境を整えることもできなくはないんですが、アホみたいに面倒くさいです。幸いにもコンパイル済みのバイナリが提供されてるんでそっちを使いましょう。

matplotlib

matplotlibは公式でWindows用バイナリを提供してます。
http://sourceforge.net/projects/matplotlib/files/matplotlib/
から適当なのを探します。執筆時の最新バージョンはこいつ
http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.1/matplotlib-1.1.1.win-amd64-py2.7.exe/download
exeなのでダンロードして実行すればインストーラ立ち上がります。

numpy

numpyは残念ながら公式でWindows 64bit用のバイナリを提供してません(32bitはあるんですが)。
なので野良ビルドを使いましょう。
http://www.lfd.uci.edu/~gohlke/pythonlibs/
ここにあります。
numpy-MKL-1.6.2.win-amd64-py2.7.‌exe
が執筆時の最新版です。


以上です。あとはPythonを楽しむだけです。