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

Lean Baseball

Engineering/Baseball/Python/Agile/SABR and more...

1月をふりかえる - 転職後どうなの?&野球統計の授業ほか

日記

久々に日記らしい日記を書こうと思います.

こんばんは,野球の人です.

嵐のように過ぎ去った1月をふりかえりつつ,2月のことをちょこっと書こうと思います.

ポエムではありませんがほぼほぼ自分メモに近い内容ですのでちょっと読みにくかったらごめんなさい.

日記のテーマは,

  • RettyにJOIN後1ヶ月のあれこれ
  • 野球統計学の授業を受けました
  • Pythonのあのエントリーと今年のPythonistaな活動について
  • プライベート&2月について

です.

RettyにJOIN後1ヶ月のあれこれ

自分の意志と周りの助け,そして様々なご縁があってRettyにJOINしたことは先月(¼)のエントリーでご報告させてもらいました.

shinyorke.hatenablog.com

1/10からJOINして約一ヶ月経過した,今のステータスと気持ちをつらつらっと書きます.

野球の人はRettyで何をしているのか

転職エントリーでは具体的に何をしているか?の言及は無かったので,ここで改めて.

現在(2/7)現在での自分の役割は,

  • 主にお店さん*1が使うサービスのエンジニアチームのLead Engineer(Tech Lead)
  • DevOps/Agile/Scrumといったプロセス・アプローチを使った開発チームのコミュニケーションや業務改善
  • 採用系エンジニア兼IT芸人エンジニアちっくな広報

その他,インターンさんのメンター(予)や社内の機械学習もくもく会(Python)のプロデュースなど,エンジニアがやりそうな役割はほぼやってる感あります.

お店さんが使うサービスのLead Engineerとしては,

  • チームのスクラム化(ほぼほぼScrum master業務)
  • 技術負債の解消やKPI・数値の見える化
  • Webサイトそのものの安定稼働のためのプロダクトオーナー業務

というかんじで日々奮闘していて,スクラムの役割的には,

7:1:2(Scrum master:Product Owner:Engineer)

ぐらいの比率で帽子をかぶり変えつつやってます.

なお,チームについてはみんな学習ややることの吸収が早く,プロダクトオーナーが強烈なオーナーシップを握ってくれる&ほぼ99%の事を任せてもらえているため,史上最高にやりやすいです.

また,DevOps/Agile/Scrumなお仕事は他のチームにも入ってやっていて(社内アジャイルコーチ的な役割が近いかも),こちらのお陰で自チーム以外とのコミュニケーションがとれたり,お互いの認知が早くなったりと早くも効果がでている気がします.

そして前職から引き続き担当させてもらっている採用系エンジニア&広報エンジニア業では(Pythonエンジニア仲間を増やすため?)PyData.TokyoでLTをキメたり,

社内勉強会で公開してかなりいい感じだったアジャイル導入&スクラムやろうぜ!な勉強会資料を公開したりなど,チームRettyの協力の元様々な事をさせてもらっています.

www.slideshare.net

www.slideshare.net

「全部お前のLTじゃねーか!」というツッコミはさておき(笑),資料の磨き込みやアドバイスなどで全員が協力してくれたり,資料公開については大変オープンで寛大なところがあったりと,「広める努力」「協力を惜しまない心」は本当に凄いなと感心しました.

そんな一ヶ月はこんな出来事もあったりしてまあ良かったのでは満足(とほんの少しの悔しさ)を感じています.

今月は本気で月間MVPめざしてがんばります(真顔)

JOIN後のHappyとTry

JOIN後のHappy(良かったこと)とTry(がんばる)ところをサクッと.

Happy

「信じてまかせる」文化

JOINして数日の私にいきなり採用の仕事が回ってきたり,スクラムマスターとして必要な道具や権限をプロダクトオーナーに相談→即答でOK…などなど,

User Happyのために必要なことはすべて信じて任せてくれる文化は素晴らしいと思いました.

いままでのチームはしばらくの間権限無かったり承認リレーが続いたり等など大変でしたが,すべてを信じて任せてもらえるお陰でスピーディーかつ熱量が下がる前にミッションをDone!できたりととても気持ちが良かったです.

「とにかく話す・対話する」「お互いの話を聞く」やさしい世界

対話・話す・相手を尊重する,と言ったところが全メンバーに浸透しており,何か議論になったときにもしっかりお話を聞き,咀嚼して対話するという事がシンプルにできていると思いました.

また,普段のコミュニケーションはSlackで行っているのですが,オリジナルのスタンプやスレッド機能を上手く使って腹落ちするまでコミュニケーションをとっており,「うやむやのままで終わる」事が殆どないことに驚きを感じました.

Try

木を見て森を見る習慣を浸透させる,プロセスで

隣のチームやプロダクトを巻き込みながら成長する,Rettyでは「Ownership」と呼んでいるWayがあってこのお陰で成長はしてる実感はある一方,「巻き込み」の為の情報取得にコストが掛かってる感があるので,こちらは徹底的な見える化や文化づくりでもっと楽に・もっと巻き込みを進めたいなあと思っています.

これは結果がでたらアジャイルな文脈で外に出られたらいいなと夢想しています(個人の見解です)

ゼロベースで大きく考える

日々のKPIやQuarterのミッション,だけでなく「ゼロから考えて物事を大きく考える・推進する」ような「ゼロトゥーワン」な考え方もちょっと入れていきたいなと.

RettyのWayにも「Think Big」という項目があるので,もっと大きく考えて動いていければなと思っています,すっごくコミュニケーションがとれていいチームなので.

野球統計学の授業を受けました

恒例の野球Hack(野球×Python)の完成度をより高めるため,2017年に入ってからこんな講座を受けていました.

www.wuext.waseda.jp

野球データ分析・統計専門の組織DELTAのノウハウを教える1時間半×4コマの授業をつい先日(2/4)まで受講していました.

内容はセイバーメトリクスや日本プロ野球の2017年展望,野球統計モデルの基礎といった内容で,授業の内容そのものはNDAなので触れることはできませんが,大凡以下のエントリーに書いてること・本を理解できたら普通にわかるんじゃないか?という内容でした.

shinyorke.hatenablog.com

shinyorke.hatenablog.com

今思えば独学&野球Hackで授業の内容の7割程度を理解してたことをココに素直に報告します*2…が,ゼロから学びたい方にとっては安い授業料で濃厚な時間を過ごせるかと思うので,ホントにオススメです!

Pythonのあのエントリーと今年のPythonistaな活動について

「あのエントリー」の顛末

前回のエントリーが予想以上にバズり,とても驚いた&感謝しています.ありがとうございます(._.)

shinyorke.hatenablog.com

このエントリーの構想は去年の10月(PyCon JP 2016終了後)から密かにあったのですが,PyCon mini Hiroshimaや転職活動,プライベートのバタバタが続き書けなかった→年明け転職終わった後に「まあ200ブクマは集まるんじゃないか」という思いで書いた結果想像以上の大ヒットになりました(震え声)

個人的には,

  • プログラミング学習はそもそもどこからはじめるべきかを整理したかった,もっというと「本を読むだけが勉強じゃないんじゃ!」ってのを大きな声で言いたかった.
  • 「本当にプログラミングする必要あります?」「なんでPythonである必要があったのか?」などなどを自問自答するようなフローが欲しかった.
  • 人に会ったり相談を受けるたびに「Pythonはじめたい」と聞かれ同じ答えを334回(誇張)言うのに疲れた.

というテーマで一気に書き上げてホント良かったと思っています.

今年のPythonistaな活動(予定)

仕事でもPythonはちょこっと触りますが,まあやっぱり野球はやりたいなと思っています.

そして,Rettyでは「魚料理担当」という大好きかつ大きいワードの担当になったので,

魚料理×Pythonでなんかやるブログ

Pythonで作りたいと思っています.

なおキッカケはこちらです.

という訳でMezzanine*3デビューしようと思います.

mezzanine.jupo.org

プライベート&2月について

プライベート

1月にあったこと.

  • 転職祝をたくさん頂いた,ありがとうございました!!
  • Retty魚料理担当になったんだから!!!…という感じでいくつか飲み会をやってもらったりお店を紹介してもらった.いい寿司食ったり,野球の授業終わりに行った「焼鳥には打順があってレバーは3番」「南蛮漬けは総合格闘技」という謎理論が出てきた八丁堀の夜は最高だった.
  • 何故か2kgほど痩せた,いいもの食ってるのに.

2月(抱負)

  • 月間MVP目指して頑張りたい
  • PythonのためにMezzanineを覚える&Deep Learning本を読了する
  • しっかり体のケアして健康に過ごす

