社会人2年目がデータ分析で得た教訓

# はじめに
こんにちは．
NTTドコモサービスイノベーション部で働いております社会人2年目の橋本です．  
業務では機械学習を中心にコードを書いています． 
社会人2年目もあと残すところ4ヶ月弱となりましたが，社会人1年目から今日までデータ分析業務にて突っ走って来ました．  
そんな私がこれまでを振り返るとスタート時にこれを知っておけばもっとスムーズにデータ分析を進めれただろう感じるポイントがいくつかあります．  
アドベントカレンダー2日目の今日はそんな私からのクリスマスプレゼントということで「社会人2年目になった私が感じるデータ分析業務の教科書」を皆様にプレゼントしようと思います！


　　　　　　　　　　    <img  alt="christmas_santa_elf.png"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/78800df8-a537-1ccd-3521-41deb61d2195.png"width=50% >

※これ以降に出てくる内容は，難しい技術の内容は出てきません．
ただエンジニアとして働く上では大切なことも含まれていると思います．
データ分析業務に従事している方や，それ以外の技術者の方，
多くの方に読んでいただいて「わかる！あるあるだよね」と思っていただけたら幸いです．


　　

ちなみにこれから書くことはまだ実践中で，完全にできている訳ではないです．
（わかっていても中々すぐにできるようにならないというのが私の所感です．）  


# 教訓その１．超重要！コードは誰が見てもわかるように書くべし
そもそもコードをあえて汚く書こうと思っている人なんていませんよね． 
ただ何も意識しないで書くと，挙動がすぐに理解できないコードだったりすることはよくあります．  
特に私の場合は 
試行錯誤のフェーズ（データの中身を軽く確認する・どうやってコードに落とし込むか考える段階のこと） 
でできたコードは読みにくいことが多いです．

ここでは，
<img  alt="qiita_woman_computer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/5f013702-459f-7471-8cf8-7a2258f38ca6.png" width=100% border="0" align="center">
ことの大切さをお伝えしたいです！

## 1.1 なぜコードを綺麗に書くか？
業務をしていてたまに起こるのが，


<img  alt="qiita_hatena_woman.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/56d93354-f3e2-19b6-cc8f-68c5dd709d7c.png" width=100% border="0" align="center">


みたいな状況です． この状況は**割と深刻な状況**です．
過去の自分は他人のようなものなので，
自分が読みづらいと思ったコードは他人も読みづらいです．  
例えばデバッグしてもらいたいと思って第三者にコードを見せると 
 
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/e34743ba-b51a-f6c7-9d80-3b3a69841f07.png" width=100% border="0" align="left">
などの弊害が生まれてしまいます．

## 1.2 どうすればコードが綺麗に書けるか？
じゃあどうすれば読みやすいコードになるの？という疑問が湧いてくるかと思います．  
詳細については，参考書籍：リーダブルコードを読むのがお勧めですが，  
いくつか参考に私が実践していることを書いておきます．  




1. **コメントでどんなプログラムか書く**  
   データ分析をする際はjupyter-notebookを使用することが多いです．  
   精度向上のためにmodelを複数作る場合などがありますが  
   後でコードを見るとどんな特徴量を付け足し・削除をしたのか一々コードを確認しないといけなかったり，  
   なぜその特徴量を付け足したかなどの自分の思考プロセスを思い出せないことがあります．  
   このようなことを避けるため，一番上のセルになぜ・どんなことをしたのか書いておいて識別できるようにしています．
1. **なるべくネストは使わない**
   試行錯誤的にコードを書いていくと，過去の私が作成したif文の中に更にifを分岐させて…みたいな状況がよくあります．
   作業している私からするとごく自然な流れでifが二重になるコードを生成しているのですが，
   このようにしてコードを書くと未来の私がとても苦しみます．

