Delivery Metrics

# Empty
# Create the tibble
tib.all <-
  finmetrics::get.FilteredTibble(here::here("inst/extdata",
                                            "essence_delivery.csv"),
                                 date_from = Sys.Date() - months(18))

tib.anom <- anomalities(tib.all, action = 'SELECT')
tib.all <- anomalities(tib.all, action = 'REJECT')

tib.all$Priority <- 
  factor(tib.all$Priority, 
                           levels=c("Critical",
                                    "High", 
                                    "Medium", 
                                    "Low", 
                                    "None"), 
                           ordered = TRUE)


tib <- tib.all %>%
  finmetrics::exclude.OpenCases() %>% 
  finmetrics::compute.CycleTime() %>%
  finmetrics::compute.Week()

# Taking a one year subset after calculating cycle time for 18 months.
tib <- tib %>% filter(crdt > Sys.Date() - months(18))

# Collecting only stories, filtering out abnormalities
stories.closed <- tib %>% filter(cldt > crdt) %>% filter(Type == "Story")
# Collecting only Epics, filtering out abnormalities
epics.closed <- tib %>% filter(cldt > crdt) %>% filter(Type == "Epic")

Overview

Distribution of priorities across projects

The Tree Map of the entire dataset provides an excellent solution level overview of the total number of work items (Stories) that flowed in across different projects and priorities.

tib_stories_treemap <- tib.all %>% 
  filter(Type == 'Story') %>%
  group_by(Project, Priority) %>% 
  summarize(Count= n(), .groups = 'drop' )
treemap_d3(tib_treemap = tib_stories_treemap, title = "Distribution of priorities across projects")

Cycle Time

Summary

The below Five-number summary will provide a high level distribution of the cycle times. The 75% Qartile value is significant because that is the number which you can typically see as the turn around time (TAT) to service a work item.

tabulate.TypeAndPriorityBasedCycleTimeStat(tib)

Epics

loess_plot.CycleTimeTrend(epics.closed, col_date="crdt")
 tabulate.PriorityBasedCycleTimeStat(epics.closed)

Stories

loess_plot.CycleTimeTrend(stories.closed, col_date="crdt")
tabulate.PriorityBasedCycleTimeStat(stories.closed)

Throughput

Epics

line_plot.NumClosed_For_FloorDate(
  gen_ds.NumClosed_For_FloorDate(epics.closed)
)

The plot below shows the number of epics closed in every week, marked separately in different color based on priority

bar_plot.NumClosed_For_FloorDate(
  gen_ds.NumClosed_For_FloorDate(epics.closed, priority_based=TRUE),
  data_values = TRUE
)

Stories

Tells us the number of work items (stories) completed aggregated for each week which is an indication of how stable the throughput is.

line_plot.NumClosed_For_FloorDate(
  gen_ds.NumClosed_For_FloorDate(stories.closed), 
  show_trend = TRUE
)

The plot below shows the number of stories closed in every week, marked separately in different color based on priority

bar_plot.NumClosed_For_FloorDate(
  gen_ds.NumClosed_For_FloorDate(stories.closed, priority_based=TRUE),
  data_values = TRUE
)

Gives and indication of the densities especially the occurrence of multiple maxima in the data. This can be due to multiple categories of work items which may be investigated further.

stories.closed %>% violin_plot.CycleTimeVsPriority()

Flow

tib_epics_work_in_progress <- tib.all %>%
  dplyr::filter(Type == 'Epic') %>% finmetrics::compute.WIP()
tib_stories_work_in_progress <- tib.all %>%
  dplyr::filter(Type == 'Story') %>% finmetrics::compute.WIP()

Inflow/OutFlow

Epics
flow.epics.merged <- tib.all %>%
  get.InflowOutflowTibble.Epic(include_priority = TRUE)
 bar_plot.InflowOutflow(flow.epics.merged)
line_plot.InflowOutflow.CumSum(flow.epics.merged)
line_plotly.InflowOutflow.CumSum(flow.epics.merged)
DT::datatable(flow.epics.merged, filter='top')
Stories
flow.stories.merged <- tib.all %>%
  get.InflowOutflowTibble.Story(include_priority = TRUE)
 bar_plot.InflowOutflow(flow.stories.merged, data_values = TRUE)
line_plot.InflowOutflow.CumSum(flow.stories.merged)
line_plotly.InflowOutflow.CumSum(flow.stories.merged)
DT::datatable(flow.stories.merged, filter='top')


rajivgangadharan/mtrxbook-minimal documentation built on Sept. 28, 2024, 5:31 a.m.