読者です 読者をやめる 読者になる 読者になる

無印吉澤

ソフトウェア開発、運用管理(俗にいう DevOps)、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

艦これアーケードのプレイデータ管理ツール Admiral Stats のソースコード公開のお知らせ

f:id:muziyoshiz:20161011225236p:plain:w600

ソースコード公開しました

艦これアーケードのプレイデータ管理ツール "Admiral Stats" のソースコードを、GitHub で公開しました。https://www.admiral-stats.com/ で動いているのと全く同じものです。

github.com

先日正式リリースされた Ruby on Rails 5 で開発しています。Admiral Stats の開発に興味がある方や、動作の詳細に興味がある方はぜひご覧ください。

gitter のチャットルームも作りました

僕は本当につい最近まで知らなかったんですが、艦これブラウザ版には MyFleetGirls ってツールがあるんですね(完全に Admiral Stats の先人だ……)。ここの開発スタイルを参考にさせてもらって、gitter のチャットルームを作りました。

gitter.im

GitHub アカウントがあれば誰でも入れますので、ご意見・ご要望のある方はこちらにお寄せください。もちろん、お知らせ用の Twitter アカウント @admiral_stats や、GitHub の issue ページにお寄せいただいても OK です。

Admiral Stats の関連記事

Rails 5 での実装の解説と、Admiral Stats の利用状況の分析を過去に書きました。

muziyoshiz.hatenablog.com

muziyoshiz.hatenablog.com

艦これアーケードのプレイデータ管理ツール Admiral Stats を作って公開したら、プレイヤーが多いのか少ないのかわからなくなってきた話

f:id:muziyoshiz:20161011225236p:plain:w600

これまでのあらすじ

艦これアーケードにハマった勢いで、夏休みにプレイデータ管理ツール Admiral Stats を開発し、9/3 にリリースしました。

www.admiral-stats.com

艦これアーケードと、Admiral Stats の詳細については、以前書いた記事をご覧ください。

muziyoshiz.hatenablog.com

簡単に言うと、艦これアーケードとは、艦娘と呼ばれるキャラのカードを集めて、選りすぐりのデッキを作成し、ステージを攻略していくアクションゲームです。数ヶ月に1回、大きなゲーム内イベントがあるので、それに向けてキャラのカード集めやレベル上げをしていくのが主な楽しみ方になります。Admiral Stats はそういう楽しみ方を助ける(主に自分が楽しくプレイする)ことを目的に開発しているツールです。

9/3 のリリースから約1ヶ月が経過しましたが、正直言って、なかなかユーザが増えずに苦戦しています。そこで今回はこれまでの Admiral Stats のアクセスログを解析し、今後の対策を考えようとしたら、よくわからなくなってきた……という話をします。

最近追加した機能

リリース後に追加した機能で、大きな機能は以下の4点です。

  • 9/10:Lv. 99 到達予想日の追加
  • 9/17:本家のデータ形式変更に対応(★の数のインポート、および一覧表示)
  • 9/18:Ruby なしで使える PowerShell 版のエクスポータ(ユーザの @sophiarcp さんが開発してくれた機能の取り込み)
  • 10/7:全艦娘との比較(艦娘カード入手率)ページの追加

特に、9/18 の PowerShell 版のエクスポータ は、利用者増に大きく貢献してくれました。それまでは Ruby 版のエクスポータ(しかも bundler のインストールとか要求する)しか無かったので、そこで脱落する人が多かったと思われます。

また、10/7 に追加した 艦これアーケードの艦娘カード入手率 は、Admiral Stats にプレイデータをアップロードした提督全体に対する、各艦娘カードを入手済みの提督の割合を表示する機能です。例えば、最もレアと言われる「秋月」のカードを、提督全体の何%が持っているか、といったことがわかります。

f:id:muziyoshiz:20161011225334p:plain:w600

これらの機能でユーザ数は増えたのですが、それでもプレイデータを Admiral Stats にインポートしてくれたユーザはまだ 30 名程度となっています。まだまだ少ないですね……。

Admiral Stats の利用状況

Admiral Stats 自体のログと、Google Analytics のデータを元に、利用状況を調べてみました。3行で 4行でまとめると、結果はこんな感じです。

  • Admiral Stats の離脱率は高いが、1回使ってもらえればそこからの定着率はそれほど悪くない
  • Admiral Stats にアクセスしたユーザのデバイスは、おおよそ PC:Android:iOS = 3:1:1 の割合
  • そもそもアクセス数が少ない
  • ユーザ増に一番寄与したのは、1回だけ取り上げてもらったまとめサイト

