Skip to content

If you could collect data on task efficiency, why not? In this report, I am creating a method to predict task-related problems and address them before they become larger.

The long term benefits of implementing a system like this for a consulting firm:

  1. Improved client expectation managment
  2. Revenue hours optimization
  3. Improved profitability

Here is a simple way to do so!

To explain the use of the schematic, below is randomly generated data assuming 1) a decreasing improvement rate as employee tenure increases and 2) normally distributed minutes consumed per task.

library(readr)
library(dplyr)
library(ggplot2)

library(tidyverse)
library(lubridate)

# Generate a sequence of months
months <- seq(ymd("2023-01-01"), ymd("2023-12-31"), by = "month")

# Updated function to include Task_Type
simulate_hours <- function(staff_level, start_mean, improvement_rate, months) {
  hours <- start_mean * (1 - improvement_rate)^(seq_along(months) - 1)
  task_types <- c("Design", "Development", "Testing")
  
  data_frame(
    date = months,
    level = staff_level,
    taskType = rep(task_types, length.out = length(months)),
    consumedMinutes = round(hours, 2)
  )
}

# Generate data for each staff level with Task_Type
data_juniors <- simulate_hours("Junior", 90, 0.07, months)
data_mid_level <- simulate_hours("Mid-level", 60, 0.03, months)
data_seniors <- simulate_hours("Senior", 30, 0.01, months)

# Combine into one data frame
data <- bind_rows(data_juniors, data_mid_level, data_seniors)
data %>%
	arrange(date)

p <- ggplot(data, aes(x=date, y=consumedMinutes, color=level)) +
	geom_point() +
	facet_wrap(~ taskType) +
    ggtitle('Minutes consumed per task per level')

p # Display the plot

Above chart is useful to determine changes in efficiency across task types and staff levels. Good for high level overview of performance.

library(ggplot2)
library(dplyr)

task_comparison <- function(type) {
  type_data <- data %>% filter(taskType == type)
  general_plot <- ggplot(type_data, aes(x=date, y=consumedMinutes, color=level), alpha=0.4) +
    geom_point() +
    facet_wrap(~ level) +
	ggtitle('Minutes consumed per level for x task')
  
  print(general_plot)
}

task_comparison(type='Design')

Above plot is useful for reviewing the performance of different staff levels over time for a specified task. Combined with mean and variance data, it could be used to connect high performers with low performers or discover troublesome tasks.

data %>% filter(level=='Junior', taskType=='Design')
junior_mean <- mean(data$consumedMinutes)
paste('junior mean: ', junior_mean)

Means would be useful to predict consumption for specific tasks depending on variability of respective consumption data. If there is high variability in consumed time per task, find root cause and solve. Then with low variability data make predictions. Once our varaibility in collected data is not improving or deteriorating we can assume a minimum range and begin making predictions.

Projects would have to be broken into task types, then task types can be estimated based on their risk (variability) + most likely amount of minutes spent.

The next question is ....

How much money do we need to make?

With reliable time consumption distributions, job quotes can be priced with more accuracy and provide the client and service provider with more earnings and more savings, respectively.

How do we predict project efficiency?

The hours needed for a project (a collection of tasks) would be sum of the probable hours consumed by staff member for each task they are executing in the project.

For best estimates, our price calculations would include variability per task per employee:

Where:

  • n is the number of tasks
  • H_i is the estimated (probable) hours for task i
  • Sigma_i is the standard deviation of the hours for task i
  • k is the offset factor for the standard deviation
  • R is the average hourly rate for employees involved in the task