技術レポートを Jupyter Notebook で「魅力的」にしよう

(更新

How to increase value of your technical report by Jupyter Notebook.

企業の研究者、またデータ分析者の皆様は、既に Jupyter Notebook(以下 Jupyter)を研究や技術レポートの作成に活用なさっている方が多いかと思います。

最初の前書き

本題に入る前に是非とも御理解いただきたいことがあります。(加筆: 2020/8/18)

  • Jupyter は「ソフトウェア技術者のためのツール」ではありません!  誤解を恐れずに言えば、ソフトウェア技術の専門家でない人のためのツールと言っても良いでしょう。(よく、「私はソフト技術者でないので、そういうツールには興味がありません」とおっしゃる方が多いのです。)
  • かつて、「表計算ソフトは、知的生産者が最初にマスターしなければならない PC アプリである」という時代がありました。2020年の今日、表計算ソフトというキーワードは、Jupyter に置き換わったと言っても過言ではないでしょう。

「そんなこと言っても、Python なんてプログラミング言語、分かりませんよ」とおっしゃる方もありそうですが、Jupyter では何百行もあるようなコードを書くことは稀です。数行から 20〜30行程度の簡単なコードを書き散らすのが、Jupyter の一般的な使い方です。

プログラミングの専門家でなければ、分厚い Python の参考書を買う必要はないでしょう。いまや、検索エンジンでいくらでもサンプルコードが手に入ります

2つ目の前書き

今回は、企業の若手技術者や学生さん向けに Jupyter を御紹介したいと思います。同時に、大学の先生(情報科学分野以外では、まだ意外と利用されていないようです)や、企業の技術マネージャの方にも御参考頂けるよう、Jupyter で技術レポートの価値をどのように高めることができるかについて、御説明したいと思います。

なお、必ずしも皆様のパソコンに Jupyter をインストールする必要はありません!  Jupyter をネット上で共有できる、Google Colab といったようなサービスを利用できるからです。

従来の技術レポートの問題点

学生時代のレポートを思い出しますと、工学部や理工学部では、プログラミング実習ですとか、物理学実験レポートなどというものがあったかと思います。(前者では、ラインプリンタで印刷したプログラムコードを、糊でレポート用紙に貼り付けたりした御経験をお持ちの方も多いのではないでしょうか。)

そのようなレポートを提出する際に、さすがに「結果のグラフだけ」を提出する学生はいませんよね。そんなレポートだと「不可」を貰ってしまいます。言うまでもありませんが、レポートでは結果や結論だけでなく、そこに至るまでの過程(プロセス)が重要だからです。また企業での技術レポートというものもあります。上司に、何か技術的なテーマについて調査した結果を報告する、ということはよくあるでしょう。その場合でも、もちろん「結果だけ」を報告するようでは技術者として失格です! (結果にしか興味がない、という上司もいない訳ではありませんが…。)

繰り返しになりますが、技術レポートでプロセスが重要である理由は、

  • なぜそのような結論に至ったかが分からないと、他者はその結論の正当性が判断できない
  • プロセスが明確ならば、同僚や上司がプロセスを検証(レビュー)することができる
  • 万が一プロセスが間違っていた場合には、それを後で修正することができる

といったところかと思います。

しかしながら一方で、レポートを作成する過程でコンピュータプログラムを書き、そのプログラムの使い方をレポートに添付したとしても、それらの操作方法が容易でない場合(たとえば、特殊なツールを自分のパソコンにインストールしないといけない等)には、そのプログラムは十分に活用されない恐れがあります。いや、ほぼ間違いなく、作成者(報告者)以外がプログラムを実行してみることはないと言って良いでしょう!

Jupyter Notebook とは何か

Jupyter は、プログラミング言語 Python と大きな関連があります。Python は、近年広く使われるようになった言語です。Python は万能のプログラミング言語ではありませんが、様々な問題を解決するためのライブラリや周辺ツールが充実しているのが最大の特徴です。

例を挙げますと、

  • 数値演算(NumPy ライブラリ)
  • 科学技術計算(SciPy ライブラリ)
  • 数式処理(SymPy ライブラリ)
  • 画像処理(OpenCV ライブラリのラッパー)
  • 機械学習(TensorFlow や Keras フレームワークなど)
  • ウェブアプリケーション(Flask ライブラリなど)

などがあります。少し変わったところですと、有名なコンピュータゲーム Minecraft の世界を Python プログラムで制御するためのライブラリなどもあります。

おそらく読者の方の御専門分野で、コンピュータで解決できる類の問題において、Python から使えないライブラリはほぼ存在しない、と言っても過言ではありません。最近は Python を「グルー(糊)言語」と呼ぶ人もありますが、これは Python の特徴を非常にうまく捉えていると思います。例えば、数値演算をするだけなら、30年以上も前から広く使われている MATLAB といった優れた専用言語もありますが、例えば MATLAB で画像解析をしながら機械学習で推論をし、その結果をウェブアプリケーションとして出力する、といったことはなかなか難しいのです。一方 Python ならば、そんな応用も容易に実現できてしまいます。

かつて私が驚いたものに、PyEphem というライブラリがあります。これは、Python を使って天体の位置計算をすることができるものです。月や惑星の軌道計算に関する十分な天文学的知識がなくても、ライブラリに観測者の緯度経度や時刻を与えると、それら天体がどの方向に見えるか、という情報が極めて正確に求められます。私かかつて、これを使って二十四節気や月齢、日の出、日の入りの時刻を計算するプログラムを書いたことがあります。

仮に最終製品を Python で実現(実装)しない場合でも、評価試作段階においては、非常に素早くプログラムを用意することができるので、あるアイデアが正しいか否かを早期に判断できる、というメリットがあります。Python 言語を使いこなせる技術者であれば、上司に午前中に指示された技術検証を夕方までに報告することも不可能ではありません。

今でも、「C 言語で書くのがもっとも移植性が高いので、なんでも C 言語で書け」と言う技術者がありますが、それは過去の話です。そもそも、C 言語実装の移植性が高いとは言えないのは、C 言語でソフトを設計した方なら周知の事実でしょう。(ところで、その前の時代は「技術者なら何でも FORTRAN」でしたね。古い?)

さて。このように Python は有用なプログラミング言語なのですが、Python をあたかも「ノート(帳面)」やレポート用紙のように使って、文章、プログラムコード、結果のチャートやグラフを一緒にすることができるツールが、Jupyter なのです。もし、読者の方が Wolfram Mathematica というソフトを利用なさったことがあれば、Jupyter Notebook は、Mathematica Notebook と同様なもの、とお考え頂ければイメージは伝わるでしょうか。一方で、Mathematica と異なり、Python も Jupyter も完全にフリーなツールである、というところが大きな強みでしょう。

Jupyter の公式サイトへのリンクは、こちらです。

Jupyter Notebook で学生レポートを書いてみよう

さて、どうして Jupyter を使うと技術レポートの価値を高めることができるのか、学生時代の気分に立ち戻って(学生さんであれは、来週のレポートからでも)、実際に Jupyter で学生レポートを書いてみましょう。

今回は、大学の先生から学生さんに「データのソーティング(整列)法」について講義があったとします(情報科学科の 1年生程度でしょうか)。講義の宿題(レポート)は、教わったバブルソート法とクイックソート法について、実際に Python 言語で実装し(Python のソーティングライブラリは使わないこと)、その性能についてレポートを提出しなさい、というものだとしましょう。

例えばですが(内容にポカがあったらごめんなさい)、Jupyter では以下のようなレポートを作成して提出することができます。(スクロールバーを動かすと、下のほうまで見られます。) 文章で書かれた説明、考察と、Python プログラムと、その出力結果が一枚のページ(ノート)にまとめられている様子がお分かりになりますでしょうか。

もし、実際の Jupyter Notebook の画面を見たい方は、以下の Google Colab サイトを御覧ください。

Google Colab とは、Jupyter を御自分のパソコンではなく、ネット上で共有したり実行したりすることのできる便利なサイトです。つまり、御自身のパソコンに Python や Jupyter をインストールしたくない、あるいは企業の上司の方のように、自分のパソコンに Jupyter をインストールして評価するまでの意志はない、といった場合でも、部下のレポート中のパラメタを少しいじりながら、結果のグラフがどうなるか確認することができる訳です。

実行するには、御自身で Google アカウントが必要ですが、皆様の手で実際に操作したり、プログラムを書き換えたりすることができます。実際には(私も困ったのですが)、Google Colab ではこのプログラムはメモリ使用量が大きすぎて(再帰ネスティングが深すぎて?)動きませんでした。エラーが出る場合には、プログラム中の N = 1000 という部分を、N = 100 くらいに小さくしてお試しください。。。

具体的に、皆様の手で実行する方法を簡単に説明しておきましょう。

  1. 上記リンク(Google Colab: student_report_sorting.ipynb)をクリックします。
  2. まずはマウスで画面全体をスクロールして、私のレポート例の全体を(先生になった気分で)御覧ください。
  3. 先生は、本当にこの学生が自分でプログラムを動かしたのか気になった、あるいは、プログラムに何か不明な点を見つけたとしましょう。自分で編集して実行してみることにします。
  4. まずは、メニューで File → Save a copy in Drive… を選びます。
  5. Google アカウントへのサインインを求められるので、御自身のアカウントでログインしてください。
  6. おそらくもう一度、メニューで File → Save a copy in Drive… を選ぶ必要があります。
  7. 画面左上のファイル名が Copy of student_report_sorting.ipynb となることを確認します。
  8. そうしたら、一度レポートの結果(説明書きやプログラムコードを除く)だけをクリアしましょう。そのためには、メニューから Edit → Clear all outputs を選びます。
  9. そして、Runtime → Run all を選びます。ここで動けばめでたしなのですが、おそらく quicksort() の実行中に、RecursionError: maximum recursion depth exceeded in comparison というエラーが出て停まってしまいます。残念、Google Colab が提供するリソースが十分でないようです。
  10. しようがないので、頭のほうの N = 1000 という部分を N = 100 に書き換えましょう。そうしたら、もう一度 Runtime → Run all しましょう。
  11. 無事に動きましたね?

まとめ

今回は、Jupyter を使って技術レポートを書く方法を御紹介しました。このように、技術的な結果(グラフなど)だけでなく、そこに至った思考過程、評価に用いたプログラムを一緒にまとめることで、レポートの閲覧者は、自分で過程を再現してみることができます。また、後になって結果に不審な点が見つかった場合は、上司の方だけでなく同僚が技術レビュー、プログラムのチェックをすることで、なにか問題がないかトレースすることができます。仮に、上司の方がプログラミング経験をお持ちでなくても、複数の社員にレビューをして貰うことで安心できるでしょう。

さらにもう一つの利点として、切った貼ったのレポートでは、(意図せず)間違えて、プログラムの内容と結果に不整合が生じさせてしまうことがありますが、Jupyter を使えば、そのようなケアレスミスを防ぐことができます。つまり、プログラムは修正したのに、グラフを差し替えるのを忘れていた、というような失敗を防ぐことができるのです。素晴らしいですね!

参考書

最後までお読み頂き、ありがとうございました。もし、「こいつは素晴らしい。ぜひ、ちゃんと参考書で勉強したい」という方がいらっしゃいましたら、以下の本を紹介させて頂きます。Jupyter、Matplotlib だけでなく、関連する技術が網羅されています。(加筆: 2020/8/18)

今日はここまで。

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。必ず返信致しますが、時々アドレス誤りと思われる返信エラーがございます。返答が届かない場合、大変お手数ではございますが別のメールアドレスで督促頂けますと幸いです。