データ分析のプログラム
#トピック
- フラットなメリット
- dupとくくりだしのpros-cons
- 関数の引数の数
- オブジェクトのpros-cons
- 整理はコードを追加する時に行う
bad smell
- 簡単な事なのにすぐに結果が確認出来ない
- 途中の結果が簡単に確認出来ない
- 引数が多すぎてしかもほとんどが要らない引数
- セルの評価順序への深い依存
- 少し変えたい時に全部dupされてしまう
- あるコードを直したい時に同じセルがたくさんあり、直したセルと直してないセルがごっちゃになってる
重複の長所と短所
コード重複は以前は良くないとされていたが、データ分析では良い事も多い。
重複の長所
- 過去の結果に影響を与えない
- 以前の結果を受けてそれをちょっと変えた事を試したい時に、一番簡単に試せる
- フラットさが変わらない
- 前うまく行った事は、コピペ後もうまく行く(バグを埋め込まない)
全体的に、データ分析では試してみたい、という事が多くて、試した結果そのコードは不要になる事が多く有る。 捨てられるコードはもっともコストをかけずに作られるべきである。
重複の短所
重複には悪い所もある。
- コードの量が内容に比して大量に増えてしまう
- どこが必要なセルか探すのが大変
- 内容を理解するのも大変(後で読み直す時、同僚が読む時)
- ちょっと違う事を試す時に、全部dupしないといけなくなる(どんどん増える悪循環)
- ちょっとだけ違うコードがたくさんになり、どれがなんだか分からなくなる
- もともと同じコードからうまれた2つの実験のうち、片方の実験で必要になって書いた事を別の所に持っていくのが難しくなってしまう場合がある(乖離が大きくなると)
- 変更をいろいろな所に入れないといけなくなる事がある
重複は何度も使いまわすコードには向いてない。
データ分析特有の部分
-コードの大半は、一度しか実行されない
- コードの寿命が短く、書くコードが多い
- 以前よりもずっと「そもそも試している事が間違っている」という事が多い
- コードの間違いより仕様の間違いの方が圧倒的に多い
- どのコードが後でも使われるかが、事前には分からない(試した結果良さそうだと使われる。試す時には分からないから試す訳で)
- プログラムの小片の結果を、プログラムだけでは無く人間も必要とする
- 実行時間が凄く長いコード片が日常的にある
- それを試す事自体が工数として非常に多くなってしまう
- コードを変更した時に、それを試すのが難しい(時間を食ってしまう)
- コード整理の結果を確認する為だけに実行するのが難しい
- 結果が正しいかどうかが良くわからない
- そもそも結果があってるか分からない
- 変更した時にその結果があっているかが分からない
- 確認出来る時も、その確認に凄いコストがかかる
コードの整理の仕方
整理の為だけに実行するのは難しい場合があるので、何か試したい事がある時に、その過程で整理する。
- 一度の整理では少しの部分だけ整理する(全部やろうとしない)
- あまりそこで問題を発生させないように気をつける
後者はちょっと説明も要ると思うので補足。 通常リファクタリングでは結果を頻繁に確認しながら進めるが、データ分析では結果を確認する事自体が難しい。
そこで、試したい事を試す過程で、それが正しい事を確認する事をもって整理が間違ってない事を確認する事になりがち。
コードを変更すると、必ず間違う可能性が生まれる。そこでこの間違う期待値という考え方が大切になる。 なるべくコード整理で間違う事を減らしつつ、それでもコード整理で間違う事は実験のコストの一部と考えるべき。
実験の方が大切なので、コストを払いすぎては行けない。 なるべくコード整理にコストを払わず、でもカオスにはなってしまわないギリギリのバランスを見極める。
コード整理での間違いの発生率を減らす為には、リファクタリングの手順が参考になる。 あまりバグを埋め込まないコードの変形のやり方のストックを増やし、なるべくそういう変形の比率を多くする。
フラットな構造
データ分析では、従来のプログラミングとは違う構造が望ましい部分がある。 一番重要なのは、フラットな構造の望ましさだと思う。
フラットで無い物の代表、GOD(神)関数
フラットな構造とは何か、という事を考えるには、そうでない極端な物を見ると分かりやすい。
GOD関数という物を考える。 GOD関数は、その関数を実行するとその内部で全部の必要な事をやって、帰ってくる、という関数。
GOD関数の特徴
- ネストが深い事が多い
- データの前処理、計算、結果の表示を全部やる事が多い
- 途中まで実行して結果を得て、その結果を人間が見てから続きを確認、がやりにくい
- ネストの底の方で何か処理を分岐させる為の引数を持ち、間の階層の全関数ではただその引数を渡すだけで使わない
- 重複はあまり無い
データ分析に慣れてないプログラマが書きがち。