Lead Time - Média Móvel

Gerando um Diagrama com a Média Móvel do Lead Time, a partir de uma Lista de Tarefas, como forma de obter a tendência da medição
Rstats
Author
Published

June 29, 2026

O Lead Time fornece a percepção do cliente do tempo de resposta da equipe do projeto. Por este motivo é uma medida importante de acompanhar.

Em projetos controlados por Lista de atividades, como descrito neste neste post, o Lead Time deve ser considerado a partir do momento de início da execução da atividade.

A função abaixo calcula a média móvel do Lead Time e gera um gráfico com a tendência da evolução da mesma.

# get_cfd_tasks - A partir de uma lista de tarefas,
#                 a função conta o número de tarefas
#                 iniciadas e encerradas por dia.
# Parâmetros:
#   ldf_raw - lista de atividades contendo ao menos as colunas:
#     status: Aberto, Em Execução, Bloqueado, Encerrado
#     iniciado: POSIXct - data de início
#     encerrado: POSIXct - data de encerramento
#   time_window - inteiro representando os dias da 
#                 janela de tempo a ser considerada
#                 para obter a lista de tarefas do CFD.
get_cfd_tasks <- function(ldf_raw, time_window = NULL) {
  # Todas as datas ajustadas para data sem hora:
  ldf_raw <-
    ldf_raw |>
    dplyr::mutate(dplyr::across(dplyr::where(lubridate::is.POSIXct), as.Date))

  # Precisamos da lista de atividades iniciadas e encerradas.
  # Estamos excluindo as atividades planejadas não iniciadas.
  cfd_tasks <-
    ldf_raw |>
    dplyr::filter(status %in% c("Encerrado", "Em Execução"))

  # Precisamos de uma sequência de datas
  # da atividade iniciada mais antiga
  # até a atividade iniciada mais recente:
  date_seq = seq.Date(
    from = min(cfd_tasks$inicio),
    to = max(c(
      max(cfd_tasks$inicio, na.rm = TRUE),
      max(cfd_tasks$encerramento, na.rm = TRUE)
    )),
    by = "day"
  )

  # Vamos montar duas sequencias: iniciadas e encerradas.
  ## Atividades iniciadas:
  tsk_started <-
    cfd_tasks |>
    dplyr::count(inicio) |>
    dplyr::arrange(inicio) |>
    tidyr::complete(inicio = date_seq, fill = list(n = 0)) |>
    dplyr::mutate(cum_n = cumsum(n)) |>
    dplyr::mutate(status = "Iniciado") |>
    dplyr::rename(dt_status = inicio)

  ## Atividades terminadas:
  tsk_finished <-
    cfd_tasks |>
    dplyr::filter(status %in% c("Encerrado")) |>
    dplyr::count(encerramento) |>
    dplyr::arrange(encerramento) |>
    tidyr::complete(encerramento = date_seq, fill = list(n = 0)) |>
    dplyr::mutate(cum_n = cumsum(n)) |>
    dplyr::mutate(status = "Encerrado") |>
    dplyr::rename(dt_status = encerramento)

  ## Vamos juntar as duas sequências em um grupo único
  cfd_tsk_count <-
    dplyr::bind_rows(tsk_started, tsk_finished) |>
    dplyr::select(-n)

  # Ajusta para um intervalo:
  end_date <- max(cfd_tsk_count$dt_status)
  start_date <- min(cfd_tsk_count$dt_status, na.rm = TRUE)
  if (!is.null(time_window)) {
    start_date <- max(start_date, end_date - time_window)
  }
  cfd_tsk_count <-
    cfd_tsk_count |>
    filter(
      dt_status %within%
        lubridate::interval(start = start_date, end = end_date)
    )
}

Para gerar um diagrama de fluxo acumulado podemos utilizar a função abaixo:

# plot_cfd - A partir de uma lista de número de tarefas 
#            iniciadas e encerradas por dia, 
#            gerar um CFD
# Parâmetros:
#    tsk_count - tibble com as colunas:
#       dt_status: as.Date
#       cum_n: número de tarefas iniciadas / encerradas (acumulado)
#       status: Iniciado, Encerrado
plot_cfd <- function(tasks) {
  p <-
    tasks |>
    ggplot2::ggplot(aes(dt_status, cum_n, group = status, fill = status)) +
    ggplot2::geom_col(alpha = 0.8, position = "identity") +
    ggplot2::scale_fill_manual(
      values = c(
        "Outro" = "#C85D3D",
        #"Infraestrutura" = "#0F4C5C",
        "Encerrado" = "#5D7A8C",
        "Iniciado" = "#98B89A"
        #, "final" = "#FFE6A7"
      )
    ) +
    labs(
      title = "*Cumulative Flow Diagram* - 
        Tarefas <span style='font-size:11pt'> 
        <span style='color:#98B89A;'>Iniciadas</span> e
        <span style='color:#5D7A8C;'>Encerradas</span>
        </span>",
      x = "Data",
      y = "Tarefas"
    ) +
    theme_minimal() +
    theme(
      plot.title = element_markdown(lineheight = 1.1),
      legend.text = element_markdown(size = 11)
    ) +
    theme(legend.position = 'none')
}

Citation

BibTeX citation:
@misc{abreu2026,
  author = {Abreu, Marcos},
  title = {Lead Time - Média Móvel},
  date = {2026-06-29},
  url = {https://abreums.github.io/posts/2026-06-29-lead-time/},
  langid = {pt-br}
}
For attribution, please cite this work as:
Abreu, Marcos. 2026. Lead Time - Média Móvel. accepted, June 29. https://abreums.github.io/posts/2026-06-29-lead-time/.