Jupyter

Pythonで開発工数可視化してみた話

More than 1 year has passed since last update.

最近、Javaをがりがり書く仕事から大規模開発の責任者的な立ち位置にシフトしています。

100人前後のエンジニア/デザイナをマネジメントするとなると、リソース管理が結構大変なことになります。

案件ごとの進捗はJiraなどのプロジェクト管理ツールを使って、バーンダウンチャートなど作っていけば、可視化できますが、3ヶ月くらい先の開発計画に対して人が足りているか余っているかというのはJiraだけで可視化するのは結構難しかったりします。

多くの場合はスプレッドシートやパワポなどで矢羽を引いたり、要員アサイン表、山積み表を作ったりしていると思います。

たとえば、以下のような要員アサイン表があったとします。

名前 チーム 10月上 10月下 11月上 11月下 12月上 12月下
Aさん デザイン 管理 管理 管理 管理 管理 管理
Bさん バック 案件 案件 改善 改善 改善 改善
Cさん フロントエンド システム保守 システム保守 システム保守 案件 案件 案件

これが100人分あると考えてください。
ぱっと見では状況わからないので、当然、集計結果/分析結果をグラフ化することが必要になるかと思います。

Jupyter Notebook使ってみる

スプレッドシートやエクセルならエクセル上で集計して表を作ればよいのでしょうが、以下の理由でJupyter Notebook を使ってみることにしました。

・集計ロジックを可視化できそう
・誤操作を防げそう

Jupyter Notebookを簡単に説明すると、Notebookと呼ばれる形式で作成したプログラムを実行しながら、分析作業を進めていくツールです。
実行結果を記録して、ページとして表示できます。

詳しくは以下から
http://jupyter.org/

インストール

Macを使っていれば Homebrew などで python3 をインストール後、pip で簡単にインストールできます。

pip3 install jupyter

以下も必要になってくるのでインストールしておくとよいでしょう

pip3 install matplotlib
pip3 install pandas
pip3 install numpy

実際に書いてみる

前述の要員計画表をdata/chart.csv としてCSV形式で保存したとします。
以下のようなコードで簡単にグラフが出せます。

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# CSVからDataFrameを作成。空のセルは なし で埋める
df = pd.read_csv('data/chart.csv').fillna('なし')

# チーム単位集計 (SQLでいうところのgroup by)
groupd = df.groupby('チーム')
result = groupd.agg(lambda x :  [sum( x == '管理' ),sum( x == '改善' ),sum( x == 'システム保守') ,sum( x.str.contains("案件")),sum(x == 'なし') ])

 # バックエンドチーム (例)
left = np.array([1,2,3,4,5])
label = ['Management','Improve','Maintaince','Enhance','No Assign']
plt.bar(left, result['10月上']['バック'],tick_label=label,color="green")
plt.title("Backend Engineers")
plt.xlabel("Task")
plt.ylabel("Man-Power")
plt.grid(True)

実行結果例

スクリーンショット 2017-12-09 17.12.08.png

Github上で描画/共有できる

Jupyter Notebookで作られる.ipynbファイルは、Github上で描画できます。
Githubを社内で使っているので、集計結果をPushして、そのURLを「現状こんな感じ!」とSlackで簡単に共有できます。
(エクセルファイルを貼り付けるより楽!)

Jupyter Notebookが使えるようになると、社内のデータサイエンティストとの会話も弾むかも! という効果もありますね。