Equipe = Alisson Otávio e Eleonília Monteiro

estimativas_raw = read_projectdata()

O que são os dados

glimpse(estimativas_raw)
## Rows: 12,299
## Columns: 17
## $ TaskNumber           <chr> "1735", "1742", "1971", "2134", "2251", "2283", "~
## $ Summary              <chr> "Flag RI on SCM Message Summary screen using meta~
## $ Priority             <dbl> 1, 1, 2, 5, 10, 1, 5, 5, 6, 5, 2, 1, 3, 1, 1, 8, ~
## $ RaisedByID           <chr> "58", "58", "7", "50", "46", "13", "13", "13", "1~
## $ AssignedToID         <chr> "58", "42", "58", "42", "13", "13", "13", "58", "~
## $ AuthorisedByID       <chr> "6", "6", "6", "6", "6", "58", "6", "6", "6", "58~
## $ StatusCode           <chr> "FINISHED", "FINISHED", "FINISHED", "FINISHED", "~
## $ ProjectCode          <chr> "PC2", "PC2", "PC2", "PC2", "PC2", "PC9", "PC2", ~
## $ ProjectBreakdownCode <chr> "PBC42", "PBC21", "PBC75", "PBC42", "PBC21", "PBC~
## $ Category             <chr> "Development", "Development", "Operational", "Dev~
## $ SubCategory          <chr> "Enhancement", "Enhancement", "In House Support",~
## $ HoursEstimate        <dbl> 14.00, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7.00, ~
## $ HoursActual          <dbl> 1.75, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7.00, 1~
## $ DeveloperID          <chr> "58", "42", "58", "42", "13", "13", "43", "58", "~
## $ DeveloperHoursActual <dbl> 1.75, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7.00, 1~
## $ TaskPerformance      <dbl> 12.25, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ~
## $ DeveloperPerformance <dbl> 12.25, 0.00, 0.00, 0.00, 0.00, 0.00, NA, 0.00, 0.~

Entendendo os dados

estimativas_raw %>% 
    select(ProjectCode, TaskNumber, HoursEstimate, HoursActual) %>% 
    skimr::skim()
Data summary
Name Piped data
Number of rows 12299
Number of columns 4
_______________________
Column type frequency:
character 2
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
ProjectCode 0 1 3 4 0 20 0
TaskNumber 0 1 4 5 0 10266 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
HoursEstimate 0 1 10.15 28.84 0.01 1 3 7.0 910.00 ▇▁▁▁▁
HoursActual 0 1 13.18 68.72 0.01 1 3 8.5 2490.16 ▇▁▁▁▁

Temos 20 projetos, com 12299 estimativas_raw. Não há apenas uma estimativa por tarefa, já que há apenas 10266 valores distintos de TaskNumber.

estimativas_raw %>% 
    group_by(TaskNumber) %>% 
    mutate(estimativas = n()) %>% 
    filter(estimativas > 1) %>% 
    count(TaskNumber, sort = T)
## # A tibble: 1,384 x 2
## # Groups:   TaskNumber [1,384]
##    TaskNumber     n
##    <chr>      <int>
##  1 10605          8
##  2 6889           8
##  3 10089          7
##  4 10974          7
##  5 11056          7
##  6 11270          7
##  7 13124          7
##  8 13190          7
##  9 13253          7
## 10 3812           7
## # ... with 1,374 more rows

1 estimativa por task

Para nossa análise, usaremos uma estimativa por task. Caso haja mais de uma usaremos a média das estimativas_raw:

estimativas = estimativas_raw %>%
    group_by(ProjectCode, TaskNumber, Category, Priority, Summary) %>%
    summarise(
        HoursEstimate = mean(HoursEstimate),
        HoursActual = mean(HoursActual),
        DeveloperPerformance = mean(DeveloperPerformance)
    ) %>%
    ungroup()
## `summarise()` has grouped output by 'ProjectCode', 'TaskNumber', 'Category', 'Priority'. You can override using the `.groups` argument.

Dados por time

por_time = estimativas_raw %>% 
    group_by(ProjectCode) %>% 
    summarise(devs = NROW(unique(DeveloperID)), 
              erro_medio_abs = mean(abs(HoursEstimate - HoursActual)), 
              estimativas = n(),
              media_erro = mean(erro_medio_abs))

Qual a relação entre as estimativas e horas reais tomadas na empresa como um todo e em diferentes categorias de tarefa?

Para responder essa perguntas vamos utilizar os dados de horas reais e estimadas para indentificar a correlação entre as duas variáveis.

Relação entre horas estimas e reais das tarefas como um todo