以下は、その詳細です。

Admiral Stats のログ(9/3 〜 10/9 の 37 日間)

まず、Admiral Stats のログを使って、定着したユーザ数を見ていきます。

利用状況 ユーザ数 ログインユーザ数に対する比率 GA 計測のユーザ数に対する比率
1回以上ログインしたユーザ(以下、ログインユーザ) 107名 - 16.8 %
1回以上データをインポートしたユーザ 30名 28.0 % 4.7 %
2回以上データをインポートしたユーザ 22名 20.6 % 3.4 %
3回以上データをインポートしたユーザ 19名 17.8 % 3.0 %
先週(10/3〜9)に1回以上データをインポートしたユーザ 19名 17.8 % 3.0 %

Google Analytics(GA)で計測したユーザ数に対するログインユーザの比率は 16.8 % でした。1回ログインするだけでも心理的抵抗があると思うので、これは、この種のツールにしてはそこまで低くないと考えています。

また、1回ログインしてくれたユーザのうち、何らかの理由で脱落したユーザが 72 % でした。この脱落率は高いですね……。理由は以下のように予想しています。

  • エクスポータが PC 必須のため、PC を持っていない(あまり使わない)ユーザが使えなかった
  • 使う気にはなったが、エクスポートツールのインストールに失敗した
  • ログインしてみたが、機能が期待したものと違った

3回以上データをインポートしてくれたユーザはそれなりに定着してくれたアクティブユーザである、と仮定すると、アクティブユーザの比率はログインユーザの 17.8 %、1回以上インポートしたユーザの 63.3 % でした。1回インポートしてもらえれば、そのまま定着する割合はまあまあ高いと言えそうです。

Google Analytics のデータ(9/3 〜 10/9 の 37 日間)

PV 数などの基本的な数値は以下の通りです。少ないですね。検索エンジン経由のアクセスはほとんどなく、アクセス元はこのブログに書いた記事、Twitter での宣伝、おーぷん 2ch での宣伝と、そのまとめブログ記事でした。

項目 計測結果
PV 数 3,845
ユーザ 638
セッション 1,328
新規セッション率 47.97 %

じゃあ、定着せずに離脱してしまったユーザはどこから Admiral Stats に来て、どんな端末を使っていたのか? 以下は、集客のサマリーから、Oauth 認証のトラフィックと、(ブックマークなどを介した)直接アクセスを除外したものです。これは、ユーザ定着後のアクセスを除いた、初回アクセスの数に近いと思います。

参照元 デバイス セッション 新規セッション率 新規ユーザ
まとめサイト デスクトップ 167 83.83% 140
Twitter デスクトップ 125 16.80% 21
まとめサイト モバイル 122 90.16% 110
Twitter モバイル 97 92.78% 90
おーぷん 2ch デスクトップ 59 27.12% 16
おーぷん 2ch モバイル 37 70.27% 26
はてなブログ(このブログ) デスクトップ 27 40.74% 11

Admiral Stats は PC のみ対応(モバイルは表示のみ対応)なので、デスクトップの新規ユーザ獲得が大事なのですが、その点で一番強かったのは1回だけ取り上げてもらえたまとめサイト(【艦これアーケード】プレイデータ管理ツールを作ってみた : 艦これアーケードまとめ速報@艦アケ 艦これAC)でした。Twitter もアクセスは多いのですがモバイルが主体で、デスクトップの新規ユーザは少なく、なかなか厳しいです。

なお、iOS と Android の比率は、若干 Android のほうが多いもののほぼ同率で、どちらか一方だけ対応すればよいという状況ではなさそうでした。

艦これアーケードのプレイヤーってどれくらいいるの?

とりあえず定着率は改善すべきことがわかりましたが、そもそもアクセス数が少ないこともわかりました。

アクセス数が少ないってことは、プレイヤーにリーチできてないのか、そもそもプレイヤー自体が少ないのか? そもそも、艦これアーケードのプレイヤーって実際に何万人くらいいるんだろう?と疑問に思い、手に入る情報の範囲でプレイヤー数を見積もってみました。

Admiral Stats のデータから推測 → 7,000 人

せっかくなので、まずは Admiral Stats のデータを使って推測してみます。