まだまだ寒かったり変な天気だったりするので健康には気をつけよう!

お後がよろしいようで.

*1:一般用語だと「クライアント」「店舗」なのですが,User Happyを大切にするRettyでは「さん付け」で呼んでいます.ちなみにユーザーは「ユーザーさん」です.

*2:受けてムダではなかったけどもうちょっと歯ごたえほしかったなあ…実際に計算するとかそういうのを期待してたのに残念

*3:一言で言うと「PythonWordPress」という感じのCMSDjangoがベースになってます&日本でも幾つか運用事例があるそうです.WordPressに疲れたのでPythonを(真顔)

初心者がPythonを覚える為の本の選び方を体系化してみた(2017版)

Python プログラミング

こんにちは.野球(とグルメ)の人です.

会社と仕事はメッチャ楽しいのですが,今日はそれと関係なくPythonの話題を久々に.*1

昨年から,「AI(えーあい)」だの「でぃーぷらーにんぐ」だの「機械学習」といったワードとともにPythonを覚えようとしている方が多いらしく,

  • 何から学ぶべきか
  • 何の本がオススメか
  • 簡単に覚えて僕もいっちょ前に「えーあい」したいのだが!

みたいな質問を公私共々沢山いただく機会が多くなりました.*2

今まで学んだ・実践したPythonの学び方・本を整理するのにいい機会だ!

...ということで,

  • レベル別の本の選び方
  • オススメ書籍(三行レビュー付き)
  • イベントや勉強会との付き合いかた

について一筆書きたいと思います!

免責事項

前触れもなく書くとマサカリが飛んできそうなので一応書いときます.

  • あくまでも個人(shinyorke)の見解です,この内容が正解・銀の弾丸ではありません.
  • 世の中にある全てのPython本・イベントを網羅しているモノではありません.「取り上げられていない書籍/イベントがダメ」ということではないのであしからず!
  • 所属企業・組織および,参加している団体・組織は一切関係ありません.
  • その他書いてないことも私(shinyorke)個人の見解です.

基本的に私の経験で書いてるものなのでご意見・フィードバックお待ちしております.

初心者がPythonを覚える為の本の選び方を体系化してみた(2017版)

というわけで,体系化してみた絵がこちらになります.

中身は順を追って解説します.

f:id:shinyorke:20170115161603p:plain

学習のポイント(または避けられない選択)

PCの有無

言わずもがなですね.

環境は直接Pythonをインストールしたり,Cloud系の学習・開発環境サービスを用いるどちらでもOKかと思いますが,いずれにしてもPCが無いと始まりません.

会社や学校のPCを活用でも良いですが,個人的には本気で覚えてモノを作るならやっぱり自分で買っちゃったほうがいいと思います.

(たとえ中古であったとしても無いより334倍マシです)

プログラミング経験の有無

f:id:shinyorke:20170115163011p:plain

いちばん重要なポイントかもしれません

何人かご相談していて思うこととしては,

によって,オススメするべき本や学習の方法が異なるんじゃないかと言うことです.

何かしら言語を知っている場合は知っている言語の置き換えで読みやすい本や学び方を取るべきだし,「え,プログラミングって言語があるの?」レベルから始める方はそもそも「プログラミングis何?」から学ぶべきという感じになっちゃうのでアプローチが確実に異なります.

「今年は富士山に登るぞ!」という人だって,既に他の山(1000m級)で登山経験があるのかそれともピクニック程度なのかによって準備が異なりますよね?

それと同じです多分.

平たく言えば,

自分が今どの立ち位置・レベルにいるかを正確に把握することが重要となります!

プログラミング言語を覚えた後の目標・成し遂げたいイメージがついているかどうか

f:id:shinyorke:20170115163025p:plain

目的指向かどうか,というところになります.

これはいつも自分に言い聞かせているのですが,

  • 目標・成し遂げたいことをちゃんと言語化してから覚える(メモでもなんでもいい)
  • プログラミングはあくまでも手段
  • プログラミングする必要があればガッツリ覚える,そうでも無かったらやらない

Pythonの場合,データ分析や数理的な処理・分析に強いかつ作りやすい特性があるのでデータ指向の方は覚えたほうが良いというのがありますが,Webアプリやちょっとしたインフラ作業など,他に代替手段があるものについては「本当にPythonでやる必要あるかな?」を先に考えるのがいいのかなと思っています.

確かにPythonは学習コストが低い・アプリからデータまで一気通貫に作れる強みとエコシステムが揃っているのですが,言語そのものにフォーカスしすぎるのものね...ということです.*3

オススメ書籍(三行レビュー付き)

上記の体系表に載せた本の簡単なレビューです.

気になった本は是非手に取ってもらえると!

なお,手に入れる際には最新版がベストです!(リンクは最新版です)*4

プログラミングを学ぶ

独習Python入門――1日でプログラミングに強くなる!

独習Python入門――1日でプログラミングに強くなる!

ホントの本当にプログラミングを学んだことがない状態から始めるのにオススメです.

詳しくはこちらのエントリーを御覧ください(手前味噌ですがw).

「独習Python入門」は一生付き合える入門本だと334回言いたい - Lean Baseball

Pythonを学ぶ

みんなのPython 第4版

みんなのPython 第4版

私がPythonをはじめた時はこの本からスタートしました(第二版だったと記憶).

言語仕様から勘どころまでわかりやすく書いており,最新版(第四版)ではデータ分析についても触れています.

(レベルを問わず)プログラミング経験者は迷ったらみんPyがベストかと思います.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

オライリー本かつ,Pythonの生みの親(Guidoさん)の本です.

導入部から解説までガッツリかいてます.

みんPyと比べ堅い作りでプロユース(仕事目的)な方には一冊あったほうが良い感じです.

やりたいことが決まってる/決まってない

やりたいこと別のオススメ本です.

決まってない方にも決まってないなりに読める本があるので紹介します.

やりたいことがわからない

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonそのものの歴史やコミュニティーのことに軽く触れつつ,

データやWebアプリ,インフラ(Ansible)など網羅的に触れている本です.

まずはこの本で一通り試してやりたい方向性の本を買ってみる!という使い方が良いかと思います.

Web開発・お仕事など

Pythonプロフェッショナルプログラミング第2版

Pythonプロフェッショナルプログラミング第2版

Pythonを使ってWebアプリケーションを作る!というお仕事をする方には必読の一冊です!

単にWebアプリを作るだけでなく,テストやコードレビューに自動化,オススメのライブラリなど痒い所の情報が手に入る一冊です.

個人的には無いと仕事にならない一冊です.

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

コードレビューをしたり,「もっときれいなコードを書きたい!」という時にオススメです.

私は辞書的な使い方をしていますが読む度に知らないことに気がつきます.

書くのに慣れてきたら手元にあるといいですね.

データ分析・機械学習ほか

この分野は恐ろしく本がたくさん出ているので絞って紹介します.*5

Webスクレイピング以外の話題は網羅的に載っています.

IPython(Jupyter)の使い方から可視化(matplotlib)やデータ処理(pandas)など必要なものがほぼ揃います.

この一冊でPyData(Pythonでデータを扱う営みの総称)の3割いや半分くらいはわかりそうです.

機械学習系はこの二冊が人気かつ内容もしっかりしている印象です.

基礎から載ってる「ゼロから〜」は数学弱い自分としては助かってます(真顔)

Python機械学習〜」は導入部から可視化・分析に必要なノウハウをほぼ網羅していてお得感と深さがあります.

Webスクレイピング(データの取得と前処理)

PythonによるWebスクレイピング

PythonによるWebスクレイピング

Pythonを元にしたWebスクレイピングの教科書です.

Beautifulsoup4(Pythonスクレイピングライブラリ)の使い方をベースにノウハウが満載です.

特に法令的なところや「人間らしく振る舞う」所は忘れがちなので助かります.

最近出た本でこれも評判いいですね.

最近はやりつつあるscrapyの解説ががっつりあります.

体系的にも読みやすくていい本かと思います.

イベントや勉強会との付き合いかた

学ぶのに本をよむ・写経するのも良いですが,

一番手っ取り早いのはイベント・勉強会に参加して経験者にもまれてくることです!

...という経験談・ノウハウはこちらをご参照ください(手前味噌パート2)

www.slideshare.net

本を読む・写経する以外のポイントはたった3つで,

  • Get out of the building(家や会社の中だけでなく,外に出て交流しよう)
  • Output & Feedback(覚えたこと・成果は外に出す,フィードバックをもらう)
  • Networking(詳しい人・面白い人・同じ勉強をしている人でつながろう)

覚えやすいでしょ?

