LIVESENSE Data Analytics Blog

リブセンスのデータ分析、機械学習、分析基盤に関する取り組みをご紹介するブログです。

転職ドラフトのデータ分析 - 年収非公開施策による提示年収の平均処置効果

 こんにちは、リブセンスでデータサイエンティストをしている北原です。今回は転職ドラフト年収非公開施策のデータ分析の一つとして行った、施策が提示年収に与えた平均処置効果推定の紹介です。今回の記事は過去に行った分析結果を因果推論手法で再確認するのが主な目的です。

 年収非公開施策ではA/Bテストを行っていないため、年収非公開施策回のみに参加しやすかったユーザーや企業の提示年収水準が通常と異なる場合、これらが影響して施策のみの効果を推定するのが難しくなります。今回は、これらの影響を除去する方法を使って施策のみの効果を推定します。なお、今回の分析結果も過去に行った集計分析やベイズ推定による分析とほぼ同じで目新しい結果は得られていません。

 転職ドラフトの年収非公開施策およびそのデータ分析については下記記事をご参照ください。

analytics.livesense.co.jp

analytics.livesense.co.jp

 今回使った平均処置効果推定方法については下記をご参照ください。

analytics.livesense.co.jp

転職ドラフトの年収非公開施策

 今回も簡単におさらいです。以前の記事をお読みになられたことがあるのであれば読み飛ばしていただければと思います。

 転職ドラフトは競争入札型のユニークなエンジニア向け転職サービスです。面接などの本格的な選考前に企業から年収が提示される仕組みになっています。提示年収は公開されているので、その後に続く企業は他社の提示年収を参考に自社の提示年収を決めることができます。この仕組みはエンジニアの実力が正当に評価されるよう採用市場の透明化を図ったものです。

 しかし、過去の提示年収に影響されてその後の提示年収が決まることで、ユーザーあるいは企業にとって不公平になっている可能性があるのではないかという懸念もありました。そこで2020年8月に行われたのが過去の提示年収を非公開にする年収非公開施策です。この施策で過去の提示年収に影響されない状況を作り、他の開催回と比較することで過去の提示年収が現在の提示年収に与える影響を検証しようという試みです。以前の記事では年収非公開施策の簡単な分析結果と提示年収のばらつきの推定結果について紹介しました。しかし、因果推論の結果については公開していなかったので今回紹介する次第です。

年収非公開施策のバイアス

 知りたいことは、過去の提示年収がその後の指名時の提示年収額に与える影響です。本来ならばA/Bテストを実施するのがよいのですが、過去の提示年収を非公開にするユーザーをランダムに設定すると不公平になる可能性があるのでA/Bテストは実施しにくいです。そこで今回は過去の提示年収を参考にできない状況をつくり、過去の提示年収を参考にできる通常回と参考にできない年収非公開回の平均提示年収の差を利用して過去の提示年収の影響を調べています。

 A/Bテストを行えない場合に注意しなければならないのがバイアスの問題です。年収非公開施策回のみに年収水準の異なるユーザーが参加するインセンティブがあるとそれらのユーザーの影響を受けるため、単純に平均提示年収の差を計算するだけでは過去の提示年収の影響を推定することができません。このような影響で本来とは異なる推定値が得られてしまうとき、本来の推定値との差分がバイアスと呼ばれるものです。

 例えば、平常時と比較して年収非公開施策回にスキルの高いユーザーが多数参加していると、見かけ上は年収非公開施策回の提示年収が高くなります。このとき、本来の提示年収より高く算出されている年収幅がバイアスです。

 バイアスを除去するのに使うのが因果推論手法です。因果推論では推定対象やバイアスに関わる知見が必要になるので、年収非公開施策のバイアスについて考えてみましょう。

 バイアスがどのように生じているかがわかれば、影響の方向や大きさをある程度推測できます。ここでは提示年収と年収非公開回参加の双方と相関のある要因があるかを考えます。次の視点で考えていきます。

  • 高(低)年収を提示されやすいユーザーが年収非公開施策回に参加するインセンティブがあるか
  • 高(低)年収を提示しやすい企業が年収非公開施策回に参加するインセンティブがあるか

 まずどのようなユーザーが年収非公開施策回に参加しやすかったかを考えましょう。過去の提示年収を知られないほうが得と考えるユーザーが参加しやすかった、というのがもっとも可能性の高い仮説です。具体的には次のようなユーザーです。

  • 自分が想定しているよりも、過去の提示年収が低かったユーザー