艦これアーケードのプレイヤーズサイトには「暫定順位」という項目があり、ここに全国での順位が表示されます。ただし、順位が低すぎると「圏外」と表示されます。集まったデータを見る限りでは、暫定順位は 3,000 位くらいから下になると「圏外」と表示されるようです。ちなみに、僕は週1回ゲーセンに通う程度なので、「圏外」以外の表示を見たことないです。

f:id:muziyoshiz:20161011225746p:plain
(プレイヤーズサイトより抜粋)

Admiral Stats のデータを調べてみたところ、9月に1回以上データをインポートしている提督は21名で、9月末時点の暫定順位は以下の通りでした。

  • 3,000 位以内:9名
  • 圏外:12名

もし、艦これプレイヤー全体もこれと同じ比率に従うなら、9月のプレイヤー数は 7,000 人、ということになります。ただ、さすがにそんなに少ないわけないですよね……。

Admiral Stats を使ってくれているユーザには(こんな地味なツールに興味を持ってくれるくらいなので)ライトユーザはあまりいないので、コアユーザに比率が偏りすぎているのだろうと思います。この推測は置いておいて、別の方法を試してみます。

ゲーセンの混み具合と設置店舗数から推測 → 約 37,000 人

僕は土日しかゲーセンに行かないので、平日の状況はわからないのですが、土日に行くと無制限台はだいたい埋まっていて、制限台は半々くらいで空いている印象です。

公式サイトの設置店舗検索 にある店舗がすべてなら、艦これアーケードの設置店舗数は10月11日現在で 652 店舗です。

各店舗への納品数はわかりませんが、僕がよく行く地域のゲームセンターを例に上げるとそれぞれ 10, 2, 4, 4, 4 台で、平均 4.8 台設置されています。まずはこの値で概算すると、全国に筐体が 3129.6 台あることになります。あとは、少し雑ですが、以下のような仮定を置きます。

  • 筐体の主な稼働時間は9時〜21時間の12時間で、各筐体とも、その半分の6時間はプレイされている(半々くらいで空いている印象から)
  • 1人あたりの、1日のプレー時間は1時間
  • 一般的なプレイヤーは土日どちらかの1回だけ来る
  • 平日来るようなランカーは土日も当然来るだろうから、平日の分は無視

この仮定に基づくと、現在も艦これアーケードをプレイしているプレイヤー数は 652 * 4.8 * 6 * 2 = 37,555 名となります。うーん、こっちのほうが実体に近いですかね。

公式サイトからの推測 → ??

意外なことに、艦これアーケード専用の Twitter アカウントは存在せず、元々あった艦これの Twitter アカウント 「艦これ」開発/運営(@KanColle_STAFF) が艦これアーケードの告知も兼ねています。ブラウザ版とアーケード版でアカウントが分かれていれば、フォロワー数からプレイヤー数を見積もれたんですけどね。

他の公式サイトとしては、Admiral Stats もお世話になっている SEGA の艦これアーケード プレイヤーズサイト があります。

余談ですが、最近このプレイヤーズサイトで、SEGA IDを登録するとプレゼントが貰えるキャンペーンをやっていました(敵泊地への突入!準備キャンペーン)。こういうキャンペーンをするということは、プレイヤー数と比較して、プレイヤーズサイトを使っているユーザはあまり多くないのかもしれません。

Wiki からの推測 → ブラウザ版の 100 分の 1

艦これアーケードに関する Wiki はいくつかあり、アクセスが多いのは以下の2つのようです。

前者の PV はわからないのですが、後者はサイドバーの一番下にアクセスカウンタがあり、10/9(日) の PV は 1,251 でした。艦これブラウザ版の Wiki の同じ日の PV は 127,706 で、艦これアーケード版の約100倍でした。

この差はプレイヤーの規模を表してるのでしょうか? それとも、アーケード版はブラウザ版ほど難しくないから、Wiki のニーズが低い、というだけなのでしょうか。アーケード版でイベントが始まったら、また状況は変わるかもしれません。

まとめサイトからの推測 → ブラウザ版の 8 分の 1

ブラウザ版のまとめサイトは複数ありますが、艦これアーケード専用のまとめサイトで、きちんと編集されていそうなのは1個くらいしか見当たりませんでした。元々あるまとめサイトが(公式 Twitter と同様に)ブラウザ版とアーケード版の両方の話題を扱っているため、新規参入が難しいのかもしれません。

