Help us understand the problem. What is going on with this article?

メンバーの興味・関心は、プロジェクト管理データに反映されるか?

More than 1 year has passed since last update.

プロジェクト管理ツールを利用することで蓄積されるテキストデータを、プロジェクト管理以外の目的で活用できないか検証してみました。
お題は、「メンバーの興味・関心は、プロジェクト管理データに反映されるか?」です。
検証の結果、身内で楽しめるぐらいの精度では、メンバーの興味・関心が反映されていることが分かりました。

プロジェクト管理ツールとは?

会社の中では、「プロジェクト」という単位で仕事が進むケースがあります。
プロジェクトには、目的と制約(予算、期限、メンバーなど)があり、制約の中で目的を最大限達成するためのマネジメントが、プロジェクト管理です。
そして、プロジェクト管理を効率的に行うために導入されるのが、プロジェクト管理ツールです。

プロジェクト管理ツールにも色々ありますが、以下のようなツールが代表的です。
・Redmine
・Backlog
・Microsoft Project
・Trello
etc

見た目は、どのツールも大体こんな感じです↓
プロジェクト管理ツール.PNG

プロジェクト管理の過程で、メンバーがコメントを書き込むので、そのコメントを有効活用できないか探るのが今回の趣旨です。

メンバーの興味・関心が分かりそうなデータは?

お題が、「メンバーの興味・関心の抽出」なので、そのような情報を抽出できそうなプロジェクト管理データを分析対象として選定します。
私の所属する組織の場合、メンバーが興味のある世の中のニュースや技術を発信する情報共有のためのプロジェクトが立てられているので、そのプロジェクトに対して、メンバーが投稿(コメント)したデータを分析対象とします。この情報は、Backlogで管理されていたため、以降のデータ収集・加工は、Backlogの例で説明します。

プロジェクト管理データの収集・加工(Backlog)

①Backlogのメンバーになる

分析したいプロジェクト管理データを持っているチームの人に頼んで、メンバーに入れてもらいましょう。

②Backlog APIの利用キーを取得する

下記のサイトを参考に、APIの利用キーを取得します。

APIの設定 | プロジェクト管理ツールBacklog

飛んで読めば分かりますが、1分かからずに完了します。

③Backlog APIで、データを収集する

Backlogの運用方法に依存しますが、一例として以下のように記述することで、
プロジェクト内のコメントデータを取得することが可能です。

# Backlogデータの収集
import requests

Domain_ID = 'XXXXXX'
Issue_ID = 'YYYYYY'
apiKey = '00000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaa'  # ②で取得したキー

# 取得したいBacklogのURL
BACKLOG_URL = "https://%s.backlog.jp/api/v2/issues/%s/comments" % (Domain_ID, Issue_ID)  # ※1

# 課題に対して、コメントされたデータを収集
BACKLOG_PARAMS = {
    'apiKey': apiKey,
    'count':100  # ※2
}

# データをリクエスト
backlog_comments = requests.get(BACKLOG_URL, params=BACKLOG_PARAMS).json()

# 確認(※3)
print("取得データの形式:%s" % type(backlog_comments))
print("コメント数:%s" % len(backlog_comments))
print("コメントの形式:%s" % type(backlog_comments[0]))
print("コメントの属性:%s" % backlog_comments[0].keys())

出力:
取得データの形式:<class 'list'>
コメント数:100
コメントの形式:<class 'dict'>
コメントの属性:dict_keys(['id', 'content', 'changeLog', 'createdUser', 'created', 'updated', 'stars', 'notifications'])


※1:BACKLOG_URL = "https://%s.backlog.jp/api/v2/issues" % Domain_ID
とした場合、課題の一覧の情報を取得することが可能です。
課題に対するコメントの一覧の情報を取得する場合は、
BACKLOG_URL = "https://%s.backlog.jp/api/v2/issues/%s/comments" % (Domain_ID, Issue_ID)
とします。
※2:Backlog APIの1回のリクエストでのデータ取得上限は100です(デフォルトは20)
※3:backlog_commentsは、辞書型のコメントを要素とするリストです。コメントには、id、content、createdUser、createdなどの属性が含まれます。