転職ドラフトの公式twitterでもこのようなユーザーに参加を呼びかけているので、年収非公開施策回への参加が多かったと考えるのが自然です。ただし、過去の提示年収に不満があるかを質問したわけではないので確証はありません。前後の7月回や9月回と比較して年収非公開施策回の既存ユーザー参加人数は8〜10%ほど多くなっており通常とは異なるユーザーの参加が増えた可能性は高いと考えられます。

 しかし、過去の提示年収に不満があるユーザーの本来の提示年収水準がわからないので、バイアスについての定性的な予想が難しいです。ユーザーが考えているとおり本来の実力より過小評価されることが多かったのであれば年収非公開施策回の提示年収は高めになりますし、自分を過大評価しているだけであれば低めになります。今回の場合、どちらが多いかを推測可能な情報がないためバイアスの向きも大きさも予想がつきません。これ以外にも年収非公開のほうが得と考えるユーザーが参加していた可能性はありますが、同様の理由でバイアスの特徴を予想するのは困難です。

 どのような企業が年収非公開施策回に参加しやすかったかについてもわからないのでそのバイアスについてもわかりません。一番ありそうなのは、他社の提示年収額を参考に提示額を決めていた企業が参加を控えたケースです。採用担当者が非エンジニアあるいは経験の浅いエンジニアの場合はありえますが、企業向けアンケートの回答を見ると年収非公開施策回のみ経験のあるエンジニアが担当することがあったようです。7月回、収非公開施策回、9月回の参加企業数はそれぞれ99、103、118となっていて、年収非公開施策回のみ参加企業数が減ったということはありませんでした。参加を控えた企業はあったかもしれませんが、何らかの対策をとった企業もあることをふまえると数は多くなさそうですし、参加を控えた企業の提示年収水準もわかりません。

 以上のことから、バイアスの方向などの推測は困難なものの、過去の提示年収に不満のあるユーザーの影響を考慮することが重要なことがわかりました。しかし、転職ドラフトは過去の提示年収への不満に直接関わる情報は持っていませんし、過去の提示年収に不満を持ちやすい職務経歴なども明らかではありません。そのため、真のモデルを仮定して推定するのは困難です。一方で、過去の提示年収に不満のあるユーザーにありがちな職務経歴傾向があるかもしれません。そこで、今回は真のモデルを仮定せずにこれらの情報を共変量として活用できる因果推論手法を使います。

方法

推定対象

 推定対象は、年収非公開施策が提示年収に与えた平均処置効果です。つまり、年収非公開回の平均提示年収と通常回の平均提示年収の差分です。年収非公開施策では過去の提示年収を参照できないため、これによって過去の提示年収を参照できないことが提示年収に与える影響を調べるのが目的です。

 A/Bテストを実施したときと同等の効果を推定します。推定対象の母集団は全体とし、Average Treatment Effect(ATE)を推定します。つまり、年収非公開回と通常回いずれのユーザーも推定対象とします。またMarginal Effectを推定します。つまり、条件付けなしで全ユーザーについて、過去の提示年収を参照できないときと参照できるときの差を推定します。

 推定は希望年収のあるユーザーとないユーザーそれぞれについて行います。希望年収のあるユーザーでは、希望年収に起因するバイアスが生じている可能性があるためです。年収非公開施策は、過去の提示年収を参照できないようにすることで、職務経歴などから判断される本来の実力に基づく年収が提示されることを意図したものです。しかし、希望年収があると希望年収を基準とした年収が提示されやすくなります。平均的に提示年収は希望年収を下回ることが多いので、希望年収に基づいて提示年収が決められることが多いと希望年収のあるユーザーの提示年収は高くなりやすくなります。