まとめサイトのPV数はわかりませんが、Twitter のフォロワー数を比較すると、10/10時点で 艦これアーケードまとめ速報@艦アケ (@kancolleAC) のフォロワー数が 15,700、艦これ速報(@kancollect) のフォロワー数が 123,250 で、こちらは約8倍の差のようです。

ちなみに、Admiral Stats は1回だけまとめサイトに取り上げられたのですが、艦これ界隈ではツール関係の話題は嫌がられるようで、それ以降はスルーされています。宣伝方法として、まとめサイトに頼るのはちょっと難しそうです。

ブラウザ版とアーケード版のユーザ比からの推測 → 約 50,000 人

ブラウザ版のプレイヤー数は非公開ですが、先人の動向分析では MAU(Monthly Active User、月間の総ログインユーザ数)が約40万人と推測されています。

このデータを使えば、ブラウザ版とアーケード版のユーザ比さえわかれば、アーケード版の MAU を推測できます。

人気の比較手段の定番として、Google Trends で人気度を調べてみました。上のグラフは「艦これアーケード」のみ、下のグラフは「艦これアーケード」と「艦これ」の、2016年4月28日(艦これアーケード稼働開始日)以降の比較です。

人気度の平均値は 艦これアーケード:艦これ = 5:47 でした。「艦これ」に「艦これアーケード」も含むと考えると アーケード版:ブラウザ版 = 5:42 で、つまりブラウザ版はアーケード版の約 8.4 倍となります。奇しくも、まとめサイトのフォロワーの比率に近くなりました。

以上から、ブラウザ版の MAU はアーケード版の約 8 倍と仮定すると、アーケード版の MAU は約 5 万人となります。

その他、攻略サイト、ブログなど

定量的でない比較としては、アーケード版はブラウザ版と比べて、ユーザ発のコンテンツがほとんど無いような気がします。

例えば、ブラウザ版の攻略サイトに当たるものは、アーケード版についてはあまり見当たりませんでした。"艦これアーケード" "攻略" でググると 約 356,000 件 (0.46 秒)と表示されるのですが、その大半が Wiki のようで、ページをめくっていくと(似たページを除外した状態では)7 ページ目までしか出てきませんでした。

あとは、ニコ動や YouTube に、解説動画や、単艦プレイ動画などが挙がっていて、参考になるものもたくさんあるのですが、それほど数は多くありません。アクションゲームなのでプレイ中の記録が難しいのと、SEGA 公式が撮影 OK としてないので、ユーザ主体のコンテンツもなかなか出にくいのでしょうか。

まとめ:Admiral Stats がこの先生きのこるためには

長くなりましたが、艦これアーケードのプレイヤー数としては 3 〜 5 万人くらいが妥当な推測に思えます。Admiral Stats としてはその 1 % の 300 〜 500 人くらいを目標に頑張りたいところです。

今後の予定としては、PC ユーザの定着率を上げるためにエクスポータを使いやすくし、検索エンジン経由のアクセスを増やすために 艦これアーケードの艦娘カード入手率 のようなコンテンツを増やそうと思います。あとはイベント対応で何か面白い機能が浮かんだら突っ込みたいですね。

根本的にはスマホ対応しないとユーザ増は難しそうですが、僕にそのスキルがないのと、非公式ツールなので審査を通らない気がするため、着手すべきか悩んでいるところです……。

ともあれ今後もいろいろ機能追加していきますので、艦これアーケードをプレイ中の提督は是非一度使ってみてください。ただ、プレイデータのエクスポートに非公式ツールを使わざるを得ない関係上、利用は自己責任でお願いします。

www.admiral-stats.com

github.com

Ansible の --extra-vars 引数を安全に使うためのラッパーを書いてみた

f:id:muziyoshiz:20160313233740p:plain

最近は、仕事でも趣味でも、サーバ構築を自動化したいときは Ansible を使ってます。

アプリケーションのデプロイには Capistrano も使うんですが、つい最近 Ansistrano という便利な Ansible role の使い方を覚えてしまったので、そこも Ansible で済むようになりました。

recruit.gmo.jp

ansible-playbook の --extra-vars 引数

ところで、Ansible の playbook を書いていると、「普段の動作は決まっているけど、ごくまれに違う動作をさせたい」ことがたまにありませんか? そういうとき、僕は ansible-playbook の --extra-vars 引数(-e 引数)を良く使います。

例えば、自作のアプリケーションをデプロイするための playbook で、「普段は master ブランチをデプロイするけど、たまに違うブランチをデプロイしたい」ことがあったとします。そういう場合、playbook のなかで version 変数を、

