用R語言分析與預測員工離職

版權聲明:本文爲博主原創文章。未經博主贊成不得轉載。 https://blog.csdn.net/kMD8d5R/article/details/83542978
640?wx_fmt=gif 640?</p><p>wx_fmt=png

做者簡單介紹css

糖甜甜甜,R語言中文社區專欄做者html

公衆號:經管人學數據分析算法



在實驗室搬磚以後,繼續咱們的kaggle數據分析之旅,此次數據也是答主在kaggle上選擇的比較火的一份關於人力資源的數據集,關注點在於員工離職的分析和預測,依舊仍是從數據讀取,數據預處理,EDA和機器學習建模這幾個部分開始進行,最後使用集成學習中比較火的random forest算法來預測離職狀況。app

數據讀取

 
   

setwd("E:/kaggle/human resource") library(data.table) library(plotly) library(corrplot) library(randomForest) library(pROC) library(tidyverse) library(caret) hr<-as.tibble(fread("HR_comma_sep.csv")) glimpse(hr) sapply(hr,function(x){sum(is.na(x))}) ———————————————————————————————————————————————————————————————————————————————————— Observations: 14,999 Variables: 10 $ satisfaction_level    <dbl> 0.38, 0.80, 0.11, 0.72, 0.37, 0.41, 0.10, 0.92, 0.89, 0.42, 0.45, 0.11, 0.84, 0.41, 0.36, 0.38, 0.45, 0.78, 0.45, 0.76, 0.11, 0.3... $ last_evaluation       <dbl> 0.53, 0.86, 0.88, 0.87, 0.52, 0.50, 0.77, 0.85, 1.00, 0.53, 0.54, 0.81, 0.92, 0.55, 0.56, 0.54, 0.47, 0.99, 0.51, 0.89, 0.83, 0.5... $ number_project        <int> 2, 5, 7, 5, 2, 2, 6, 5, 5, 2, 2, 6, 4, 2, 2, 2, 2, 4, 2, 5, 6, 2, 6, 2, 2, 5, 4, 2, 2, 2, 6, 2, 2, 2, 4, 6, 2, 2, 6, 2, 5, 2, 2, ... $ average_montly_hours  <int> 157, 262, 272, 223, 159, 153, 247, 259, 224, 142, 135, 305, 234, 148, 137, 143, 160, 255, 160, 262, 282, 147, 304, 139, 158, 242,... $ time_spend_company    <int> 3, 6, 4, 5, 3, 3, 4, 5, 5, 3, 3, 4, 5, 3, 3, 3, 3, 6, 3, 5, 4, 3, 4, 3, 3, 5, 5, 3, 3, 3, 4, 3, 3, 3, 6, 4, 3, 3, 4, 3, 5, 3, 3, ... $ Work_accident         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... $ left                  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ... $ promotion_last_5years <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... $ sales                 <chr> "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sa... $ salary                <chr> "low", "medium", "medium", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low... satisfaction_level       last_evaluation        number_project  average_montly_hours    time_spend_company         Work_accident                  left                    0                     0                     0                     0                     0                     0                     0 promotion_last_5years                 sales                salary                    0                     0                     0 dom

數據集狀況例如如下。一共10維數據,14999個觀測值。變量的表明名稱各自是
satisfaction_level--愜意度,last_evaluation--最後一次評估,number_project--參與項目數量。average_montly_hours--每個月平均工做時間。time_spend_company--公司停留時間。Work_accident--工做事故次數,left--是否離職。promotion_last_5years--過去五年升值情況,sales--工種,salary--工資。
機器學習

而且簡單的觀測了一下。沒有發現缺失值,那麼我就可以直接進入數據分析階段了。ide


數據預處理

依據每一個特徵的數值狀況。咱們可以將很多特徵因子化,方便後期作不一樣類別的差別分析。post

 
   

hr$sales<-as.factor(hr$sales) hr$salary<-as.factor(hr$salary) hr$left<-as.factor(hr$left) hr$Work_accident<-as.factor(hr$Work_accident) hr$left<-recode(hr$left,'1'="yes",'0'="no") hr$promotion_last_5years<-as.factor(hr$promotion_last_5years)學習

看的出大部分數據都是數值型的。咱們使用相關性來衡量不一樣變量之間的相關性高低:人工智能

 
   

cor.hr<-hr %>% select(-sales,-salary) cor.hr$Work_accident<-as.numeric(as.character(cor.hr$Work_accident)) cor.hr$promotion_last_5years<-as.numeric(as.character(cor.hr$promotion_last_5years)) cor.hr$left<-as.numeric(as.character(cor.hr$left)) corrplot(corr = cor(cor.hr),type = "lower",method = "square",title="變量相關性",order="AOE")

640?wx_fmt=jpeg

直觀的來看。是否離職和愜意度高低就有很是高的關聯性啊。


EDA

 
   

ggplot(group_by(hr,sales),aes(x=sales,fill=sales))+geom_bar(width = 1)+coord_polar(theta = "x")+ggtitle("不一樣職業的人數") ggplot(hr,aes(x=sales,y=satisfaction_level,fill=sales))+geom_boxplot()+ggtitle("不一樣職業的愜意度")+stat_summary(fun.y = mean,size=3,color='white',geom = "point")+  theme(legend.position = "none") ggplot(hr,aes(x=sales,y=satisfaction_level,fill=left))+geom_boxplot()+ggtitle("不一樣職業的愜意度") ggplot(hr,aes(x=sales,y=average_montly_hours,fill=left))+geom_boxplot()+ggtitle("不一樣職業的工做時長") ggplot(hr,aes(x=sales,y=number_project,fill=left))+geom_boxplot()+ggtitle("不一樣職業的項目狀況")

