有意水準5%で純情な感情

有意水準5%で純情な感情

データサイエンティスト見習いです。データ解析とかIoTとか。 技術ブログも書いてますhttps://qiita.com/okura__

理学部進学を考える人へ

高校時代、志望学部を決める際に、 一番興味があったのが理学部物理学科でした。

ただ、すこしネットで調べると就職活動で苦労するみたいな話がゴロゴロ転がっていました。 しかし、その中には実体験を元に書かれた記事はあまり無いように思えました。 5年ほどたった今でも状況はあまり変わっていないように思えます。

実際に理学部物理学科に進学し、就職活動を経た実体験から 物理学科進学後の進路を少しでも多くの物理科を目指す高校生に届けられればいいと思いこの記事を書く次第です。 他の学部と比べて就職率はどうなのか?実際どのような会社のどのような職種に就く人が多いのか?などを書ければと思ってます。

前提

僕はMARCH、理学部物理学科の4年生です。 まぁまぁ真面目に就職活動をしてました。 「理学部、物理学科」で、「理工学部」でも「応用物理学科」でもないです。 また、大学によって扱う分野の範囲や風習も違います。 あくまでここに書く話は僕の一例として書きます。

理学部は就職無理学部?

自分が高校時代に学部について調べてる時によくこう揶揄されているのを見ました。 ですが実際に就活してみてそんなことはありませんでした。 むしろまわりを見ると、満足いく会社に内定をもらえなかった人はいませんでした。 身近な人は日経225企業や誰しもが知ってるメーカー、新卒1年目で日本の平均給与を上回る会社など、一般に難易度が高いとされる企業に内定をもらった人がほとんどでした(もちろん会社の良し悪しは個人の価値観によると思いますが)。 僕に関して言えば物理の命題の証明や議論のプロセスは就活でよく課されるグループディスカッションやワーク型選考に良く活きた実感があります。

では実際どのような会社/業種に行くのか?

学部就職

4年生で研究室に配属され、若干専門性が分かれてきますが、就職活動時点では未配属ですので、就職にはあまり影響しません。 その上で(うちの)物理学科の人気就職業界は

  • メーカー
  • IT(特にSIer)

の二つが圧倒的です。

職種でいうと 総合職(簡単に言えば転勤あり出世コースだが、入社時に職種は決まってない) システムエンジニア 技術営業 らへんになる人が多いと思います。

なにをやるのかというと システムエンジニアはアプリケーション(ソフトウェア)をプログラミングで作ったり、作ってくれる人の管理をしたりする人です。 技術営業は営業の際に営業の人より技術に詳しい人として同席する人です。

これらの業界は周りを見る限り

  • 給与が高い
  • 業務内容のイメージがつきやすい
  • 授業、研究でプログラミングやソフトウェアを扱うため、抵抗が無い

のような理由で物理学科に人気な気がします。 ですが、人気であって、有利なわけではないと思っています。ふつうに文系の人たちでも応募してますし、合格してました。

研究職や開発職は学部卒だと結構厳しいように思えます。

修士卒就職

自分で就活したわけじゃないので不正確です。 上であげたような総合職やシステムエンジニアになる人も一定数いますが、それに加えて工作っぽい方面(ハードウェア)に進む人が高いウェイトを占めるイメージがあります。たとえばメーカーの開発職などです。 新しい商品を作る際のプロトタイプつくりだったり、設計したりする仕事みたいです。 一部で研究職(基礎研究)につける人もいるみたいですが、こういった職種は博士課程卒の方が多くを占めるみたいです。   こちらはシステムエンジニア等と違い、理系であるかつ修士卒であることが応募のスタートラインである気がします。

その他

上では人気な業界について話しましたが、全く関わりのない業界に対しても特段不利なわけではなく、ふつうに就職活動を進めることができます。僕は途中まで金融を受けてましたが、理系であることにマイナスに触れられたことは一度もなかったです。

言いたいこと

結局、就職無理学部と呼ばれる理学部に進学しましたが、世間で言われているほど就職活動に難を感じている学生はいませんでした。 大学では自分がやりたいこと、興味あることに情熱を傾けるのが一番だと思うので、純粋に理科が好きという気持ちだけで理学部進学するに値すると思います。

signateのマイナビコンペ2019に出ました