データ

 2020年の7月から9月に開催された転職ドラフトのデータを使い、年収非公開回と通常回の比較を行います。この時期の転職ドラフトは月に1回開催されているので合計3回分のデータです。年収非公開施策は8月に行われており、前後に開催された7月回と9月回が通常回です。

 年収非公開回とその前後の開催回のデータのみを使っているのは、転職市場の活況度に起因するバイアスを低減するためです。2020年の8月は新型コロナウィルスによる転職市場の急激な縮小からの回復過程にある時期で、年収非公開施策以外にも転職市場の回復が提示年収水準に影響を与えていると考えられます。年収非公開回の比較対象とする通常回のデータを、時間的に離れた時期や年収非公開回前のみもしくは後のみとすると、転職市場の回復度合いに起因するバイアスが生じる可能性があります。なお、このようなデータの使い方は2020年7月から9月までの転職市場の回復による提示年収の水準の上昇が線形であることを仮定していることと同じであるため、実際の回復度合いとのずれによる影響は受けます。

 2020年の7月から9月に開催された転職ドラフトの希望年収有無別の指名ユーザー数、指名数、平均提示年収は以下のとおりです。指名の多いユーザーの影響を緩和するため、平均提示年収は各回のユーザーごとに平均した後、さらに各回で平均しています。なお、参加ユーザーのうち、指名があるのはおよそ半数のユーザーです。

開催回 希望年収有無 指名ユーザー数 指名数 平均提示年収
29 0 59 115 623.9
29 1 101 273 678.3
30 0 73 183 643.7
30 1 113 290 698.2
31 0 71 198 635.9
31 1 104 257 695.2

 年収非公開回と通常回で、希望年収有無別に計算した平均提示年収は以下のとおりです。平均提示年収は全指名をそのまま平均しています。

希望年収あり 希望年収なし
年収非公開回 697.9 643.3
通常回 686.3 630.1
年収非公開回 - 通常回 11.6 13.2

推定方法

 推定では、マッチングと重み付けによる共変量のバランシングによってバイアスを低減する方法を使います。具体的には、以前の記事で紹介した手順に従います。

 この方法は共変量のバランスがとれるとモデル依存性や未観測共変量の影響が弱くなることを利用して推定が安定しているかを判断するところが特徴です。結果や処置についての正確なモデルがわからないときにも利用でき、未観測共変量が存在していても観測共変量との相関が強い場合には有効に機能するのが利点です。

 今回は、年収非公開施策回、提示年収のいずれについても正確なモデルを作成できる保証がないので、このような手法を利用しています。結果もしくは処置のいずれかについて正確なモデルを確実に作成できる場合は、Doubly Robustなどの真のモデルが既知であることを仮定した手法を使うことで共変量のバランスを気にせずにバイアスの小さい推定を行うことができます。しかし、モデルに不正確な部分があったり未観測共変量の影響があるとバイアスの低減はできないので今回は採用していません。

 なお、時期の異なる複数回のデータを使っているので縦断データ、パネルデータとして分析することも検討しましたが、複数回指名を受けたユーザー数が少ないため断念しました。なお、3回とも指名を受けたユーザーは19人で、転職ドラフト1回の指名ユーザー数のおよそ1割強にあたります。

 1人で複数企業から指名を受けるユーザーもいますし、人数は少ないとはいえ異なる回で指名を受けるユーザーもいるので、サンプル間に自己相関が生じます。そのため、不均一性だけでなく自己相関も考慮して標準誤差を計算しています。具体的には、重み付けにおいても同一ユーザーの誤差項には相関があることを仮定して、クラスタ頑健標準誤差を使っています。

共変量

 年収非公開回参加の原因となる情報が不明なため、共変量には提示年収の原因と考えられる情報を使っています。具体的には、職務経歴の各プロジェクトから生成したデータ、年齢、業務経験年数、希望年収のあるユーザーについては希望年収です。業務経験年数はプロジェクト従事年数を合計したものを使っています。

 職務経歴データは主に「プロジェクトタイプ」、「経験した職種・役割」、「担当工程」の各タグについて全プロジェクトの従事期間を合計し、各タグの業務経験年数を計算したものを使いました。例えば、設計を担当した半年のプロジェクトと1年のプロジェクトがある場合は、設計1.5年となります。各タグの内容は以下のとおりです。なお、その他タグについては利用していません。

