Python/matplotlibでウォーターフォール図を描く方法

  • このエントリーをはてなブックマークに追加

ウォーターフォール図は企業のIR資料でよく見かける図ですが、投資家向け以外でも使いこなせば大変説得力のある図となるようです。ここではPythonでウォーターフォール図を描くにはどうしたら良いかを検討した結果を紹介します。

こんにちは。wat(@watlablog)です。ここでは説得力抜群なウォーターフォール図をPythonのmatplotlibだけで描く方法を紹介します

ウォーターフォール図の概要

ウォーターフォール図とは?

ウォーターフォール図とは、企業のIR情報でおなじみですが、増減や構成を効果的に説明可能なプロットです。

百聞は一見に如かずであるため、以下の図をご覧下さい。
これは今回このページで紹介するPythonコードで作成しました。

ウォーターフォール図の例

どうでしょうか。各年度の純利益という指標が、どのような要因で変化していったのか、どのように次年度の計画を立てているのかが一目瞭然だと思います。

これをウォーターフォール図を使わないで説明しようとすると、細かい表を示すか、箇条書きの文章で示すか…いずれにしても口頭で色々補足が必要と思います。

ウォーターフォール図について詳しくは、僕のTwitterのフォロワーさんが「ウォータフォール図を使いこなそう(アラサー東大卒のゆとり生活)」で紹介しています。こちらにはExcelを使った描き方の説明があるので、是非ご覧下さい。

ウォーターフォール図を描く動機

僕自身この図は自社のIR情報等でよく見ていたはずなのですが、「これは投資家のための特別な図」と思い込んでいました。

ウォータフォール図を使いこなそう」の記事がリツイートで回ってきて読んでみると、

使わない手は無い!

と思いました。

ウォーターフォール図の効果である増減要因の説明数値の構成の説明…というのは技術職でも頻繁に要求されます。効果的な説明図を作れるようになって、会議を短時間で終わらせよう!というのが最も大きなモチベになっています。

プログラムの処理時間の内訳をウォーターフォールで示したり…というのも良さそう??

と思ったら以下のニーズがあるようです(かなり前ですが)。

今、 jupyter notebook 上で、諸々の開始時刻と終了時刻からなるイベントデータを取得していて、それを、この Chrome のウォーターフォール図のような形で図示したいと考えました。
これを実現するにあたって、よく使われるライブラリなどはありますか?

stackoverflow:pythonでプロセス処理時間のウォーターフォール図のようなものを図示したい

本ページのコードがよく使われるライブラリの代わりになれば幸いです。

本ページの目標

スプレッドシート一つ用意して動くようにする

これに尽きます。多くの企業の方はExcel等の表計算ソフトで業務を行っていると思うので、おそらくExcelでフォーマットを作っておく方が便利とは思いますが、プログラミング言語で作るメリットは自動化が可能という所です。

所定のスプレッドシート(今回は.csv)を一つ用意して実行ボタンを押せば、求めたいウォーターフォール図が瞬時に出てくる…という所を目標にします。

ウォーターフォール図用のライブラリは使わない

外部ライブラリは大変便利なもので、時に絶大な効果を発揮します。
しかし、グラフは相手に説明する時に使うもの。僕は割とグラフにはこだわっていますが、説明用の資料は見た目も結構重要と思います。

例えばExcelのデフォルト設定そのままでは見れたものじゃないと思います。皆さん自分でカスタマイズした設定をテンプレートとして登録して使っていると思いますが、専用の外部ライブラリはカスタマイズがやり難いというデメリットがあります。

ウォーターフォール図はバープロット一つ一つの色、テキストの描画、グラフサイズ、フォントサイズや色にこだわって初めて説得力のある図となると思うので、今回は自分で色々変更できるように作ります。

ここでは、Pythonを使った表計算としてデータサイエンス界隈でデファクトスタンダードとなっているPandas、数値計算の代表格Numpy、強力なグラフ描画ライブラリのmatplotlibのみを使う事を目標とします。