estimativas_raw %>% 
    ggplot(aes(x = HoursActual, y = HoursEstimate)) + 
    geom_point(alpha = 0.2, size = 3, color = "steelblue")+
    labs(
        title = "Gráfico 1 - Relação entre as horas estimadas e reais das tarefas como um todo", 
        x = "Horas Reais", 
        y = "Horas Estimadas")+
    theme(plot.title = element_text(size = 12))

Analizando o gráfico 1, mostra uma concentração maior nas primeiras faixas de valores com alguns outliers (pontos extremos) acimad 2000 horas em horas reais e acima das 500 horas em horas estimadas. Devido a dispersão ser muito fraca, não é possível ver uma forte correlação entre as variáveis, por esta rezão, decidimos analisar o gráfico em escala logarítmica nos dois eixos (x,y) a fim de identificar uma melhor correlação. Abaixo o gráfico 2, mostra a relação entre as horas estimadas e reais na escala logarítmica:

estimativas_raw %>% 
    ggplot(aes(x = HoursActual, y = HoursEstimate)) + 
    geom_point(alpha = 0.2, size = 3, color = "steelblue")+
    scale_x_log10()+
    scale_y_log10()+
    geom_abline()+
    labs(
        title = " Gráfico 2 - Relação entre as horas estimadas e reais como um todo", 
        x = "Horas Reais em escala de log10", 
        y = "Horas Estimadas em escala de log10")

    #theme(plot.title = element_text(hjust = 0.5))

No gráfico 2 os resultados apresentados nos mostra uma correlação que tende a ser linear (como foi aplicada uma transformação logarítmica nos eixos x e y não podemos confirmar a linearidade) com forte concentração, o que supostamente mostra uma correlação forte entre as variáveis. Além disso existem pontos extremos mais afastados da massa de concetração e, para analisarmos melhor a relação entre os dados, vamos aplicar os coeficientes de correlação de Person, Spearman e Kendal buscando confirmar a correlação entre as variáveis.

estimativas_raw %>%
    summarise(
        pearson =  cor(x = HoursEstimate, y = HoursActual, method = "pearson"),
        pearson_log10 = cor(x = log10(HoursEstimate), y = log10(HoursActual), method = "pearson"), 
        spearman = cor(x = HoursEstimate, y = HoursActual, method = "spearman"), 
        kendall = cor(x = HoursEstimate, y = HoursActual, method = "kendall"))
## # A tibble: 1 x 4
##   pearson pearson_log10 spearman kendall
##     <dbl>         <dbl>    <dbl>   <dbl>
## 1   0.261         0.788    0.783   0.642

A tabela apresenta os valores para os coeficientes de Pearson, Spearman e Kendall. O coeficiente de Perason é mais utilizado quando há uma normalidade dos dados, isto é, quando há uma relação linar e, para identicar essa correlação, utilizamos as variáveis em escala de log na base 10 nos eixos x e y onde tivemos uma correção forte e positiva de 0.78 (considerando que a correlação é considerada forte em intervalos de 0.7 a 0.9). Entretanto, o coefiente de Pearson sem transformação logarítmica se mostra desprezível com 0.26 por se encontrar no intervalo de 0 a 0.3, quando isto ocorre podemos analisar os coefientes de Spearman e Kendall que funcionam bem em valores não lineares e com valores extremos. O coeficiente de Spearman teve uma correlação forte e positiva mostrando um valor de 0.78, já Kendall mostrou um coeficiente de 0.64 o que é considerado uma correlação moderada positiva. Sendo assim, podemos dizer que há uma correlação fortemente positiva entre as Horas estimadas e reais, isso significa que na maioria das vezes em que foi estimada uma determinada hora para a realização da tarefa, de fato o tempo real de execução da tarefa foi próxima da estimada.

Relação entre horas estimas e reais das tarefas por categoria

estimativas_raw %>% 
    ggplot(aes(x = HoursActual, y = HoursEstimate, color = Category)) + 
    facet_wrap(~ Category, ncol = 1)+
    geom_point(alpha = 0.2, size = 2)+
    labs(
        title = "Gráfico 3 - Relação entre as horas estimadas e reais por categoria", 
        x = "Horas Reais", 
        y = "Horas Estimadas")+
    theme(plot.title = element_text(size = 12))

Assim como na relação como um todo, a realação por categoria mostrado no gráfico 3 mostra uma grande concentração de valores, porém não conseguimos identificar o tipo de correlação dos dados, além disso, a distribuição pela categoria de Desenvolvimento possui uma cauda à direita e mais pontos extremos ao observarmos as horas estimadas e um ponto extremo em horas reais. Já os dados para as equipes de Gestão e Operacional possuem comportamento semelhante sendo que o Operacional possui o ponto que mais foge do padrão. A fim de identificar melhor o formato de correlação, vamos mais uma vez utilizar a escala logarítmica (vide gráfico 4).

