Human Resources Analytics——你會是下一個辭職的嗎?
1 簡單介紹
項目來源:Human Resources Analytics
工作是我們大多數人的剛需,不僅因為工作可以養活我們自己,它還可以實現我們的價值。
但是不管是哪個公司,員工們總是有走有來,辭職與換工作或許是我們這個時代的人面臨的必修課。
企業老闆和領導頭疼的是,為什麼那些最優秀和最有經驗的員工輕易地就離職了呢?而或許我們關心的是哪些因素會是我們辭職時首要考慮的。
2 數據導入
#載入包nlibrary(dplyr) #數據處理nlibrary(ggplot2) #可視化nlibrary(ggthemes) #可視化nlibrary(plyr)nlibrary(corrplot)nlibrary(caret)nlibrary(rattle)nlibrary(rpart.plot)nlibrary(randomForest)nn#數據導入nhure <- read.csv("D:Human resourceHR_comma_sep.csv",stringsAsFactors = FALSE)n
#數據類型n> str(hure)ndata.frame:t14999 obs. of 10 variables:n$ satisfaction_level : num 0.38 0.8 0.11 0.72 0.37 0.41 0.1 0.92 0.89 0.42 ...n$ last_evaluation : num 0.53 0.86 0.88 0.87 0.52 0.5 0.77 0.85 1 0.53 ...n$ number_project : int 2 5 7 5 2 2 6 5 5 2 ...n$ average_montly_hours : int 157 262 272 223 159 153 247 259 224 142 ...n$ time_spend_company : int 3 6 4 5 3 3 4 5 5 3 ...n$ Work_accident : int 0 0 0 0 0 0 0 0 0 0 ...n$ left : int 1 1 1 1 1 1 1 1 1 1 ...n$ promotion_last_5years: int 0 0 0 0 0 0 0 0 0 0 ...n$ sales : chr "sales" "sales" "sales" "sales" ...n$ salary : chr "low" "medium" "medium" "low" ...n
變數名解釋:
satisfaction_level——工作滿意度
last_evaluation——距離上次業績評價的時間(年為單位)
number_project——在工作中已完成的項目數量
average_montly_hours——月均工作時間
time_spend_company——工作年限
Work_accident——是否有工傷(0表示沒有,1表示有)
left——是否辭職(0表示否,1表示是)
promotion_last_5years——近五年是否有升職
sales——工作崗位類別
salary——相對的薪資等級
#觀測數據:
這個數據集總共包含15K的員工,可以看出,平均滿意度還是挺高的,而月均工作時間達到200小時的人不在少數,工齡分布在2~10年,離職的人其實不多(15K中約3.6K離職),近五年內升職的人也是少數(2.1%,300人左右)。
3 數據觀察
單看數字不是很直觀,接下來通過一些圖表來觀察一下不同變數間的關係。
a 工作年限與離職情況
ggplot(hure, aes(x = time_spend_company, fill = factor(left))) +n geom_bar(stat = "count", position = "dodge") +n theme_few()n
可以看出,大部分離職的工齡都在3~5年之間,可能是剛來的(工作三年以下的)還在適應階段,而工齡長的由於已經「定型」了,很難脫離原有的工作崗位。
b 各行業的薪資水平
hure$salary = factor(hure$salary,levels=c(low,medium,high))nggplot(hure) +n geom_bar(mapping= aes(x = sales, fill = as.factor(salary)), position = "fill",width = 0.8) n
大部分工作中,薪資低的幾乎都佔50%左右,大部分崗位薪資分布甚至都不滿足「二八定律」,而是比這更苛刻。
但是我們可以看到management(管理)這個崗位的高薪比例遠遠高於其它崗位,管理所要求的複合能力比較多,所以提升自己的綜合實力才是提高自己成功的條件概率。
c 薪資等級與離職情況
ggplot(hure, aes(x = salary, fill = factor(left))) +n geom_bar(stat = "count", position = "dodge") +n theme_few()n
可以看出,拿高薪的人畢竟還是少數,而辭職率最高的是薪資等級最低的。
d 項目數量與離職情況
ggplot(hure, aes(x = number_project, fill = factor(left))) +n geom_bar(stat = "count", position = "dodge") +n theme_few()n
可以看出,離職率最低的是完成項目數量在3~5之間的,可能項目太少的沒什麼發展前途,而項目太多的太累了,沒時間考慮其它東西了,比如學習深造,關注家庭與健康等。
e 薪資等級與滿意度
ggplot(hure, aes(x = salary, y = satisfaction_level, fill = factor(left), colour = factor(left))) + n geom_boxplot(outlier.colour = "black") + xlab("Salary") + ylab("Satisfacion level") n
可以看出,沒辭職的人滿意度更高,而工資中等和偏低的人們,對於工作的滿意度更低。
f 薪資等級與工作年限
ggplot(hure, aes(x = salary, y = time_spend_company, fill = factor(left), colour = factor(left))) + ngeom_boxplot(outlier.colour = NA) + xlab("Salary") + ylab("time_spend_company")n
可以清楚地看到,薪資中等及以下的人們,工齡越長越容易辭職。
g 工作年限與工作時間
ggplot(hure, aes(x = factor(time_spend_company), y = average_montly_hours, fill = factor(left), colour = factor(left))) + n geom_boxplot(outlier.colour = NA) + xlab("Time spend Company") + ylab("Average Monthly Hours") n
工作年限4~6年的應該算是中流砥柱了,他們的工作時間普遍較長,而這之中月均工作時間最多的人,我們可以理解為加班最多的人,選擇了辭職。
h 將satisfaction_level分為不同的等級
由於satisfaction_level這個參數是連續型的,我們可以把它分為幾個不同的等級:highest, high,good,average,low, lowest。
#satisfaction分級,加入新列nhure$satisfaction[hure$satisfaction_level >= 0.9] = "highest"nhure$satisfaction[hure$satisfaction_level >= 0.8 & hure$satisfaction_level < 0.9] = "high"nhure$satisfaction[hure$satisfaction_level >= 0.6 & hure$satisfaction_level < 0.8] = "good"nhure$satisfaction[hure$satisfaction_level >= 0.4 & hure$satisfaction_level < 0.6] = "average"nhure$satisfaction[hure$satisfaction_level >= 0.2 & hure$satisfaction_level < 0.4] = "low"nhure$satisfaction[hure$satisfaction_level < 0.2] = "lowest"n
不同滿意度的離職情況:
#satisfaction~leftnhure$satisfaction = factor(hure$satisfaction,levels=c(lowest,low,average,good,high,highest))nggplot(hure, aes(x = satisfaction, fill = factor(left))) +n geom_bar(stat = "count", position = "dodge", width = 0.8) +n theme_few()n
上班時間與工作滿意度
#satisfaction~average_montly_hoursnggplot(hure, aes(x = satisfaction, y = average_montly_hours, fill = factor(left), colour = factor(left))) + n geom_boxplot(outlier.colour = NA) + xlab("satisfaction") + ylab("Average Monthly Hours") n
可以看出,最不滿意的,還上班最多的人最容易離職,滿意度一般的人,工作時間也比較少,而滿意度高的人當中,工作時間太多也是離職的一大原因。
i 看看各個變數的關聯性
#變數間的關係nHR_correlation <- hure %>% select(satisfaction_level:promotion_last_5years)nM <- cor(HR_correlation)ncorrplot(M, method="circle",number.cex=1.2,tl.cex = 1.2)n
其中left與satisfaction_level,呈現比較明顯的負相關關係,即滿意度越低的越容易離職;項目多的,工作時間也相對較長,但是工作滿意度卻可能較低。
四 建模與預測
下面搭建簡單的模型,來預測會不會辭職。
4.1 決策樹
首先建立訓練集和測試集,train和test,將原有數據集拆分,比例定位8:2。
#數據集拆分nhure$left = as.factor(hure$left)ntrainIndex <- createDataPartition(hure$left, p = .8,n list = FALSE,n times = 1)ntrain <- hure[ trainIndex,]ntest <- hure[-trainIndex,]nn> print(table(train$left))n 0 1 n9143 2857 nn#決策樹ndecisionTreeModel <- train(left~.,method="rpart",data=train) nfancyRpartPlot(decisionTreeModel$finalModel)n
由此可見,滿意度和完成項目數量是影響人們辭職的主要因素,接下來檢測一下這個模型的準確性。
#檢測準確性ntest$pred <- predict(decisionTreeModel,test)ntest = test %>% mutate(accurate = 1*(left == pred)) nsum(test$accurate)/nrow(test)n[1] 0.9106369n
可見準確率在91%左右,並不是很高,接下來我們看看隨機森林的表現,隨機森林其實就是決策樹的集合而已。
4.2 隨機森林
#數據集拆分nhure$left = as.factor(hure$left)nhure$sales <- as.factor(hure$sales)nhure$salary <- as.factor(hure$salary)ntrainIndex <- createDataPartition(hure$left, p = .8,n list = FALSE,n times = 1)ntrain <- hure[ trainIndex,]ntest <- hure[-trainIndex,]n#隨機森林nset.seed(415)nrfModel <- randomForest(left~.,train,ntree=500,importance=TRUE)nvarImpPlot(rfModel)ntest$pred <- predict(rfModel,test)ntest = test %>% mutate(accurate = 1*(left == pred)) nsum(test$accurate)/nrow(test) n[1] 0.9916639n
隨機森林的預測準確率達到99%,已經很不錯了。
至於各個變數的重要性可以從下圖中看出,其中satisfaction_level(工作滿意度) last_evaluation(距離上次的評價時間) number_project(完成的項目數量) time_spend_company(工作年限) averge_monthly_hours(月均工作時間) 屬於比較重要的因素。
你會不會辭職?
有同學想問了,那我自己能不能帶入自己的數據進去預測一下,讓我們來試試吧。
在數據拆分後面加上:
addmy <- c(0.3,0.6,4,260,4,0,1,0,technical,low,low) #根據自己的實際情況填寫,參數順序參考數據集
test <- rbind(addmy,test)
經過隨機森林預測後,發現我自己的預測是沒有辭職。
五 總結
通過這個練習簡單地複習了一下之前學習的知識,對ggplot等相關函數的鞏固,重溫了一下Titanic項目中的部分內容。通過觀察可以發現,人們選擇辭職主要考慮的因素是滿意度,工作年限,月均工作時間等。
實際上辭職的因素有很多,上面列舉的只是一部分,其它因素比如身體健康,家庭原因,個人發展,人際關係等等。
總之呢,辭職還是自己的事情,每個人的情況都不一樣,考慮主要因素就好。
推薦閱讀:
※發現有人時空旅行的證據……
※打野不參團,為什麼不去玩單機?
※Scikit-learn(sklearn) 0.19 中文文檔校驗邀請函
※發達地區的年輕男性
※摘錄|R語言在抽樣技術中的運用