The Pitcher in the Rye

I'd just be the catcher in the rye and all. I know it's crazy, but that's the only thing I'd really like to be.

データサイエンティストに転職して1年ちょっとの感想

春なので何かを書いてみたくなった

in-the-rye.hatenablog.jp

上記の記事で、転職3ヶ月後の記録を書いてから1年弱の間完全にブログをサボっていました。ただ、4月1日ということもあって、Twitterで新天地で活躍する思いを表明されている話とか、いろんな人のブログとかを見ているうちに何となくこの一年あまりを振り返ってみたくなったので書いてみようと思います。

春

この一年どんな案件に関わってきたのか?

自然言語処理案件

大量の自然言語公開データを使って、今まで一部のプロフェッショナルがやってきた判断と類似の判断を自動で行うという案件を担当しました。機械学習とルールベースの処理を組み合わせて実現するような案件で、似たような案件を複数件担当しました。

何度かPoCを行って、ある程度有用な示唆を出せるようにはなったのですが、どれもプロフェッショナルを代替するような結果にまでは至らず、プロフェッショナルを一部サポートするツールという位置付けとなりました。

単語分割してベクトル化等を行うWord2Vecなどをベースとする技術から、BERT系の技術まで使って一通り実装してモデルを作ったりしました。単純な文書分類器というわけではなくルールベースを組み合わせたりする必要があったのが大変でした。またプロフェッショナルが判断を行った正解ラベルにかなりバイアスがあり、これも何を正解とすべきかがだんだん分からなくなったりして大変でした。

本当の最先端の技術を使った訳ではないですが、前処理等含めて自然言語処理の基本的な部分や、大変な部分を色々経験できたので良かったと思います。

時系列データ分析案件

とある時系列データの分析モデルを作る案件でした。メインでの担当ではなくサポートです。

精度の良い予測モデルを作ることが目的ではなかったので、SARIMAなどのモデルにその他の説明変数を加えた線形重回帰モデルを構築しました。前処理や、説明変数の選別などを行い、一定以上の精度のモデルができたところで、目的変数の変化を説明する要因を分析していきました。

この案件で、SARIMAというモデルを初めて知りました。単純だけど理論からの先見情報がない時系列変化をモデル化するには便利なモデルだなと思いました。時系列データの分析は前職でも色々やっていたのですが、物理現象など微分方程式で一定の定式化がされているデータを扱うことが多かったので、先見情報となる理論がないのは新鮮でした。

異常検知案件

これも時系列データ分析案件の類似案件ですが、時系列データからの異常検知でした。

SARIMAモデルを応用して、周期変動成分、トレンド成分、ノイズ成分を分離し、本質的な変動が一定閾値を超えるような異常変動を検知する比較的単純なモデルを作りました。ただ、残念ながら元のデータがあまり明確なトレンドを持ったデータではなくノイジーなデータだったため、”異常”をきちんとは検知できませんでした。

FFTやウェーブレット解析などの周波数分析も少しだけ試みましたが、あまり有用な結果は得られませんでした。

統計分析案件

こちらは「とりあえずデータがあるんだけど何かできない?」という典型的な失敗に向かう案件でしたが、やることになりました。

一番つらかったのが、ビジネス観点から分かる仮説をカウンターパートとなるビジネス側の人間が何一つ提示してくれないという状況からスタートしたことでした。さらに非常に短い期間で結果を要求される案件であったため、あまりきちんとビジネス側にヒヤリングをすることも出来ずきつい案件でした。

結局のところ基本的な記述統計量を様々な属性ごとにまとめたり、散布図やヒストグラム、相関ヒートマップなどの可視化等基礎分析を行なった上で、暫定仮説を立てて統計検定を行いました。

この案件の中でパラメトリック、ノンパラメトリックの統計検定やpost-hoc analysisのやり方や、多重検定時の補正、効果量や信頼区間、サンプルサイズなど色々なことを学び直しました。

検定結果から得られた示唆は、ある特定の属性間において仮の仮説に基づいていくつか定めた目的変数間に統計的に有意な差異が見られる、という結果になりましたが、まあ想像した通り「そんなことはもう知ってるよ」という返事がビジネス側から得られました。

ちなみに、仮説のきちんとした検証は継続的にデータを取ったり、そもそもデータを取得する計画をきちんと立てないとならないという話をしましたが、示唆が当たり前のことしか言えなかったため継続した話にはつながりませんでした。

この案件で、HARKing, p-hacking, asterisk-seekingという言葉を恥ずかしながら初めて知りました。これらを学べた点や、数理統計学の実用上の落とし穴を色々学べた(というか必死に勉強し直した)点は良かったように思います。

組み合わせ最適化案件

とあるデータリストと、とあるデータリストの最適な組み合わせを探る案件でした。(この説明では抽象的すぎて、何も説明できていないですがご容赦ください。。。)こちらもメイン担当ではなくサポートでした。

一番難しいモデリング部分は別のデータサイエンティストの方が基本的に終えていたので、組み合わせ最適化問題を解くだけでした。

制約条件が非常に複雑で、多項式時間で最適解を求められるような形にモデリングではなかったので、ソルバを使って混合整数計画問題(MIP)を解くか、ヒューリスティックな手法で解くかのどちらかでした。

結果としてこちらでは遺伝的アルゴリズムを使ったヒューリスティックな方法を採択しました。精度が保証されるやり方ではないので、あくまで解は参考値として最終的には人が判断するという形になりました。

ただ、結果はプロフェッショナルな人間の目から見てそれなりに妥当な結果であったようで、人間が一から組み合わせを考えるよりも、十分使えるという形になりました。

簡単な分析処理を組み込んだアプリ開発

直接のデータ分析案件からは少し離れますが、ソフトウェアエンジニアと一緒に協力しあってクラスタリング処理や、PCAによる次元圧縮などの処理をベースとした分析処理を行うWebアプリを作りました。

フロントはフロントエンドエンジニアに任せていましたが、バックエンド処理はそれなりに作りました。フロント側はVue.jsでした。

AWS上で作ることになり、AWS自体あまり使ったことがなかったので最初はかなり戸惑いました。ただ慣れてくると、軽い処理はAWS lambdaで、重い処理はAWS batch(中身はDockerで作ってECRに保存してデプロイ)で比較的簡単に作れるということがわかりました。

フロントもシンプルなものならS3にデプロイして、lambdaでAPIを作れば比較的簡単にWebアプリは作れるということがわかりました。

今まで、SIerではオンプレのサーバ等でしか開発した経験がなかったのでAWSのインフラ構築とデプロイの簡単さは驚きました。一方でAWSのサービス自体はものすごく多く、使いこなすのは大変だなという思いを抱きました。あと権限周りの設定が非常に多岐にわたっていて難しく、今だにこの辺りは単純な例を除くとよく分かっていません。

その他の案件と直接関係ないお勉強

  • 因果推論(効果検証)、因果探索等を勉強し、勉強した内容を発表したりしていました。

  • 強化学習の勉強も少ししていて、勉強した内容を発表したりしていました。

一年を振り返ってみて

こうして書き出してみると、色々やったなーと思いました。まだまだ、勉強しなきゃならない事はいっぱいありますが、データサイエンティストとして、ある程度のことはできるようになってきたのかなと思っています。

自分自身何か1つの技術に特化したデータサイエンティストではなく、広く知見を伸ばし、ビジネス課題を解決するための適切な手法を選択できるようなデータサイエンティストになりたいと思っているので、可能な限り手を動かし、より広い知識と経験を得ていければなーと思っています。