Pythonでウォーターフォール図を描くコード

縦向きのウォーターフォール図

まずは縦向きのウォーターフォール図を描いてみます。

スプレッドシートを用意する

今回は以下の情報を記載したスプレッドシートを.csvファイルとして用意しました。日本語の注釈を付けてあり、ファイルは「SHIFT-JIS」でエンコードしています。

SHIFT-JISはExcelで.csvを作成する時はデフォルトだと思います。もちろんこれから紹介するプログラムを最初からExcelを開く仕様にしても使いやすいと思いますが、僕は今回Macで開発したためまずはNumbersで作った.csvでテストします。

サンプルのスプレッドシート

データは横軸、利益、増減、備考とよくあるIR情報のような並びにしてあります。これは「ウォータフォール図を使いこなそう」の例題を参考にしています。

import文

import文はこちら。pandas, numpy, pltはおなじみとして、今回はグラフ内に日本語を使いたいので、rcParamsををimportし、冒頭で宣言してしまいます。

僕はMacですので、「'Hiragino Maru Gothic Pro'」を使いましたが、Windowsの場合は「'Meirio'」とかが良いかも知れません。

Pandasでスプレッドシートを読み込む

スプレッドシートは何かと便利なPandasというライブラリを使って読み込みます。今回SHIFT-JISでエンコードしているので、encodingの指定も必要です。

読み込んだデータは以下となります。空白部分はNaN(Not a Number)となっていますが、そのままにします。

この構成でスプレッドシートを作成すれば、後は自由に行を追加して使用して頂く事が可能です。もちろんこの構成でPandasデータフレーム型の変数を直接作成すれば、スプレッドシートを用意する必要も無くなります。

Pandasのファイル読み込みについては「Python/Pandasなら文字数値混在csvも簡単読み込み!」も併せてご覧下さい。

初期化

上記スプレッドシートの内容を読み解いたり、計算したりするのにリスト型を使って整理していきます。

layerを2つ作っていますが、これは棒グラフで色を付けたい部分と消したい部分(マスク)を表現するために必要となります。flagは格納したデータが増減のどちらかなのか、それともメインデータなのかを判断するためのフラグです。

ウォーターフォール図用データの作成

データフレームの行数でループを回し、上からデータを抽出していきます。
但し、抽出したデータが何なのか(増?減?それともメインの実績?)をNaNを使って判定し、自動分類していきます。

分類した結果は先ほどのflagにappendしていき、後でプロット時に使います。

プロット

ウォータフォール図はプロット部分もキーポイントです。

flagの値に応じてプロットの色、テキストの書式や内容を変更しています。特に増加データ(flag==1)と減少データ(flag==-1)だとbar()内のlayer1, layer2の順序が事なっている所が注意点です。

全コード(コピペ用)

ここにコピペしてすぐに動かせるように全コードを載せておきます。以下にサンプルのcsvファイルもアップロードしておきますので、もし手元にデータが無い場合はお使い下さい。

全コードではdef関数形式にまとめています。ファイル名を引数に実行するだけにしました。

本コードはMITライセンスの考え方を採用してありますので、ご自由に使用して頂いて構いません。

実行結果

上記コードを実行すると、以下の結果を得ます。サイズや位置、色といった設定はコードをお好みで変更して下さい。

実行結果

横向きのウォーターフォール図

全コード(コピペ用)

ウォーターフォール図は横向きで使う事もあります。以下に横向きの場合の全コードを載せます。

変更点はaxisを逆順にしたり、プロット部分のhorizontalとverticalの変更、テキストの座標変更のみです。

実行結果

以下が実行結果です。横向きになりました!

横向きウォーターフォール図の計算結果

まとめ

本記事はウォーターフォール図の簡単な紹介と、Pythonによる自作コードでプロットを検討した結果を紹介しました。

結果、縦向きと横向きの両方でウォーターフォール図を描く事ができました。

…これは今後の社会人生活で役立つ武器が一つ手に入ったのでは?

実益の大きそうなコードが書けました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*