- hosts: apservers
  vars:
    version: master

のように定義しておいて、master ブランチをデプロイしたい場合は --extra-vars 引数なしで実行します。

$ ansible-playbook -i inventory deploy-app.yml

そして master 以外のブランチをデプロイしたい場合だけ、以下のように --extra-vars 引数を使ってブランチ名を指定します。

$ ansible-playbook -i inventory deploy-app.yml --extra-vars="version=develop"

Ansible 公式の Variables にある通り、あらゆる変数指定のなかで --extra-vars の指定は最優先されます。そのため、このような上書きが可能なわけです。

--extra-vars のデメリット

この方法はだいたいうまくいくのですが、「変数名を間違えても何のアラートも出ない」というデメリットがあります。

例えばつい最近、僕が書いた playbook を使ってアプリをデプロイした同僚から、「develop ブランチを指定したのに master ブランチがデプロイされてる。playbook がバグってないか?」と言われたことがありました。何か実装間違えたかな、と思って彼が実行したコマンドを見たら、こうなっていました。

$ ansible-playbook -i inventory deploy-app.yml --extra-vars="develop"

調べてみたところ、これは無効な変数指定として ansible-playbook に無視されるようです。その結果、version 変数はデフォルトの master のままで、master ブランチがデプロイされました。その同僚はどうも「引数でブランチ名を変えられる」程度の理解だったようです。

そのときは同僚に --extra-vars 引数の使い方を解説して終わったのですが、あとから考えてみると、--extra-vars で動作を変更させること自体が危険なんじゃないか? という気がしてきました。今回は引数の使い間違えでしたが、引数の使い方を理解していても version を versoin と書き間違えてしまうくらいは、普通にありそうです。

--extra-vars の代替案としての vars_prompt

--extra-vars の代替案としては、Prompts に説明のある vars_prompt を使うという方法があります。

vars_prompt は、playbook の実行後に、変数入力のプロンプトを表示するためのオプションです。例えば、playbook に、

- hosts: apservers
  vars_prompt:
    - name: "version"
      prompt: "Branch name?"
      default: master

と書いておくと、playbook の実行時に以下のプロンプトが表示されます。そのまま Enter キーを押せば version 変数に "master" が代入され、ブランチ名を入れればそちらに変わります。

Branch name? [master]:

これでまあ確かに安全になるので、多くの場合は vars_prompt を使うのがよいと思います。

ただ、master ブランチをデプロイするのが大半、というケースでは Enter キーを無駄にぺちぺち押さないといけないのが面倒です。また、カスタマイズ可能な変数がもっと多い場合は、その変数の数だけ Enter キーをぺちぺち押さないといけなくなります。何も考えずに Enter キーをぺちぺち押す習慣ができるのは、またなにか別の障害の原因になりそうで嫌な感じです。

--extra-vars を安全に使うためのラッパー ansible-playbook-se

さっきの同僚の例について考え直してみると、要するにあれは "develop" という僕の想定しない変数名を、ansible-playbook コマンドが受け入れてしまったのがいけなかったわけです。

それなら、--extra-vars 引数に指定できる変数名を限定できれば、それで十分安全になるのでは? そう考えて、ansible-playbook コマンドのラッパー "ansible-playbook-se" を試作してみました。最近覚えた Python 3 で実装し、GitHub にソースコードを置いておきました。

github.com

使い方はまず、このリンク先にある ansible-playbook-se と extra-vars-cheker を、どこかパスが通ったところに置きます。

次に、playbook が置いてあるのと同じディレクトリに、以下のような内容で extra-vars.yml という名前のファイルを作ります。このファイルには、playbook のファイル名と、各ファイルが --extra-vars で指定するのを許す変数名を書きます。

---
deploy-app.yml:
  - version

そして、いつも使っている ansible-playbook の代わりに、ansible-playbook-se を使うようにします。そうすると、想定外の変数が指定された場合、ansible-playbook-se は以下のようなエラーを出して、処理を中断します。

$ ansible-playbook-se -i inventory deploy-app.yml --extra-vars="develop"
ERROR: Invalid extra-var format: develop
ERROR: extra-vars-checker Failed.

安全になりましたね? なりましたよね? でも、これはこれで何だか面倒な気がしますね……。

試しに作ってはみたのですが、まだ実際の環境には導入していません。こういうニーズって、他の人にもあるもんでしょうか? もしニーズがあればもう少しちゃんと作ろうと思うので、ご意見お待ちしています。