④収集したコメントデータを、メンバー別に整理する

取得したデータを、さらに加工し、メンバー別にコメントを整理します。
一例として、以下のように記述します。

name_comment_dict = {}  # キー:メンバー名、値:コメントのリスト

for backlog_comment in backlog_comments:
    name = backlog_comment['createdUser']['name']

    if name not in name_comment_dict:
        name_comment_dict[name] = []

    comment = backlog_comment['content']
    if comment is not None:  # Noneの場合を例外扱い
        name_comment_dict[name].append(comment)

print(name_comment_dict)

出力:
{'Aさん':["1つ目のコメント~", "2つ目のコメント~", ...], 'Bさん':["1つ目のコメント~", ...], ..., 'Eさん':["1つ目のコメント~", ...]}


メンバーの興味を可視化する

こうして取得したデータを形態素解析して単語に分割し、名詞だけに限定してWordCloudを出力することで、メンバーの興味を可視化してみました。
WordCloudの実装は過去記事の通りです。

※プロジェクト管理の実データでの例は公開できないため、私が発信した情報に基づく別データの例で説明します。

↓WordCloudの実装

# Word Cloudで可視化、WordCloud可視化関数(過去記事とほぼ書き方同じ)
def color_func(word, font_size, position, orientation, random_state, font_path):
    return 'white'

from wordcloud import WordCloud
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=r'C:\WINDOWS\Fonts\meiryo.ttc', size=50) #日本語対応

def DrawWordCloud(word_freq_dict, fig_title):

    wordcloud = WordCloud(background_color='white', min_font_size=15, font_path='C:\WINDOWS\Fonts\meiryo.ttc',
                          max_font_size=200, width=1000, height=500, prefer_horizontal=1.0, relative_scaling=0.0, colormap="rainbow")    
    wordcloud.generate_from_frequencies(word_freq_dict)
    plt.figure(figsize=[20,20])
    plt.title(fig_title, fontproperties=fp)
    plt.imshow(wordcloud,interpolation='bilinear')
    plt.axis("off")

↓メンバーの興味・関心の可視化の実装

from janome.tokenizer import Tokenizer
t = Tokenizer()

# メンバーごとにコメントに含まれる名詞を整理
name_keyword_cnt_dict = {}

for name, comment in name_comment_dict.items():

    name_keyword_cnt_dict[name] = {}      
    str_comment = " ".join(comment)  # 複数のコメントを一つのコメントとして結合

    bow = [token.base_form for token in t.tokenize(str_comment) if token.part_of_speech.startswith('名詞') and len(token.base_form) > 1]  # 2文字以上の名詞に限定

    for b in bow:
        if b not in name_keyword_cnt_dict[name]: 
            name_keyword_cnt_dict[name][b] = 0
        name_keyword_cnt_dict[name][b] += 1

    print("%s : finished" % name)

# メンバーの興味を可視化
for name in name_comment_dict.keys():
    DrawWordCloud(name_keyword_cnt_dict[name], "%sが興味・関心のあるキーワード" % name)

出力:
Aさん : finished
Bさん : finished
Cさん : finished
Dさん : finished
@pocket_kyoto : finished

@pocket_kyotoの興味.PNG

主観評価ですが、私が興味・関心を持っている用語が多く抽出されているように思います。
プロジェクト管理の実データの場合でも、上記と同程度の精度で、メンバーの興味・関心を可視化できることを確認しました。複数メンバーの結果を可視化した場合、メンバー共通 or 固有の興味を比較することも可能です。

まとめと今後

今回は、プロジェクト管理データの活用をテーマに、メンバーの興味・関心の抽出に取り組んでみました。
プロジェクト管理データを、メンバー別に整理して比較分析することで、色々面白そうなことが分かりそうな感触でした。
今後は、分析対象とするデータを増やす、文体からのメンバーの性格推定に取り組む、テキスト以外のプロジェクト管理データの活用を検討する、などに取り組んでいきたいです。

pocket_kyoto
投稿は、テキストマイニング系中心。 興味ある分野は、機械学習全般、NLP、人流データ解析、転移学習、メカニズムデザイン など
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away