6ヶ月間過ごしたインドでのデータサイエンスインターンを振り返る
タイトル通りインドでデータサイエンティストとしてインターンシップをしてきたのでその振り返りをしたいと思います。こういう経験をしている学生はかなりレアだと思うので、インターンの探し方も含め全てをここにまとめようと思います。
はじめに
軽い自己紹介をします。岡山大学の大学院生で春からM2になりました。大学では生存時間解析を専門にやっていて、授業でも医学分野の統計手法を中心に勉強しています。インターンでは、MLエンジニアとしてミトラにて高齢者見守りシステムの開発に1年ほど携わったり、BEENOSにてECサイトにおける定着ユーザーの予測、楽天ではデータエンジニアとして新規プロジェクトのデータパイプラインの構築をしたりしてきました。経歴の詳細はこちらでご確認ください。
なぜインドのなのか
数あるインターンシップの中でインドを選んだわけですが、あえてインドにした理由は国としてのポテンシャルとその環境に魅力を感じたからです。
僕が初めてインドという国に興味を持ったのはこのニュースがきっかけです。
もともとメルカリには興味があったのですが、そのメルカリがインド人を大量に採用したと聞いて何か狙いがあるのではないかと思い「インド×IT」をテーマに情報収集を始めました。調べてみるとどうやら以下の背景からインドのITは注目されているみたいです。(もちろん諸説あると思います。)
・0を生み出した国、数学に強い
・カーストや地理歴要因からオフショアとしてITが盛んだった過去がある
・インドならではの厳しく制約のある環境からリバースイノベーション生み出される
・スタートアップ大国
・ネクストチャイナと呼ばれるほどインド市場は急成長している
アメリカのシリコンバレーでインターンをすることも考えたのですが、国として成長している環境に飛び込みそれを肌で感じ取ることは貴重な経験なのではないかと考えました。
また自分自身がどのような環境に身を置けば成長できるのか考えました。自分の過去を振り返った結果「やらざるおえない厳しい環境に身を置くこと」が自分の成長に繋がるのではないかと仮説を立てました。(自分の過去のことは詳しくは述べませんが「チームの目標のためにセンター試験2ヶ月前まで部活を両立させた高校生活」や「特に目立たない選手だった僕が大学で部員100人のキャプテンをした経験」から上記の仮説を立てました。)具体的に「やらざるおえない厳しい環境」とはどういう環境か考えたときに、まず言語として日本語で助けてもらえるような環境は甘いと考えました。また、少数精鋭でインターン生ながらも主体的にやらなければいけない環境が最適だと思い、インド系のスタートアップでインターンをすることを決めました。
インターンシップの見つけ方
詳細は以下のnoteにまとめているので見てみてください。
ここでは簡潔にまとめます。インターンを見つけるために実際にしたアクションは以下の①~⑥です。
①海外インターン仲介業者を利用する
②Indiaサロンを活用する
③Twitterを活用する
④企業に直接メールを送る
⑤Twitterで現地にいる日本人にDMを送り、アドバイスを受ける
⑥Facebookのコミュニティを活用する
僕がインターンを始めたのは2019年9月ですが、インターンを探し始めたのは2018年8月です。DMやメールを送った数は100通ほど。やりたいこと・身を置きたい環境が明確になっていたためインターン先を確約するまでにかなりの時間を要しました。この頃はインドの電話文化を知らなかったため、チャットベースでやりとりをしていてインド人から返信が来ないことで毎日悩んでいました。いろいろありましたが2019年6月頃正式な受け入れ書類を送ってくれたのがPurelogic Labsという企業になります。
会社の詳細
次は実際に僕がインターンをしたPurelogic Labsという企業を紹介します。
この他に自社のデバイスを利用してMicrosoftやインドのタクシー配車アプリのOlaと共同研究をしてたりしていました。
他の企業からもオファーはありましたが、僕がこの企業を選んだ理由は4つあります。
上記のような環境では、
自分が持っている 統計学の知識を生かして、社長のアイディアをデータサイエンスの課題に落とし込んだり、データを元に自分から分析できることを提案したりできる!
こんな最高の環境はないのではないかと思い、日本人、データサイエンティストもいないインド系のスタートアップに飛び込むこととなりました。
(もちろん現実こんな夢物語はなく、入社1週間前にデータベースの故障を知らされ使えるデータは0、入社してみるとエンジニアと称していた人はPMでコードは一切書いておらずエンジニアは全て外注でした...続く)
インターンでしたこと
インターンでしたことは大きくまとめると以下の4つです。
それでは1つずつ説明していきます。
課題のヒアリング
インターン開始後はまず会社の課題を社長からヒアリングしデータサイエンスの課題に落とし込む作業をしました。会社の課題はいくつかあって
などがありました。社長の話を聞く限り「AIなら何でもできるだろ」というノリで話していました。ホテルの在室推定は結構面白いと感じそれに取り組もうと思っていたのですが、よくよく聞いてみるとデータが1回試しに取ったものしかなく到底モデリングできる状況ではありませんでした。ここで発生した問題はなぜAIで解けないのか、どんなデータが、どのくらいあればAIがで解けるのかを非エンジニアの社長に英語で説明し説得させることでした。インド人の社長なので(?)自分のビジネスにはかなり自信を持っていました。そんなに英語がうまくない僕に取って英語で非エンジニアの社長に根拠を持って説明することはかなり難しかったです。簡単な例題や説明のスライドを作り何とか説得した結果、とりあえずPM2.5の予測に取り組むことにしました。
PM2.5の予測
PM2.5の予測のために時系列モデルの作成に取り組もうとしたわけですが、先ほども書いたようにデータベースの故障のため自社のデータは0になっていました。社員に聞くと「新しくデータベースを1から構築しているから3ヶ月後には3ヶ月分データが溜まっている」とのことでした...。この辺りは本当にデータベースが壊れていたのか、そもそもデータがなかったのかは未だにわかっていません。データがあるからこの企業を選んだのでこの事実にはかなり絶望したのですが、時系列の理論を1から学ぶチャンスだとポジティブに捉えることにしました。時系列モデルの理論を勉強するにあたりTJOさんのブログには大変お世話になりました。またudemyのベイズ統計学のコースも視聴しました。
この期間でPython, R, stanを用いて時系列データの前処理、トレンド・季節性の抽出、自己相関の確認、ARIMA・状態空間モデル・LSTMの作成など時系列データの理論から実装までを一通りサクッとインプットすることができました。
理論を勉強したあとはPM2.5のオープンデータを用いて時系列モデルの作成に取り組みました。事前知識で大気汚染のメカニズムとして、インドデリーの北側では野焼きが起きている→それが風によりデリー方面に流れてくる→山脈にぶつかることでデリー付近に貯まる。それが原因となり他の地域よりデリーではPM2.5mの値が高くなっているということがわかっていました。そのため特徴量として他のエリアの過去の大気汚染データや未来の風速・風向情報の活用を検討しました。
この時系列モデルを作成する上で課題となったことは2つあります。
- 何時間後まで予測をすればいいのか
- 評価指標はどのようにしたらよいか
まず1についてですが、社長の主張としては7日後まで予測をしたいとのことでした。これには特に大きい理由はなく他社が7日間予測をやっているからだと思います。もちろん7日間精度良くできればいいのですが、7日後までを正確にモデリングすることは僕にとっては不可能でした。実際、他社の予測結果を確認しても3日後までは精度が良さそうなのですがそれ以降の予測結果は平均を推移しているような様子でした。ここでPM2.5の予測をすることでユーザーは何が嬉しいのかを考えました。インドでは大気汚染がひどくなると息をするだけで不快になりマスクなしでは外を歩くことができません。特に、妊婦や乳幼児の健康に悪影響を与えます。また、洗濯物を干している場合は砂埃をかぶりせっかく洗ったものが汚れてしまいます。これらを考えると長期予測よりも短期的な予測で一日のうちの大気汚染のピークを知り、そのピークの時間帯を避けられるような行動をユーザーに促す方がユーザーにはメリットではないのかと考えました。上記のことからまずは短期的な予測で精度をあげることにフォーカスしました。
次に2について。データコンペなどではあらかじめ評価指標が与えられていますが、いざ自分で予測モデルを組むとなると自ら評価指標を決める必要がありました。回帰のタスクでは評価指標としてRMSEが標準的だと思いますが、精度を比較する基準がなくRMSEがどのくらい小さければ妥当なモデルと言えるのかを設定する必要がありました。そこで僕が用いたのは以下のカテゴリー表です。PM2.5は以下のような6階級で評価されます。1階級あたりの大きさは30であるためRMSEが30以内に収まればカテゴリーとしての予測はできているだろうと考えました。
上記の検討をもとに、まずは24時間予測でRMSE<30のモデルを作ることにしました。実際に検討したモデルはARIMA、Prophet、状態空間モデル、LSTMです。データの種類(観測地点・季節)・特徴量・trainデータの期間・前処理の方法・パラメータなどを変化させながら泥臭く精度比較をしました。結果、一番RMSEが小さくなったモデルはRMSE=20ほどになりました。LSTMはもう少し勉強して良い特徴量を作れば精度が向上したかも知れませんが、それに時間を費やすよりは次のタスクに移った方が良いと考え予想タスクはひとまずここで終えました。
クリギングを用いた空間補間
PM2.5の予測の次に取り組んだのはクリギングです。PM2.5の予測に取り組みつつも週に数時間は社長のもとでビジネスの構想を聞き、データサイエンスとして何かできないか何度もヒアリングを繰り返していました。ある時社長の口から出てきたのは大気汚染のデータを収集するIoTデバイスがない場所のPM2.5の値を知りたいということでした。以下は会社のwebアプリのmapなのですが、インド中にデバイスは408設置されていても地域によってはデバイスがないところがあることが課題でした。
これを聞いたときにふとゼミで習ったクリギングを思い出しました。クリギングを用いて空間補間をすればヒートマップのような滑らかな地図を作成することができ課題を解決できるのではないかと思い、自ら提案しこの課題に取り組むこととなりました。この時ちょうど1月の一時帰国のタイミングだったので、研究室に戻り教科書の必要なページをコピーしてインドに持ち帰り理論の勉強からはじめました。また、Rを用いたバリオグラム雲の作成や理論モデルのフィッティング、シェープファイルの処理の方法、Pythonでのクリギングの方法やfoliumを用いた可視化の方法を勉強しました。しかし、クリギングのモデルを作り緯度と経度を与えるとその場所のPM2.5の値を空間補間はできるようになったものの、以下のようにいい感じに地図上に重ね書きすることはできませんでした。
他サイトも参考にしたのですがJavaScriptのd3.jsで書かれていたため諦め、インターン期間内にこの課題を解決することができませんでした。研究室に戻りいくらかアドバイスをもらおうと思います。
時系列モデルのデプロイ
クリギングの可視化を諦めたのが2月末くらいで、最後に取り組んだのが時系列モデルのデプロイです。エンジニアリングの経験はほぼなかったため正直ここが一番苦手意識を持っていました。しかし、頼る人はいないため基本的には自分で調べるしか方法はありませんでした。社員の人と話し合った結果、まずは毎日時系列モデルを走らせ予測結果をTwitterに吐きだすBotを作ろうということになりました。
会社のクラウドはAWSを使用していたため、まずLambdaを用いてデプロイしcloudwatchで定期実行を試みました。しかし、外部モジュールを実行ファイルと一緒にzipファイルにまとめてアップロードするとことで転けました。調べてみるとzipファイルの容量が大きすぎるのが原因らしく、S3を経由したアップロードを試みました。しかしそれでもなぜかエラーが吐き出されLambdaの使用を諦めました。次にやったのがEC2上に環境構築をしてモデルをデプロイする方法です。ここではProphetのインストールで転けました。anacondaで環境構築をすると上手くいきました。最後はcronで定期実行を設定してモデルのデプロイが完成しました。今のところ不具合なく毎日10 am(IST)に時系列モデルが走り予測結果がツイートされています。
Air Quality Forecast for today, 04th April 2020.
— Rahul Singh (@socialRahulS) 2020年4月4日
[New Delhi] AQI: 70, PM2.5: 25.0 μg/m³
For detailed data: https://t.co/4atHwAvsMC#airquality #pollution #MyAQI #airqualityindex #AQI pic.twitter.com/qD5LkmFqUl
たった1地点でのモデルが動くようになっただけですが、社員の方が喜んでくれ嬉しかったのを覚えています。モデルのデプロイに成功したのが3/20で帰国日が3/22だったので本当にギリギリでした...笑
最後は、モデルの詳細のドキュメント化、コードのコメントアウトも全て英語に置き換えインターンシップが終了となりました。
インターンのまとめ
以上が僕がインターンで経験した全てになります。
このインターンシップでの収穫は
- 社長直下で働くことができたこと
- 企業の課題をデータサイエンスの課題に落とし込むところを経験できたこと
- 苦手意識があったモデルの設計・運用に挑戦できたこと
が挙げられます。今までのインターンだとモデルを作ってデプロイは他の人に任せたり、分析をした結果・考察をレポーティング&プレゼンで終わっていたのですが、モデルの設計・運用に挑戦できたことは良かったと思います。これは誰も頼る人がいない、自分がやるしかない環境に身をおいたからだと思います。また、データを用いた事業を立ち上げ形にしていく工程を純粋に楽しむことができ将来自分がなりたいデータサイエンティスト像を考えるきっかけとなりました。
一方で今後への課題も見つかりました。
- 日常英会話ではなく、根拠を持って相手を納得させることができる英語力が必要
- 自分が何となくで進めたモデルの構築・設計の正解を調べ、必要なスキルを身につけていくこと
以上2点が挙げられます。まず英語力についてですが、いわゆるビジネスレベルでの英語力が必要だと感じました。6ヶ月間日本人のいない環境でインターンをしたり、インド中を一人で観光できたりはしたので適当に日常会話をするレベルの英語力は身についたと思います。しかし、相手を説得させる英語、そして専門用語をわかりやすく伝える英語はまだまだだと痛感しました。これらを解決するためにさっそく、スタディーサプリのビジネス英語を1日1時間毎日取り組んでいるので3ヶ月ほど継続してみたいと思います。また、統計関連の専門用語は英語の論文を読むときに意識的に覚えることとします。次に2点目についてですが、これは頼る人がいない環境に飛び込んだ弊害なのですが、本当ならばどのようにモデル作りアプリケーションに取り組んでいくのが正解だったのか未だにわかっていません。そのためモデル作りはDSの専門の方に、モデルの設計・運用はエンジニアの方にアドバイスを受ける必要があると感じています。また、このブログを読まれた皆様、何か些細なことでもいいのでアドバイスをしていただけると幸いです。
今回の6ヶ月のインターンでは一時点の予測で終わったので、今後は複数エリアの予測をアプリ上に実装すること、クリギング結果をmap上へ可視化することに取り組んでいくのが目標です。引き続きPurelogic Labsとはリモートで関わっていく予定です。
その他
インド系企業のあれこれ
おまけでインドの会社の勤務時間、お昼ご飯、オフィスついてまとめたいと思います。
まず就業時間についてですが、僕の会社は8時間労働で10時~18時(フレックスタイムなし)でした。しかし、実際に同僚のインド人が出社するのは10時30頃で、始業時間はかなりルーズでした。(ちなみに僕は最初は10時に出社していたのですが、ルーズな環境に慣れた結果、最終的には11時前後の出社になりました🤫)お昼ご飯の時間は14時から15時でかなり遅めな印象でした。休憩時間はほぼなく、ご飯が終わると皆デスクに戻るという感じでした。中にはタバコを吸いにいく人もいましたが、1時間も休んでいる人は0でした。終業時間については予想通りという感じで18時00でした。17時55分頃になると机を整理し始め、18時には帰宅できる状況ができていました。遅くとも5分以上居残りをしていると戸締りをするメイドさんに催促をされるほどでした。
次にお昼ご飯についてです。これは何度もツイートしたの既にご存知の方も多いかもしれませんが、僕の会社の場合毎日会社負担でカレーをオーダーしてみんなでシェアして食べていました。実際に食べていたのがこちらです。。。笑
どうでしょうか?笑
ナンが出たときやカレー+ライスの時はかなり美味しかったです。しかし、3行3列にあるコリアンダー大量に含んでるやつは無理でした、コリアンダーが嫌いなので。また、5行3列にあるパリパリのやつはかなり辛いです。あと6行2列, 3列にあるようなチャパティ2枚の日は結構辛かったです。このような食生活を6ヶ月続けた結果体重を4キロほど減らすことに成功しました。
オフィスは予想していたよりも綺麗でビリヤード台などもありました。僕は贅沢にもデュアルディスプレイで開発できたり、就活時は個室のミーティングルームを使えたりと充実した環境でインターン生活を過ごすことができました。
meetupについて
最後にmeetupについてお話しします。meetupとはIT関連の勉強会のことでインドでは毎週この勉強会が行われています。僕はインドの首都デリーに住んでいたのですが、以下のような勉強会に参加しました。
・Developing AI Solution Mindset & Intro to Meta Heuristics and it’s Applications
・CellStrat AI Lab-Coding Hours - Machine Learning, Deep Learning & more (Gurgaon)
・Demystifying Expedia ML/AI Ecosystem & UX Practices for Designing AI Application
・PyData Delhi Meetup #35
・Google Cloud Community Day
・Explainable AI (XAI) Day at ODSC Delhi
・GDG Cloud New Delhi x Elastic: Data on Google Cloud Platform
PyDataやODSCのようにDS関連のコミュニティーが主催のmeetupとGoogleなど企業主催のものがありました。内容は入門的な内容から専門的な内容まで様々でした。meetupの時間は朝から夕方まで1日かけて行うものが多く、LTだけでなくGoogleColabでコードを共有しハンズオン形式のものが多かったです。また、これらのmeetupに積極的に参加する層は一定数しかいないため、どのmeetupに行ってもほぼ同じ顔ぶれでした。しかもmeetupでは日本人が0で僕しかいないため、僕の名前は多くの人が覚えてくれました。インドにおける日本人がいないというマイノリティな環境はかなりメリットだと思っていて、meetupで会う人全員が「何でインドに来たんだ」とか「何が専門なのか」と日本人の僕に興味を持って聞きに来てくれたました。そのおかげでGoogleやMcKinsey、American Expressなど有名企業のデータサイエンティストと簡単に繋がることができました。帰国前最後に参加したmeetupではインターンの総括を英語でプレゼンする機会ももらえました。
有名企業の方との出会いだけでなく、熱狂的なインドのエンジニア学生に出会えたこともこのインド生活の収穫の一つです。僕が出会った学生たちは技術力の高さは日本の学生と同じくらいでしたが、エンジニアとして人生を変えてやるという熱い思いをひしひしと感じました。世界に向けて英語で技術ブログを書いたりLinkedinで積極的に情報発信している学生と出会えたのは、将来グローバルに働きたい僕にとって最高のモチベーションとなりました。帰国後の現在も引き続き彼らとは連絡を取り合っているので、今後もお互いに高め合っていきたいと思います。
以上1万字近く書きましたが僕が6ヶ月間過ごしたインドでのデータサイエンスインターンの全てになります。インドでの生活についてはまた時間があるときにまとめたいと思います。
最後まで読んでいただきありがとうございました。