なぜそういう結びなのか,についてはスライドを読んでもらえると幸いです.

というわけで,素敵なPythonライフを!

*1:JOINして一週間ですがチームとサービスのエネルギーに圧倒されそうでヤバイです(真顔)いずれブログか何かに書きます.

*2:会社や外部の勉強会だけでなく,(前職の)ビザスクMatcher(マッチャー)を通じて問い合わせも幾つかあり,嬉しい悲鳴を上げております(震え声)

*3:余談ですが,個人的に相談を受けた内容で「これはPythonじゃなくていい」「Python覚える云々以前の問題」というときには情報の探り方や目標の立て方・ストーリー作りに時間を費やしています.たまに「Pythonの話まったくなかった」というフィードバックも貰いますがw

*4:たまに古本屋で買ってやる方もいますがバージョンが古くて現状と合わなかったりして学習と本質的に異なる部分でハマる&時間損失をするので古い本は絶対オススメしません

*5:本当に大杉だし玉石混交で困る

RettyにJOINします&新年の抱負

f:id:shinyorke:20170103161603j:plain

野球のチームだと思いました?No!食とグルメのチームですよ!!*1

写真は昨年食べて一番美味しかったお寿司です,本題とはあまり関係ありません.*2

私, @shinyorkeは1/9(月)をもって株式会社ビザスクを退職,1/10(火)より実名型グルメサービス「Retty」の運営元であるRetty株式会社(Retty.Inc)にJOINすることになりました.

ちなみに今(2017/1/4-1/9)までは有給消化期間ということで身体を休めたり野球のプロダクトについて夢を馳せたりしています.

Rettyでも引き続きエンジニアとして,

  • サーバーサイドアプリケーションの開発
  • データ可視化・分析(Pythonistaっぽいお仕事)
  • (エンジニア向けな意味での)情報発信とかコミュニティーとの繋がりetc...
  • その他盛りだくさん

に携わる予定です.

このエントリーでは,移籍の経緯とか今後について,

  • Rettyで成し遂げたいこと&新年の抱負
  • 過去三年(2014-2016)の振り返り(retrospective)
  • 今後三年の展望(futurespective)

の3つの章でポエムしたいと思います.

仕事始め,気持ちとやる気の暖機運転がてら読んでもらえると幸いです.

Rettyで成し遂げたいこと&新年の抱負

ここ半年(去年の夏から年末まで)に起こったことのまとめです.

なぜ転職したのか

ビザスクではサービスの企画開発・データ分析&インフラチームの立ち上げおよび広報・採用につながるコンテンツ運営(主にTechブログやエンジニアの外部発表)などを担当させてもらいました.

その中で多くの学びがありましたが,

  • 将来的な目標(ビジネス・野球両方)を達成するにあたり,今の組織で最短ゴールは狙えるのか?
  • 自分が理想とするプロダクト・チームと会社が理想とするプロダクト・チームに差があるような気がする*3
  • スポットコンサルティングが創りたい世界像を中の人じゃなくて外から作ってもよいのでは?

...などなど,いくつかのクエスチョンが芽生え,夏頃(8,9月かな?)に感じ,まずは時間が許す限り,Wantedly・知人紹介などを通じ,色々な会社・チームに会うことにしました.

そんな最中,ほぼレギュラー参加していた勉強会にてRettyの中の人のプレゼンに興味を持ち,繋がりを駆使して採用選考に乗り,そのままストレートに決まりました.

出会ったのが10月,その後は選考やエンジニアチームとのミートアップなどを通じ,じっくりと価値観やプロダクト,サービスの事について語り合い自分としては非常に腹落ちがした状態でJOINを決断しました.

なぜRettyだったのか

食を通じて

世界中の人々をHappyに。

http://corp.retty.me/より引用

このビジョンに共感したことと,何よりも(アプリの記録上)4年前(2012年ころ)から普段使いしているくらい,Rettyを愛用していてかつ,

以前はアジャイルと野球と食事ネタでブログを寄稿していたぐらい,食に対しては野球とPythonと同じぐらいこだわりと強い価値観があり,家族・友達そしてその先々にいる人たちの食生活をHappyにしたい!という覚悟ができたからです.*4

なお,その当時に書いていたブログはこちらです(2012-2014の1年半くらい).

www.manaslink.com

今となっては閉店しているお店もあるのでなつかしいですね...そんなブログを書いたり,仕事や友達同士の飲み会を知ってるお店で開催したりという中で,

  • ユーザーさん(外でご飯を求めて探したりしている皆様)に対する負
  • 飲食店さんが感じている負
  • 自分が飲み会やイベントの幹事・進行を通じた「場作り」で感じた負

というものに改めて気が付きかつ,

  • 食文化の素晴らしさ
  • 食がもたらす場作りとコミュニケーション
  • 自炊したり,レシピを共有したりする以外に伝えるべき「食育*5

というテーマも改めて気が付き,

これらを実現する場所としてRettyしか無いな!ということでJOINする決断をしました.

また,選考の過程において経営陣やマネージメント層のみならず,メンバーのみなさんも自分の意志・ストーリーを持ってガチで私と対話(勿論私も思いをガチで返しています)できてとても気持ちがよく,

(JOINが決まった後に読みましたが)Joy, Incの世界に近くてとても良いなと思ったのも決断を後押しする理由の一つでした.

ジョイ・インク 役職も部署もない全員主役のマネジメント

ジョイ・インク 役職も部署もない全員主役のマネジメント

新年の抱負

Rettyおよび個人として成し遂げたいこと.

Rettyのメンバーとして

プロダクト開発・データ分析などのタスク・チームづくりを通じて,Rettyが持っている価値の最大化をいかにエンジニア・スクラムマスターとしてしていくか?が大きな目標となるかな?と思っています.

JOINしたモチベーション(様々な負の解決&夢の実現)を大切にしつつ,Rettyを使っているユーザーさん達の幸せを如何に最大化するか?をテーマにやっていきたいと思っています.

各論めいたところは...ここでは書けないのでそれは後々形になったものから公に出ればいいと思っています.

個人として

まず,Pythonコミュニティーの一員としては,スタッフとしても協力させてもらっているPyCon mini Kumamoto 2017の成功が最初の目標となります.

PyCon mini Kumamoto 2017

また,みんな大好き野球に関しては,

  • (いい加減)コミュニティー化する
  • データ収集&分析のOSS化(主にPython)
  • 野球データ分析に関するプロダクトをローンチする(まずはβ版)

というのが最大の目標になる予定です.

また,個人としては,

  • 認定プロダクトオーナーの取得
  • 数学力を高める
  • 最低限の英語力

これらをなんとかできたらと思っています.

なぜ野球(関連の仕事ができそうな)チームに行かなかったのか

一言で言うと,

プロ野球にしてもMLBにしても侍ジャパンにしても,JOINするなら,エンジニアorデータ分析な立場で責任ある立場で入りたいからです!

細かい話は避けますが,データの活用・分析で野球のチームや野球そのものを変えるのであれば,エンジニアとしてOSSやコミュニティーの力を最大に活かしたいかつ,

イノベーションは過去の権威ではなく技術で起こすものと信じているので,技術でなんとかしたい!という思いが強いからです!!*6

技術でなんとかした後に,オリンピックの前期間にスポットではいる...などそのような世の中が出来るまで待とういや作る手伝いを可能な限りできたらと思っています.

世の中にはスポットコンサルという仕組みもあったり,副業・パラレルキャリアが当たり前になったりするでしょうし...

過去三年(2014-2016)の振り返り(retrospective)

この件はポエムもポエムなので読み飛ばしても大丈夫です(自分の思考整理メモにお化粧した程度のアレです)

昨年のビザスク以前に,リクルート・ITコンサルタント時代からのストーリーで語ったほうが整理が付きそうなのであえて3年前(2014年)から振り返ります.

[2014]ITコンサルタント->リクルート

ちょうどこのブログをはじめた頃*7ですね.

初っ端のエントリーがよく燃えた記憶があります(黒歴史)*8

shinyorke.hatenablog.com

それはさておき,当時は独立系のITコンサル企業でITコンサル兼エンジニアとして,サーバーサイドアプリの開発・インフラエンジニアの真似事を繰り返しつつ,研究開発系のプロジェクトに従事していました.

かなり辛かった時期ですが,その頃に出たアプリ(今はサービス終わってる)がかなり有名になって嬉しかったです.

がしかし,ここでいくつかの思いが芽生え始めました.

...というビジネスマン・エンジニアとしての希望と,「2020年には東京オリンピックで野球やるぞ!」という中二病な夢が強くなり,(業態的に)ITコンサルタントじゃ無理!という判断に至り,ちょうどいいタイミングで縁があったリクルート(正確にはリクルート住まいカンパニー,以下SUUMOと略します)にJOINしました.

