效果展示
效果如下图所示:
RMD代码
---
title: "人力资源变动dashboard"
output:
flexdashboard::flex_dashboard:
# storyboard: true
# social: menu
orientation: rows
vertical_layout: scroll
source: embed
theme: journal
---
<style>
.navbar {
background-color:#D87A80;
border-color:white;
}
.navbar-brand {
color:white!important;
}
</style>
```{r setup, include=FALSE}
library(flexdashboard)
library(readxl)
library(dplyr)
library(tidyr)
library(tidyverse)
library(leaflet)
library(echarts4r)
library(recharts)
require(knitr)
#读入数据
USA_data3<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Americas.xlsx","data")
APAC_data3<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - APAC.xlsx","data")
EU_data3<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Europe.xlsx","data")
country_coor3<-read_excel("C:/Users/asus/Desktop/R语言期末//country coord.xlsx")
#数据预处理
##清除无用数据
America3<-USA_data3[,c(-1,-4,-5,-6,-7,-14,-16)]
APAC3<-APAC_data3[,c(-1,-4,-5,-6,-7,-14,-16)]
EU3<-EU_data3[,c(-1,-4,-5,-6,-7,-14,-16)]
##绘制新表:总表、离职表、入职表
global3<-rbind(America3,APAC3,EU3) #总表
colnames(global3)[10]<-'movement_type'
dplyr::filter(global3,movement_type=="Entry")->entry3 #入职表
dplyr::filter(global3,movement_type=="Exit")->exit3 #离职表
##新表处理
global_1=global3 %>% group_by(Country) %>% summarise(count=n())
global_1=left_join(global_1,country_coor3[,2:4],by=c("Country"="name"))
exit_1=exit3 %>% group_by(Country) %>% summarise(count=n())
exit_1=left_join(exit_1,country_coor3[,2:4],by=c("Country"="name"))
entry_1=entry3 %>% group_by(Country) %>% summarise(count=n())
entry_1=left_join(entry_1,country_coor3[,2:4],by=c("Country"="name"))
colnames(America3)[10]<-'movement_type'
number1=America3 %>% group_by(movement_type) %>%
summarise(count=n())
number1$location<-c("America","America")
colnames(APAC3)[10]<-'movement_type'
number2=APAC3 %>% group_by(movement_type) %>%
summarise(count=n())
number2$location<-c("APAC","APAC")
colnames(EU3)[10]<-'movement_type'
number3=EU3 %>% group_by(movement_type) %>%
summarise(count=n())
number3$location<-c("EU","EU")
#读取数据
USA_data1<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Americas.xlsx","data")
APAC_data1<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - APAC.xlsx","data")
EU_data1<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Europe.xlsx","data")
#数据预处理
##清除无用数据
America1<-USA_data1[,c(-1,-2,-4,-5,-6,-7,-14,-16)]
APAC1<-APAC_data1[,c(-1,-2,-4,-5,-6,-7,-14,-16)]
EU1<-EU_data1[,c(-1,-2,-4,-5,-6,-7,-14,-16)]
##绘制新表:总表、离职表、入职表
global1<-rbind(America1,APAC1,EU1) #总表
colnames(global1)[9]<-'movement_type'
dplyr::filter(global1,movement_type=="Entry")->entry1 #入职表
#导入数据集
Americadata2 <- read_xlsx("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Americas.xlsx")
Apacdata2 <- read_xlsx("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - APAC.xlsx")
Europedata2<- read_xlsx("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Europe.xlsx")
##清除无用数据
America2<-Americadata2[,c(-1,-4,-5,-6,-7,-14)]
APAC2<-Apacdata2[,c(-1,-4,-5,-6,-7,-14)]
EU2<-Europedata2[,c(-1,-4,-5,-6,-7,-14)]
##绘制新表:总表、离职表、入职表
global2<-rbind(America2,APAC2,EU2) #总表
colnames(global2)[11]<-'movement_type'
colnames(global2)[10]<-'manager_name'
dplyr::filter(global2,movement_type=="Entry")->entry2 #入职表
dplyr::filter(global2,movement_type=="Exit")->exit2 #离职表
colnames(exit2)[13]<-'leaving_reason'
colnames(exit2)[14]<-'attri_type'
```
<!-- # page1 {.storyboard,data-icon="fa-user-alt"} -->
# 总览 {data-icon="fa-user-alt"}
Row {data-width=150}
--------------------------------------
### 新进总人数
```{r}
newhires=entry3 %>% nrow()
valueBox(value = newhires,icon = "fa-user-plus",caption = "新进人员",color = "#FFB980")
```
### 离职总人数
```{r}
exits=exit3 %>% nrow()
valueBox(value = exits,icon = "fa-user-minus",caption = "离职人员", color = "#5AB1EF")
```
### 净变动
```{r}
netchange=(newhires-exits)
#If loop to have either up-arrow or down-arrow icon on valuebox based on the value of netchange
if(netchange>0){
valueBox(value = netchange,icon = "fa-arrow-up",caption = "净变动", color = "#2EC7C9")
} else{
valueBox(value = netchange,icon = "fa-arrow-down",caption = "净变动", color = "lightblue")}
```
Row {data-height=300}
----------------------------------
### 各国变动情况展示
```{r}
#地图可视化
global_1$entrycount<-c(7,10,1,4,20,35,16)
global_1$exitcount<-c(0,5,0,0,15,15,12)
globallabels<-sprintf(
"%s<br/>新进 %d<br/>离职%d",global_1$Country,global_1$entrycount,global_1$exitcount
)%>%
lapply(htmltools::HTML)
entrylabels<-sprintf(
"%s<br/>新进 %d",entry_1$Country,entry_1$count
)%>%
lapply(htmltools::HTML)
exitlabels<-sprintf(
"%s<br/>离职%d",exit_1$Country,exit_1$count
)%>%
lapply(htmltools::HTML)
map<-leaflet(data=global_1) %>% addTiles() %>%
addMarkers(~longitude,~latitude,
label=globallabels,
labelOptions(style=list("font-weight"="normal",padding="3px 8px"),
textsize = "15px",direction = "auto"),
group = "global_1")%>%
addCircles(data=global_1,~longitude,~latitude,color="yellow",weight=global_1$count/1,group="global_1")%>%
addMarkers(data=entry_1,~longitude,~latitude,
label=entrylabels,
labelOptions(style=list("font-weight"="normal",padding="3px 8px"),
textsize = "15px",direction = "auto"),
group = "entry_1")%>%
addCircles(~longitude,~latitude,color="red",weight=global_1$entrycount/1,group="entry_1")%>%
addMarkers(data = exit_1,~longitude,~latitude,
label=exitlabels,
labelOptions(style=list("font-weight"="normal",padding="3px 8px"),
textsize = "15px",direction = "auto"),
group = "exit_1")%>%
addCircles(~longitude,~latitude,color="blue",weight=global_1$exitcount/1,group="exit_1")%>%
addLayersControl(overlayGroup=c("global_1","entry_1","exit_1"),options = layersControlOptions(collapsed = FALSE))
map
```
Row {data-height=150}
----------------------------------
### America离职变动情况
```{r}
t1<-echartr(number1, movement_type,count, type='ring') %>%
setTheme(palette=c(
'#D87A80','#5AB1EF' ))%>%setToolbox(show=FALSE)
t1
```
### APAC离职变动情况
```{r}
t2<-echartr(number2, movement_type,count, type='ring') %>%
setTheme(palette=c(
'#D87A80','#5AB1EF' ))%>%setToolbox(show=FALSE)
t2
```
### EU离职变动情况
```{r}
t3<-echartr(number3, movement_type,count, type='ring') %>%
setTheme(palette=c(
'#D87A80','#5AB1EF' ))%>%setToolbox(show=FALSE)
t3
```
Row {data-height=400}
----------------------------------
### 月变动情况
```{r}
month=global3 %>% group_by(Month,movement_type) %>%
summarise(count=n())
month$Month<-as.character(month$Month)
####创建净流入表并合并
month1<-data.frame(Month=c("2019-01-01","2019-02-01","2019-03-01","2019-04-01","2019-05-01","2019-06-01","2019-07-01","2019-08-01","2019-09-01"),
movement_type=c("netinflow"),
count=c("1","-4","5","2","4","11","5","14","8"))
month1$count<-as.integer(month1$count)
month<-rbind(month,month1)
t4<-echartr(month, Month, count,movement_type, type='line') %>%
setTitle('月变动情况')%>%
setSymbols('emptycircle')%>%
setTheme("macarons")%>%
setToolbox(show=FALSE)
t4
```
### 整体新进离职比例
```{r}
number<-rbind(number1,number2,number3)
t5<-echartr(number,location,count,movement_type,type='hbar',subtype='stack')%>%
setTitle("整体新进离职比例情况")%>%
setTheme("macarons")%>%
setToolbox(show=FALSE)
t5
```
# 新入职员工分析 {data-icon="fa-user-plus"}
Row{data-height=350}
--------------
### 新入职员工国家、月份分布
```{r}
##绘制new hired by country堆积图
#分离年月和日
entrybycountry<-entry1%>%select(c(3,4))
entrybycountry<-entrybycountry%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
unite("yearmonth",year,month,sep='-')
##数据汇总
p1=entrybycountry%>%
group_by(yearmonth,Country) %>%
summarise(count=n())
echartr(p1, yearmonth, count, Country,type='hbar', subtype='stack') %>%
setTitle('新入职员工国家、月份分布')%>%setTheme('macarons')%>%setToolbox(show=FALSE)
```
### 新入职员工隶属单位分布
```{r}
# 绘制new hired by org图
#分离年月和日
entrybyorg<-entry1%>%select(c(6,4))
entrybyorg<-entrybyorg%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
unite("yearmonth",year,month,sep='-')
##数据汇总
p2=entrybyorg%>%
group_by(yearmonth,Org) %>%
summarise(count=n())
#绘制new hired by country堆积图
echartr(p2, yearmonth, count, Org,type='hbar', subtype='stack') %>%
setTitle('新入职员工隶属单位分布')%>%setTheme('macarons')%>%setToolbox(show=FALSE)
```
Row{data-height=400}
-------------
### 各经理员工流动人员分布 {data-width=1600}
```{r}
global4<-rbind(USA_data1,APAC_data1,EU_data1)
exitbymanager <- global4%>%select(c(16,17))
names(exitbymanager)<-c("manager_name","movement_type")
p5=exitbymanager%>%
group_by(manager_name,movement_type)%>%
summarise(count=n())
p5$count[p5$movement_type=='Entry'] <- -p5$count[p5$movement_type=='Entry']
g <- echartr(p5, manager_name, count, movement_type, type='hbar', subtype='stack') %>%
setTitle("各经理员工流动人员分布")%>%
setTheme('macarons')%>%setToolbox(show=FALSE)
g %>% setYAxis(axisLine=list(onZero=TRUE)) %>%
setXAxis(axisLabel=list(
formatter=JS('function (value) {return Math.abs(value);}')
))
```
### 新入职员工工作许可分布
```{r warning=FALSE}
#绘制new hired split by work authorization信息图样环图
entrybyworkauthorization<-entry1%>%select(c(14))
names(entrybyworkauthorization)<-c("workauthorization")
p3=entrybyworkauthorization%>%
group_by(workauthorization) %>%
summarise(count=n())
p3<-p3[order(p3$count, decreasing= T), ]
h1<-echartr(p3,workauthorization,count, type='ring', subtype='info') %>%
setTheme(palette=c(
'#D87A80','#5AB1EF', '#B6A2DE' ),width=800, height=500) %>%
setTitle('', pos=c('center','center', 'horizontal'))%>%setToolbox(show=FALSE)
h1
```
### 新入职员工岗位性质分布
```{r warning=FALSE}
#绘制new hired split by employment信息图样环图
entrybyemployment<-entry1%>%select(c(13))
names(entrybyemployment)<-c("employment_type")
p4=entrybyemployment%>%
group_by(employment_type) %>%
summarise(count=n())
p4<-p4[order(p4$count, decreasing= T), ]
h2<-echartr(p4,employment_type,count, type='ring', subtype='info') %>%
setTheme(palette=c(
'#FFB980','#5AB1EF', '#FFB980', 'limegreen', 'cyan', 'violet'),width=800, height=500)%>%
setTitle('', pos=c('center','center', 'horizontal'))%>%setToolbox(show=FALSE)
h2
```
# 离职员工分析 {data-icon="fa-user-minus"}
Row {data-height=300}
-----------------------------------------------------------------------
### 离职员工国家、月份分布
```{r}
#分离年月和日
exitbycountry<-exit2%>%select(c(4,1))
exitbycountry<-exitbycountry%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
unite("yearmonth",year,month,sep='-')
##数据汇总
a1=exitbycountry%>%
group_by(yearmonth,Country) %>%
summarise(count=n())
##绘制条形图
echartr(a1, yearmonth, count, Country,type='hbar', subtype='stack') %>%
setTitle('离职员工国家、月份分布')%>%
setTheme('macarons')%>%
setToolbox(show=FALSE)
```
### 离职员工隶属单位分布
```{r}
#分离年月和日
exitbyorg<-exit2%>%select(c(7,1))
exitbyorg<-exitbyorg%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
unite("yearmonth",year,month,sep='-')
##数据汇总
a2=exitbyorg%>%
group_by(yearmonth,Org) %>%
summarise(count=n())
##绘制条形图
echartr(a2, yearmonth, count, Org,type='hbar', subtype='stack') %>%
setTitle('离职员工隶属单位分布')%>%
setTheme('macarons')%>%
setToolbox(show=FALSE)
```
### 离职原因与类型分布
```{r}
exitbyreasontype<-exit2%>%select(c(13,14))
a3=exitbyreasontype%>%
group_by(leaving_reason,attri_type)%>%
summarise(count=n())
echartr(a3,leaving_reason, count,facet=attri_type,type='ring') %>%
setTitle('离职原因与类型分布')%>%
setTheme('macarons')%>%
setToolbox(show=FALSE)
```
Column {data-width=350}
-----------------------------------------------------------------------
### 离职员工在职工作时间分布 {data-width=1600}
```{r}
file1<-exit2
colnames(file1)[5]<-'hiremonth'
Dates.exit <- cut(file1$Month, breaks = "month")
Dates.entry <- cut(file1$hiremonth, breaks = "month")
file1 <- data.frame(file1, Dates.entry)
file1 <- data.frame(file1, Dates.exit)
time<-c(as.Date(file1$Dates.exit)-as.Date(file1$Dates.entry))
time<-data.frame(time)
time<-data.frame(c(1:47),time)
names(time)=c('staff','days')
time$days=as.numeric(time$days)
time$staff=as.character(time$staff)
echartr(time, staff, days, type='column') %>%
setTitle('离职员工工作时间分布')%>%
setTheme('macarons') #%>%
#setToolbox(show=FALSE)
```
### 离职员工工作许可分布
```{r}
#信息图样环图
exitbyworkauthorization<-exit2%>%select(c(16))
names(exitbyworkauthorization)<-c("workauthorization")
a5=exitbyworkauthorization%>%
group_by(workauthorization) %>%
summarise(count=n())
a5<-a5[order(a5$count, decreasing= T), ]
a5[is.na(a5)] <- 'unknown'
a6<-echartr(a5,workauthorization,count, type='ring', subtype='info') %>%
setTheme(palette=c(
'#B6A2DE', '#5AB1EF', '#FFB980', 'limegreen', 'cyan', 'violet'))%>%
setToolbox(show=FALSE)
a6
```
### 离职员工岗位性质分布
```{r}
#信息图样环图
exitbyemtype<-exit2%>%select(c(15))
names(exitbyemtype)<-c("em_type")
a7=exitbyemtype%>%
group_by(em_type) %>%
summarise(count=n())
a7<-a7[order(a7$count, decreasing= T), ]
a8<-echartr(a7,em_type,count, type='ring', subtype='info') %>%
setTheme(palette=c(
'#D87A80','#B6A2DE', '#FFB980', 'limegreen', 'cyan', 'violet'))%>%
setToolbox(show=FALSE)
a8
```
# 整体分析{data-navmenu="分析"}
## Row{data-height=80}
### 公司整体的人员流动(新进/离职)情况怎样?哪些区域表现较好,哪些区域存在问题?
- 公司整体上人员流动呈现净流入趋势,且净流入人员呈现波动增长趋势,原因为人员新进数量波动较大,而离职数量呈现递减趋势。
- 三个地区均有人员流入流出现象,其中欧盟地区(EU)表现较好,美洲地区(America)表现次之,两者均呈现净流入趋势,APAC地区表现较差,呈现净流出趋势。
Row {data-height=400}
----------------------------------
### 月变动情况
```{r}
t4
```
### 整体新进离职比例
```{r}
t5
```
# 人员流动具体分析{data-navmenu="分析"}
## Row{data-height=120}
### 公司的新进人员情况怎样?呈现怎样的特点?
- 公司新进人员时间集中在2019年6月份和8月份.
- 新进人员最多的单位为Delivery单位,尤其以Delivery单位中由Kelly Paul负责的CelA,由Gibson Max负责的DelB,由Burgess Deirdre负责的DelC中新入职人员最多;其次是隶属于Support单位的Jackson Megan负责的Shared Se。
- 新入职人员中81.72%的员工为全职员工,78.49%的员工为当地公民,3.23%为永久居民;另外18.28%的新入职员是签了劳务合同获得工作许可证进入公司。
## Row{data-height=120}
### 公司的人员离职情况怎样?呈现怎样的特点?
- 公司人员离职员工均为全职员工(full time employee),离职员工数量呈现逐年递减趋势。
离职人员最多的单位与新进人员最多的单位相同,均为Delivery和Support单位,但与新进情况不同的是,在Delivery单位中,离职人数最多的为Gibson Max负责的DelB以及Burgess Deirdre负责的DelC,由Kelly Paul负责的CelA项目,人员稳定性较好。
- 离职员工中自愿离职与非自愿离职的比例为40:7,其中自愿离职的员工多是由于工作机会与补偿原因不满意,非自愿离职员工中,超半数的人是因为工作项目结束而离职。
- 通过离职员工的在职时间分布可看出:大多数员工的在职时间为1500天左右。
Row {data-height=235}
----------------------------------
### India员工流动工作室分布
```{r}
dplyr::filter(APAC2,Country=="India")->APAC2India
Indiastudio <- APAC2India%>%select(c(3,11))
colnames(Indiastudio)[2]<-'Movement_Type'
a11=Indiastudio %>%
group_by(Studio,Movement_Type)%>%
summarise(count=n())
a11$count[a11$Movement_Type=='Exit'] <- -a11$count[a11$Movement_Type=='Exit']
a12 <- echartr(a11, Studio, count,Movement_Type, type='hbar', subtype='stack') %>%
setTitle("India员工流动工作室分布")%>%
setTheme('macarons')
a12 %>% setYAxis(axisLine=list(onZero=TRUE)) %>%
setXAxis(axisLabel=list(
formatter=JS('function (value) {return Math.abs(value);}')
))
```
### Europe人员流动工作室分布
```{r}
EUstudio <- EU2%>%select(c(3,11))
colnames(EUstudio)[2]<-'Movement_Type'
a13=EUstudio %>%
group_by(Studio,Movement_Type)%>%
summarise(count=n())
a13$count[a13$Movement_Type=='Exit'] <- -a13$count[a11$Movement_Type=='Exit']
a14 <- echartr(a13, Studio, count,Movement_Type, type='hbar', subtype='stack') %>%
setTitle("Europe员工流动工作室分布")%>%
setTheme('macarons')
a14 %>% setYAxis(axisLine=list(onZero=TRUE)) %>%
setXAxis(axisLabel=list(
formatter=JS('function (value) {return Math.abs(value);}')
))
```
# 问题、趋势发现以及建议{data-navmenu="分析"}
Row {data-height=120}
---------
### 人员数据反映出公司的人员新进和离职流动有无需要改进之处?
- 公司应加强员工福利待遇,并改善工作体系,为优秀员工预留晋升空间,以减少优秀人员流出。
- 公司可开展优秀工作室表彰、优秀经理表彰工作以及通告批评会,对表现突出的工作室及经理,如Baia Mare工作室,负责CelA项目的Kelly Paul经理,通过工作绩效表彰来增强员工的归属感、认同感,鼓励优秀员工,激发员工干劲及潜力;但对于工作懈怠者、纪律违反者也应加强通报警告,让全体员工引以为戒,整顿公司风气。
- 开展经验交流会,公司各子公司之间交流管理经验以及项目攻克经验,促进子公司之间的交流,带动公司整体向上发展。
Row {data-height=270}
---------
### 现有数据集还能揭示公司人员流动的哪些新问题、新趋势,值得公司领导重视?
- America地区:进一步观察发现,America区域的canada,Brazil,Argentina这三个国家没有人员流出,但相应的,其新进人数也是最少,可推测当地公司人员数量较为精简,公司待遇较好,整体凝聚力强,公司领导可关注公司在该地区的发展状况,合理改进公司资源倾斜情况。
- EU地区:Romania的新进以及离职人数均为最多,人员流动性强,稳定性较弱,但整体呈现净流入趋势。从员工的离职原因中可看出Romania地区人员为追求更好地晋升机会以及补偿待遇而自愿离职。
在EU地区所有的工作室(Studio)中,Baia Mare,Bucuresti,Iasi,Remote,Timisoara仅有新进人员,推测原因可能是工作室待遇较好或者工作室因人员稀缺而扩招;其余工作室中仅有Cluj-Napoca工作室没有新进职员,推测可能是由于员工已饱和,或者工作室待遇未能达到寻职者的要求;公司领导可在进一步考察原因后做出在当地区域的战略调整。
- APAC地区:Australia的新进职员均为contractor(合同)类型,该类型可保证人员流动在一定时间段的稳定性;India的离职员工全部隶属Mysore工作室,当地领导可靠查当地区其他类似公司职员的福利待遇,根据自身工作室的情况合理进行福利改善。
- 公司整体:从员工的新进以及离职情况可看出,全职员工(full time employee)是造成公司人员变动的主力,这类员工由于有足够的工作变动自由,会为了自身发展以及待遇而选择辞职,但这类员工也是公司的主体员工,公司领导应注意倾听他们的工作体验,降低这类员工的离职率,从而改进公司的人员流动情况。
生成的dashboard(html文件)下载
链接如下:
一些说明
-
在数据可视化中我们使用了百度的Echart进行绘图。
-
我们的dashboard由三人完成,所以在代码上存在冗余,请见谅。
-
大家如有问题和建议可以在评论区指出。