機械学習初心者が『Python 機械学習プログラミング』(速習コース)を読んだメモ

f:id:muziyoshiz:20160924124311p:plain

きっかけ

機械学習の重要性は、それこそ「ビッグデータ」という言葉が出てきた頃からいろいろな人が訴えていますが、最近は特にツールが充実して、敷居が下がってきたように感じています。

そろそろ自分でも機械学習関係のツールを使えるようになりたいと思っていたのですが、そんなときに「具体的なコード例が多くて読みやすい」という本書の評判を聞いて、読み始めました。

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

まだ、ツールを使いこなせるレベルには全然届いていないのですが、試したことを記録しておかないと忘れてしまいそうなので、一旦メモをまとめておきます。

この記事を書いた人のレベル

私のレベルはこんな感じです。

  • 大学は情報科学科で、線形代数とか勉強したはずなのに、数学のことはほとんど忘れている
  • プログラミング言語の知識はあるが、Python のコードは書いたことがなく「ブロックをインデントで表現するやつ」程度の認識

今回の読書プラン

読み始める前に書評を色々検索して読んでたのですが(気後れしていたとも言う)、そのなかに、翻訳の福島さん自身が、本書の読み方をアドバイスする記事がありました。

thinkit.co.jp

この記事の3ページ目で、「速習コース」と「特訓コース」という2通りの読書プランを紹介されています。「全部読まなくて良い」というので少し気が楽になり、まずは速習コースに従って一通り読みました。

f:id:muziyoshiz:20160924124421p:plain:w600
速習コースのフロー
f:id:muziyoshiz:20160924124447p:plain:w600
特訓コースのフロー

Python 環境の構築

本書にコード例がふんだんに含まれており、すべて 本書の GitHub (rasbt/python-machine-learning-book) で公開されてます。しかも Jupyter Notebook の .ipynb ファイルで公開されているので、Web ブラウザ上からすぐに実行できます。今風ですね。

github.com

そこで、まずは Jupyter Notebook を動かすために必要なソフトをインストールします。Python 本体はもちろん、科学計算向けのライブラリもいくつかインストールする必要があります。

本書にはインストール方法はあまり書かれておらず、『Python機械学習プログラミング』学び方ガイド で紹介されている データサイエンティストを目指す人のpython環境構築 2016 - Qiita にも、Mac での手順はあまり詳しく書かれていませんでした。つまづいたポイントがいくつかあるので、自分の環境でのインストール手順をメモしておきます。

インストール先の環境

今回のインストール先は以下の通りです。次の MacBook Pro が出たら OS を乗り換えよう、と思っていたら、未だに Yosemite を使ってしまってる始末……。

  • OS X Yosemite 10.10.5
  • MacBook Pro (Mid 2014)

Anaconda (Python 3) のインストール

本書にも「科学計算に特に推奨したい Python ディストリビューションの1つに Anaconda がある」と書いてあったので、Anaconda をインストールしました。Mac に元々入ってる Python は使いません。

Mac上にデータ分析で使用するAnacondaをインストールし、IDEを起動するまで - Qiita を参考に、pyenv を入れてから、その上に Anaconda をインストールします。

Homebrew が入っていれば、以下のコマンドで pyenv がインストールされます。

% brew install pyenv

ただ、この状態で、

% pyenv install --list | grep anaconda

を実行したところ Anaconda 4.0.0 までしか選択できませんでした。Anaconda のダウンロードページ を確認したところ、その時点での最新版は Anaconda 4.1.1 だったのに……。

で、ここ最近 brew update を実行してなかったことに気づき、以下のコマンドを実行。

% brew update && brew upgrade pyenv

これで Anaconda 4.1.0 まで選択できるようになりました。最新ではないのが若干気になりますが、まあ Homebrew 対応に時間差があるのだろうと考えて、以下のようにインストール。デフォルトで Anaconda が使われるように設定しました。

% pyenv install anaconda3-4.1.0
% pyenv global anaconda3-4.1.0
% pyenv rehash

そして、Anaconda のなかでのパッケージ管理に使われる conda をアップデート。何かの記事を参考に実行したと思うのですが、これは必要なかったかもしれません(参考元ページを探し直したのですが見つからず)。

% conda update conda

科学計算に関するライブラリのインストール

本書 p.14 には、以下のパッケージが必要と書かれていました。

  • NumPy
  • SciPy
  • scikit-learn
  • matplotlib
  • pandas

