日報から見えてくる新卒の成長と育成課題

1. Introduction

Junyaです。Qiitaに投稿しようとしましたが、プログラミング話題でもないので、はてなを開設しました(noteとの棲み分けが難しい) Qiitaでは自分が大学3年の冬に投稿したネットワーク ソケットプログラミングの閲覧数、いいね数が思ったより増えていて嬉しい限りです(あの頃の記事雑だな…)。

2019年3月に大学院修士課程を修了し、4月から東京汐留にある某企業で勤め始めて8か月が経過しました。 現在の部署では、社内コア事業で扱うWebアプリケーションの開発を行っています。とても恵まれたチームでして、積極的な意見や自己研鑽活動を推奨して頂けます。

そういった環境の中で、新卒日報というPJを与えられました。大企業がやっているようなフォーマットありの固い形式ではなく、「紙でもOK」「メールでもOK」「Webサイト作って提出でもOK」という自由な課題です。条件は自分が一日の中で出来た事や感じた事を綴ればよいだけです。

今回の記事では、

  1. 日報システムをどんな風に体系を仕上げたか
  2. 8ヶ月の日報を振り返って何が見えてくるか

を中心に伝えられればなと思います。

注1)日報本文の中には社内情報も入っています。記事に展開する文章や画像の中に一部マスクされたものがあります。ご了承ください。
注2)自分は自然言語処理の初心者です。分析手法やデータの取り扱いが初心者なので、温かい目で見守りください。

2. System Architecture

結論から申し上げますと、全てGoogle Apps Script(以下、GAS)で完結しています。およそ1ヶ月で製作しました。 社内事情によるものです(DBや継続的に稼働するサーバを使うには色々と手続きがくそほど面倒でして、社内自由に利用可能なG Suiteサービスを使いました)

system_architect.png

スプレッドシートをDB代わりに利用してます。I/Oは遅いですが、スクリプトの記述次第では影響ありません。 Sakaimo(@sakaimo)さんのスライドが参考になったりします。基本はGASのHTTPサービスを使って、Webサイト上で操作します。

  1. サイトアクセス(Google認証情報をスクリプトで拾います)
  2. 各ページ遷移可能
  3. 日報記入ページへ遷移(スプレッドシート側でアクセスできるユーザを制限しています)
  4. 日報記述→下書きor提出
  5. メールにて上長、先輩へ送信

投稿した内容はHOMEページへ反映されます。記述内容や自分が今日覚えたことを基にしたグラフを表示します。 残念ながらGASのコードは公開できませんが、ファイル相関図は以下のようになっています。拙いコンポーネント図ですが…。

system_component_diagram.png

3. Report Analysis

企業には決算があります。普通、四半期というものに分けて各期で決算をしますね。特に、第1四半期と第2四半期を「上期」、第3四半期と第4四半期を「下期」と読んだりします。企業によっては、上期の新卒社員を「試用期間」扱いしたりします。

さて、10月に入り下期に突入したわけですが。いつまでも新人気分でいられるわけでもなく、上長とこんな議論をしました。 「今まで貯めた日報データ使って何かできないかな~」 おぉー、どこかで聞いたセリフ。ネットでよくある最近の企業の「AI使って何かやってよ~」に似てるぞ、おい。上期からそんな事を匂わせてはきましたが、遂に取り掛かることにしました。もちろん綺麗に成形されたデータではありません…。

3.1 Data Overview

自分のチームには新卒がもう一人いるのですが、幸いにも日報の書き方が似通っていたので、2人分合わせて分析することとしました。まず初めに全体量を眺めてみました。土日祝除く、平日の日報投投稿数をプロットしました。ここで言う投稿数とはの事です。自分たちの日報スタイルとして、「~できました。」「~について取り組みました。」と一つ一つの出来事を羅列していく形になっています。これをカウントしました。なお、祝日の抜粋方法はPythonライブラリである jpholiday を用いています。

# jpholiday の使い方
# 2019.05.20 ~ 2019.11.22 の土日祝抜き日付リストを作成するコード例

import datetime as dt
import jpholiday

start = str(20190520)
end = str(20191122)

start_dt = dt.datetime.strptime(start, "%Y%m%d")
end_dt = dt.datetime.strptime(end, "%Y%m%d")

lst = []
t = start_dt
while t <= end_dt:
    # is_holidayで日本の祝日か判定する
    if t.weekday() >= 5 or jpholiday.is_holiday(t.date()):
        t += dt.timedelta(days=1)
        continue
    lst.append(t.strftime('%Y/%m/%d'))
    t += dt.timedelta(days=1)

system_component_diagram.png

