OpenWork Tech Blog

OpenWork を運営するエンジニアによるテックブログです。

OpenWorkの年齢別年収機能の裏側

f:id:yutaro_honda:20210625105405j:plain

はじめに

こんにちは。データサイエンティストの本多です。今回の記事はみんなが大好きな年収の話です。OpenWorkに2020年12月に登場した機能である、年齢別年収についてその裏側を紹介します。

プロジェクトの背景と目標

OpenWorkで集めている年収データの歴史

OpenWorkのクチコミには開設当初から「年収・給与」というカテゴリがあり、各企業の年収事例や給与制度の特徴などに関するクチコミを収集・掲載しています。かつては具体的な年収事例も他のカテゴリのクチコミと同様に自由記述のテキスト形式で収集していました。古い投稿を読んで頂くと、「新卒入社10年目、35歳、主任 年収XXX万円」のような内容のクチコミを見かけると思いますが、それのことです。

その後、より正確なデータを収集するために2018年5月末からテキストだけではなく定量(数値)データとしてクチコミ投稿者の年収情報(年収/基本給/残業代/賞与/その他)を入力していただくようにしています。多くの方に入力していただいているおかげで、現在では24万件以上の定量年収データをサービス上に掲載できるようになりました。

集めた年収データを就職や転職の判断に使える形で可視化したい

データを集めたからには便利な形で可視化してユーザーの皆さんに提供する必要があります。クチコミ単位で掲載している個々の年収事例はもちろんそれ自体が価値ある情報ですが、皆さんが知りたいのは「結局この会社の年収っていくらなの?」ということだと思います。そこで、定量データを集め始めたばかりでデータが少なかった頃は、単純に企業ごとに集まったデータのヒストグラムを掲載し年収の分布がわかるようにしていました。

f:id:yutaro_honda:20210625105437p:plain

そして、更に多くのデータが集まってきたのを受けて2020年後半に年収データをもっと有益なコンテンツに改善するプロジェクトが立ち上がりました。OpenWorkは転職・就職のための情報プラットフォームなので、機能の開発にあたっては就活生や転職希望者にとって重要な情報を提供することを大切にしています。そこで、そのプロジェクトでは企業別年収分布からもう一歩踏み込んで、就職・転職活動中の人が一番気になるであろう「もし自分がこの会社に入社したら、年収はいくら貰えるだろうか?」という疑問に答えることを目指しました。

節目となる5歳ごとの年齢の年収を推定したい

昨今はジョブ型雇用というキーワードも盛り上がりを見せてはいますが、まだ日本の多くの企業では年収を決める最大の因子は年齢です。そのため、転職を考えるときにも、その企業社で働く自分と同世代の社員の年収がわかると転職後の年収を見積もる上で有益な情報になります。また、将来の昇給の可能性などを探るため、自分よりも年上の社員の年収も気になります。そこで、このプロジェクトでは年齢の節目となる25歳、30歳、35歳、...と5歳ごとに各企業の年齢別の年収を推定し可視化することにしました。

年収推定のアルゴリズム

単純平均ではなぜ不十分か

推定年収の具体的な算出方法として真っ先に思いつくのは年齢別の単純平均です。要するに25歳、30歳、35歳、...の年収データをそれぞれ集めて、単に平均を計算してサイトに掲載するというお手軽な方法です。

ただ、この方法には明らかな欠点があります。それは使えるデータが少ないことです。27〜29歳や31〜33歳など前後の年齢のデータがたくさんあっても、運悪く30歳のデータがなければ30歳時点の年収を出せなくなってしまいます。また、データがあったとしてもそれぞれの年齢のデータはほんの1~2人分しかないということも多くあり、たまたまそれらのデータが極端な外れ値と言うこともあります。

これではとても信頼性のある情報とは言えず、安心して転職の判断に使ってもらうことはできません。また、この方法では、せっかく集まったデータのうち、年齢が5の倍数でない多くのデータが活用できないのも残念です。

年齢別年収分布をモデル化する

年齢別の単純平均の課題を解決するために、各企業の年齢別の年収分布を統計モデルで表すことを考えました。詳細な数式は割愛しますが、以下の2つを仮定し、企業毎に年齢別の年収分布をモデル化しています。

  • 年齢ごとの年収の分布は対数正規分布に従う。
  • 分布のパラメーターは年齢に対して滑らかに変化する。

年齢別の年収の分布として対数正規分布を採用したのは、一般的に所得の分布は対数正規分布に従うとされていることと、実際のデータと照らし合わせた結果、多くの企業のデータで当てはまりが良いことが確認できたためです。

統計モデル化の恩恵

年齢ごとの年収を統計モデルで表すことによって、各年齢の年収はその前後の年齢のデータも考慮した確率分布として表現されます。これによって、年齢別のデータの件数の少なさの問題に対応でき、外れ値などに対してもある程度は堅牢な情報を得ることができます。

さらに、確率分布で年収の分布を表す事ができたので、「何歳の年収はXXX万円」、という点推定だけではなく、「何歳の社員のZ%は、年収がXXX万円〜YYY万円」のように、年収のレンジを予測することも可能になりました。多くの企業のデータを眺めていて年収の水準だけでなく散らばり方にも企業ごとの個性があるのを感じており、これもきっとユーザーのためになる情報だと判断したので、このプロジェクトのアウトプットにも、モデルから予測した年収レンジを含めることにしました。

新たな課題「どの代表値を推定年収とするか」

