DISTRICT 37

なにか

第52回スーパーボウル!

2月の頭ってあいついつも休むよな。そんな奴がいたらそいつはアメフトファンに違いない。そう!年に一度のお祭り!SuperBowlの日なんです!

ペイトリオッツVSイーグルス

今回の対戦はニューイングランド・ペイトリオッツフィラデルフィア・イーグルス。去年のSuperBowlで大逆転劇を見せたレジェンドQB、トムブレイディ率いるペイトリオッツは連覇を狙う。対してイーグルスはエースQBカーソンウェンツがシーズン終盤に故障し、控えのQBニックフォールズが先発で投げる事に。レジェンドQB対サブQBという、設定だけでも映画になりそうなカード。

トムブレイディの昔からのファンであることもそうだが、前回大会の大逆転劇もあって今回はペイトリオッツを応援することにした。ちょっと前にマクナブっていう俊足・強肩のQBがいて、そのマクナブ率いるイーグルスは好きだったのだが、悪いけどあまり今のチームには思い入れはないんですよね。

SuperBowlは両チームに対して中立的な場所で行われる為、今回はミネソタ・ヴァイキングスのホームで行われた。だがなぜがイーグルスファンが多く、ペイトリオッツにはブーイングの嵐が巻き起こる。トムブレイディへのリスペクトの裏返しなのか、入場から、キックオフから、何かとクラウドノイズが巻き起こる。繰り返すがここはイーグルスのホームではなくヴァイキングスのホームなのだ。

P!NKが国歌斉唱を行い、さあキックオフ!

前半戦

前半から両チームともに獲得ヤードをかなり取りながら殴り合いのゲームの様相だ。ディフェンスが機能していないのか、はたまたQBや戦術がすごいのか。見る分としては面白い、ハイスコアゲームが期待される展開となる。

そして、今回の試合の行く末を表すかのようなプレイが2Q終盤あたりに登場する。初めに動いたのはペイトリオッツ。QBをレシーバーにするというスペシャルプレイをかますがそのブレイディがキャッチ失敗。そしてその数プレイ後。今度はイーグルススペシャルプレイ。こうやるんだとばかりにQBのニックフォールズがレシーバーとなるスペシャルプレイを見せつけ、しかもそそのままタッチダウンスペシャルプレイで裏をかこうとしたペイトリオッツに対して、イーグルススペシャルプレイで返された格好だ。試合を見てるうちそのリプレイが何度も繰り返される。

前半終了時点でイーグルス22-12ペイトリオッツ。去年の大逆転劇を知るペイトリオッツファンとしてはブレイディのマジックにいやでも期待してしまう。

ハーフタイムショー

SuperBowlのお楽しみといえばハーフタイムショー。これをリアルタイムで見るだけでも価値がある。今年はどうか?、、、おいおい、ジャスティン・ティンバーレイクって前にジャネットとやらかした野郎じゃないか!出演オファーが出るなんて、もう彼は許されたのか?と思いながら見ていたが、そういえばあの時のSuperBowlもペイトリオッツでQBはブレイディだったなと、改めてすごい選手だと感じる。というかこの事件自体、もう14年も前の話なのね。

後半戦

で、出たー!ペイトリオッツのQBブレイディーTEロブ・グロウコンスキーのゴールデンコンビによって一気にタッチダウンを取る。ドライブ自体も2分ちょっとと、なんでこんなに簡単に、、、とため息が漏れる。TEにこんだけ仕事をされたらWRもこのままでいいわけないよな!たのんだぞ!奮起したペイトリオッツのWR陣。WRアメンドーラが走り回りブレイディが続々とヒット。今回は両チームとにかくパスが出るし成功する。

3Q終了時点でイーグルス29ー26ペイトリオッツ。後半に入りじわじわと追い詰めてきたペイトリオッツは4Qで初めて逆転に成功。TDを決めたのはもちろんこの男。TEグロウコンスキ。頼りになるぜ!ということでこの時点でイーグルス32ー33ペイトリオッツ。これはキタ!さっすがブレイディ!奇跡は何度でも起きるんだよ!起こすんだよ!