1. **ドキュメントを書く**
   どのコードがどんな動きをするコードなのか書いてまとめましょう．
   ディレクトリの構造も書いておいた方が後々の自分が助かります．
  

社会人1年目の頃はコードは試行錯誤のフェーズで書いたらそのままにしてしまうことが多かったですが  
**試行錯誤のフェーズから相手にコードを見せるフェーズに移る前にコードをわかりやすく書き換えるのが基本です．**   
**大切なことは「とにかく一目見たらどんなコードがなんとなくわかるコードにする」ことです．** 
<br>  

※勿論試行錯誤のフェーズでそのままにしていたのは，サボっていた訳ではなく
コードを綺麗にすることの価値がきちんとわかっていなかったので，別のことに時間を使ってしまっていた．というのが正しいです．
ただ時間はかかっても**コードをわかりやすく整理しておくことはかなり重要なので
生産性向上のため絶対にやったほうが良い**です．

# 教訓その２．メモリや計算時間には気を遣うべし
データ分析をしていると，必然的に大きなデータを扱うことが多くなってきます．  
<img  alt ="qiita_atama_woman.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/fd57d4bc-be3d-f332-33dd-8b17045a1d0f.png" width=100% border="0" align="left">

などに悩ませられることがあります．

## 2.1 tqdmを用いて処理時間を目視で確認しよう  
まずforループを回すときや，大きなデータを読み込むときには
**tqdmを用いてプログレスバーを表示させる**ようにしましょう．  

[tqdm][1] は進捗を目視で確認できる便利なモジュールです． 

[1]: https://tqdm.github.io/


```
from tqdm import tqdm
for i in tqdm(range(100)):
    ...
```
このような形で簡単にforループ内に組み込むことができます．

```
100%|██████████| 100/100 [00:00<00:00, 273066.67it/s]
```
余談ですが，  
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/3352cd93-5cb0-099c-4044-7f6efdd440f1.png" width=100% border="0" align="left">

## 2.2 適材適所のデータ構造を使うべし
[python][2] にはlistやdict，setなど様々なデータ構造があります．  
普段pythonを使い慣れている方でも，きちんとドキュメントを読んだことがない方も居るかもしれません．
一度目を通してみると新しい知見があって面白いです．  

[2]: https://docs.python.org/ja/3/tutorial/appetite.html  

業務ではlistを使用してしまうことが多いですが，
listだと処理が重く，遅くなってしまうことも多いのでsetなどが使えないかどうか考えてみると良いです．  

小ワザとして，listを用いてappendを行う場合は
**forベタ書き→リスト内包表記を行う**ことで多少は高速になります．  
また，**大きな疎行列などを扱う際にはscipyを使う**など工夫をしてあげると良いです．  

## 2.3 chunksizeを使って大きなファイルを読み込む

あまりにもファイルが大きくて

```
df = pd.read_csv('img_data.csv')
```
このような形で読み込んでも時間がかかる場合は

```
df = pd.read_csv('img_data.csv',chunksize='500')
```
のようにしてファイルを読み込むと良いです．  



# 教訓その3.最強のチームを目指し個人のスキルを向上すべし

データ分析の仕事は，比較的**属人化しやすい**です．
そのため，個人のスキルが高ければそれで充分だと感じる人も多いかもしれません．


## 3.0 属人化って何？
属人化という言葉を知らない人のために，念のため記載しておきます．
[weblio][3] より抜粋
>企業などにおいて、ある業務を特定の人が担当し、その人にしかやり方が分からない状態になることを意味する表現。多くの場合批判的に用いられ、誰にでも分かるように、マニュアルの作成などにより「標準化」するべきだとされることが多い。企画・開発業務など、属人化されているのが一般的と言われる業務もある。

[3]: https://www.weblio.jp/content/%E5%B1%9E%E4%BA%BA%E5%8C%96#:~:text=%E4%BC%81%E6%A5%AD%E3%81%AA%E3%81%A9%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81%E3%81%82%E3%82%8B%E6%A5%AD%E5%8B%99,%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E6%A5%AD%E5%8B%99%E3%82%82%E3%81%82%E3%82%8B%E3%80%82