項目 タグ
プロジェクトタイプ スマホアプリ, 自社プロダクト, webサービス, 業務システム, 受託開発, パッケージ開発, ゲーム, OSS開発
経験した職種・役割 バックエンド, インフラストラクチャ, マネージメント, デザイン, フロントエンド
担当工程 企画, 要件定義, 設計, コーディング, テスト, 運用保守, データ分析

 職務経歴データからは、マネジメント経験の有無、コミッタかどうか、育成経験有無、機械学習経験有無のダミー変数データも作成し共変量として使っています。具体的には以下の条件に当てはまる場合は1そうでない場合は0としています。

変数名 条件
マネジメント経験有無 マネージメント能力欄に記載がある
コミッタ プロジェクト内容の説明で正規表現「コミッタ|committer」がマッチ
育成経験有無 プロジェクト内容の説明で正規表現「育成|教育|指導」がマッチ
機械学習経験有無 プロジェクト内容の説明で正規表現「機械学習|.achine .earning」がマッチ

 希望年収有無別の共変量のバランスは以下のとおりです。左から順にStandardized Mean Difference(SMD)、分散比、Kolmogorov-Smirnov(KS)統計量を表示しています。共変量の並び順はSMDの降順になっています。いずれのユーザーについても、SMDの絶対値が0.1を超える共変量が複数あるものの、極端な偏りはないことがわかります。また、年収非公開回ではスマホアプリの業務経験が長い傾向があることなどもわかります。

f:id:livesense-analytics:20210212092613p:plain
希望年収ありのユーザーの共変量バランス

f:id:livesense-analytics:20210212092646p:plain
希望年収なしのユーザーの共変量バランス

結果

 先にマッチングと重み付け利用時の推定結果を示し、その後に設定や共変量バランスなどの推定の信頼性を確認するための情報を示します。

マッチングによる推定結果

 マッチング利用時のATEの推定値、標準誤差、信頼区間は以下のとおりです。

推定値 標準誤差 信頼区間(2.5%) 信頼区間(97.5%)
希望年収あり 14.2 5.5 3.4 25.1
希望年収なし 17.9 13.4 -8.6 44.3

 希望年収ありのユーザーの年収非公開施策による提示年収の増加幅は、バイアスを低減することで見かけよりも2.6万円ほど高く推定されています。また、信頼区間に0を含んでおらず、統計的にも年収非公開施策によって提示年収が増加していたことがわかります。ただし、希望年収ありのユーザーの場合、希望年収に起因するバイアスの分だけ高めの年収が提示されます。そのため、この結果だけから「過去の提示年収を参照しないと提示年収が高くなる」とは結論づけられません。提示年収の増加が全て希望年収によるものとも考えにくいので、年収非公開と希望年収双方の影響で上記の提示年収増加が生じたと考えられます。

 希望年収なしのユーザーの結果は誤差が大きいので注意が必要です。年収非公開施策による提示年収の増加幅は、バイアスを低減することで見かけよりも4.7万円ほど高く推定されています。しかし、信頼区間に0を含んでおり統計的には誤差の範囲内です。

重み付けによる推定結果

 重み付け利用時のATEの推定値、標準誤差、信頼区間は以下のとおりです。

推定値 標準誤差 信頼区間(2.5%) 信頼区間(97.5%)
希望年収あり 16.4 6.1 4.4 28.5
希望年収なし 2.8 11.0 -18.8 24.5

 希望年収ありのユーザーの年収非公開施策による提示年収の増加幅は、バイアスを低減することで見かけよりも4.8万円ほど高く推定されています。また、信頼区間に0を含んでおらず、統計的にも年収非公開施策によって提示年収が増加していたことがわかります。マッチングよりやや高めの推定値ですが、同じような結果と考えてよいでしょう。common supportを考慮すると推定値は16.75となりました。考慮しない場合とほとんど変わらず、希望年収ありの場合は安定した推定結果が得られていると考えてよさそうです。

 希望年収なしのユーザーの結果はマッチングと同様に誤差が大きいので注意が必要です。バイアスを低減することで見かけよりも10.4万円ほど低く推定されています。こちらも信頼区間に0を含んでおり統計的には誤差の範囲内です。common supportを考慮して計算すると推定値は7.67、95%信頼区間は-10.4から25.8という結果が得られました。低く推定されていた原因の一部はcommon support外のサンプルによるものと考えられます。正確な推定値はわからないですが、マッチングの結果と合わせて考えると年収非公開施策によって提示年収は増加した可能性が高いといえます。