このあたりでイーグルスQBニックフォールズもだんだんパスが定まらなくなるように見えてきたと思っていたら、元ペイトリオッツイーグルスのRBブラントがインサイドにアウトサイドにスルスルとペイトリオッツ陣営に入っていき、気が付いたらレッドゾーンへ。やはりパスが定まらないなんて事はなく、そのままパスプレイでタッチダウン。2PCを狙ったが失敗し、この時点でイーグルス38-33ペイトリオッツ。残り2分。1タッチダウンで勝負は決まる!ブレイディ・グロウコンスキのホットラインを使えば2分なんて長いくらいだ!!攻撃を始めるペイトリオッツ。もう一度夢を見させてくれ!

、、、ここでブレイディ、痛恨のQBサック。

ただのサックにとどまらずファンブルも犯してしまい、リカバーはイーグルス。ターンオーバー。その後のドライブでイーグルスはダメ押しのFGを決めてイーグルス41-33ペイトリオッツ。その瞬間ブレイディはベンチで大きくうなだれる。だが、彼らの目は死んでおらず、次の攻撃へ移る。残り時間1分。アメンドーラ、グロウコンスキとパスを投げるがあえなく時間切れ。イーグルスがSuperBowl制覇を決めた。

感想

スタッツはコチラ

2018-02-05 イーグルス vs ペイトリオッツ | NFL JAPAN.COM

両チーム合わせて1151ヤード、しかも獲得ヤード数で言えばペイトリオッツのほうが613ヤードと75ヤードも上回っている。そう、獲得ヤードで上回っているのにペイトリオッツは負けたのだ。そしてサック数。最後の最後のただの一回だ。パントも一回とまさに殴り合いと呼ぶにふさわしい試合だったといえる。

この試合ではWRアメンドーラがパスターゲットとなったが、俺たちは前回のSuperBowl制覇の立役者、エデルマンを知っている。だが、彼は故障してこの試合には出ていなかった。勝負事にタラ・レバを言ってしまってはダメなのはわかっているが、やはりこの舞台でエデルマンが見たかった。

レジェンドQBとシンデレラQB。この両者の対決はシンデレラに軍配が上がった。ロモが去り、兄ングも去り、キャムニュートンといった新しい時代のQBが台頭していく。一つの時代が終わり新しい時代になっていくのだろうかというのを感じさせるSuperBowlだったと思います。

今年も面白かった!来年も仕事さぼって見よう!

irisをMetabaseしてみる

irisをMetabaseでも愛でる

irisの準備

データベースの準備はちょっと前にやったやつを

dragstar.hatenablog.com

データソースの設定

MetabaseAdminからデータソースを追加する。管理画面から「Add a database」をクリックして追加画面を表示する。

f:id:dragstarclassic:20180116141231p:plain

DBによって設定する内容が異なるが、MySQLの場合はデータベース名、ホスト、ポート、ユーザ、パスワードを設定したらよい。

f:id:dragstarclassic:20180116141254p:plain

無事にデータベースが登録されたのでExitAdmin

irisを可視化

それではデータを確認

いいぞ!

f:id:dragstarclassic:20180116141330p:plain

いいセンスだ!

f:id:dragstarclassic:20180116141422p:plain

えっ!?

f:id:dragstarclassic:20180116141536p:plain

どうも散布図が納得のいかない出来となりました。品種ごとに見分けたいので、数値を勝手につけてプロットしてみたが、付け焼刃なのでやっぱり納得はいかないし、やっぱり見にくい。今後の開発に期待するというよりも、まぁこんなものかなと割り切るのがいいのかと思う。

欲しかったもの

f:id:dragstarclassic:20180116141559p:plain

できたもの

f:id:dragstarclassic:20180116141621p:plain

分析がしたいのなら餅は餅屋です。これは分析ツールではなく可視化ツールです。

まとめ

総じて簡単にここまで表現できるのは良いツールだと思うので、ちょっとした進捗とか、確認しておきたいデータとかはこれで表現するのはアリですね。

Metabaseを触ってみる