結果を積み上げ棒グラフにプロットしました。紫の濃淡は自分or同期を表してます。黒線は5日移動平均の値です。上期は一か月単位で周期性がありそうですね。これを見たときに真っ先に思い浮かびました。自分達の所属するチームでは1ヶ月ごとにシステムリリースがあるということです!どんな形で、何を報告してもよいとう形になった結果、リリース前に日報書いてる時間なんて存在しないことが伺えます。

3.2 Sentence Analysis - Word Frequency

投稿数の上下は分かったところで、実際に普段どんなことを書いているのか、どんなことを書きがちかを分析しました。 今回はMeCabを使った形態素解析を基に、頻出単語や極性判定を行いました。

まずはMeCabで、全文章から名詞を抜き出してカウントしてみます。

import MeCab

tagger = MeCab.Tagger("-Ochasen")
tagger.parseToNode('ダミー')

def extractKeyword(text):
    """Morphological analysis of text and returning a list of only nouns"""
    rep_text = str(text).replace('\\n', '')
    node = tagger.parseToNode(rep_text)
    keywords = []
    while node:
        feature = node.feature.split(",")[0]
        if feature == u'名詞': # only noun
            keywords.append(str(node.surface))
        node = node.next
    return keywords

まず自分だけの結果を見てみます。同期のやつを晒すのもかわいそうなので。

noun_word_count

※冒頭にも述べましたが、一部ワードはマスクしています。

TOP15のワードについて考察します

  • 「開発」「コーディング」「API
    • 確かにうちのチームはフロアの中でも一番と言っていいほど自主開発に取り組んでいますので、コーディング量は圧倒的です。普段から開発の会話ばかりです。
  • 「参加」
    • 新卒はいろんなイベント行きますからね。自分の場合は社内・社外問わずですが。
  • 「確認」「大事」「作成」「報告」
    • 報連相のことですかね。大事さに毎日気づかされてます。
  • 「AI」
    • となりの部署の若手先輩方とKaggleベースに機械学習勉強会やってます。その話題も日報に書いてました。

同期と合わせるとこうなります。

noun_word_count

ほぼ同じですね。「バック」はバックエンド開発の事です。バックだけ抜かれてます。 2人とも「最近」「今後」という言葉が気になります。「最近何を思っているのか」「今後どうしていきたいのか、不安なのか」というニュアンスかもしれません。新卒がこのワードがをいつ頃表に出し始めるかも気になるところです(次回以降)。

3.3 Sentence Analysis - Polarity

よくネガポジ判定と呼ばれる部類の分析です。一般的に単語には善し悪しのイメージがあります。「優しい」は善いイメージですし、「苛立つ」は悪いイメージですよね(あくまで一般的にです)。世の中にはそれをまとめた極性辞書なるものが存在して、単語ごとにスコア化されています。値域は $[-1,1]$ です。今回は単純に、文章中の各単語のスコアを総和し、日ごとに和で集約しました。

今回用いた辞書は東工大の高村教授が作成したものとなります(参考ページ

np_score_edit

黒線が極性スコアのグラフです。棒グラフは3.1で導出した投稿数のプロットです。 見たところ0以上の(ポジティブが頻出する)日が少ないですね…。計算方法も雑ですので、これを見て一概に新卒社員は不満を感じています!とは言い切れないですが。

np_score_histgram

各日、各日報報告のスコアをヒストグラム化してみました。最頻値は $-1.75$ あたりですね。

frequent_verbs

日報の中で、どんな動詞(発言や行動に結びつくと考えました)が善い悪いと捉えられいるか、辞書のスコアをソートしてプロットしてみました。以下、考察です。

  • 正のスコア
    • 助ける → 普段から協調性高い証拠?
    • 慣れる、励む、心掛ける → 個人的に善いイメージのワードではないですが、一般的にはそうなんでしょう
    • 生きる → 頑張れ、新卒の俺。
  • 負のスコア
    • 早める、役立てる、進める
      • 「早め早めに準備を」「何か役に立つものを」という言葉は新卒への過大なプレッシャーになったりするかもしれませんね
      • 「〇〇の作業を進める」=「単調な作業になりつつある」という意味に捉えられなくはない

これらの結果を次のステップへ活かすのは難しそうですが、来年の新卒育成への材料になればよいと思っています。

4. Conclusion

今回は、とある企業の新卒が日報サイトを作製し、集めた日報を分析するという記事を書きました。 教訓は以下の3つです。

  • 文章データの集め方は難しい。ある程度最初にどんな内容を書くかを具体化する必要がある?
  • GASはもう嫌だ。
  • 日報から成長度を測るのは難しいか。人材育成は定量化するのが難しそう。

あまり実装コードは記載できませんでしたが、成形した後GitHubにて公開したいと思います。