hiroki
こちらのトピックに関連して、"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)
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
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つのタイプの散布図をそれぞれ別々に載せます。タイトルにある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の分布はまだ複数の集団が重なっているように見えます。)
・ここから有効な特徴量を作る方法がわかりません。
Pondelion1783
Thanks for your great notebook!
masato8823
ありがとうございます!参考になります
shimajiro
> もっと適切な分け方があるかもしれません。(特に1, 2の分布はまだ複数の集団が重なっているように見えます。)
> ここから有効な特徴量を作る方法がわかりません
単純にこのセグメントをカテゴリ変数として組み込むだけでも意味があると思われます
また、セグメント分割した事によって得られた高い相関係数を見るに、セグメント毎の線型モデルも有効ではないかと思われます。モデルを分割するか階層モデルに持ち込むなどが選択肢となるかと思います
線形モデルでない場合でも下記の資料に記載されているように、セグメント毎の集約値およびその集約値と元の値の四則演算によって有効な特徴量が構成可能ですので試してみて頂ければと思います