estimativas_raw %>% 
    ggplot(aes(x = HoursActual, y = HoursEstimate, color = Category)) + 
    facet_wrap(~ Category, ncol = 1)+
    geom_point(alpha = 0.2, size = 2)+
    scale_x_log10()+
    scale_y_log10()+
    labs(
        title = "Gráfico 4 - Relação entre as horas estimadas e reais por categoria", 
        x = "Horas Reais em escala de log10", 
        y = "Horas Estimadas em escala de log10")+
    theme(plot.title = element_text(size = 12))

Como esperado, a transformação para a escala em log na base 10 mostra os dados tendem a ter uma correlação, isto porque o formato linear e concentrado dos dados nos permite supor que existe uma forte correlação entre as horas estimadas e reais. Ademais, podemos notar que a equipe de desenvolvimento, de fato, possui maior centração dos dados, dando a entender que as horas estimadas para cada tarefa realmente ocorre. Para confirmar essa sposição, aplicamos os coeficientes de correlação mostrados na tabela a seguir:

estimativas_raw %>%
    group_by(Category) %>% 
    summarise(
        pearson =  cor(x = HoursEstimate, y = HoursActual, method = "pearson"),
        pearson_log10 = cor(x = log10(HoursEstimate), y = log10(HoursActual), method = "pearson"), 
        spearman = cor(x = HoursEstimate, y = HoursActual, method = "spearman"), 
        kendall = cor(x = HoursEstimate, y = HoursActual, method = "kendall"))
## # A tibble: 3 x 5
##   Category    pearson pearson_log10 spearman kendall
##   <chr>         <dbl>         <dbl>    <dbl>   <dbl>
## 1 Development   0.344         0.811    0.805   0.663
## 2 Management    0.536         0.667    0.635   0.503
## 3 Operational   0.124         0.798    0.832   0.713

Como ocorreu na relação como um todo, é nítido que os dados possuem forte correlação positiva para as equipes de Desenvolvimento e Operacional. Já a equipe de Gestão curiosamete apresentou uma correlação moderada positiva tanto para o coeficiente de Person sem tranformação logarítmica quanto para o Pearson transformado e os demais coeficientes. Sendo assim, é possível afirmar que há uma tendência de que as equipes estimem horas para execução das tarefas e, de fato, se aproximam da hora real.

Equipes com mais desenvolvedores produzem estimativas com mais ou menos erro que equipes menores?

Para responder esta pergunda vamos considerar 2 grupos: abaixo de 8 dvs iremos considerar como sendo uma equipes menores e grupos acima de 8, equipes maiores.

por_time %>% 
    ggplot(aes(x = devs, y = erro_medio_abs)) +
    geom_point(colour = "coral") +
    
    labs(x = "Número de desenvolvedores", 
         y = "Erro médio", 
         title = "Gráfico 5 - Relação entre o número de desenvolvedores e erro médio das estimativas")+
    theme(plot.title = element_text(size = 9))

De antemão, somente analisando o gráfico 5 é díficil enxergar uma correlação entre os variáveis, é nítido que não há concentração de valores em nunhum ponto e que existem dois pontos extremante distantes dos demais. Portanto, em busca de melhor entendimento da relação entre os dados e por mostrar resultados mais acertivos, fizemos uso ds coefientes de correlação: Pearson, Spearman e Kendall.

por_time %>% 
    summarise(
        pearson = cor(x = devs, y = erro_medio_abs, method = "pearson"), 
        spearman = cor(x = devs, y = erro_medio_abs, method = "spearman"), 
        kendall = cor(x = devs, y = erro_medio_abs, method = "kendall"))
## # A tibble: 1 x 3
##   pearson spearman kendall
##     <dbl>    <dbl>   <dbl>
## 1  -0.137   0.0438  0.0324

Após realizarmos a aplicação dos coeficientes de correlação, notamos que tanto para Spearman quanto para Kendall os valores foram muito próximos de zero, o que mostra uma correlação desprezível. Já para Pearson, o valor também está muito próximo de zero negativamente, mostrando que a correlação para coefiente de Pearson também é desprezível. Desta forma, havendo divergencias entre os resultados, é incerto afirmar que há correlação entre as varáveis, ou seja, não podemos concluir que o número de desenvolvedores influenciam no erro médio da estimativa.