## Net Hire Ratio: What It Is and How to Use It

## Introduction

If there is one thing that HR analytics can do, it’s pump out numbers. Lots and lots of numbers. So many, in fact, that it is often impossible for anyone to consistently distinguish the signals from the noise.

One persistent area of concern (and confusion) is employee turnover. While there is broad agreement about what turnover is and how to calculate it (see here and here ), making sense of those turnover numbers is another matter.

The Net Hire Ratio is one underappreciated metric for helping us understand turnover.

When you are done with this tutorial you will:

- Be able calculate Net Hire Ratio (with examples in R)
- Understand what it tells you
- Know how to combine Net Hire Ratio with other organizational data

## What Is Net Hire Ratio?

Net Hire Ratio tells you the number of new hires for every termination in the reporting period.

If the Net Hire Ratio is greater than 1, the workforce grew. If it is less than 1, it shrank.

To calculate it, simply divide the number of new hires by the number of terminations in a given reporting period: # New Hires/ # Terminations

```
# Basic Net Hire Ratio in R
sum(df$NewHire)/sum(df$Term) #where df is your current dataframe of interest.
```

It’s that easy.

If the reporting period is for the month, for example, then you simply divide the number of new hires that month by the number of terminations in the same month.

## Calculating Net Hire Ratio (examples in R)

Let’s start with some basic data. Just copy the code below and then paste into your R script file. Then run it.

```
# Growing workforce
set.seed(42)
Id <- seq(400, 599) # Employee Id Number (just to be realistic)
Month <- rep("Apr", 200)
Area <- rep(c("Retail", "Commercial"), 100)
NewHire <- sample(c(0,1), prob = c(.88, .12), replace = T, 200)
Term = sample(c(0,1), prob = c(.92, .08), replace = T, 200)
g <- data.frame(Id, Month, Area, NewHire, Term) #putting everything together into a single dataframe
#Shrinking workforce
set.seed(42)
Id <- seq(400, 599) # Employee Id Number (just to be realistic)
Month <- rep("Apr", 200)
Area <- rep(c("Retail", "Commercial"), 100)
NewHire <- sample(c(0,1), prob = c(.92, .08), replace = T, 200)
Term = sample(c(0,1), prob = c(.88, .12), replace = T, 200)
s <- data.frame(Id, Month, Area, NewHire, Term) #putting everything together into a single dataframe
```

Taking a quick look at the data structure, we can see it resembles the data structures you see in your own work.

`head(g)`

```
## Id Month Area NewHire Term
## 1 400 Apr Retail 1 0
## 2 401 Apr Commercial 1 0
## 3 402 Apr Retail 0 0
## 4 403 Apr Commercial 0 0
## 5 404 Apr Retail 0 0
## 6 405 Apr Commercial 0 0
```

`head(s)`

```
## Id Month Area NewHire Term
## 1 400 Apr Retail 0 1
## 2 401 Apr Commercial 1 0
## 3 402 Apr Retail 0 0
## 4 403 Apr Commercial 0 0
## 5 404 Apr Retail 0 0
## 6 405 Apr Commercial 0 0
```

Now we’ll calculate the total number of new hires, terminations, and the Net Hire Ratio for the “growth” example dataset first using the “sum” function.

`sum(g$Term) `

`## [1] 20`

`sum(g$NewHire)`

`## [1] 27`

Looking at the term and new hire totals by themselves might not be that informative. Yes, we lost 20 people last month, but so what? Let’s calculate the Net Hire Ratio.

`sum(g$NewHire)/ sum(g$Term) #Net Hire Ratio`

`## [1] 1.35`

Our new hire ratio of 1.35, however, tells us that overall, our workforce is growing (that is, 1.35 new hires for every term). If our goal is workforce growth, we now have one indicator that says we are on the right track.

Carrying out the Net Hire Ratio for the “shrinking” scenario dataset shows the opposite trend, with .67 new hires for every term

`sum(s$NewHire)/ sum(s$Term)`

`## [1] 0.6666667`

## How to Calculate Separate Net Hire Ratios for Different Groups

Knowing the Net Hire Ratio for the entire organization might be useful, but usually we would break things into smaller groups like business areas or demographic groupings of interest. In this example, we’ll calculate Net Hire Ratio separately for business areas.

### The Easy, Clunky Solution with Subsets

There a million ways to do things in R which is both a blessing and a curse. I will first show you a clunky but clear way to do this. Then I will show you a more compact, elegant code.

When you are first learning R, it is helpful to just “get it done” with a transparent logic without worrying about how compact your code is.

The simplest way to do it is to use the “subset”” command where we filter the dataset down to just the business areas of interest and then calculate the Net Hire Ratio for those subsets.

```
com <- subset(g, Area == "Commercial") #filter down to area of interest.
sum(com$NewHire)/sum(com$Term) # Net Hire Ratio using new data
```

`## [1] 0.8571429`

```
ret <- subset(g, Area == "Retail") #filter down to area of interest.
sum(ret$NewHire)/sum(ret$Term) # Net Hire Ratio using new data
```

`## [1] 2.5`

Splitting up our Net Hire Ratio now shows us that the commercial area shrank a bit while the retail area hired 2.5 employees for every term. That’s a meaningful difference that sheds more light on our overall ratio of 1.35.

### The Pretty Solution with ddply

Clunky solutions are great in the beginning, but as you progress you’ll want to find more efficient code.

In our pretty solution, we will create our own Net Hire Ratio function that we can use over and over again.

Then we can use the ddply function from the plyr package and apply that function separately to each dataframe. ddply takes a dataframe, splits it by the variables you specify, and then returns

```
# Run the following without the "#" if you don't already have the plyr package
# install.packages("plyr")
library(plyr)
```

```
# Create our own Net Hire Ratio Function
nhr <- function(x) {
sum(x$NewHire)/sum(x$Term)
}
# Use our function with ddply
ddply(.data = g, .variables = "Area", .fun = nhr)
```

```
## Area V1
## 1 Commercial 0.8571429
## 2 Retail 2.5000000
```

If you only want to run the Net Hire Ratio function once, you can just add your function directly into the ddply call.

`ddply(.data = g, .variables = "Area", .fun = function(x) sum(x$NewHire)/sum(x$Term))`

```
## Area V1
## 1 Commercial 0.8571429
## 2 Retail 2.5000000
```

That’s a lot of information from one line of code.

## Final Thoughts

HR Analytics pays a lot of attention to turnover but often seems to lose sight of the context needed to understand those turnover numbers. The Net Hire Ratio is an extremely simple, incredibly effective measure for putting termination numbers in context. Moreover, we can easily apply this calculation across different areas of interest to see if our outcomes are consistent with out goals.

## Like this post?

### Get our FREE Turnover Mini Course!

You’ll get 5 insight-rich daily lessons delivered right to your inbox.

In this series you’ll discover:

- How to calculate this critical HR metric
- How turnover can actually be a GOOD thing for your organization
- How to develop your own LEADING INDICATORS
- Other insightful workforce metrics to use today

There’s a bunch more too. All free. All digestible. Right to your inbox.

### Yes! Sign Me Up!

**Comments or Questions?**

Add your comments OR just send me an email: john@hranalytics101.com

I would be happy to answer them!

photo credit: <a href=”http://www.flickr.com/photos/54060879@N02/8155586515″>Weighing – MoNovember 4</a> via <a href=”http://photopin.com”>photopin</a> <a href=”https://creativecommons.org/licenses/by/2.0/”>(license)</a>

## Contact Us

- © 2023 HR Analytics 101
- Privacy Policy