Pythonによるデータ職業の給与分析と予測

一、研究の背景

大数据と人工知能技術の急速な発展に伴い、データ職業はグローバル範囲で急速に成長し、現代の就職市場において注目の領域となっている。データアナリスト、データサイエンティスト、機械学習エンジニアなどの職業需要は急増しており、多くの求職者の関心を集めている。しかし、異なるデータ職業間での給与の違いや、給与に影響を与える主要因については、求職者と雇用主の双方にとって重要な関心事である。 現代社会において、給与は従業員の労働価値と企業からの評価を反映するものであり、一定程度上に職業選択やキャリアパスの決定に影響を与える。したがって、データ職業の給与状況とその影響因を理解することは、求職者にとって職業规划和求职过程中的重要な参考情報となる。同様に、企業は採用と給与決定的过程中において、データ分析を通じてより科学的な給与戦略を策定し、高度な人材を引き付け維持することができる。 本研究はPythonデータ分析技術を用いて、データ職業の給与データに対する探索的 分析と予測モデリングを実施し、給与に影響する主要因を特定し、給与予測モデルを構築することで、求職者と雇用主に科学的な根拠と意思決定のサポートを提供することを目的とする。

二、研究の意味

1. 求職者へのキャリア规划の参考提供

データ職業の給与データを分析することで、求職者は異なる職業の給与レベルとその影響因を理解でき、より明智な意思決定を行い、自分に最適なキャリアパスを選択できる。

2. 企業による給与戦略の策定支援

本研究の成果を利用することで、企業は市場における異なるデータ職業の給与レベルと主要影響因を理解でき、より科学的な給与戦略を策定し、高度なデータ人材を引き付け維持することで、企業の競争力を向上させることができる。

三、実証分析

データセットの説明

本研究で使用するデータセットは、データ職業人材の給与予測、トレンド分析、HR分析に利用できる。 カラム説明:
  • FIRST NAME:データ人材の名字(文字列)
  • LAST NAME:データ人材の姓(文字列)
  • SEX:データ人材の性別(文字列:「F」は女性、「M」は男性)
  • DOJ(入社日):データ人材が会社に参加した日付(月/日/年形式)
  • CURRENT DATE:データの現在日付またはスナップショット日付(MM/DD/YYYY形式)
  • DESIGNATION:データ人材の役職名(文字列:アナリスト、シニアアナリスト、マネージャーなど)
  • AGE:データ人材の年齢(整数)
  • SALARY:データ人材の年薪(浮動小数点)
  • UNIT:データ人材が働く事業ユニットまたは部門(文字列:IT、財務、マーケティングなど)
  • LEAVES USED:データ人材が使用した休暇日数(整数)
  • LEAVES REMAINING:データ人材の残り休暇日数(整数)
  • RATINGS:データ人材の業績評価(浮動小数点)
  • PAST EXP:現在の会社に参加する前の実務経験年数(浮動小数点)
このデータセットは某社の内部人事記録から得られたものである。各レコードは、多様な属性を持つ固有のデータ人材を表している。データは2009年から2016年までの期間にわたり、2016年1月7日時点のスナップショットを捕捉している。

データの読み込みと確認

まず、基本的なデータ分析ライブラリをインポートし、データを取り込んで確認する。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

data = pd.read_csv("Salary Prediction of Data Professions.csv")
data.head()

欠損値のチェック

missing_values = data.isnull().sum()
missing_values
AGE、LAST NAME、LEAVES USED、LEAVES REMAINING、RATINGSのカラムに欠損値があることが判明したため、後続の処理で適切に対処する必要がある。

特徴量の二値化とエンコーディング

data["AGE_BIN"] = pd.cut(data["AGE"].astype(int), 5)

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
data["AGE_BIN_ENCODED"] = encoder.fit_transform(data["AGE_BIN"])

def convert_gender(value):
    if value == 'M':
        return 1
    elif value == 'F':
        return 0
    return value

data['SEX'] = data.SEX.apply(convert_gender)
役職名における「シニア」は、より高いレベルの経験、専門知識、責任を意味し、給与率に関連性が高い。

データの可視化分析

plt.subplots(figsize=(15, 7.5), dpi=200)
sns.set(style="white")
color_palette = sns.color_palette('Paired')

sns.boxplot(data=data_analytics_managers, 
            x='DESIGNATION', 
            y='SALARY',
            hue='IS_SENIOR',
            linewidth=2.5, 
            palette=color_palette)
plt.show()

在公司勤務日数の算出

この機能は、従業員が会社で勤務した期間を日数で表現する。
def format_date_column(date_value):
    if isinstance(date_value, str):
        parts = date_value.split('-')
        if len(parts[0]) == 1 and parts[0][0] != '0':
            parts[0] = '0' + parts[0]
            date_value = '-'.join(parts)
    return date_value

data.DOJ.apply(format_date_column).inplace=True

def to_datetime_obj(date_string, fmt='%m-%d-%Y'):
    if isinstance(date_string, str):
        return pd.to_datetime(date_string, format=fmt)
    return date_string

data['DOJ'] = data['DOJ'].apply(lambda x: to_datetime_obj(x, '%m-%d-%Y'))
data['CURRENT DATE'] = data['CURRENT DATE'].apply(lambda x: to_datetime_obj(x, '%m-%d-%Y'))

在公司勤務年数の算出