640?wx_fmt=jpeg

首先觀察不一樣崗位的工做人數。搞銷售的人數真的是很多。難道有很多我大生科的同窗嗎??(哈哈哈哈哈哈哈。開個玩笑而已,只是說實話作生物真的很是累啊)。

銷售,後期支持,和技術崗人數佔領人數排行榜前三。

640?wx_fmt=jpeg

不一樣的職業愜意度的分佈大致至關。只是accounting的小夥伴們彷佛打分都不高哦,其它的幾個工種均值和中位數都沒有明顯區別,接下來咱們看看不一樣職業是否離職的狀況和打分的高低狀況:

640?wx_fmt=jpeg

和想象中結果差點兒沒有區別,離職和不離職的打分區分度很是高,和職業差點兒沒有關係。

640?wx_fmt=jpeg

那麼不一樣職業的平均工做時長呢,看圖而言,沒有離職的人羣工做時間都很是穩定。但是離職人羣的工做時間呈現兩極分化的趨勢。看來太忙和太閒都不是很是好。這對hr的考驗仍是很是大的。


後面咱們來一次關注一下不一樣特徵和離職的關係問題:

 
   

ggplot(hr,aes(x=satisfaction_level,color=left))+geom_line(stat = "density")+ggtitle("愜意度和離職的關係") ggplot(hr,aes(x=salary,fill=left))+geom_histogram(stat="count")+ggtitle("工資和離職的關係") ggplot(hr,aes(x=promotion_last_5years,fill=left))+geom_histogram(stat="count")+ggtitle("近5年升值和離職的關係") ggplot(hr,aes(x=last_evaluation,color=left))+geom_point(stat = "count")+ggtitle("最後一次評價和離職的關係") hr %>% group_by(sales) %>% ggplot(aes(x=sales,fill=Work_accident))+geom_bar()+coord_flip()+  theme(axis.text.x = element_blank(),axis.title.x = element_blank(),axis.title.y = element_blank())+scale_fill_discrete(labels=c("no accident","at least once"))

640?</p><p>wx_fmt=jpeg

沒有離職的人羣打分已知很是穩定,而離職人羣的打分就有點難以估摸了

640?wx_fmt=jpeg

仍是那句話。「有錢好辦事啊」

640?wx_fmt=jpeg

你不給寶寶升職,寶寶就生氣離職

640?</p><p>wx_fmt=jpeg

和前面的面積圖幾乎相同,hr也要警戒那些最後一次打分很是高的,儘管大部分是不許備離職的。但是有些爲了給老東家面子仍是會來點「善意的謊話」的。


640?wx_fmt=jpeg


不出錯是不可能的,出錯人數多少基本和總人數成正比,因此這個對於離職來講不是問題。


模型構建和評估

 
   

index<-sample(2,nrow(hr),replace = T,prob = c(0.7,0.3)) train<-hr[index==1,];test<-hr[index==2,] model<-randomForest(left~.,data = train) predict.hr<-predict(model,test) confusionMatrix(test$left,predict.hr) prob.hr<-predict(model,test,type="prob") roc.hr<-roc(test$left,prob.hr[,2],levels=levels(test$left)) plot(roc.hr,type="S",col="red",main = paste("AUC=",roc.hr$auc,sep = ""))

依據前面的特徵分析,本次答主並無認爲有很是好的特徵來提取。就直接扔進算法裏面計算去了,計算出來的混淆矩陣的狀況效果仍是槓槓的:

 
   

Confusion Matrix and Statistics          Reference Prediction   no  yes       no  3429    5       yes   28 1010                                                         Accuracy : 0.9926                           95% CI : (0.9897, 0.9949)    No Information Rate : 0.773              P-Value [Acc > NIR] : < 2.2e-16                                                                  Kappa : 0.9791           Mcnemar's Test P-Value : 0.0001283                                                            Sensitivity : 0.9919                      Specificity : 0.9951                   Pos Pred Value : 0.9985                   Neg Pred Value : 0.9730                       Prevalence : 0.7730                   Detection Rate : 0.7668             Detection Prevalence : 0.7679                Balanced Accuracy : 0.9935                                                           'Positive' Class : no                                                        

acc=0.9926,recall=0.9951,precision=0.9730,基本都是逆天的數據了,看來kaggle的數據集已經清洗的很是棒了,rf算法也是一如既往地給力。最後貼出ROC曲線的圖

640?wx_fmt=jpeg


寫在最後

本次分析事實上並無很是多的技巧可言,答主的ggplot2水平也遇到了瓶頸期,後期需要不斷增強,而且僅僅會調包不懂算法後面的原理更是不可以的,因此近期在慢慢把機率論。線性代數,仍是統計學撿起來,固然R語言的數據分析實踐仍是不會停下來的,答主英語還不錯,可以和實驗室的老外教授「忽悠」幾句。也算是有了很多的進步。

道阻且長,你們共勉~~~



往期回想

詞雲一分鐘瞭解周董的歌詞

R語言實現統計分析——非參數若是檢驗

《我不是藥神》30億票房後分析徐崢的選角眼光


640?wx_fmt=jpeg

公衆號後臺回覆keyword就能夠學習

回覆 爬蟲            爬蟲三大案例實戰  
回覆 
Python       1小時破冰入門

回覆 數據挖掘     R語言入門及數據挖掘
回覆 
人工智能     三個月入門人工智能
回覆 數據分析師  數據分析師成長之路 
回覆 機器學習      機器學習的商業應用
回覆 數據科學      數據科學實戰
回覆 常用算法      常用數據挖掘算法

相關文章
相關標籤/搜索