shinyorke.hatenablog.com

SUUMOには9月からJOIN,最初の半期(〜2015年3月まで)は新規事業のプロダクトオーナー兼エンジニアをさせてもらいました(途中からエンジニア専任).

また,PyCon JPへの初参加&初登壇をキッカケに「野球Hackの人」「Python野球のお兄さん」として名前が出始めたのもこの年でした.

gihyo.jp

[2015]リクルートでの1年

SUUMOにJOINしてからは,

  • 新規事業のプロダクトオーナー兼エンジニア(上述の通り)
  • 既存サイトのリニューアル
  • 社内外でのイベント登壇とそのフォロー
  • アジャイルスクラムの推進や実践
  • Tech Blogの立ち上げなど,エンジニア文化作りと発信

などなど...多くのミッションを通じて様々な学び・価値観を得ました.

同時に,SUUMO以外のリクルート各社のエンジニアをはじめ,素晴らしい人々との出会いやコラボレーションがありました.*9

一時期心身ともに壊れたりしてかなり辛い時期もありましたが...

閑話休題.

長いようで短い一年の中で,自分の今と今後を考えるにあたり,クエスチョンが出来たのもこの時期でした.

  1. 自分,思ったより不動産や住まいの事に対して当事者になれてない*10
  2. ずっとマネージメントや管理業務してるけどそれ本当にやりたいことだったっけ?
  3. (上記を考えた上で)自分が理念・意志をもって全力疾走できるサービス・プロダクトって何だろう?

役員や上長は当然のことながら,周りの後輩や新人たちが住宅や住まいに運命と命をかけている中*11,「え,住めれば借家で全然よくね!?」ぐらいに考えていた私にはかなりのショックと刺激をもらいました.

その中で,

本当にやりたいことって何だったっけ?

を本気で考えはじめ,外の人たちとの接点を重ねた結果出会えたビザスクにJOINすることを決めました.

その時の経緯とサマリーはこんなエントリーにまとめさせてもらいました.

shinyorke.hatenablog.com

「自ら機会を創り出し、機会によって自らを変えよ」という教えを転職という形で叶えたのが2015年の末でした.*12

なおこの頃には「Pythonと野球のお兄さん」「野球の人」としてのブランディングがしっかり固まっており,「野球に向けての目標」についてはちゃんと進捗してました.

shinyorke.hatenablog.com

[2016]ビザスクでの1年

ビザスクのスポットコンサルティングは、

組織、世代、地域を超えて、知見を集めつなぐことで、

世界のイノベーションに貢献します。

https://visasq.co.jp/ より引用

(細かい話はここでは語れませんが)このビジョンに強く共感したことと,プレーヤー(エンジニア)として力を求められているしかもPythonアジャイルで!!!

...というのがビザスクにJOINしたモチベーションと理由の全てでした.

ITコンサルそしてSUUMO時代からクエスチョンだったコンサルや業務委託という考え方に挑戦できる魅力,そして将来副業・パラレルキャリアが当たり前になる時代の先頭に立つべきサービスとしてのビザスクに大変共感を持ち,CEO面接から数日で退職を決めてJOINしました.

ビザスクの中では,他のエンジニアメンバー同様企画・開発を同時に進めながら,

  • アジャイルスクラム・カンバンを軸としたプロセスの最適化(スクラムマスター的な意味で)
  • データ分析・可視化を円滑に進めるための基盤構築とチームづくり(PyData+プロダクトオーナーな意味で)
  • Tech Blog,イベント(PyCon JPなど)を通じた情報の発信とブランディング強化

といった事を通じてビザスクおよびスポットコンサルティングを広めるお手伝いをさせてもらいました.

サービスの数字の追い方,広告やSEOや採用,広報といった知識を実践だけでなく,リアルに事業の数字を追いながらサービスを育てるノウハウと大切さを学んだのがスタートアップに一年いた大きな学びでした.

そんな中で気がついた新たな疑問が...上記「Rettyで成し遂げたいこと&今年の抱負」に書いたとおりです.

今後三年の展望(futurespective)

2020年(40歳)の自分が目指している世界,一言で言えば,

Rettyで食を通じたHappyな世界を創りつつ,野球の仕事ができる自分でいたいと思っています!

半身は食の仕事をしながら,残り半身は野球の仕事...というパラレルキャリアな世の中がその頃にはできていて,東京オリンピックの野球競技をスタッフとしてお手伝いできていれば最高だな!...と思っています.

さいごに

転職前後におけるお悩み相談や数々の壁打ち,情報交換といった所で今回は多くの人の助けをお借りすることができたことをとても感謝しています.

仕事関係のみならず,普段からのコミュニティー活動そして関わってくださった皆さんの協力と優しさがなければホント心折れていましたし.

この場を借りて厚く御礼を申し上げます(._.)

というわけで本年もどうぞよろしくお願いいたします!

最後までお付き合い頂きありがとうございました.

P.S. (前回の転職から一年も経っていませんが)例のリストのリンクはこちらです.

amzn.asia

*1:フルなんちゃら総務だと思った?残念!酔っ払いだよ! の言い回しをパクりましたすいませんすいません

*2:私の地元,斜里町(北海道・知床)のお寿司屋さんです.> すし善

*3:平たく言うと...いや直接的に言うと音楽性の違いです.察してください.

*4:本当は野球とアジャイルだけで書きたかったのですが,当時の編集部から「これだとコンテンツ弱い」「ガジェットさん(当時の呼び名)はいつも美味しいもの食べてるんだから店紹介しろよ!」という声が上がり,”渋々”食をコンテンツに加えた経緯があります.なお掲載に当たっては個人としてちゃんと一回一回掲載許可を取ってました.

*5:手前味噌で恐縮ですが,母親および漫画「味いちもんめ」で得た食と人の価値観が自分の食育の全てです.とくに母が教えてくれた価値観はユーザーさんに受け入れられる限り形にしたいです.

*6:スポーツって何やかんや古い世界なので...下から「入りたいです!」って言って入っちゃ駄目だと思うの&入るならユーザー価値と技術で圧倒したい

*7:独自ドメインで別にやってた過去もありますがそれは抹消済み

*8:この本棚論は今でも自信ありますけどね&ここで炎上したのをキッカケにWebライティングを真剣に考えるようになった感ある

*9:特に大きかったのはアジャイルサムライ監訳者の@nawotoさんとの出会い,同じR内でイベントをご一緒させてもらったり幾つかの接点で大きな学びをもらいました

*10:ITコンサルタントから転職を選んだ際,業界やサービスそのものに意志を持てるか?を考えていなかったのが大きな反省点であり学びでした

*11:自宅やマンションを買うぐらいは当たり前で,進んでる人たちはビルのオーナーやったりスペースを貸したりしてました,若手でも.そこがSUUMOの中の人達の本当の強さ

*12:全くもって後悔はしていない

Pythonを用いたWebスクレイピングの開発ノウハウ〜スポーツデータの場合(野球風味)

Webスクレイピング Python 野球

クローラー/Webスクレイピング Advent Calendar 2016 - Qiitaのクローザーとしてマウンドに立ちます@shinyorke(しんよーく)ともうします.

このエントリーではみんな大好きな野球(メジャーリーグ)を題材に,

を,自分の実体験を元に紹介します.

年末年始?来年とかに, 「俺もスポーツデータで機械学習やるぞ!」 という方(と自分)の参考になればと幸いです.*1

というわけでプレイボール⚾

対象読者&取りあつかわないこと

対象読者

  • スクレイピングおよびPythonのプログラミング初〜中級者
  • 何かしらのテーマ,特にスポーツでWebスクレイピングをされたい方
  • データに強いPythonスクレイピング&分析したい方
  • とにかくスポーツ,特に球技が大好きだ(野球に限らず)
  • 野球のルールとデータの意味を知っている(誰が出ていて,どっちが勝ってるか分かる程度でOK)

取りあつかわないこと

特にクローラー(scrapyのノウハウとか)について期待している方は別のエントリーをご覧頂ければと思います.*2

  • 特定のサイト・データを周期的・自動的に取得する,つまりクローラーのの解説とか各論
  • Python以外の言語・ライブラリの話題
  • 野球・メジャーリーグのデータおよび指標の解説

Starting Member

Pythonを用いたWebスクレイパー開発の勘どころ

スポーツに関係なく,PythonでWebスクレイパーの開発をする際の流れを元に勘どころを紹介します.

ちなみにこれは完全に我流です(が自信はある).