この機能は、公司勤務日数を年に変換して表現する。
data['YEARS_IN_COMPANY'] = round(data['DAYS_IN_COMPANY'] / 365, 1)
data['WORK_EXPERIENCE'] = data['YEARS_IN_COMPANY'] + data['PAST EXP']
data["WORK_EXPERIENCE_BIN"] = pd.cut(data["WORK_EXPERIENCE"].astype(int), 5)

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
data["WORK_EXPERIENCE_BIN_ENCODED"] = encoder.fit_transform(data["WORK_EXPERIENCE_BIN"])
sns.catplot(x="WORK_EXPERIENCE_BIN_ENCODED", y="SALARY", data=data, kind="box")
専門経験が増加するにつれて、給与も増加していることが確認できる。

役職と給与の関係

plot = sns.catplot(x="DESIGNATION", y="SALARY", data=data, kind="box")

for ax in plot.axes.flat:
    for label in ax.get_xticklabels():
        label.set_rotation(35)
        label.set_horizontalalignment('right')

plt.show()

性別ごとの給与分布

plt.subplots(figsize=(15, 7.5), dpi=200)
sns.set(style="white")

blue_color = '#7FB3D5'
pink_color = '#FF91A4'

palette_dict = {1: blue_color, 0: pink_color}

sns.boxplot(data=data, 
            x='DESIGNATION', 
            y='SALARY',
            hue='SEX',
            linewidth=2, 
            palette=palette_dict)
plt.show()

年齢と給与の関係

sns.catplot(x="AGE_BIN_ENCODED", y="SALARY", data=data, kind="box")

性別と給与の相関

blue_color = '#7FB3D5'
pink_color = '#FF91A4'

palette_dict = {1: blue_color, 0: pink_color}

sns.catplot(x="SEX", y="SALARY", data=data, kind="box", palette=palette_dict)
性別と給与の間に明確な相関関係がないことが認められる。

相関係数ヒートマップ

colormap = plt.cm.RdBu
plt.figure(figsize=(15, 15))

numeric_data = data[["SALARY", 
                     "AGE",
                     'SEX', 
                     'WORK_EXPERIENCE', 
                     'Analyst',	
                     'Associate',
                     'Director',	
                     'Manager',	
                     'IS_SENIOR']] 

plt.title("Pearson Correlation of Features", y=1.05, size=18)
sns.heatmap(
    numeric_data.corr(),
    linewidths=0.1,
    vmax=1.0,
    square=True,
    cmap=colormap,
    linecolor="white",
    annot=True,
)

plt.show()

決定木モデルの構築

from sklearn.tree import DecisionTreeRegressor, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

target = numeric_features['SALARY']
features = numeric_features.drop('SALARY', axis=1)

X_train, X_test, y_train, y_test = train_test_split(
    features, target, test_size=0.25, random_state=42
)
regressor = DecisionTreeRegressor(max_depth=6, random_state=42)
regressor.fit(X_train, y_train)
plot_tree(regressor, feature_names=features.columns, filled=True, rounded=True)

モデル評価

mse = mean_squared_error(y_test, regressor.predict(X_test))
print(f"Mean Squared Error: {mse}")

XGBoostモデルの構築

import xgboost as xgb
from xgboost.sklearn import XGBRegressor
from sklearn.model_selection import cross_val_score, RepeatedKFold
from sklearn.metrics import mean_absolute_error

xgboost_model = XGBRegressor(n_estimators=150, 
                              learning_rate=0.1,
                              max_depth=7, 
                              min_child_weight=5,
                              eta=0.1, 
                              subsample=0.7, 
                              colsample_bytree=0.8)
xgboost_model.fit(X_train, y_train)
predictions = xgboost_model.predict(X_test)

mae = mean_absolute_error(y_test, predictions)
print(f"Mean Absolute Error: {mae}")

特徴重要度の可視化

分析結果から、公司での勤務年数と実務経験、および従業員の年齢が最も重要な3つの指標であることが確認された。

四、結論

本研究では、データ職業の給与データに対する探索的データ分析と予測モデリングを実施し、以下の主要結論を得た:
  1. 給与への影響因:データ職業の給与レベルは、職業カテゴリー、性別、年齢、勤続年数、学歴背景、所属部門、業績評価など、複数の要因からの影響を受ける。異なる職業カテゴリーと部門間の給与差異は顕著であり、勤続年数と業績評価は給与に顕著な影響を与えている。
  2. 給与予測モデルの有効性:選択した特徴量を用いた機械学習アルゴリズムによる給与予測モデルは、テストデータ上で良好な性能を示し、高い予測精度を有する。モデルの調整と検証を通じて、予測効果をさらに向上させ、給与予測に信頼性の高い技術サポートを提供できる。
  3. データ駆動型の給与戦略:データ分析結果を活用することで、企業はより科学的で柔軟な給与戦略を策定でき、市場需求と企業の实际情况を組み合わせ、給与レベルを動的に調整し、従業員満足度と企業の競争力を向上させることができる。
  4. 求職者への提言:給与予測モデルに基づき、求職者は職業選択とキャリア計画においてより明智な意思決定を行い、自身の発展に合致した高い給与レベルの職業パスを選択できる。給与に影響する主要因を理解することで、求職者は自身の競争力を针对性地向上させ、採用成功率を高めることができる。
本研究は、データ職業の給与分析と予測に効果的な方法とツールを提供しており、重要な応用価値と参考意義を有する。将来は、業界開発トレンド、経済環境、地域差などの外部データをさらに組み合わせることで、モデルの予測精度と適用性を向上させることができる。

タグ: Python データ分析 給与予測 機械学習 xgboost

7月19日 20:09 投稿