上記にあるように，属人化という言葉は批判的に用いられることが多いようです．
あくまで個人の見解ですが，**属人化と標準化はバランスが大切であり，どちらに傾きすぎても良くない**と考えています．   
     　　　　　　　　　　　            <img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/71c0b887-023b-0124-c2f2-6ad7859bf7c2.png" width=50% border="0" align="left">

## 3.1 なぜ属人化しやすいの？
データ分析の仕事は，**仕事の性質上**属人化が起こりやすいと考えています．  
データ分析の大まかな流れは，
1. ビジネス課題からデータ分析できる課題に落とし込む
2. どんなデータが使えるか考える
3. データ基礎分析
4. 特徴量生成
5. モデル作成
6. 精度確認
7. 精度向上のため4.5.6.を繰り返す

このような一貫した流れで仕事をすることが多いです．  
基本的に**上記のタスクを一人でこなしていくことが多い**と思います．
1.2.の部分は比較的チーム内で相談しやすいかなと思いますが
3.以降はやはり一つのデータについて詳しくなっていってしまうので，一人で行うことが多くなります．

## 3.2 属人化のメリット・デメリット
上述したように，属人化と標準化は対義語にあたるものですが，どちらかであればいいというものではなく**バランスがとても大切**です．
### 属人化のメリット
1. **自分のペースで働くことができる**
1. **責任感をもち一人一人が働く**   
   タスクが個人に紐づいているので，  
   標準化で起こりがちな”だれかにタスクをなすりつける人が出てくる”ということは少ないです．

### 属人化のデメリット
1. **異動などによるチームメンバーの欠如によってアウトプットに大きな差が出てしまう**   
    チームのメンバーによってアウトプットが異なってしまうので，割と致命的な属人化のデメリットです．  
   できるだけアウトプットに差が出ないように対策をしておいた方が良いと思います．
1. **引継ぎに時間がかかる**
1. **ミスに気付きにくい**  
   社会人1年目の時に特に不安だったことの一つです．  
   自分が何かミスしても自分しかわからないのでいつも最悪の場合を想定し，慎重に作業は行っています．
1. **きちんと作業しているか不透明**  
タスクが個人で紐づいているので，他人の作業については何をしているかよくわからないこともありますが  
基本は相手を信用して作業をしているだろうと思っています．  


## 3.3 どんなスキルが必要か？
タスクの流れは3.1でなんとなくわかったかなと思うので，
3.2ではデータサイエンティストとして必要なスキルを紹介します． 
業務で必要なスキルは割と幅広く，
社会人として他の業種でも必要な論理的思考力やプレゼン力，タイムマネジメントから
専門的なものまであると感じています．
データサイエンティストはコーディングについては
python（特にPandasなど）やSQLなどを用いることが多いです．
深層学習も扱うので深層学習系のライブラリも使えると良いかなと思います．  


データサイエンティスト協会から
[スキルチェックリスト][2]  
[2]: https://www.datascientist.or.jp/common/docs/skillcheck_ver3.00.pdf
なども出ているようですのでぜひ参考にしてみてください．

## 3.4 チームで働く意義
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/ebaac65a-c829-6c9f-d3fd-8f4a0e3a7b5d.png" width=100% border="0" align="left">

教訓その１で書いたようにチーム内でコードを見せ合うこともありますし，
それぞれ持っているバックグラウンドが少しずつ異なるので，詰まった時にアドバイスをもらうことも多いです．  
またチーム内では，急病や異動などによって急遽人が抜けてしまうことが考えられます．
その際にあるタスクを一人でこなしていて，必要なドキュメントやコードだけ置いていかれてしまうよりも，
日頃からチーム内でのメンバーである程度やっている内容やコードなどを理解していた方が
メンバーが欠如した際の立て直しが早く，
僅かではありますが属人化を防ぐことができます．  