Webスクレイパー開発の流れ

私はスクレイピングを行う際,必ず以下の作業&定義を決めてから開発を行っています.

スクレイピングの対象ページを眺める&コードを追う

まずこれをしないと何も始まりません!

スクレイピングしたいページをChromeの開発者ツール(SafariFirefoxなど好きなブラウザでOK)を用いて,

眺める

ここでは, スクレイピングする必要が無ければスクレイピング以外の手段を使うという事を前提に調べていきます.

  • APIの有無
  • オープンデータや公式データ無いかな?

を地道に調べます.

たとえばWikipediaスクレイピングしなくても, 公式のデータベースがあったりするので必要ないな,とわかるだけでも無駄なプログラミングをせずに済みますし,ライセンスなどの問題に当たる必要がなくなります.

コードを追う

  • HTMLの構成, 特にデータの出どころ
  • CSSのルールや名前
  • サイトの構造

などを辿っていきます.

重要なポイントはやっぱりデータの出どころで,

  • HTMLに直接書いている場合(tableタグとかdivタグ)はHTMLをスクレイピングするツールを使う
  • AngularやReactなどのシングルページアプリケーションやJQuery等でAPIを呼び出してるアプリの場合はJavaScriptスクレイピングする仕組みを使う

要するに,対象のデータがHTMLなのかJSなのかを見極める事を重点的に行います.

要件を決める

(スクレイピングに限らず)やみくもにコーディングすると目的がどっか行ったりするので,要件を決めます.

私は目的,もっといえば「なぜスクレイピングするか」のストーリーをちゃんと作りたい人なので,

ということをしています.

とはいえ,「お勉強のためにスクレイピングしたい」「いやまあ使い捨てのツールだし」っていう場合は,

  • 環境や動作条件(Pythonのバージョン,出力フォーマットなど)をメモる
  • なんちゃってで動くWebスクレイパーを作る,平たくいうとプロトタイピングする

というのも良いでしょう.

なお,私は恒常的につかうWebスクレイパーを作りたかったのでインセプションデッキに要件とゴールを書きました.

インセプションデッキ(一部抜粋)

Webスクレイパーに加え,分析環境も作ってたので内容が若干煩雑かも.

f:id:shinyorke:20161225160046j:plain

f:id:shinyorke:20161225160216j:plain

f:id:shinyorke:20161225160231j:plain

ライブラリ(もしくはフレームワーク)の構成を決める

ここでようやっとライブラリやフレームワークを選ぶ段階に入ります.

Pythonの場合,Webスクレイピングの手段として,

  • 素のPython(urllibなど)を使う
  • 便利なHTTPクライアント「requests」
  • HTMLをスクレイピングするなら「Beautiful Soup」
  • Webクローラーを含めてオールインワンで開発「scrapy」
  • 分析しながらカジュアルにスクレイピング&Dataframe化する「pandas」のread_htmlメソッド

という5つの手段があります(他にもあると思うけど知らない).

それぞれの強みと利点を簡単に紹介します.

素のPython(urllibなど)を使う

  • (当たり前だが)ライブラリの導入がいらない
  • 好きなようになんでも書ける
  • なんでも書ける!ということは自分で書くコードの総量が増える&メンテナンスが煩雑に
  • Pythonそのものの勉強目的を除きオススメしません!*3

便利なHTTPクライアント「requests」

github.com

  • HTTP Request/Responseを人間らしくカジュアルに扱える神ライブラリ
  • モジュールやメソッドがかなり直感的で使いやすい
  • ちょっとリッチなHTMLなどをスクレイピングするときにはコード量が増える印象
  • JSON/XMLなどで返すAPIを扱うときは一番ラク&最強です!

HTMLをスクレイピングするなら「Beautiful Soup」

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

  • PythonでWebスクレイピングといえば!の代表格でとても扱いやすい!
  • 特定のタグの捜索や正規表現(find/find_all)に加えてCSSセレクタ(select)での特定や抽出ができる
  • HTMLのWebスクレイピングはまずbeautiful soupで間違いない
  • クローラーに必要な機能(ファイル/データベース出力,定期的なクロール)は自前で実装が必要,そこまで必要になったらscrapyで
  • xpathには対応していない,これもやりたくなったらscrapyかな

Webクローラーを含めてオールインワンで開発「scrapy」

Scrapy | A Fast and Powerful Scraping and Web Crawling Framework

分析しながらカジュアルにスクレイピング&Dataframe化する「pandas」のread_htmlメソッド

pandas.read_html

  • pandasのDataframeをすぐ作りたいかつ,ページがtableタグで構成されているときは一番手っ取り早い!
  • データ型まで保証はしてくれませんが必要なDataframeが1行で書けるのはかなり強力
  • 前処理(ゴミを取り除く,欠損値対応など)を地道にできる人はさっさとpandasでやっちゃうのが良さそう

なお,このブログでも事例を紹介させてもらいました(野球ネタです).

shinyorke.hatenablog.com

どの手段が一番オススメか!?

私個人の意見としては,

  • RESTful APIを叩くだけならrequests
  • 一時的にHTMLをスクレイピングするならBeautiful Soup
  • クローラーを作る必要がある要件だったらscrapy一択
  • Try and Errorで分析しながらやるor手早くまとめるならpandas.read_html
  • 迷ったらBeautiful Soup!

ですね.

何をやるのにもscrapyは最強なのですが,迷った時はBeautiful Soupを使っています,欠点(xpath使えない,クローラー化が面倒)については回避の方法もありますし,何よりライブラリが完成度高く,事例がたくさんあるので個人的にはBeautiful Soup推しです.

と,いいつつ最近はscrapyの方が使う機会増えてますけどねw*5

スポーツデータをスクレイピングする際のコツとノウハウ

お待ちかね,スポーツデータの話です.

野球やサッカーといったデータを使った分析事例が増えていたり,自分でもやる方も増えている印象があり(火付け役の一人として)とても嬉しいのですが,スクレイピングそのものが辛くなるようなハマりどころが存在します.

いくつか事例(≒僕の黒歴史)を紹介します.

ページ構造/APIのインターフェースが不完全

  • スクレイピングの後にやりたいことにたいして,データが見当たらないもしくは別ページ・APIに存在する
  • 例えば野球の場合,指標の計算で盗塁死(cs)が欲しい!と思ってもデータが無かったり
  • 別サイトからスクレイピングする,盗塁死が無くても計算可能な近似式を使うなどで回避
  • Webスクレイパーを開発終了後に気がつくので本当にたちが悪い!(涙目)

データ・指標に関する仕様が見当たらない

  • 「知ってて当然だよね?」と言わんばかりに指標の説明などが全く持ってない!
  • 距離や長さがメートルなのかフィートなのか?とかそのレベル
  • 本物の一球速報サイトや海外の文献を漁って仕様を類推,確かめながら作るなどして対応
  • スピードガンやPitch f/xは仕様がそもそもガラパゴスだという事を把握(学び)野球専用の機械だししょーがない.

計算が合わない

  • 前処理・指標計算の結果が実際の結果と合わない
  • 前述の「インターフェース不完全」「仕様が謎」問題から起こる不幸
  • こればっかりはスポーツ(野球)のドメイン知識を駆使して地道に解くしか無い

処方箋

そんな不幸を避けるためには,

要件をちゃんと作る・書く

ガッツリな仕様は無くてもやっぱ転ばぬ先の杖は要件かなと.

  • データの不完全性や仕様を予め把握
  • どこにデータがあるの?とかフォーマットはHTML?JSなの?とか
  • インセプションデッキとかお絵かきとか面倒くさいと思うでしょう?事前に整理することによって気がつくことがあるんですよ!!!

ドメイン知識をつける

スポーツデータに限った話ではないですが本当に重要.

  • 野球なら野球、サッカーならサッカーのドメイン知識をこれでもかっ!ってぐらいつける
  • ルール、データの種類から対象リーグのトレンドだったり傾向だったり.
  • 野球の場合は上記に加えてセイバーメトリクスの基礎も覚えるとなお良い.
  • 「オレ,審判とかスコアラーできちゃう!?」ぐらいに磨けば完璧
  • 球場やTVで試合みる延長線上でデータをスクレイピングしたり分析できたりすると思うなよ!

メジャーリーグベースボールのデータセットスクレイピングする(pitchpx)

一個の事例として.

昨年末〜今年にかけて,MLBの一球速報データをスクレイピングしてデータセットにするWebスクレイパー(コマンドラインツール)を自作しました!

github.com

こちらで何ができるか?というと,

  • 2007年以降のMLB全試合(プレーオフ含む)の一球データをCSVとして取得
  • 投球,打席の結果がメイン
  • ついでに出場選手や審判のデータセットも含む