これらを以下のコマンドでインストールします。元々 Anaconda に同梱されているものもありましたが、最新版にアップデートされました。

% conda install numpy scipy scikit-learn matplotlib pandas

サンプルの実行に必要なライブラリのインストール

本書を読みながらコード例を実行したところ、12〜13章のコードを実行するのに、以下のパッケージも必要になりました。

  • Theano
  • Keras

これらも conda install theano keras でインストールできると思いきや、インストールできませんでした。anaconda search -t conda theano を実行しろ、というメッセージが表示されますが、osx-64 向けに個人がビルドしたと思われる Threano が43個も見つかる始末。

最終的には Installing Theano — Theano 0.8.2 documentation の手順に従って、以下のコマンドを実行してインストールしました。

% pip install Theano

Theano のページには conda install pydot-ng も実行するように、と書いてあるのですが、私の環境では以下のエラーが出てインストールできませんでした。ただ、これをインストールしなくてもサンプルは動いたので、そのまま使っています。

% conda install pydot-ng
Using Anaconda Cloud api site https://api.anaconda.org
Fetching package metadata .......
Solving package specifications: ....

The following specifications were found to be in conflict:
  - pydot-ng
  - python 3.5*
Use "conda info <package>" to see the dependencies for each package.

Keras のほうは以下のコマンドでインストールできました。

% pip install keras

ただ、このインストール後にサンプルコードを実行すると、

from keras.utils import np_utils

の行で、ImportError: No module named 'tensorflow' というエラーが発生してしまいました。サンプルコードで TensorFlow は使ってないはずなんですが……。TensorFlow のダウンロードページ を参考に、以下のコマンドで TensorFlow をインストールしたところ、このエラーは出なくなりました。

% conda install -c conda-forge tensorflow

あと、サンプルの実行に必須ではないですが、notebook の先頭でソフトウェアのバージョン番号を表示したい場合は watermark のインストールも必要です。

% pip install watermark

サンプルの実行

サンプルは GitHub で公開されているので、git clone でコピーします。

% git clone https://github.com/rasbt/python-machine-learning-book.git

あとは jupyter notebook で Jupyter Notebook を起動し、code ディレクトリ以下にある ipynb ファイルを開けばコードを実行できます。

Jupyter Notebook の使い方については、本書の付録A「Jupyter Notebook の基本的な使用方法」と、Jupyter事始め - Qiita を参考にしました。メニューバーから Cell → Run All で動く、ということさえわかれば普通に使えると思います。私は、コードが書かれたセルを選んだ状態でないと Run Cells を押しても何も起こらない、ということに気づくのに結構時間がかかりました……。

それ以外の方法としては、jupyter console で CLI を開いて、ここにコードをコピーして実行するのも良いと思います。変数の中身を1個ずつ確認しながら実行するのは、GUI よりも CLI のほうが楽な気がしました。

例えば、サンプルコードを実行してると、これは Python 標準のオブジェクトなのか、科学計算ライブラリ固有のオブジェクト(例えば NumPy 固有の、多次元配列を表す ndarray など)なのか、知りたくなることがありました。そういうときは、コンソールで変数名の後に "?" を付けると、以下のようにオブジェクトの説明が表示されて便利です。

% jupyter console
Jupyter Console 4.1.1


In [1]: from sklearn import datasets

In [2]: iris = datasets.load_iris()

In [3]: X = iris.data[:, [2, 3]]

In [4]: X?

Type:            ndarray
String form:
[[ 1.4  0.2]
           [ 1.4  0.2]
           [ 1.3  0.2]
           [ 1.5  0.2]
           [ 1.4  0.2]
           [ 1.7  0.4]
           [ 1.4  0.3]
           [ 1.5 <...>  1.9]
           [ 5.9  2.3]
           [ 5.7  2.5]
           [ 5.2  2.3]
           [ 5.   1.9]
           [ 5.2  2. ]
           [ 5.4  2.3]
           [ 5.1  1.8]]
Length:          150
File:            ~/.pyenv/versions/anaconda3-4.1.0/lib/python3.5/site-packages/numpy/__init__.py
Docstring:       <no docstring>
Class docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
        strides=None, order=None)
(以下、ndarray の docstring)

サンプルコードを実行していて引っかかったところ

速習コースのサンプルコードを実行していて、ライブラリのインストール不足以外では、以下のポイントでエラーが出ました。DeprecationWarning もいくつか出ましたが、そちらについては今回は触れません。

