データ分析におけるコーディング規約とフォーマッターの役割

こんにちは。Customer Analytics Divisionでデータサイエンティストをしている高田です。Customer Analytics Divisionでは、KDDIやauに関連するサービスのデータ分析や、それに伴うコンサルティングを行っています。データ分析ではpandasやPySparkを使うことが多く、私含むデータサイエンティストの多くの方が毎日Pythonを書いています。

今回は、データ分析組織の業務効率向上を達成する過程でのコーディング規約の必要性、それに伴う取り組みであるフォーマッターの導入例をご紹介します。

コーディング規約はなぜ必要か

どのような事業にせよ、1人で1人分の仕事を達成することは容易ですが、5人でその5倍の大きな仕事を達成することは非常に困難です。組織の人数が増加すると、人と人が意思疎通する際のコストが発生するからです。

 

プログラムにおいてもそれは同じです。誰かがその場で思うがままに書いたコードを別の人が読むのは困難です。そのコードを保守することも、再利用することも難しくなります。可能な限り保守性を高め、属人化を防ぎ、組織全体で効率的に業務を遂行するためには、ある程度ルールに則ったコーディングをすることが必要になります。その定められたルールこそ「コーディング規約」です。Pythonの一般的なコーディング規約としては、PEP8 [1] や Google Python Style Guide [2] が有名です。

上記観点から、規模拡大を続けるARISEのデータ分析組織においてもコーディング規約の必要性が叫ばれるようになりました。

コーディング規約のメリット/デメリットとフォーマッターの役割

コーディング規約を遵守することで発生するメリットやデメリットをざっくりと整理してみました。

メリットは大きいのですが、どうしてもデメリットは生じます。特に、デメリット1の影響は非常に大きく、この確認や修正の時間が必要になるために、コーディング規約が結局守られないケースも生じてしまいます。

特にデータ分析業務は、分析結果や分析速度は評価されやすい一方、分析過程や後続発展性は評価されにくいため、コードそのものを確認・修正する行為が疎かになりがちです。

このデメリット1を大きく手助けするのがリンターやフォーマッターです。

  • リンター:コードがコーディング規約に沿っているかを確認
  • フォーマッター:コードがコーディング規約に沿っている状態へ自動整形

現在ARISEの分析チームではBlack[3]というフォーマッターの導入を進めています。BlackはPEP8のコーディングスタイルに沿って自動でコードを整形します。

フォーマッターを用いることで、デメリット1の時間を最小限に抑え、見た目に関するコーディング規約の多くを自動で解決することが可能です。具体的には、コンマの後にスペースを入れる、インデントはスペース4つ、引数が複数になる場合は改行する、などが該当します。

分析コード整形のためにコードフォーマッターBlackを導入する

Blackは、”The Uncompromising Code Formatter”という標語に表される通り、調整を許さない厳しいPythonフォーマッターです。初期設定からほとんど調整することができません[4]。

https://github.com/psf/black#used-by

Djangoの開発指針、Django Enhancement Proposals の DEP8 でも、Blackを使用しコードをフォーマットすることが採択されています。

https://github.com/django/deps/blob/master/accepted/0008-black.rst

Blackのインストールに加え、.ipynbファイルに記載された分析コードをJupyter Notebook上でフォーマットするため、以下の Jupyter Notebook Extension もインストールします。セルごとにコードをフォーマットすることが出来るようになります。

https://github.com/drillan/jupyter-black

Jupyter Lab を利用している方はこちらなどが利用できます。

https://github.com/ryantam626/jupyterlab_code_formatter

それではインストールしていきましょう。

# black自体のインストール
pip install black

# jupyter拡張機能自体のインストール
pip install jupyter_contrib_nbextensions

# jupyterのblackフォーマッター拡張機能のインストールと有効化
jupyter nbextension install https://github.com/drillan/jupyter-black/archive/master.zip --user
jupyter nbextension enable jupyter-black-master/jupyter-black

 

これで準備は完了です。

Blackの実行例

Blackを実行した際のコード変化例をお見せします。ボタンを押すだけで、一瞬で自動整形されるのがわかるかと思います。どのようにコードの見た目を整えるか、どのようにコードの見た目が整えられているのかについて、もう悩む必要はないのです。最小限の時間で、最低限の見た目を整えることが可能です。

おわりに

今回は、データ分析組織の業務効率向上を達成する過程でのコーディング規約の必要性、それに伴う取り組みであるフォーマッターの導入例をご紹介しました。フォーマッターが解決できる要素はコーディング規約が定める項目のごく一部でしかありませんが、その時間対効果は非常に大きいです。

コーディング規約だけに留まらず、強いデータ分析組織であるために必要な取り組みをこれからも続けていきたいと思います。

参考

[1] PEP8 (https://www.python.org/dev/peps/pep-0008/ )

[2] Google Python Style Guide (https://google.github.io/styleguide/pyguide.html)

[3] Black( https://github.com/psf/black – Connect to preview)

[4] とはいってもいくらか設定することがあります。例えば、line-lengthで1行の文字数上限指定、skip-string-normalizationで文字列をシングルクォートをダブルクォートにするのを無効化など。

関連記事