33歳未経験からデータサイエンティストになるってどういうこと?
あけましておめでとうございます。
2019年もデータを活用したビジネスや、機械学習、統計学などのトピックが注目されましたね。
データサイエンスの勉強を始めてちょうど2年経ったので、2020年はチャレンジするぞ!と言う方向けに、これまでの体験を記事にしてみたいと思います。
この記事では、
数学は微分積分がわからない。そもそも記号が読めない...。プログラミングなんてほぼやった事ない...。
という状態だった私が、33歳から勉強を始めて8ヶ月後に運よくデータ分析職に転職することが出来たので、
どんなレベルの人が、どんな勉強をして、どんな仕事をやってきたか、恥ずかしいですが出来る限り赤裸々に書いていきます。
現在もデータサイエンティストを自称できるほどのレベルではありませんが、この世界に飛び込んでみよう!と考えている方の参考になれば幸いです。
対象とする読者について
実は通っていたデータサイエンティスト育成スクールに採用されて、今は講師をやってます。正直運が良かっただけなので、転職のやり方に興味がある方への有益な記事ではありません。
この記事は、未経験から実務に当たった私が、
・もともとどのような経験・能力があったか
・実務にあたるまでに何を勉強したか
・どんな実務をやったか
を出来る限り生々しく書きたいと思ってます。私自身まだまだなので、もし意見があればなんでもください。またもし相談したい事がある方は私で良ければ気軽にご連絡ください。
もともとどのような経験・能力があったか
数学・プログラミング
序文の通りですが、数学・プログラミング共にめっちゃレベル低かったです。今でも覚えていますが、積分記号のインテグラル(これ→∫)が読めず、ググれなかったんですよね。
中学生までは数学が結構強くて、高校入学直後の学力テストでは学年2位(学年300人ぐらい)だったんですが、高校から全く勉強をしなかったことを後悔しました。微積分はもちろん行列や確率も全然わからなかったです。
プログラミングについては、最初の出会いは大学時代でなぜか基本情報技術者を取得しようと参考書籍を買ってJavaをやろうと思ったんですが、3分ぐらいで挫折しました。その後(確か2016年ごろ)にプログラミングスクールに通ってRailsを触ったので、Pythonを始めるときに「やったことあるし、いけるっしょ」と思ってましたが、全く覚えてませんでした。for if def の書き方から勉強し直しました。ただ、今講師をやっていて思うのですが、少しでもやった事がある方とそうでない方は、結構差が出る事が多いので意味はあったと思います。
経験職種
営業と特定プロダクトの営業戦略(と言っていいか微妙だけど間違ってはいないと思う)をやってきました。営業は個人と法人両方やってますが、法人の方が長いですね。
法人営業時代は成績は結構良くて、半期ごとの成績では(ほぼ)毎回1位でした。社長賞をもらったこともあります。
営業戦略は簡単に言うと「担当プロダクトの売上をあげてね」と言う至極シンプルなミッションで、本当になんでもやりました。
特に営業戦略の経験は2つの理由でデータ分析でも非常に活きました。
1. データのイメージがある。
業務ではテーブルデータをExcelでクロス集計を行い、レポートを書いていたんですが、統計や機械学習を学んでいる最中も「あの時のあのデータをこうするとどうなるかな」ずっと考えてました。「データ定義」が出来るレベルで具体的にシーンを想像しながら学べたのはアドバンテージでした。
2. 分析結果を使うシーンが想像できる
データ定義よりこちらの方が重要かも。勉強を始める前は、機械学習や統計が魔法の様に問題を解決すると(ちょっとだけ)思ってましたが、本質的には記述統計(平均とか)を使うことと変わらない様に思います。分析をした結果を「で?」ってあの人に言われそうだなぁ...。とか考えながら勉強してました。以前の仕事と基本動作は変わらないので、その経験は大いに役立ちました。
総じて「自分の過去の経験を引っ張り出して何とか関連づける」事で時短を図ったわけですが、ある程度狙い通りに行ったような気がします。
転職までに何を、どう勉強したか
ざっくり以下のようなトピックを学びました。
・統計:Rプログラミング、確率分布、仮説検定、線形回帰、ロジスティック回帰、回帰診断
・機械学習:Pythonプログラミング、教師あり(いくつかのアルゴリズムと交差検証などの一通りのパイプライン)、教師なし(クラスタリング、次元削減)
最初に書いた通りスクールに通っていたので、その教材から学んでます。ここに書いてあること以外も結構やってますが、特に印象深かったのは、2回目の講義の時に勾配降下法と確率的勾配降下法をnumpyでフルスクラッチしたことです。当時はマジで意味不明で鬼だと思いました。その後も、かなりマゾイ量を詰め込みました。結論それが良かったんですけどね。
当時から少しずつカリキュラムを改善し続けているので内容は異なりますが、主要なトピックは変わってません。
ということで、スクール行ってました。だけではちょっと味気ないのでおすすめ書籍などを紹介していきたいと思います。
1.勉強を始める前に
あまり書籍などに丁寧に書かれていない事なのですが、どのような手法も
「もしこうだとしたら、この手法が適切だよね」が前提になってます。
要は「未知の母集団を手元のデータで推定してみよう」って事なんですが、「未知」なので「もしこうだとしたら」という仮定を当てはめないと、数理的に近似できないんですよね。
なので、常にどの手法・理論がどんな仮定を置いているかを考えながら学ばないと上手く使えないのですが、これに気づくのに結構な時間をかけてしまいました。諸先輩方にとっては当たり前なんでしょうか。
2.統計
これはめっちゃわかりやすいし、最初に学ぶべき大事な部品をかなり丁寧に説明している印象です。(最初に読みたかった)
次はこれです。
でその次にできればこれも読んで欲しい。仮説検定におけるサンプルサイズの決め方について、この本以上に丁寧に説明している本はないと思います。
このぐらいまで読めれば久保先生の鉄板書籍が読めると思います。
一回で全て完璧にわかろうとするときついので、統計はロジスティック回帰までで一旦はいいんじゃないかと思ってます。
あとは、理論ではないですが統計読み物として面白かった本
こういう本は馬鹿にならなくて、学習対象のトピックに様々なコンテキストが関連づけられると定着しやすいので、休憩がてらぜひ読んでみてください。
他に全人類がわかる統計学と統計WEBもめっちゃいいサイトです。無料でこの情報量はすごい!ありがとうございます!
3.機械学習
機械学習の最初のゴールはKaggleへのsubmitじゃないでしょうか。実務ではKaggleのような問題に落とし込む力の方が重要ですが、こんなに良い練習環境はありません。
大量の「リアルな」データがあって、ググればいくらでも情報があり、コミュニティもある、最高の環境です。因みに私はTitanic,HousePriceという2つの練習コンペに参加し、できるだけ自分でコードを書いて、どちらも(当時の)上位7%ぐらいになったのでそこでやめちゃいました。
Kaggle の submit までならググればなんとでもなりますが、一応お勧め書籍を。
まずはこれ。勾配ブースティングとスタッキング・アンサンブルは飛ばして良いと思います。一通りのお作法ができる様になりましょう。
こっちが先でも良いかも。とっつきやすい。
次がこれ。これでアルゴリズムの中身を理解するのにいい本。
とりあえず、線形回帰とロジスティック回帰、決定木とランダムフォレストは、紙に書きながらでも良いのでちゃんと理解できるとその後の勉強がだいぶ楽になると思います。他のアルゴリズムは知っていた方がいいですが、最初のうちは必須ではないと思います。
ちなみに「はじめてのパターン認識」を薦める人が多いですが、初学者がこれ?え?まじ?と私は思いました。私はもうちょっと勉強してから読みました。
4.数学
数学2Bをサボった私は、最低でも微分積分、指数対数、数列、確率はやらないといけませんでした。数学2Bの範囲はいくらでも書籍や動画があるので、ここでは紹介しませんが、書籍を買う場合は自分のレベルにあっている本を書店で探すのが吉です。
ただ、線形代数はたぶんこれが一番いいと思います。rubyで書かれてますが、ぜひnumpyやscipyで書くと練習になります。
機械学習のお作法が一通りわかって、線形代数もなんとな〜くわかった感じになると以下の本がめっちゃ簡単に感じるはずです。
ところで、数学はどこまでやればいいんでしょうか。33歳の私は答えが欲しかったんですが、必要な時に必要なものを学ぶしかなさそうです。とりあえず、証明ができなくても意味が分かることを目指しますが、どこまでやれば意味が分かる様になるかは対象によって全然変わりますし、その時々に応じて必要な理解レベルは変わるので、自分なりのベストな方法を探しましょう。きっと見つかるはず。(日々の訓練をサボっていいわけではない)
それから数式だけが数学ではありません。例えばインド式の掛算で格子状に線を引く方法がありますが、あれは数式ではありませんが、数学ではあります。別に図形的に理解してもOKなわけです。こういう柔軟な考えを初めから持てたらもう少し効率的に勉強できたかもしれません。
紹介は以上です。
現在の私も紹介した書籍の全ての内容を完璧に理解しているとは言えませんが、転職前にはうすーく理解してました。
一応補足しておくと、同じトピックについて複数の書籍から同時に学ぶような方法を取っていたので、これ以外の書籍も結構読んでいます。
転職して携わった仕事
上記で説明したレベル感から始めて、一体どんな分析をしてきたのかまとめていきたいと思います。
1. 20億行のデータ集計。SQL書けない地獄
最初の案件です。勉強中に少しだけKaggleにハマっていたこともあり、pandasは書けたんですがSQLはほぼ書けませんでした。
なので、pandasで処理できる大きさにするまでをなんとかSQLで書いてpandasで集計しました。
無事レポートを納期内に提出できましたが、その後急いでBigQueryにKaggleのデータセットを流し込んでひたすら練習しました。(環境構築なんてやったことないので、データを流し込むのも苦労)
私の場合前職でExcelは使っていたので、pivot table ,Vlook UPに相当する処理を自由に出来る事を目標に練習しました。
当時の私のレベルでは知識というより実践あるのみだったので、SQLに関する書籍はあまり読んでません。
2. 2000万行のテキストデータを自然言語処理
前回の案件の続きです。この頃からクエリの「コスト」を意識するようになり、index の勉強をした記憶があります。
以下のサイトをとりあえず読みました。無料でこの情報量はすごい。
で、この案件で何をしたかというと顧客のTreasureDataから自社AWS Redshiftにデータを保存し、それを自社EC2から読み込み、自然言語処理を行うというもの。顧客別にテキストが関連づけられており、購買セグメント別の違いをレポートにしました。自然言語処理はLDAを使っています。
「クラウドあんまわからん」「.py って何?jupyterしか知らんがな」「データでかすぎ」「LDAとか知らん」て感じで、もう全部がマジできつかったです。sshとか普通に書き方知りませんでした。git/git hubも初めて使いました。LDAの出力結果をレポートとしてキーメッセージを付けるのもめちゃ大変で、それらしい結果が出るまでは、アルゴリズムに入れる前行程も何度も調整しました。
ちなみにLDAは書籍が少なく、たぶん「トピックモデルによる統計的潜在意味解析 (自然言語処理シリーズ)」しか詳しい解説がないと思うのですが、頑張って読みました。むずいよ…。
3. 40万件のデータなら簡単…ではなかった
40万件のデータをクラスタリングするのがゴールで、かつ小サンプルでパイプラインが通っていたので、コードを修正して40万件のデータを流し込めるようにするのが私の役割でした。
使われている技術が、NMF、コサイン類似度行列生成、スペクトラルクラスタリング、だったんですが(ちなみにレコメンドエンジンではありません)
類似度行列を作ると(40万^2)× 64bitのデータ規模になってしまうため、何も考えずに実行するとメモリに乗らないんですね。
最終的には、上述の方法そのままは使わず、ビジネスゴールから逆算して問題ない妥協点を探してなんとかしました。
※その時に人に薦められた本。良かった。
そうそう、レコメンドエンジンは書籍が結構限られているので、やってみようという方は以下のスライドを読みつつ文献を探してみるといいと思います。
あとは「m3 推薦システム」とかでググると大量に記事がヒットします。以下の記事とか結構面白いです。
尊敬するスーパーエンジニアに紹介された本。英語に耐性があればどうぞ。私は今年こそ読むぞ!と思ってます。
4. 予測モデルを作りFlaskでAPI化する - 1
Flaskやったことねぇ!!から始めたんですが、GET request に対して Jsonでレスを返すだけだったので、思ったより簡単でした。本も買ってません。
ただ、特徴量を3000個作るのが大変でした。そのために、Query構文を生成するプログラムを(Excelで)作りました。(せめてpythonで書けや。当時の俺)
また、ただ予測結果を返すのではなく、特定の量的な特徴量を下限から最大まで与えた場合に、その特徴量がどの程度だと「最適か」を判定する仕組みでした。いわゆる「partial dependence plot(ぜひググってみてください)」を使いました。で、この処理がクッソ重かったんですね。
と言うことで、並列処理や早く動かすpythonの書き方を勉強しました。ただ、並列処理は私にはちょっと早すぎましたね。問題を複雑にするだけだったので並列処理はしない方針にしました。
あと、結局やりませんでしたが、効果測定を傾向スコアでやろうとしていたので、そのあたりも勉強しました。
5. 予測モデルを作りFlaskでAPI化する - 2
上記の案件の続きですが、裏側のロジックが全然異なりました。
線形回帰モデルを複数生成し、モデルごとの予測値の合計が最大になるように、限られたリソース(要は説明変数の一つ)をモデルごとに配分する。いわゆる数理最適化問題です。(厳密には単純な線形回帰の合計ではありません)
PuLP(というライブラリ)で解こうと思ったんですが、蓋を開けてみると解けない問題設定だったので結構ヘビーでした。
また、今回の Json レスポンスはエンドユーザーに直接表示するものなので、データから学習したとはいえ、極端な値は出力できません。(前回は違和感のない出力結果だけをユーザーに表示する仕組みだった)
これがめっちゃ大変でした。最適化問題の制約はユーザーの入力値によって決まるので、何パターンも試行して出力結果が特定のレンジにおさまるよう、ありとあらゆる検証をしました。
この案件は、書ききれないぐらい学びが多かったんですが、中でもちょっと自慢したいのは、個別の予測モデルは数式から考えて書いている所です。
sklearnで済ませようと思ってましたが、どうしても無理だったので自分達で考えた基底関数を試したところ上手く行ったんですね。
またこの頃には、「早さ」が必要な場面ではほぼ numpy で書くことが習慣になってました。
※リーダブルコードは確かこの時期に読んだ気がする
6. リーケージの洗礼
はい。出落ちです。顧客別の受注予測というシンプルなTaskでした。
データは先方に用意してもらって、いきなりAUC95%を超えました。
ROC曲線も「角ばって」おり、Freature Importance は特定の変数だけ異様に高い。典型的なリーケージですね。
データを作り直してもうだけだったので、大した問題にはなりませんでしたが、実は先方も自分でやろうと思えばできてしまうぐらいには、理論的にも実装力的にも理解があるご担当者だったので、注意してデータを作っていたはずなんですよね。
ここでの学びは「リーケージは注意しても起こりうる」事ですね。実際私も、FlaskAPIの案件で「時点」をかなり気を付けながらQueryを書きましたが、単純集計の時とは別の大変さがありました。結合するすべてのテーブルの「時点」をレコードごとに合わせないといけないのは、恐らくこの手のTask特有だと思います。
7. 自然言語では辞書が大事
上記の受注予測と同じ顧客です。word2vecを使って何やかんやしました。予測精度のTaskとは独立しており、「ぽい」結果が出るように調整するのが結構楽しかった案件です。
この案件で印象的だったのは「辞書」です。
なんと形態素解析に使う「辞書」をクライアント企業の担当者の方々が、自分たちで編集して、自社ビジネスに関わる単語を登録されてました。
最近はBERTなどの高度なアルゴリズムが注目されていますが、アルゴリズムに投入する前処理で、必ず「辞書」を使った処理を行います。
機械学習を使った自然言語処理が流行ってますが、業界業種特有の「言葉」って一般の辞書では登録してないことが多いんですよね。例えば、「機械学習」と言う単語を、「機会」と「学習」に分けちゃうと全然意味が変わっちゃいますよね。地味ですが「辞書」はめちゃ重要だと思います。
※Word2vecに興味があれば以下の本をどうぞ。
8. 自分の名前で...
過去の仕事でお世話になった企業から受注いただきました。成果物はレポートで、決定木を用いて分析しました。事業について私がそれなりに理解があったことも関係しますが、「仮説の掘り下げ」や「意味付け」が楽しかったですね。
そして何より、会社名ではなく自分の名前で売上になった人生初の案件でもあります。
これまでの案件を軽い気持ちで取り組んでいたわけでは決してありませんが、如何とも形容しがたい緊張感で取り組んでいました。
弊社側の事情があってその後の分析は継続しなかったのですが、チャンスをいただけるならまたいつかお役に立ちたいと思っています。
以上。
上記で書いた案件は、期間もバラバラだったので、常に並列して複数案件をやってました。勉強も必要だったので寝る時間が十分に取れませんでしたが「まぁ受講生は働きながら勉強しているのでサービス提供側の私が仕事以外に勉強するのは普通でしょ」と考えて乗り切りました。
また、当たり前ですがレビューや指導をもらいながらやっていたので、チャレンジしやすかったのも幸運でしたね。
正直まだまだレベルは高くないとは思いますが、あまりそういうことは気にせずに楽しんで取り組むことができました。
最後に
DXとかデータサイエンスが完全にバズワード化しているので、今後どんどん淘汰されていくと思ってます。生き残る人材とそうでない人材の境界線はわかりません。
そもそも、どんなに事実に基づいて分析しても、人間の意思決定なんてものは最後は気持ちですしね。重要であればあるほど、違和感があればNoです。
データが石油だとか言っている人がいますが、データそのものに価値なんてありません。人間が意味づけをして初めて価値が生まれます。
考えれば考えるほど、データサイエンスって矛盾と混沌の真ん中にあって非常に面倒くさい領域だと感じるのですが、それが一番楽しいんですよね。矛盾して板挟みになるような状況ってエキサイティングなこと起こりません?根拠ないですけど私は勝手にそう思ってます。
まぁいずれにしても、万人に向いている仕事とは言えませんが、興味がある方は一歩踏み出してみてはいかがでしょうか!ぜひ一緒にデータサイエンスしましょう!
この記事が気に入ったらサポートをしてみませんか?