マッチングの設定・共変量バランス

 マッチングの設定は以下のとおりです。なお、フルマッチングを使っているのでmethodは"full"です。

distance caliper formula
希望年収あり mahalanobis "年齢"に0.1 年収非公開回 ~ 希望年収 * (希望年収 + 業務経験年数 + マネジメント経験有無 + コミッタ + 育成経験有無 + 機械学習経験有無 + 企画 + 要件定義 + 設計 + コーディング + テスト + 運用保守 + データ分析 + バックエンド + インフラストラクチャ + マネージメント + デザイン + フロントエンド + スマホアプリ + 自社プロダクト + webサービス + 業務システム + 受託開発 + パッケージ開発 + ゲーム + OSS開発 + 年齢)
希望年収なし mahalanobis "業務経験年数"と"年齢"にそれぞれ0.3 年収非公開回 ~ (年齢 + 業務経験年数) * (業務経験年数 + マネジメント経験有無 + コミッタ + 育成経験有無 + 機械学習経験有無 + 企画 + 要件定義 + 設計 + コーディング + テスト + 運用保守 + データ分析 + バックエンド + インフラストラクチャ + マネージメント + デザイン + フロントエンド + スマホアプリ + 自社プロダクト + webサービス + 業務システム + 受託開発 + パッケージ開発 + ゲーム + OSS開発 + 年齢)

 共変量のバランスは以下のとおりです。SMDは絶対値表示にしています。

f:id:livesense-analytics:20210212103537p:plain
希望年収ありユーザーのマッチング後の共変量バランス

f:id:livesense-analytics:20210212103620p:plain
希望年収なしユーザーのマッチング後の共変量バランス

希望年収の有無に関わらずSMDは目安とされることの多い0.1を下回っています。しかし、サンプル数が少ないことが影響したのかKS統計量は全般的に高めの値になっています。また、希望なしのユーザーの"パッケージ開発"の分散比は目安とされることの多い2を上回っていますが、これはパッケージ開発プロジェクトの経験者が非常に少ないことで一部のユーザーに起因する分散が過大になっているのが原因と考えられます。提示年収への影響は比較的小さいと考え、この結果を採用しています。

 マッチしなかったサンプル数は以下のとおりです。caliperを利用しているのでマッチしないサンプルがありますが、全体サンプルに占める割合は数%未満なので推定値への影響は大きくないと考えられます。

マッチしなかったサンプル数(処置群) マッチしなかったサンプル数(対照群)
希望年収あり 1 7
希望年収なし 2 8

重み付けの設定・共変量バランス

 重み付けの設定は以下のとおりです。

method formula
希望年収あり ps(ロジスティック回帰) 年収非公開回 ~ I(希望年収2) + 希望年収 + 業務経験年数 + マネジメント経験有無 + コミッタ + 育成経験有無 + 機械学習経験有無 + 企画 + 要件定義 + 設計 + コーディング + テスト + 運用保守 + データ分析 + バックエンド + インフラストラクチャ + マネージメント + デザイン + フロントエンド + スマホアプリ + 自社プロダクト + webサービス + 業務システム + 受託開発 + パッケージ開発 + ゲーム + OSS開発 + 年齢
希望年収なし ps(ロジスティック回帰) 年収非公開回 ~ I(業務経験年数2) + 業務経験年数 + マネジメント経験有無 + コミッタ + 育成経験有無 + 機械学習経験有無 + 企画 + 要件定義 + 設計 + コーディング + テスト + 運用保守 + データ分析 + バックエンド + インフラストラクチャ + マネージメント + デザイン + フロントエンド + スマホアプリ + 自社プロダクト + webサービス + 業務システム + 受託開発 + パッケージ開発 + ゲーム + OSS開発 + 年齢

 共変量のバランスは以下のとおりです。SMDは0.1を下回っていることがわかります。ただし、希望年収なしのユーザーの傾向スコアのKS統計量はやや大きくなっており、分布のバランスが悪くなっている可能性があることがわかります。"パッケージ開発"の分散比が大きくなっている理由はマッチングのときと同じで一部のユーザーの影響によるものです。

