Getting Started
年収を表現するには様々なものから予想する必要があります。
新卒での就職や、中途での就職にはどのような方法で選ぶのでしょうか。
働き方などもあると思いますが、一つ重要な要素として年収(給与)の大きさがあるかと思います。
DoDaさまという転職サイトには大量の求人が記されており、この説明文から給与を予想することで、どのようなことが年収に影響をおよぼすのか、定量的に確認していきたいと思います
アルゴリズム
ElasticNetを利用します。単語ごとに重みをつけるBag of Wordsを利用しようと思います
精度自体はさほどではないですが、解釈性がよいので、見通しが立てやすく、LassoとRidgeの双方の正則化項を利用します(ゴミみたいな情報が多いので正則化項は重要です)
予想精度自体はGBMやDeep Learningのほうが当然いいのですが、解釈を求めていきます
コード
一連のコードはGITHUBからダウンロードできます
https://github.com/GINK03/income-expression
コーパスの作成
コーパスは、別プロジェクトのスクレイパーの機能を利用します
$ git clone https://github.com/GINK03/scraping-designs/
$ cd scraping-designs
$ cd doda-scrape
$ python3 scrape.py
HTMLの解析
年収が記述されたフィールドは固定的なので、正規表現等を用いて抜き出すことが可能です
$ python3 10-scan.py
(testというディレクトリに必要な要素が記されます)
分かち書きと、データセットの作成
今回は表現に単語とその出現回数を用いてベクトルを構築して、予想しようと思います
最初のステップとして単語ごとにidを振ります
$ python3 make-sparse.py --step1
ElasticNetで処理できるように、numpyのarrayを作成します
$ python3 make-sparse.py --step2
パラメータの探索と、学習
ElasticNetは結構動かすパラメータが多いのですが、グリッドサーチし易いので、αとl1の大きさを可変にしてGrid Searchを行います
testデータでの誤差を最小化するパラメタがモデルに記されます
$ python3 elasticnet.py
(48GByteのメモリのマシンでギリギリです)
mean absolute errorを計算することでモデルの汎化性能を見ます
mae=00000065.696695865_alpha=0.1000_l1_ratio=0.2000
このときmae(mean absolute error)が65万円で65万ぐらいはずれるけどだいたい行けたって感じです
最良のモデルから、特徴量重要度を見ていく
$ python3 best-param-scan.py | less
実際に計算した内容を示すと以下のようになります
マネジメント 18.381396825012754
歩合 14.136117145490859
候補 13.415671954541189
契約 10.633767996153344
稼げる 10.404505087506644
+ 10.30732826774959
部長 10.152909358186502
収入 9.806592682058445
マネージャー 9.704810884773616
英語 9.421044629797384
管理監督者 9.235432398298917
年収 9.210028472698683
課長 9.07549400767956
商談 8.988719728745945
高率 8.213402666993424
管理職 8.189080396494985
転職 8.155156197596641
日本 8.073732572758566
ね 7.377261889211694
物件 7.328660432827618
投資 7.101509264292014
万 6.819871907447121
仕組み 6.784620157741977
インセンティブ 6.764353422613882
不動産 6.731659271299003
くれ 6.582004114285033
自信 6.558282474759441
新築 6.4900233558596225
以上 6.381324013280269
レベル 6.367740255782417
活躍中 6.276740342933098
構築 6.247725916521742
策定 6.131843848437284
含む 5.980037348891687
完全 5.884914709363732
これらの単語が含まれていると、高収入が期待できます。(マネージメントが一番強い)
逆にネガティブに働くものはこんな感じです
積極的 -5.252038994898416
大切 -5.262670556958283
高等学校 -5.309553157634449
ヒアリング -5.581001714390951
所定 -5.606582162252535
教室 -5.761500395033308
不問 -5.837262417330616
店長 -5.924920026296953
条件 -5.9450967582272085
正社員 -5.970355741404491
制 -5.995422955410039
キャリアパス -6.073649994402703
育休 -6.14922056111198
社会人 -6.171230212052192
PC -6.195164512902161
短期大学 -6.223481582931793
登用 -6.378367448084286
手当 -6.4973649285751005
ステップアップ -6.541287715637883
契約社員 -6.8149013193897
店舗 -6.861519856253179
普通自動車 -7.469775262947728
シフト -7.625101881814313
歓迎 -7.720352090742413
事務 -9.284846866158098
休日 -9.416569308243343
未経験 -9.848916667554974
お気持ち系が多いですね
ダンプしたファイルを添付するので、時々、年収アップには何をすべきのか、よく確認したいです
おまけ(東京、大阪、名古屋で年収の分布はどうなっているの?)
以下のコマンドで雑ですが色々分布を見ることができます
$ python3 50-verb-pair.py
大阪やばいっすね。一人だけ左側にずれています。