さて、統計モデルができたらすべての課題が解決かというと、そうではありません。最後に非常に重要な問題が残ります。それは、年収分布の代表値(期待値/中央値/最頻値)のうち、どれを推定年収として採用し掲載するのかです。統計モデルが正規分布を仮定していたらこの3値は一致するので何も悩まなくていいのですが、対数正規分布を仮定したことによりそれぞれ異なる値になるため1つを選ぶ必要があります。

普通に考えれば期待値(平均値)が第一候補です。僕らもはじめは期待値を使うことを考えていました。しかし、よく知られている性質ですが、期待値は高年収のデータに引っ張られやすく、多くの人の実感と比べて高めの値が出ることがよくあります。実際に企業毎にモデルを構築して年齢別の年収の期待値を算出し、個別のデータと比較してみたところ、多くの企業で過半数の人、企業によっては6割以上の人が期待値未満の年収であることが判明しました。

こうなると、年収の期待値を推定年収としてサイトに掲載しても、それを信じて転職した人の6割は思っていたよりも低い年収を提示されてしまいます。「もし自分がこの会社に入社したら、年収はいくら貰えるだろうか?」という疑問に答える、という当初の目的を考えればこれは非常に残念な事実です。このような背景から、現在は中央値を年収の推定値として採用することにしています。

モデリングの結果

具体的にある1社のデータを取り上げて、もとの年収データからモデルを作ったのが下のGIF動画です。

f:id:yutaro_honda:20210625105517g:plain

左側の散布図の緑色の点が、ある企業の実際のデータ(横軸:年齢と縦軸:年収)をプロットしたものです。アニメーションでスライドしている左のグラフの黒い縦棒が指し示した年齢のデータの分布を右側のグラフにヒストグラムとして表しています。そして、右側のグラフの曲線が今回構築したモデルで推定したその年齢の年収の分布です。黒い横棒がその分布の中央値を指し、オレンジのエリアがデータの80%が含まれる予測区間になっています。

43歳や50歳など、データが少ないどころか1件もない年齢においても前後の年齢のデータを使って分布が推定できているのがわかると思います。現在のOpenWorkのサービス上では、このGIF動画のグラフのうち、5歳ごとのグラフから推定年収(確率分布の中央値)と、80%予測区間を取り出し次の画像のように掲載しています。

f:id:yutaro_honda:20210625105552p:plain

まとめ

現状の課題

さて、現在のOpenWorkに実装されている年齢別年収機能の裏側を紹介して来ましたがいかがでしたでしょうか。僕の個人的な思いとしては、大半の企業についてある程度妥当な結果を掲載できているものの、まだまだ課題は多いと感じています。

単純にモデルの精度だけ見ても、1社1社見ていくとどうしてもあまりうまく当てはまってないと思われる企業もあります。個別に見ればこの企業に限っては対数正規分布よりパレート分布のほうが良さそうだとか、この企業は性別や入社形態(新卒or中途)によって給与レンジが全然違って一つのモデルで表すには無理があるといった事例はいくらでもあります。今は推定年収として中央値を採用していますが、それが絶対にベストというわけでも有りません。このようにモデル自体にもまだまだ改善の余地はあります。

外部環境にも目を向けると、世の中の動きとして今以上にジョブ型雇用が広まり、年功序列の給与体系を見直す企業が増えたら、年齢を切り口に年収を推定するという今の方針を根底から変える必要が生じるかもしれません。

また、年収の総額だけでなく、その内訳データを活用していないのも課題です。入力必須項目ではないので、年収総額ほどのデータ件数は蓄積できていないのですが、基本給や残業代、賞与などのデータも着々と溜まっています。本当はこれらのデータも有効活用し、年収における残業代や賞与の比率なども可視化していければ、ジョブマーケットをよりクリアにすることに貢献できるはずです。

今後の展望

課題に感じていることだけでなく、楽しみに思っていることもあります。

もっとデータが溜まり、多くの企業で職種や性別、入社形態などの属性別に分けても十分なデータが確保できるようになったら、属性別に年齢別の推定年収を提示できるようになるといいなと思っています。

また、この先5年10年と継続して良質なデータを蓄積できたら、各企業の年収分布の経年変化を分析できると期待しています。そうすると、「この会社は業績が成長するにしたがって社員の年収レンジも上がってきた」とか、「この会社は元々男女の年収格差があったけどそれが解消してきた」とか、「この会社は年功序列だったがジョブ型への移行が順調に進んでいるな」とか、年収に関するいろんな情報をOpenWorkのデータから見出し、発信できるのではと楽しみにしています。

We're Hiring

OpenWorkに蓄積された年収データはデータ構造としては非常に単純なものです。でも、その単純なデータをどう活用したらユーザーにとって最適な情報を提供できるかを考えると、話は単純ではなくなります。現在の形がベストというわけではなく、これからも正確さを担保しながらより多くのデータを集め新しい活用方法を考え実装していくことでサービスをより良くできる可能性を秘めています。

そしてもちろんですが、OpenWorkのDBには年収だけでなく多くの種類のデータが蓄積されています。しかし、これらのデータを分析し活用する体制はまだ十分ではありません。

蓄積されたデータを活用してサービスをより良いものにしていくために、オープンワーク株式会社では一緒に働く仲間を募集しています。ミッションに共感し、データに興味をお持ちの方がいらっしゃいましたら、一緒に働いてみませんか。

vorkers.jp vorkers.jp