乗るしかない!この(略

準備編

基本的には公式を見ながらやれば間違いない。公式にはDocker形式のものとjarを動かすだけとあとはAWSとかのクラウドで動かす方法が説明されている。今回はjarを動かすだけのヤツで試してみることにした。

javaの環境が無ければインストール

sudo apt install openjdk-8-jsk

  • 本体

ここからmetabase.jarを落としてくる

  • DataBase

管理用にデータベースが必要になるだが、今回はMySQLでやることにした。デフォルトはH2になる。MySqlコンソールに入ってデータベースを作成する。

mysql> create database metabase default character set utf8;

これでひとまず準備は完了。起動編へ

起動編

  • 実行

早速実行したいところだが、管理用のDBがMySQLだと教えるために、起動用のスクリプトファイルを作成する事にした。MySQL以外のDBでも公式にはやり方は書いてある。

#!/bin/bash
export MB_DB_TYPE=mysql
export MB_DB_DBNAME=metabase
export MB_DB_PORT=3306
export MB_DB_USER=youruser
export MB_DB_PASS=yourpassword
export MB_DB_HOST=localhost
java -jar metabase.jar

で、作ったスクリプトファイルを実行すると、コンソールがダラララララと動いて、MySQLにテーブルを作りながらセットアップをやってくれる。

Please use the following url to setup your Metabase installation:
http://localhost:3000/setup/

最後にこんな感じのメッセージが出るので、指示通りブラウザから http://localhost:3000/setup/へとアクセス。続いて設定編へ

設定編

ブラウザからリンクにアクセスすると初回時はこのような画面となる

f:id:dragstarclassic:20180116110348p:plain

管理者アカウントの設定、DBリソースの設定と簡単な項目の設定を済ませる。特に難しいことはないので、管理者設定を終わらせて続いて実行編へ

ExitAdminを押してユーザ画面へ行く f:id:dragstarclassic:20180116110744p:plain

実行編

特に問題なければこのように表示されているはずだ

f:id:dragstarclassic:20180116111307p:plain

他のBIツールと同様に、クエリを作成してダッシュボードに乗っける。というのが基本的な流れだ。

  • New Question

データソースに対して、クエリ(Question)を作成する。メイン作業場になるかと。

  • Dashboards

作成したQuestionを複数配置して確認できるボードを一覧、編集ができる。

  • Questions

保存したQuestionを一覧して確認。編集とかできる。

  • Data Reference

利用可能なデータソースの確認。テーブル定義とか確認できる。

  • Pulses

Slack連携とかメール連携とか通知系の機能。調べてない。

あとはチュートリアルが公式にあるので、そこを見てやってみたら軽く感覚はつかめる。ちなみにサンプルのデータソースは管理DB作成時に自動的に作成されている。

これでひとまずMetabaseを動かすことができた。

irisをMySQLで使えるようにする

とにかくirisが好きなんや

DDLとLOAD

  • テーブル作成
CREATE TABLE iris (
    id int AUTO_INCREMENT PRIMARY KEY,
    sepal_length FLOAT(3),
    sepal_width FLOAT(3),
    petal_length FLOAT(3),
    petal_width FLOAT(3),
    species VARCHAR(20)
    );

  • データロード

と、その前にデータインポート用のディレクトリを確認して、そこにファイルを移動

変数の確認

mysql> show variables like 'secure_file%';

+------------------+--------------------------+
|Variable_name     |Value                     |
+------------------+--------------------------+
|secure_file_priv  |/var/lib/mysql-files/     |
+------------------+--------------------------+

ファイルの移動

$ sudo cp iris.csv /var/lib/mysql-files/

データロード

LOAD DATA INFILE '/var/lib/mysql-files/iris.csv'
INTO TABLE iris
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(sepal_length, sepal_width, petal_length, petal_width, species);

これで無事俺たちのirisが登録されたので、思う存分に愛でる事ができるようになった。

seabornを使うと凡例が見づらくなる

ということでplotsする際のテクニックを軽く

凡例を描画する際に一言二言加える

seabornをmatplotlibと併せて使っているわけだが、凡例を描画すると背景に消えてしまう事がある。今回はそれを解決した。

まずはデータの準備。適当に連続した数字を。

x = np.arange(0, 10, 0.1)
y1 = np.arange(0, 10, 0.1)
y2 = np.arange(10, 0, -0.1)

これをseabornを使わずに描画

import matplotlib.pyplot as plt
plt.plot(x, y1, label="legend_1")
plt.plot(x, y2, linestyle="--", label="legend_2")
plt.legend(loc="best")
plt.show()

こうなる。凡例が見やすい。

f:id:dragstarclassic:20180109144208p:plain

seabornを使うと、、、

import matplotlib.pyplot as plt
import seaborn as sns
plt.plot(x, y1, label="legend_1")
plt.plot(x, y2, linestyle="--", label="legend_2")
plt.legend(loc="best")
plt.show()

凡例が見にくい(個人差はあります)。

f:id:dragstarclassic:20180109144517p:plain

ということでlegendの指定にちょっと書き加える。

import matplotlib.pyplot as plt
import seaborn as sns
plt.plot(x, y1, label="legend_1")
plt.plot(x, y2, linestyle="--", label="legend_2")
plt.legend(loc="best", frameon=True, edgecolor="blue")
plt.show()

こうなる。ちょっと見やすくなる(個人差はあります)。

f:id:dragstarclassic:20180109144632p:plain

だいたいは

plt.legend(frameon=True)

こうするだけでだいぶ見やすくなるわけだが、個人的には枠線があると見やすいと思うので、枠線の色も加えた。

他にもオプションがあるので、リンク先のAPIを参考に。

legend and legend_handler — Matplotlib 2.1.1 documentation

seabornは奥が深い

コード

pandasデータフレームをsklearnにぶち込む作法

せっかくirisがデータフレームで使えるようになったのに!!

dragstar.hatenablog.com

pandasからnp.arrayにする

sklearnの引数はnp.arrayとなっているので、pandasのデータフレームからは直接使えない。ということでデータフレームからnp.arrayにする必要がある。

 

  • 指定の列からnp.arrayに変換
df = sns.load_dataset('iris')
data = np.array(df.iloc[:, 0:4]) #4列目までをnp.arrayにする

 

  • 文字列の列を数値に変換しながらnp.arrayにする
target = np.array([0 if i == 'setosa' else 1 if i == 'versicolor' else 2 for i in data.species.values])

 

これでsklearnの分類器に渡せる

clf.fit(data, target)

 

思ったよりも簡潔なコードだけど、データフレームから直接使いたいというのが正直なところ

コード

機械学習の結果を保存する

学習させたモデルを保存しておきたい!

学習結果の保存

要はオブジェクトをシリアライズさせておけばいい。概念としてはオブジェクトを名前を付けてファイルに保存して、使う際にはそのファイルを開いてオブジェクトとして使うというイメージ。

この処理を応用したら、ディープラーニングとかで大量の餌を食わしていく過程で「今日の学習はここまで。明日はその続きを」なんてことが可能になるかもしれない。

ということでpythonには標準でpickle(漬物:特にピクルス)というモジュールが用意されており、これを使えばシリアライズができる。

  • pickle

12.1. pickle — Python オブジェクトの直列化 — Python 3.6.3 ドキュメント

import pickle
target = [1, 2, 3, 4, 5]
fname = 'test.pickle'

print(target)
# [1, 2, 3, 4, 5]

# リストオブジェクトをpickleを使ってダンプ
with open(fname, 'wb') as f:
  pickle.dump(target, f)

# pickleを使ってリストオブジェクトをロード
with open(fname, 'rb') as f:
  target2 = pickle.load(f)

print(target2)
# [1, 2, 3, 4, 5]

 

機械学習ライブラリであるsklearnには、joblibというモジュールが最初から用意してあった。まぁ学習結果の保存はやりたいですよね。ということで方法2

  • joblib

3.4. Model persistence — scikit-learn 0.19.1 documentation

import sklearn.externals import joblib

clf.fit(X_train, Y_train) # clfは何らかの学習モデル
pre1 = clf.predict(X_test)

fname = 'test.joblib'

# joblibを使ってオブジェクトをダンプ
joblib.dump(clf, fname)

# joblibを使ってオブジェクトをロード
clf2 = joblib.load(fname)
pre2 = clf2.predict(X_test)

# pre1とpre2は同じ結果が出るはず(X_trainが同じ値なら)

コード

jupyterによるコードはコチラ。IRISを学習させ、結果を保持しておく。オブジェクトを復元させて同じ結果が出ることが確認できる。