コマンドラインでサクッととれます.

事例についてはこのブログやPyCon JP 2016で発表させてもらいました.

使いたい方や気になる方はぜひご覧ください!

shinyorke.hatenablog.com

shinyorke.hatenablog.com

qiita.com

なお開発の時のtipsはこんな感じ,

  • Python 3専用で作った
  • Beautiful Soupベースで開発
  • 本当はクローラーにしたかったのでscrapyを使うつもりだったが,開発当時Python3を正式サポートしていなかったこと, scrapyに慣れていなかった事もあり断念
  • 初速はテスト無しで開発,ある程度安定した後テストを書いた&CIを入れた

好きな言語・好きな開発手法を思いっきりできたので気持ちよかったです.

まとめ

そら(Webスクレイパーを書くならPythonが最強で)そう(事前の下調べや要件づくり,ドメイン知識が大切に)よ(決まっているじゃないか)

私がPythonistaということもありますが,ちょっとしたWebスクレイパーPythonを使うのがベストかなと思います.

あとは最近書いていませんが,Rubyのnokogiriとかもいいよなー,とか.

その他の言語については自分自身スクレイピングの知見が無いので是非ともフィードバックを頂けると幸いです!

長文となりましたが最後まで読んでいただきありがとうございました!

(Appendix)参考文献

今回のブログを書くにあたり参考にした文献など.

書籍(Python)

オライリーのWebスクレイピング本は名著です&初学者の方には独習Python入門のスクレイピングのページが良いです(beautiful soupの事例です)

PythonによるWebスクレイピング

PythonによるWebスクレイピング

独習Python入門――1日でプログラミングに強くなる!

独習Python入門――1日でプログラミングに強くなる!

その他最近スクレイピングの本が出ていますが...まだ読んでないので良い本があれば教えて欲しい.

書籍(野球・サッカーのドメイン知識)

主に野球・サッカーのドメイン知識をつけるなら!

サッカー データ革命 ロングボールは時代遅れか

サッカー データ革命 ロングボールは時代遅れか

Analyzing Baseball Data with R (Chapman & Hall/CRC The R Series)

Analyzing Baseball Data with R (Chapman & Hall/CRC The R Series)

4‐2‐3‐1―サッカーを戦術から理解する (光文社新書)

4‐2‐3‐1―サッカーを戦術から理解する (光文社新書)

ブログ・スライドなど

主にamacbeeさんのブログ・スライドを参考にさせてもらいました.

amacbee.hatenablog.com

qiita.com

qiita.com

speakerdeck.com

*1:本題と関係ありませんが最近スポーツhackしたい方が増えているので何かコミュニティ作る&イベントやろうと思ってます

*2:日本プロ野球用に作ってるけど事情により非公開(察し)

*3:言語そのものの勉強だとしても,やるなら一回でいいと思う

*4:PythonでのDjango,RubyでのRailsを覚えるときのような「言語とは関係ないクセ」があるということです

*5:自分が慣れてきたのと,最初からクローラー化する前提での開発が多いのでscrapyを選択しています

【野球Hack】PythonとJupyterで「一球速報」っぽいモノを作る(MLB編) #pyhack

Python Baseball SABR

この記事は,「jupyter notebook Advent Calendar 2016」 12/15のネタとなります(といいつつ当日書けそうにないので前倒しで公開します).

先日(12/10)のPython mini Hack-a-thon(71回目)にて,

Jupyterとメジャーリーグ一球速報データを用いた一球速報っぽいモノを作る!

という目標を立てて色々とやっていて,一定の成果が出たので公開したいと思います.

Starting Member

  • はじめに
  • Who am I?
  • 完成イメージ&コード
  • 今回使ったモノ
  • 【おさらい】野球のストライクゾーンについて
  • Pitch f/xデータの座標系仕様(ざっくり)
  • Jupyter + pandas + matplotlib(seaborn)で実装
  • まとめ&次の方へ
  • 【Appendix】今回,参考にした書籍

はじめに

この記事内の統一ルールです.

  • MLB(メジャーリーグ)の事例かつ,日本のプロ野球はデータが手に入らないため再現不可能です.*1
  • 距離(横幅・高さ・奥行き)はフィート(ft)単位です. ちなみに1フィートが約30.5cmです.
  • 速度はマイル毎時(MPH, miles per hour)です. 時速にしたい方は1.6を掛けて読み替えてください.

Who am I?

  • shinyorke(しんよーく、と読みます)
  • Webとデータ,ちょっとだけアジャイルなエンジニア.
  • Pythonで野球の人」らしいです

完成イメージ&コード

いきなりですが結論からお見せします.

今回作ったモノ

今年(2016)の8/17 TEX-OAK戦の1回オモテ,ダルビッシュ有*2とダニー・バレンシア*3の打席の結果です.

これをJupyter(Python)とpandas, matplotlibを使って作ります.

f:id:shinyorke:20161211183324p:plain

なお, 主審(捕手)目線から見たプロットになるので要注意です!!!(≒パワプロと同じです)*4

念のため凡例を貼っておきます.

f:id:shinyorke:20161211184834p:plain

コード

ちょっとPythonを触れる方向けにサンプルコード(データ付属)を用意しました.

真似したい方はどうぞ&マー君とかマエケンとかココに無いデータでやりたい方は別途pitchpxでデータを取得してやってみてください(すぐ後の章で触れます).

サンプル(データ付き)

github.com

pitchpx(データセットの取得)

github.com

今回使ったモノ

プログラミング環境

OSは使い慣れたもので良いと思いますが,Linux系がやりやすいと思います.

  • Python 3.5.2
  • Jupyter(データ屋さん向けの統合環境)
  • pandas(データフレームを操る有名過ぎるライブラリ)
  • matplotlib(グラフ描画)
  • seaborn(matplotlibの簡易版&ビジュアルをイカした奴にするモノ,今回は後者目的で利用)

サンプルコードをcloneした方は,以下のおまじないでインストールが完了します.

$ pip install -r requirements.txt

なお,今回はそれぞれのライブラリの解説はありません.

気になる方はググるか以下の書籍あたりを参考にされると良いかと思います.

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

データ

Pitch f/x(高性能スピードガン)のデータを用います.

こちらについては,今年のPyCon JP 2016で紹介させてもらったpitchpxを用いて行います.

詳細については以下のスライドおよびQiitaの過去記事を御覧ください.

www.slideshare.net

qiita.com

この先はサンプルコードとデータが手元にある前提でお話を進めます.

【おさらい】野球のストライクゾーンについて

これであとはJupyter notebookを実行すれば出来上がり...なのですが,その前に野球のストライクゾーンの仕様についておさらいます.

なぜおさらいするかというと,

(趣味のものであれ)データ分析にはドメイン知識が必要だからです!

思わぬ落とし穴にはまらないよう,チェックしましょう.

とはいえ説明はこの絵一枚でおしまいです.

【図】ストライクゾーンの仕様

f:id:shinyorke:20161211194039p:plain

一言で言うと,

  • ストライクゾーンの幅は固定
  • ストライクゾーンの高さは可変,打者の体格によって変わる

です!

ちなみに今回は用いませんが,奥行きは固定(これもホームベースと同じ)です.

普段野球を見たりやったりしている人には常識ですが,あまりルールに慣れてない方は再確認しましょう.

Pitch f/xデータの座標系仕様(ざっくり)

ストライクゾーンの仕様が判明した所で,今回のデータの仕様を確認します.

例で上げたダルビッシュVSバレンシアの投球データの情報(データフレーム)はこんな感じです.

※必要なデータのみ抜粋しています

f:id:shinyorke:20161211194709p:plain

それぞれのカラムの意味は,本家アメリカに加え日本のブログでも紹介されています.(素晴らしい!!!)*5

tech.atware.co.jp

pitchfx glossary | Fast Balls

具体的には,

  • 本塁の場所を基準点とする
  • 横軸(x)は本塁からの距離(px)を使う
  • 縦軸(y)は本塁からの高さ(pz)を
  • 残りのデータはラベル情報として使う

ということになります.

なお,ストライクゾーンは以下の用に定義しました.

  • 横幅(固定)は基準点から0.8(-0.8)フィートの位置に定義.
    • 厳密に言えば0.7(-0.7)ちょいですが, ホームベースの入り口から出口の流れを想定して敢えてマージンを取っています.
    • 本家で似たような事をしているサイト(BrooksBaseball.net: Home of the PITCHf/x Tool)も同じ感じだったので真似した
  • 高さ(可変)はsz_top(上限), sz_bot(下限)の平均値を使用.
    • センサーデータなので実は投げる度に変わる
    • とはいえ変わるの考慮するのはちょっとアレなので打席内の投球の平均で解決することに