3章

Notebook の冒頭で以下のエラーが出ました。

DistributionNotFound: The 'sklearn' distribution was not found and is required by the application

これはパッケージ名の記載ミスのようで、

%watermark -a 'Sebastian Raschka' -u -d -v -p numpy,pandas,matplotlib,sklearn

を以下に書き換えたところ、エラーが出なくなりました。ちなみに、他の章の notebook は元々こうなってました。

%watermark -a 'Sebastian Raschka' -u -d -v -p numpy,pandas,matplotlib,scikit-learn

12〜13章

以下の場所で FileNotFoundError が出ます。

X_train, y_train = load_mnist('mnist', kind='train')
print('Rows: %d, columns: %d' % (X_train.shape[0], X_train.shape[1]))

git clone でファイルをコピーしていれば、code/datasets/mnist ディレクトリに gz ファイルがあるので、このディレクトリを丸ごと code/ch12/mnist(または code/ch13/mnist)にコピーし、gunzip で解凍しておけば OK です。

Python の勉強

コードを一通り動かしてみたものの、コードを読んでいるうちに

  • このコードはどこまでが Python の標準機能で書かれているのか?
  • やたらたくさんライブラリを使っているが、どの部分がどのライブラリの機能なのか?
  • というかこのやたら出てくるコロンは何なの?
  • カギ括弧のなかに for だの in だの書いてあるのは何なの?

などなど、機械学習の理論よりもコード自体のほうが気になってくる始末(逃避とも言う)。で、本屋に行って Python の本をいくつか眺めてみて、読みやすそうだった「入門 Python 3」を買ってきました。

入門 Python 3

入門 Python 3

サンプルコードに関する疑問点は、これの1〜7章と、付録C「科学におけるPy」を一通り読み終わったあたりで、ある程度解決できました。例えば以下のようなあたり。

  • 多次元配列にカンマ区切りの a[1, 2] でアクセスできるのは、Python 標準のリストではなくて、NumPy の ndarray を使ってるから。標準のリストを使っていたら a[1][2] のようにアクセスする必要がある。
  • a[:] のようにコロンを使ってるのは Python 標準の「スライス」。list[start:end:step] という文法でリストの一部を取得できる。返り値に end の要素は含まれない。
  • カギ括弧のなかに for だの in だのあるのは Python 標準の「リスト内包表記」。for 文でイテレータを回した結果をリストで返す、ということを短縮形で書いているだけで、for 文の入れ子も書ける。

1〜7章だけなら読むのに1日もかからない分量なので、Python 初心者にはお薦めです。それと、付録Cに ipython3 コマンド(jupyter console コマンド)の便利機能の紹介があったのは、個人的には非常に助かりました。

あとは、本書に載っていた参考 URL(下記)も読まなきゃ、と思いつつ、こちらはまだほとんど読めてません。

速習コースを読んでみた感想

説明が平易に書かれており、図も豊富なので、数式を読み飛ばしても、何ができるのかはなんとなく理解できました。また、Jupyter Notebook でコードを動かしながら確認できるので、数式だけ追うよりは、だいぶ気楽に読めました。

Python は科学計算関係のライブラリが充実しているとは聞いていましたが、短いコードでこんなにたくさんのことができるのか、と驚きました。例えば、3章に、

y_pred = ppn.predict(X_test_std)
print('Misclassified samples: %d' % (y_test != y_pred).sum())

というコードがあって、この (y_test != y_pred).sum() ってなんだ?と思ったら、これは2つの行列を比較した結果を bool の行列として取得し、さらに True の要素数を数えて返してるんですね。短いコードでこんなにたくさんのことができるのか、と驚きました。

ただ、一通り読み終えたものの、理解が中途半端なので、現状はこんな感じです。

  • いろいろな手法が紹介されているが、どういうときにどの手法を使えばよいかが、まだよくわからない
  • 実際の業務に使うとしたら、数式の部分をどこまで理解していれば十分なのか不安

なにか、身近の現実的な問題にツールを適用して、ツールにもう少し慣れたいところです。あと、最近職場でこの本の読書会をやろうという話が出てるので、何度か読み返して理解を深めたいと思います。

とりあえずの目標は、scikit-learn のサイトにある Machine Learning Map の範囲を、ツールとして一応使えるレベルかな……。

f:id:muziyoshiz:20160926132822p:plain:w800