またチームで仕事をすると，様々な考え方やスキルを持った人が増えるので
一人だけで作業をするよりも良いアウトプットを出せるようになると考えられます．

# 教訓その4. 新しい技術のキャッチアップをすべし
## 4.1 なぜキャッチアップするの？
キャッチアップが必要な理由は大きく分けて二つです．

1. **技術の進化スピードが速い**   
機械学習の分野は，技術の進化のスピードがとても速いので，新しい技術のキャッチアップは欠かせません．  
1. **チーム内での個性の確立**  
３章でもチームについて触れましたが，  
チームで仕事をこなす際には，**多様性が重視**されます．  
これはデータサイエンティストなどの括りではなく，世間一般的にそうであると考えます．  

　　　　　　　<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/9657b505-257c-6a32-de74-fbfb0776b79f.png" width=60% >


考え方のみでなく，スキルセットも多様性に富んでいるほうが
チームはより素晴らしく洗練されたものになります．  
3章で述べた基本的なスキルセット+αによって個人の地位を確立すると
チーム内での存在意義を感じられて仕事をしやすくなります．
  
しかし新入社員や経験が浅い人が，すぐにチームで個性を発揮できるほど，
ある一つの分野に精通しプロフェショナルになるのは難しいです．

<div align="center">
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/3502b467-59d2-7c22-1c41-134797169575.png" width=100% >
 </div>

もちろん先輩と同じ分野で先輩以上のスキルを身に付けられるのであれば何も問題ないですが，
そうなるには膨大な努力と時間が必要になります．  
そこで，**新しい分野を取り入れる**という方法が考えられます．  
新しい分野であれば，先輩社員であってもあまり知らない部分も多く
 先輩と同様に地位を確立できるチャンスを掴むことができます．

<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/9856c6df-0198-2a04-f7d1-272288cbaea2.png" width=100% >



このように，最新技術をキャッチアップし，詳しくなることで自分だけでなく，
チームとしても最強になれるのです．  
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874659/237a5386-4aca-e4fa-8905-cb1aefdc6c94.png" width=80% >


## 4.2 キャッチアップの方法と最新技術の導入・検証について

キャッチアップの方法は人それぞれだと思います．
どの方法が正しいというのはないと思うので好きな方法で行えばいいと思っていますが，
大きな学会で発表された論文などは手堅くチェックしておくと良いかなと思います．
Google Scholarなどを用いて検索するのも良いかと思います．

良さそうな最新技術を見つけたら，実際にその技術が活かせるか検証してみましょう   
技術の導入検証は，つまづくことが多いです．
先輩も知らないことを取り入れようとしているので
わからない時にどうしたら良いか困ってしまうこともあるかもしれません．

お勧めの方法は
1. 公式ドキュメントを参考にする
2. 公式のQuestion&Answerを参照する
3. 公式のQuestion&Answerで質問する

この流れで行っていくと良いです．
(先輩曰く大抵のことはドキュメントで解決できるらしいですが
私はドキュメントと公式のQuestion&Answerを行ったり来たりして少しずつ知見を深めていくのが好きです．)
どうしてもわからない時は，公式のQuestion&Answerで聞きましょう．  

※質問は英語ですることが多いですが，英語が苦手な技術者であることも想定して，
わかりやすい英語で書くか，コードを貼り付けたりすると良いと思います．



# 最後に
いかがでしたでしょうか？  
私がデータ分析をする中でつまづいた部分とそこから得られた教訓について大まかに書きました．
社会人2年目までに感じた葛藤や，つまづいた部分をできるだけわかりやすく書いたつもりです．
これからデータサイエンティストを目指す方，エンジニアとしてコードを書く方，チームで仕事をする方など幅広い人に読んで貰えたら嬉しい限りです．