座標データ

f:id:shinyorke:20161211200048p:plain

ラベル情報(実況データ)

サンプルコードからの抜粋&コメント付きで

# pitch type(変化球の種類)
PITCH_TYPES = {
    'CH': 'Change-up',
    'CU': 'Curveball',
    'EP': 'Ephuus',
    'FA': 'Fastball',
    'FC': 'Cut Fastball',
    'FF': 'four-seam Fastball',
    'FO': 'Forkball',
    'FS': 'Split-finger Fastball',
    'FT': 'two-seam Fastball',
    'KC': 'Knuckle Curve',
    'KN': 'Knuckleball',
    'SC': 'Screwball',
    'SI': 'Sinker',
    'SL': 'Slider',
    'UN': 'Unknown'
}

# pitched(一球毎のデータを回して突っ込む)
ii = 1
for _, pitch in df_1_v.iterrows():
    c = get_color(pitch['pitch_res'])
    marker = get_marker(pitch['pitch_type'])
    label = '{cnt}:{event}({type}, {speed}MPH)'.format(
        **{
            'cnt': ii,  # 打席内のボールカウント
            'speed': pitch['start_speed'],  # 球速
            'type': PITCH_TYPES.get(pitch['pitch_type'], 'UN'),  # 球種
            'event': pitch['pitch_des'],  # 投球結果
        }
    )
    ax.scatter(pitch['px'], pitch['pz'], label=label, c=c, marker=marker)
    ii +=1

ここまで来たらあとは実装となります.

Jupyter + pandas + matplotlib(seaborn)で実装

あとはこのnotebookを元にうまくやってあげれば出てきます(雑)

Yu Darvish pithced(2016/8/17)

ポイントを少しだけ解説します.

データの読み込み

pandasのread_csvで読んでおしまいです.

#  read to datasets
#  TEX 6 - 2 OAK (2016/8/17) http://www.baseball-reference.com/boxes/TEX/TEX201608170.shtml
df = pd.read_csv('./datasets/yu_darvish_201608170_pitch.csv')

絞り込み

1回のバレンシアの打席のみをクエリーで取ります.

カラムについては確認に必要なモノのみ.

# inning 1 Darvish VS Valencia(Strike out)
# data
df_1_v = df.query('inning_number==1 and bat_box_name=="Valencia"')
df_1_v[['bat_box_name', 'px', 'pz', 'sz_top', 'sz_bot', 'pitch_type', 'pitch_res', 'start_speed', 'pitch_des']]

描画

matplotlibのscatterを使います.

見た目を固定するため,xlim/ylimの設定および,ストライクゾーンの定義(vlines/hlines)を行います.

あとは一球毎に挿して上げればOKです!(この辺もっと賢い書き方あったら教えて欲しい)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.set_title('2016/8/17 inning 1 Darvish VS Valencia')
ax.set_xlabel('px')
ax.set_xlim((-3.0, 3.0))
ax.set_ylabel('pz')
ax.set_ylim((0.0, 5.0))
ax.grid(True)

# Strike Zone
ax.vlines(-0.8, ymin=1.58, ymax=3.45)
ax.vlines(0.8, ymin=1.58, ymax=3.45)
ax.hlines(1.58, xmin=-0.8, xmax=0.8)
ax.hlines(3.45, xmin=-0.8, xmax=0.8)

# pitched
ii = 1
for _, pitch in df_1_v.iterrows():
    c = get_color(pitch['pitch_res'])
    marker = get_marker(pitch['pitch_type'])
    label = '{cnt}:{event}({type}, {speed}MPH)'.format(
        **{
            'cnt': ii,
            'speed': pitch['start_speed'],
            'type': PITCH_TYPES.get(pitch['pitch_type'], 'UN'),
            'event': pitch['pitch_des'],
        }
    )
    ax.scatter(pitch['px'], pitch['pz'], label=label, c=c, marker=marker)
    ii +=1

ax.legend()

まとめ&次の方へ

