給与推定

給与推定により人事の赤池くんの窮地を救おう

賞金: 100,000 参加チーム数: 281 終了まで: 8日

commute - salary 分布の重なり

commute - salary 分布の重なり

こちらのトピックに関連して、"partner"と"area"の特徴量を使うことで、commute - salaryの分布の中に存在する複数の傾向を持つ集団を可視化することができました。

https://prob.space/competitions/salary-prediction/discussions/masato8823-Post52b38bc90a891ff606ae

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
root = '../data/input/'

train_df = pd.read_csv(root + 'train_data.csv')
test_df = pd.read_csv(root + 'test_data.csv')
def preprocess(df):
    df["area"] = LabelEncoder().fit_transform(df["area"])
    return df
train_df = preprocess(train_df)
test_df = preprocess(test_df)

"commute" と "salary" の散布図

trainデータのcommuteとsalaryの散布図を載せます。タイトルにあるRは相関係数です。

plt.figure(figsize=(10,10))

plt.scatter(train_df["commute"], train_df["salary"])
fs = 22
roundnum = 4

plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
corr = round(train_df.corr()["commute"]["salary"], roundnum)
plt.title("commute - salary\nR: " + str(corr), fontsize=fs)
plt.tick_params(labelsize=fs)

こちらのトピックでも指摘されているように複数の集団が一つの散布図に表現されているように見えます。

https://prob.space/competitions/salary-prediction/discussions/masato8823-Post52b38bc90a891ff606ae

分類後の"commute - salary"散布図

2つ散布図を載せます。左が上で示したのと同じ図で、右が"partner"と"area"によって4つに分けたときのものです。 

"partner"については「既婚」か「独身」の2種類、"area"については「東京または大阪勤務」か「それ以外」の2種類で分け、合計4種類の分類をしました。

train_p_1 = train_df[train_df["partner"]==1]
train_p_0 = train_df[train_df["partner"]==0]



plt.figure()
fig, ax = plt.subplots(2,1,figsize=(20,10))

fs = 22

plt.subplot(1,2,1)
plt.scatter(train_df["commute"], train_df["salary"])

plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
corr = round(train_df.corr()["commute"]["salary"],roundnum)
plt.title("commute - salary\nR: " + str(corr), fontsize=fs)
plt.tick_params(labelsize=fs)






plt.subplot(1,2,2)
feature = "area"

df1 = train_p_1[(train_p_1[feature]==9) |(train_p_1[feature]==26)]
plt.scatter(df1["commute"], df1["salary"], label='1, married & working in tokyo or osaka')

df2 = train_p_1[(train_p_1[feature]!=9) &(train_p_1[feature]!=26)]
plt.scatter(df2["commute"], df2["salary"],label="2, married & working except in tokyo or osaka")

df3 = train_p_0[(train_p_0[feature]==9) |(train_p_0[feature]==26)]
plt.scatter(df3["commute"], df3["salary"],label="3, unmarried & working in tokyo or osaka")

df4 = train_p_0[(train_p_0[feature]!=9) &(train_p_0[feature]!=26)]
plt.scatter(df4["commute"], df4["salary"],label="4, unmarried & working iexcept in tokyo or osaka")

plt.legend(fontsize=15,loc='lower right')
plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
plt.title("4 types of 'commute - salary'", fontsize=fs)
plt.tick_params(labelsize=fs)
<Figure size 432x288 with 0 Axes>
東京大阪勤務(area == 9, 26) 東京大阪以外勤務(area != 9, 26)
既婚(partner=1) 1, 既婚かつ東京大阪勤務 2, 既婚かつ東京大阪以外勤務
独身(partner=0) 3, 独身かつ東京大阪勤務 4, 独身かつ東京大阪以外勤務

なんとなく色別で分布の重なりを可視化できたように見えます。

4つのタイプの散布図

4つのタイプの散布図をそれぞれ別々に載せます。タイトルにあるRは相関係数です。

plt.figure()
fig, ax = plt.subplots(2,2,figsize=(22,22))
cmap = plt.get_cmap("tab10") 

plt.subplot(2,2,1)
corr = round(df1.corr()["commute"]["salary"],roundnum)
plt.scatter(df1["commute"], df1["salary"],color=cmap(0), label=corr)
plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
plt.title('1, married & working in tokyo or osaka\nR: '+str(corr),fontsize = fs)
plt.tick_params(labelsize=fs)


plt.subplot(2,2,2)
plt.scatter(df2["commute"], df2["salary"],color=cmap(1))
corr = round(df2.corr()["commute"]["salary"],roundnum)
plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
plt.title("2, married & working except in tokyo or osaka\nR: "+str(corr),fontsize=fs)
plt.tick_params(labelsize=fs)


plt.subplot(2,2,3)
plt.scatter(df3["commute"], df3["salary"],color=cmap(2))
corr = round(df3.corr()["commute"]["salary"],roundnum)
plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
plt.title("3, unmarried & working in tokyo or osaka\nR: "+str(corr),fontsize=fs)
plt.tick_params(labelsize=fs)


plt.subplot(2,2,4)
plt.scatter(df4["commute"], df4["salary"],color=cmap(3))
corr = round(df4.corr()["commute"]["salary"],roundnum)
plt.xlabel('commute',fontsize=fs)
plt.ylabel('salary',fontsize=fs)
plt.title("4, unmarried & working iexcept in tokyo or osaka\nR: "+str(corr),fontsize=fs)
plt.tick_params(labelsize=fs)
plt.subplots_adjust(hspace=0.3)
<Figure size 432x288 with 0 Axes>

それぞれの分布の相関係数は分類前に比べて大きくなりました。

まとめ

・"partner"と"area"の特徴量を使い4つに分類することで、分類後のcommuteとsalaryの相関係数が分類前に比べ大きくなりました。

(分類前 R : 0.6233 → 分類後 R1 : 0.848, R2 : 0.8459, R3 :0.9539, R4 : 0.9231)

・commtue - salary 分布を複数の傾向を持つ集団に分けることができました。

・もっと適切な分け方があるかもしれません。(特に1, 2の分布はまだ複数の集団が重なっているように見えます。)

・ここから有効な特徴量を作る方法がわかりません。

添付データ

  • commute-salary_%E5%88%86%E5%B8%83%E3%81%AE%E9%87%8D%E3%81%AA%E3%82%8A.ipynb
  • Icon11
    Pondelion1783

    Thanks for your great notebook!

    Icon8
    masato8823

    ありがとうございます!参考になります

    267a6b3a ab7b 4ccb 801f bfca1fa6cc6a
    shimajiro

    > もっと適切な分け方があるかもしれません。(特に1, 2の分布はまだ複数の集団が重なっているように見えます。)

    • グラフ 1 & 2 と 3 & 4 の差は結婚の有無ですので、与えられた項目の中で婚姻と関連の強いものを用いて試してみると良いと思います

    > ここから有効な特徴量を作る方法がわかりません

    • 単純にこのセグメントをカテゴリ変数として組み込むだけでも意味があると思われます

    • また、セグメント分割した事によって得られた高い相関係数を見るに、セグメント毎の線型モデルも有効ではないかと思われます。モデルを分割するか階層モデルに持ち込むなどが選択肢となるかと思います

    • 線形モデルでない場合でも下記の資料に記載されているように、セグメント毎の集約値およびその集約値と元の値の四則演算によって有効な特徴量が構成可能ですので試してみて頂ければと思います

    F12fa7b3 4718 4e5e 9a85 594397dad8d3
    hiroki

    ありがとうございます! 作ってみます!

    Favicon
    new user
    コメントするには 新規登録 もしくは ログイン が必要です。