初めてデータサイエンスのコンペに出ました(https://signate.jp/competitions/182)
kaggleのタイタニックをやったことはあって、雰囲気はなんとなくわかっていながらも、
敷居が高いように感じてリアルタイムにコンペに出たことはありませんでした
そんな時にsignateが学生限定のコンペをやるとのことで、これは絶好の機会と思い、参加しました
しかもテーブルデータということで(画像コンペ等と比較して)とっつきやすく、
計算資源が少ない僕でも参入しやすいことも参加した理由の一つです

多くの学びがあったので備忘録的に、また同じように敷居が高いと思ってる方向けにやったこととかを書いていこうと思います

僕のスキルは少し機械学習の勉強をして、機械学習の長期インターンで実務を少しやってるくらいです
noviceなので間違いやアドバイス等あればご教授いただけると嬉しいです

概要

コンペの概要は上のページを見ていただければわかると思いますが、
敷地面積や設備、立地等から目的変数である家賃を当てようというものです。評価指標はRMSEです
用意されている説明変数は15個とそんなに多くないものの、外部データ使用ありのコンペになってます
純粋なLBでの順位の他にアイデア賞という枠も用意されてるみたいなので、アイデア賞への投稿に多様性を出すためなんですかね

カーネルスタート

フォーラムの欄にEDAをあげてくれてる方がいたのでまずそれを足がかりとしました(初心者には大変ありがたいです、、、)
EDAから簡単な前処理、lightGBMで学習、サンプル提出のように
一連の流れが含まれていたので、このカーネルをベースとして最後までやってました
lightGBMは欠損値を埋めなくて良かったり、カテゴリ変数を指定できたりして使い勝手が良さそうで、
始まる前からlightGBM使おうとしてたのでありがたかったです
ちなみにカーネルにそって提出した予測のスコアはPublicで40000前後でした

特徴量作成

公開カーネルは前処理をしてなかったので、前処理をしつつ特徴量を作れそうなところを作っていきました

リソースの管理

初めてのコンペだったのでリソースの管理に苦心しました
後々困らないようにどのcsvがどの特徴量を追加したものか、
どの特徴量がカテゴリ変数なのか、各データセット,各パラメタでのスコアなどをメモしていました
ですが、あまり綺麗に整理できず、勘違いで無駄なことをして自分の首を閉めてました、、
次回コンペに出るときはディレクトリ構造と作業ログの残し方をちゃんと考えないとダメですね

関数化にこだわる

今まで重い処理を軽くしたり、可読性を高めたりする必要に迫られたことがありませんでした
ですが今回は作業の効率のため、コーディングスキル向上のために効率的なコードにこだわって書いてました

たとえばpandas.DataFrameはforではなくapplyで処理する、同じ処理を繰り返し行う時には関数定義して綺麗に処理するなどです
当たり前のことですが、意識するようになるとグッと効率が上がりました
ちなみにインターン先での業務でも効率が上がったのでハッピーでした

やったこと

具体的に前処理と特徴量生成でやったことについて話そうと思います。特別なことはしてません

  • str型→int(float)型に変更
  • カテゴリ変数はlabel encoderで処理
  • 一つのカラムに入ってる複数要素を複数カラムに展開
    • 設備等のデータ
    • 住所データ
    • 契約期間データ
  • 最寄りの施設までの距離作成

1,2個目は別に言うことないので飛ばします
一つのカラムに入ってる複数要素を複数カラムに展開はたとえば 東京都千代田区1-1を都道府県,市区町村,番地 に分けるみたいなことを意味してます
基本的にはあんまり効かない特徴量ばっかりになったんですけど、住所から作ったTownは feature importanceが2位の強い特徴量になりました
最寄りの施設までの距離作成は各施設の最寄りとの距離を特徴量として作りました。コンビニとスーパーは割と効きましたが、最後の提出には含みませんでした
正直遅れて参戦したこともあり、最低限の処理さえ未処理の特徴量もあったので、もう少しできることはあったかなと思います

別モデルに浮気

特徴量作成に限界を感じ(正確には飽きた)、選択するアルゴリズムの変更を試してみました

cat_boost

kaggle meetup tokyoの動画で、cat_boostというものを知りました (https://www.youtube.com/watch?v=4jd2XKALye0)
cat_boostは内部的にカテゴリ変数の組み合わせを作ってくれるらしくて、
laebl encodingで作ったカテゴリ変数がたくさんあったので試してみる価値はあるかなと思い、やってみました
使ってみた結果、スコアも上がらないし、学習にありえん時間がかかるので使うのはやめてしまいました
1位のチームはcat_boostを使ってたみたいなので、使ってる特徴量やパラメタの違いなんですかね(学習時間に関してはわからん)

ニューラルネットワーク

lightGBMのお供にNNがいいということもkaggle meetup tokyoの動画で知りました
Ensembleは別系統のアルゴリズムのものと組み合わせるといいらしいです
自分のなけなしの知識で3層のNNを組みましたが手元のスコアは26000で、
全然精度でず、、(その時のlightGBMはスコア22000くらい)
一応4:1くらいで混ぜてみるも当然スコアは上がらなかったのでこちらもお蔵入りしました
特徴量も対して入れてなくて、チューニングもしてなかったので、意外とちゃんとやれば使える程度にはなったかもしれません

ブレイクスルー

今まで書いてきたようにコツコツやってたんですが、ずーーーっとvalidスコアとPublicLBのスコアに乖離があることに悩んでました
評価指標がRMSEなので、testデータに外れ値が多いのかなとか思ってたんですが、
ある時急に学習時にカテゴリ変数を指定してないことを思い出しました
(一回カテゴリ変数を指定したんですが、カテゴリ数2のものを指定してもスコアは全く変わらず、
カテゴリ数1000~のものを指定したらスコアが悪化したので指定するのをやめてた)
そこでカテゴリ数~50のものを指定したら、validスコアは上がらないものの、PublicLBがガクッと下がり、validスコアにかなり近づきました
なんでカテゴリ変数を指定しないとvalidスコアとPublicLBに乖離が生まれるのかはわからないままです

2度目のブレイクスルー

築年数に外れ値があったのに気づかず(数字に変換した後に確認するの忘れてた)、
そういえば家賃も外れ値あったなーと思って外れ値の処理をしてました
家賃の外れ値を抜くとスコアが16000くらいに下がり、
signateちょろいわーとか思ってたらPublicでは24000で泣きそうになりました
実際には全然ブレイクスルーじゃなかったです
train_test_splitの割り方によって生じる精度の揺らぎかなと思って、
実装をめんどくさがってたクロスバリデーションを実装しました
多少揺らぎはましになったものの、外れ値の問題は解決せず、、、

twitterのTLみてたら、同じマンションの物件情報が
かなりたくさんあったらしくて、leakを考慮する必要あったらしいです
確かにleakしてると精度の過大評価になってvalidスコア<PublicLBのと辻褄が合います
さらにはこれを利用してtrainのデータと同じマンションのtestデータを埋めることもできたみたいです
みんな頭いいですね

やりたかったこと

時間が足りずにできなかったことがいくつかあります

前処理

アクセスの部分の処理にすごく悩んで結局時間足りなくてできませんでした
各物件に数が不定の最寄り駅とその路線情報がありました。カテゴリ数が500くらいあったので
one-hot-encodingするには多すぎるし、数も不定だからtarget encodingもlabel encodingも出来ないみたいな感じでした
そこで適切な処理かどうかはわかりませんが、各最寄り駅に対してtarget encodingをして、
その平均をとる操作ならできるかなーと思いました
ただ、target encodingはleakを防ぐような実装が必要で、
それを複数の最寄り駅に対して行う必要があり、コードがかけずに終わってしまいました
近々実装してみて効果を確認してみようと思います

NN

lightGBMと前処理を若干変える必要があり、コスパが悪そうなのでやめてしまいました
ですが、かけた労力の割にスコアが出ていたので、筋は悪くなさそうでした
こちらも近々実際にやってみたいです

緯度・経度情報

住所があったので緯度経度が取得できるはずなのでやりたかったんですが、
課金する必要があると小耳に挟んで、他にもやることはあったので
そちらを優先していたら時間ぎれになってしまってました
緯度経度を取れると面白い特徴量が作れるみたいなので
是非試してみたいです

学んだこと

そんな感じで不完全燃焼ながらも初めてのコンペをとても楽しめました 結果は302人中103位でした。実際は分母はもう少し小さいですが。

あまり納得の行かない悔しい結果でしたが、学べたことはとても多かったです

  • 前処理
    • 大量なデータの前処理の仕方
    • typoの処理
  • モデリング
  • コンペの雰囲気/流れ
    • leakは意識しよう(戒め)
    • スケジュール感
    • ユニークな特徴量の大切さ
      • 港区ポテンシャルとtwitterで調べてみてください
  • その他
    • ドキュメントの読み方を学んだ
      • lightGBMのドキュメントを読んだ
      • 苦手意識で避けていた
    • 実装力の大切さ
      • 実装で困ってると同じ土俵にも上がれない
    • 自分のレベル感を知れた

上位解法が出るのもすごく楽しみです
ぜひ次はkaggleに参戦しようと思います
間違いやご指摘、ご教授等ありましたら、是非twitterにてご連絡ください!(@takeru_okura)

時給が上がった話

こんにちは、たけるです。

今、ベンチャー企業でMLエンジニアとしてインターンやってます。フルタイム社員数名、副業メンバーいれて数十名みたいな会社です。 副業メンバーで成り立つくらいメンバー一人一人の能力がすごく高い会社です。

自分はまともな実務経験もポートフォリオも無いので、入った当初、周りのレベルを見た時に 「試用期間でさよならするやつだ…」と感じてしまい、そうならないように自分なりにできることをやってました。
勤務数回目だった先日、MLチームとモデリングについて議論してたところ急に
「10/1から時給100円UPね」 とslackが。 ジョインから半月のことでした。

今まで
時給1000円で1年間、
昇級して1500円で1年間、
別のバイトで1500円で1年間
やってきました。それらのバイトは高給で待遇は良かったけど、あくまでポジションに給与がきめてあって、そのポジションにぼくが居ただけです。だけど今回の昇級は違います。
僕という存在の スキルや思考や行動に値段がついたんです。
エンジニアを目指し始めて不安や焦燥に駆られながら勉強する毎日が認められたような気がしました。
正直なところ、1100円という評価には満足していないので、今後も精進していきます。

ただ、それだけの記事でした。

大学院にいくという選択

こんにちはたけるです。
紆余曲折ありまして大学院進学を決めました。 決断までに色々悩んだので、備忘録的に考えや思いを書こうと思った次第です。
 

大学院進学を決めた理由

キャリア的側面

SIerとコンサルをメインに就職活動をしてた時に、たまたま受かったコンサル会社のデータサイエンティスト職種に就職を決めてました。(ちなみに'たまたま'の根拠はちゃんとあって、同じ職種で内定が出た15人のうち、僕だけその場で内定通知されませんでした)
当時は機械学習を少し触っていたくらいで、データサイエンス業界のキャリアについて全く無知でした。しかし選考が進んでいくうちに自分はSEとして生きていくのは無理だと思い、データサイエンティストとしてコンサルへの入社を決めてしまいました。
入社が決まったのだからと、勉強のため色々調べていると、どうやら自分はデータサイエンス自体には興味はあるが、事業会社のアナリストとして働くことにも興味があるらしいと気づきました。

 

学問的側面

なんとなく物理が好きで理学部を選び入学した自分でしたが、別に特別強い思いで選んだ学科ではなかったので、大学生の多分にもれずバイト生活を謳歌していました。勉強も最低限でGPAは1.5。勝手に自分に物理はできないんだと思ってました。入学時には視野に入れていた大学院も次第に頭の中からフェードアウト。
時はすぎ、なんの疑いもなく就職活動をはじめ、少し早めに就職先が決まり、同じタイミングで研究室に配属されました。いざ、卒業研究に着手し始めると、面白くて面白くてたまらなかったんです。もう少し真面目に勉強していればと後悔する毎日でした(今でも毎日後悔してます)。


そんな感じで、自分の実力以上の会社に滑り込み、卒研でも着々と進捗を生んで、外面はいろいろなことが上手くいってました。その裏で、自分の腹のなかには不安や後悔、悩みが渦巻いていました。学問の道も楽しそうだなと思いつつも、いい就職先が見つかり、なんとなく目の前のタスクをこなす日々。そんななか、ある日教授に「君大学院行きなよ」とかるーく 言われました。何気も無い言葉だったけど背中を押されるような、自分を肯定されるような言葉で、自分には深く刺さりました。(そのほかにも要因はあったが)その言葉がきっかけとなり、大学院進学を決めました。

これから

自分はコンピュータサイエンス修士号をとるわけでもなければ、統計/機械学習の勉強も独学。3年後にデータサイエンティストを名乗って、おしゃれなワークスペースでカタカタやってるイメージが毛頭わきません。
ということでとりあえずデータサイエンスをやらせてもらえる長期インターンを探して半実務経験を積みながら、統計/機械学習の勉強をしていきたいと思います。
とはいえ院試に落ちてプー太郎になるのが一番やべぇので、年内は物理学に注力すると思います。

統計検定2級を受けました

こんにちはたけるです。
前回、挨拶の記事を書いた後に技術記事を書いていたんですが、
前提知識がない相手に説明するのが下手くそなことに気づきました。
本当はPC初心者でも理解できる記事を目指していたんですが
記事の量が膨大になってしまいました。
ということで本格的な技術っぽいことはQiitaで
もう少し初歩的なところはこちらで取り上げる感じで棲み分けていこうと思います。
Qiitaは書き始めたらリンクか何か貼ります。
今回の本題は統計検定についてです。

統計検定を受けてみた

データサイエンティストになるのに全く統計学を学んでいなかったので
統計検定を目標として勉強を始めることとしました。
2級を受験しました。これから勉強を始める方の参考になれば幸いです。
なお、僕は統計学が全くわからない理系です。数式に抵抗がない素人ぐらいのレベル感でみてください。

勉強内容、時間

流れは、
学校で提供されてる検定対策用教材を1周して、
その後過去問(8回分)を解き、わからない・知らないことを復習する感じでした。

学校の教材は確率変数の概念からt分布、t検定くらいまでをカバーしてました。
F分布やRの出力解釈などはごっそりとなかったし、検出力やフィッシャーの三原則みたいな少しマイナー気味なところも全くありませんでした。
ここまでで勉強時間5~8時間。2017年の過去問得点率50%くらいでした。

あとは過去問解きながら先ほど書いたような、教材から漏れている範囲を独学で学びました。
2015~2017の6回分の過去問を解き終わった時点で平均得点75~80点くらい。
合計15~20時間程度だったと思います。

ただ、2018年の過去問は直前に模試感覚で解きたくて残しておきましたが、これが失敗でした。後述します。

結果と所感

結果は得点率57%でした。自己採点ですが、多分落ちました。

前述したように、試験3日前に2018年の過去問を解いてみたら
見事に傾向がガラリと変わっていて脳みそが沸騰しました。
具体的には細かいところを突いてくるようないやらしい問題が多くなったように感じました。
網羅的に勉強している人は簡単に得点できそうでしたが、
僕のような要所を抑える小賢しいやり方では厳しく思えました。
3日前ということもあり、知識の穴を埋めきれず、
当日は試験会場で泣きながら電卓を弾いてました。

統計検定の勉強には統計webという素晴らしいサイトがあるんですが、
そのサイトは網羅的で、その内容がしっかりと入っていれば、最近の傾向でも難なく行けると思います。
ただ、少し初歩的な部分が冗長なので、僕のように他の教材が用意できる場合は
先にそちらで要所(検定くらいまで)を抑えて、統計webで細かい知識をつけていくと
盤石かもしれません。あくまで僕の所感です。

終わりに

次回もきっと受けるのでその時はきっと統計webでみっちりやってから行きます。
皆さんは最新の過去問から解いていって、僕の屍を超えていってください。

ご挨拶

はじめに

こんにちは、たけると言います。
就職活動が終わり、2020年4月からデータサイエンティストとして働くことが決まりました。 と言っても大学での僕の専門分野は物理学です。授業でまともにコードを書いたことがありません。 職種別採用のコンサルティング会社を受けた際に、ちゃんと確認せずに受けた職種がデータサイエンティストだったのです。 しかしなぜか内定をいただき、SEと悩んだ末にデータサイエンティストとして生きていくことになりました。 周りの内定者、配属される部署の社員の方々の話を聞くと、データサイエンスのバックグランドを持っていないのは自分だけらしいです。 このままだと流石にまずいということで、必死に統計学機械学習の勉強をしています。

このブログについて

上で述べたようにデータサイエンスの勉強を始めたばかりです。
このブログでは勉強のモチベーション維持のため、アウトプットのため、
そしてデータサイエンティストを目指してジョブハント中の方々のために
日々の勉強や初心者特有の悩み、キャリアについてかいていこうと思います。
あと、僕は研究室に所属している、かつバイトでエンジニアをやっていることもあり
物理学やIoTに関しても記事をあげるかもしれません。
コメントでご指摘、ご意見いただけると嬉しいです。