まとめ

  • bokehあたりと組み合わせてカッコイイ一球速報を作れそう!
    • 実はサンプルの中に色々入ってるのだが,これは時間不足で断念した残骸w(いずれやる)
    • このサンプルっぽいのを最終的には作りたい!*6
  • この辺もライブラリ化して可視化を楽にしたくなってきた
  • 実験しやすいJupyterはやっぱ便利
  • 【反省点】キャッチャー視点での打席勝負がみられない
    • 優秀なキャッチャーとそうでないキャッチャーでストライクゾーンの違いが(野球用語で言う所のフレーミング
    • pitchpx(とpitchRx)では「誰が球を受けていたか」の情報は取れない
    • pitchpxの方は年末年始に対応する予定です!(Ver.3として)

次の方

どりらんさん,よろしくお願いします!

【Appendix】今回,参考にした書籍

Pythonと野球方面で.

Python

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

野球

Analyzing Baseball Data with R (Chapman & Hall/CRC The R Series)

Analyzing Baseball Data with R (Chapman & Hall/CRC The R Series)

*1:プロなり何なりが公開してくれないと無理

*2:なんやかんやで日本選手の例がやりやすい

*3:余談ですが脳震盪やら何やらあって来季からマリナーズでプレー

*4:Yahoo!などの一球速報は投手目線となります,投手目線で作りたい人はx軸を逆転させれば作れますがあまりオススメしません(世界標準は多分主審目線)

*5:pitchpxを使ってくれて本当に嬉しい

*6:どりらんさん本当にありがとうございます!!!

野球統計学で2016年広島東洋カープの強さを証明しよう!〜PyCon mini Hiroshima 2016レポート

Baseball Python イベント セイバーメトリクス

本日開催のPyCon JPの地方版, PyCon mini Hiroshima 2016にて,

広島東洋カープの強さをPyDataと野球統計学"セイバーメトリクス"で証明したよ!」

というお話をさせていただきました!

発表スライド

www.slideshare.net

動画

youtu.be

内容(ざっくり)

  • 初心者向けPyData & 野球統計学入門
  • ピタゴラス勝率をpandasとIPythonでサクッと書く
  • Scrapy, matplotlib, pandas, seaborn, jupyterでFIP(DIPS)およびRC27(RC)を算出して広島東洋カープの強さを証明する.
  • 【結論】強力な中継ぎ陣&切れ目の無い打線が広島東洋カープの強さの秘密だった!

補足

【サンプル】セイバーメトリクスの「Hello World」〜2016年セ・リーグピタゴラス勝率を算出する

PyCon mini Hiroshimaピタゴラス勝率サンプル

【サンプル】FIP/RC27の算出

※後日公開(かも)*1

Q&A

覚えている限りで

Q:セイバーメトリクスの「セイバー」は何の略?

  • アメリカ野球学会(Society for American Baseball Research)の頭文字(SABRmetrics)
  • ライトセイバーとかは関係ないです.

Q:野球統計学の世界において、犠牲バントの評価はどうなのか?&計算などで使われているのか?

  • わざわざアウトを献上する戦術は無価値
  • RCの計算式に犠牲バントは「進塁能力」「出塁機会」の指標値計算の変数として用いられている

Q:選手の身長・体重を含んだ指標はあるのか?

  • メジャーな指標ではありませんが、一応ある
  • 体重が重いと故障しやすい、小さい投手はピークを早く迎える&衰え速い、などそんなのを分析するのに使う
  • 選手のフィジカルや身体能力は「投げる」「打つ」「走る」をベースに分析するのが基本

Q:何故日本シリーズは日ハムに破れたのか

  • シーズンデータと異なり、データが少ないのでセイバーメトリクスでの証明は難しい.
  • 仮説&主観ベースの意見だが、結局は采配の差(調子いい選手をいいタイミングで使えたか否か)が大きかったと思う.
  • センサーデータ(Pitch f/xやStatsCastなど)のデータがあれば分析可能かもしれない

今回も正装しました

なお、無事生きて帰れました.*2

もっと詳しくセイバーメトリクスを!

手前味噌ですが、過去に書いた記事をご覧頂ければと思います!

マネーボール他、参考書籍についても掲載しています.

shinyorke.hatenablog.com

shinyorke.hatenablog.com

なお、2016年版をいずれ書く予定です.

他の発表

基調講演

speakerdeck.com

感想(Twitter)

その他の発表

  • 広島の民泊、サイクリスト支援、(Python絡んでいないけど)観光データベースetc...活用方をPythonで見出す、という発表が多かった.
  • その他だと研究教育におけるPythonの活用、IoTネタ(光線銃ゲーム)などなど.
  • データ系と研究開発、IoTと完全に別れてWebネタがほぼ無かった(強いて言うならスクレイピングか).

*1:難易度が高い&これだけで一記事書けそうなのでホントに後日になりそう

*2:むしろ笑いが多かったからみんなやさしい

LEAN BRANDINGから考えさせられる,エンジニアな自分のブランディングとキャリアパス(ポエム)

Lean Branding キャリア ブランディング エンジニア

先に宣言しますが,書評の皮を被ったポエムです.

本の4章(全体で12章)しか読んでないけど、割とそこで気がついた事が合ったので書き留めます.

リーンブランディング ―リーンスタートアップによるブランド構築 (THE LEAN SERIES)

リーンブランディング ―リーンスタートアップによるブランド構築 (THE LEAN SERIES)

最近ちょこっと話題になってるこのブログあのブログの文脈ともつながるんじゃないか?

と気がついたことがあるのでメモ程度にポエムしたいと思います.

なお,エンジニア志望の学生さんや新人さんにはまだ早い内容です.

多分.

おしながき

LEAN BRANDINGってどんな本?

大雑把にいうと...

  • Lean Startupの思想とお作法をベースに,「ブランディングとはなんぞや?」を改めて解釈
  • スタートアップや社内新規事業の為のブランディングの本
  • サービスやプロダクトと同じく,ブランドだって適応しながらBUILD-MAJOR-LEANしてるのよ
  • 昔と変わらない「恐竜ブランド」VS仮説検証と適応を繰り返してグロースする「カメレオンブランド」
  • カメレオンブランドになるための考え方とかプロセスの紹介

読む上で大切なこと(なお3章までの内容な模様)

気になったキーワードを元に,ポイントになりそうな箇所を.

箇条書きは本の要約と,自分の感想です.

あらゆるモノや人は、少なくともひとつのブランドを表している。(第一章)

  • ブランドisユニークなストーリー ※ブランドの定義
  • ストーリー次第でブランドは関連付けられる
    • 製品×消費者自身のストーリー
    • 解決を約束できるか?
    • 競合他社に対するポジション(優位性、差別化)
  • 自分の感想「体験の総称」と思った(合ってるかしら?)

ブランド=ロゴではない(第一章)

  • ブランドは仮説検証を繰り返しながら動的に変わるもの = ロゴだけで語られるものではない
  • 顧客を獲得できるサービス・プロダクトは,「ブランドを動的に構築構築していた起業家」だけ
  • MVP(Minimum Viable Product)しかなくてもブランドは大切
  • つまりロゴはブランドが変わるたびにコロコロ変わる

リーンブランドは自己実現の近道になる(第一章)

ブランドは,消費者の「現在の自分」と「なりたい自分」を橋渡しするもの

ブランドについての誤解 (第二章) ※全部違うよ!

  • ブランドとはロゴである

  • ブランドは表面的だ

  • ブランドはマーケティングチームが管理するものである

  • ブランドはひとりで管理できる

  • 良い製品がさえあれば何もしなくても顧客を引き付けられる

  • ブランディングは、認知度を高めるためだけのものである

  • ブランドは計測できないので管理もできない

  • ストーリーと視覚的シンボル,成長戦略がそもそもブランドの根っこ
  • 根っこは仮説検証の中でいくらでもPivotする=良い製品は継続的成長の中で生まれる
  • Pivotを前提とするモノが,表面的だったり特定のチームが管理したり認知度を高めるためのパンダなはずがない
  • Pivotするということは計測が重要

ブランドストーリー (第三章)

  • ポジショニング

  • ブランドプロミス

  • ペルソナ

  • ブランドパーソナリティ

  • 製品

  • 価格

  • Pivotするもの=リーンだったりアジャイルなプロセスが通じる
  • MVPやプロトタイプと同様,顧客の「何」を解決し,「どのような価値」を生み出すかが重要
  • ブランドよりな考え方やアプローチだけど,ソフトウェアに通じるものがある

顧客の行動を変えるのはストーリーや不合理な衝動なのであって、事実や箇条書きなんかじゃない。(第三章)

  • ストーリーを説得する「ストーリーテリング」じゃなくて、ストーリーを表現して行動に移させる「ストーリーショーイング」が大切
  • ソーシャルメディアやデジタルチャンネル,ツールが揃ってもストーリーが表現できなきゃ意味がない

感想

ブランドは自己表現の第一歩!=人生そのもの

  • ブランドは,消費者の「現在の自分」と「なりたい自分」を橋渡しするもの ※大切なので二回言いました
  • 現在の自分→なりたい自分ということは,ブランドを通じて人は変化していく
  • ブランドの背景なストーリーが変わるということはブランドも合わせて変わるよね?
  • これって人生そのものでは

強く訴えるストーリーこそがブランディングへの近道

  • ブランドのロゴや製品そのものはストーリーを具現化する製品・機能でしかない
  • ストーリーはチームで作り上げるもの=ブランドはブランドチームのモノって事はないよね?図式的に

ブランドは常に変わる

  • 仮説検証を通じて適応していくということは常に変わる前提
  • ということはリーンやアジャイルにも通じる,というかそのものすぎる
  • ペルソナとかストーリーマッピングとかポジショニングマッピングが合うのは当然だよね

本そのものの感想

  • 30代以上のエンジニアで悩んでる人は第三章まで必読だと思う
  • エンジニア以外のビジネスマンにも◎, でも個人的にはエンジニアに第三章まで読んで欲しい(買うなり立ち読みなり)
  • あとはここまで書いた事に共感持てることあった人も.
  • 四章以降は具体的なプロセスや深掘りな思想なので,気になるところがあればつまんで読む感じがちょうどいいかと.
  • 読破するような本じゃないね絶対.
  • 総じてメチャクチャいい本でした!

LEAN BRANDINGから考えさせられる,自分のブランディングキャリアパス(ポエム)

最近ちょこっと話題になってるこのブログあのブログを読んだ上で.

LEAN BRANDINGの文脈と合わせて思ったこと.

思った&言いたいこと

自分の人生もブランドも「カメレオン」でいい

  • (エンジニアに限らず)20代・30代・40代...と、年代や状況によって、人生のストーリーは平気で変わる.
  • 20代はゼロイチで技術やビジネスを覚える、30代はそれを元でにジュウゼロにするのか違ったゼロイチにするのか...などなど.
  • 歳と経験,そして「徳」が積まれるタイミングで平気で変わるモンだぜ!ぐらいに気楽に考えるのがちょうどいいかなと.
  • もちろん,ライフイベントでも変わる(転職・結婚・etc...)

自分ブランドを下支えするストーリーを立てる&語る

  • 自分の人生のストーリーを意識して考える.リクルート風にいうと,「お前はどうしたい」っていうやつ.
  • 「お前はどうしたい」に対する問いから必要なブランディング戦略を考え,作り込む.
  • ブランディングの過程・ゴールが,「CなんとかO」や技術顧問,OSSへのコントリビュートなのかもしれない.
  • そこもやはり「カメレオンブランド」なので、ストーリーを軌道修正しながらブランディングを変えていけば.

「CなんとかO」も技術顧問もOSSコントリビュートもゴールではない(異論は認める)

  • (人によるけど)ストーリーって,抽象的かつ大きいものだと思う.
  • 「世の中の課題を解決したい」「世界一イケてるプログラミング言語を作りたい」「野球とITで世の中にイノベーションを起こしたい」とか.
  • 「CなんとかO」や技術顧問,OSSコントリビュートはブランディングやMVPであって,ストーリーとはちょっと違う.
  • 個人的には周りのCなんとかO,技術顧問,コントリビューターで「それそのものになりたくて」なった人はいない,もっと大きいストーリーを進めた結果でそれぞれのポジションに立っている.

で,お前(shinyorke)のストーリーとブランドは?

すっごい雑ですがこんな感じだと思う.

ストーリー

  • プロ野球またはメジャーリーグのフロントにエンジニアとしてJOINする(フルタイムかどうかは別として)
  • 2020年東京オリンピック,野球日本代表のスタッフ入り(勿論エンジニアとして)
  • そこに必要なエンジニアリングスキル(プログラミング・インフラ・開発プロセス)・思想を磨く
  • 勿論ビジネススキルも(マネージメント・英語・数学etc...)

ブランディング

...と, いう整理ができただけでもLEAN BRANDING読んでよかったと思いました.

リーンブランディング ―リーンスタートアップによるブランド構築 (THE LEAN SERIES)

リーンブランディング ―リーンスタートアップによるブランド構築 (THE LEAN SERIES)

それにしてもワールドシリーズ第七戦面白すぎる...