f:id:livesense-analytics:20210212103649p:plain
希望年収ありユーザーの重み付け後の共変量バランス

f:id:livesense-analytics:20210212103718p:plain
希望年収なしユーザーの重み付け後の共変量バランス

 傾向スコアの分布は以下のとおりです。希望年収ありのユーザーの分布は端を除くとよくバランスしていますが、希望年収なしのユーザーの分布は0.35〜0.4あたりで処置群と対照群の差が大きくなっています。該当サンプルも多く推定値への影響が懸念されます。また、いずれのユーザーも傾向スコアのとりうる範囲が処置群と対照群で異なっているのでcommon supportも確認したほうがよいことがわかります。

f:id:livesense-analytics:20210212103756p:plain
希望年収ありユーザーの傾向スコアの分布

f:id:livesense-analytics:20210212103824p:plain
希望年収なしユーザーの傾向スコアの分布

 重みのサマリ情報は以下のとおりです。過大な重みはなく、重みのばらつきも比較的小さいので、これらによって推定値が影響を受けた可能性は低いと考えられます。

重みの最大値(処置群) 重みの最大値(対照群) 変動係数(処置群) 変動係数(対照群) 平均絶対偏差(処置群) 平均絶対偏差(対照群) 負のエントロピー(処置群) 負のエントロピー(対照群)
希望年収あり 5.2 4.1 0.309 0.194 0.229 0.127 0.046 0.016
希望年収なし 8.3 3.3 0.391 0.211 0.274 0.155 0.066 0.020

結論

 他企業の提示年収がその後の提示年収に影響している可能性は高いが、その影響は小さい。

  • 希望年収のあるユーザーについては、年収非公開施策によって提示年収の上昇があった(統計的に有意)
    • その上昇が、他企業の提示年収が影響しなくなったからなのか、希望年収の影響なのかは不明
    • 上昇分の全てが希望年収の影響とは考えにくいので、年収非公開施策によって提示年収が上昇した可能性が高い
    • 希望年収の影響込みでも上昇幅は14.2〜16.4。上昇幅が平均提示年収(およそ690)に占める比率は2.1〜2.4%。
    • 希望年収の影響は大きいので、年収非公開施策による影響はさらに小さいと予想される
  • 希望年収のないユーザーについては、年収非公開施策による提示年収の上昇は不明(統計的に有意でない)
    • 推定値が正なので提示年収の上昇があった可能性はあるが誤差の範囲内

まとめ

 今回は共変量バランシングを利用した因果推論手法を使って、年収非公開施策が提示年収に与えた平均処置効果を推定しました。希望年収のあるユーザーについては、年収非公開施策によって統計的に有意な提示年収の上昇が認められました。一方で、希望年収のないユーザーについては誤差の範囲にとどまる結果となりました。

 因果推論でも結論は以前の分析記事とほぼ同じです。「他企業の提示年収がその後の提示年収に影響している可能性は高いが、その影響は大きくはない」という結論になりました。

 今回の施策についてはいくつかの改善点があります。主なものは以下の2つです。

  • 過去の提示年収への不満情報の取得
  • 希望年収の非公開化 

年収非公開回への参加インセンティブが過去の提示年収への不満だけとは限りませんが、このような情報を収集していたらより直接的な分析が可能でした。また、希望年収も非公開にしていたならば、過去の提示年収の影響について統計的に有意な結果が得られていた可能性があります。ただし、いずれも開発工数が必要で、ユーザーや参加企業への配慮も必要なので実現できたかは不明です。