O que são os dados

## Rows: 12,299
## Columns: 17
## $ TaskNumber           <chr> "1735", "1742", "1971", "2134", "2251", "22…
## $ Summary              <chr> "Flag RI on SCM Message Summary screen usin…
## $ Priority             <dbl> 1, 1, 2, 5, 10, 1, 5, 5, 6, 5, 2, 1, 3, 1, …
## $ RaisedByID           <chr> "58", "58", "7", "50", "46", "13", "13", "1…
## $ AssignedToID         <chr> "58", "42", "58", "42", "13", "13", "13", "…
## $ AuthorisedByID       <chr> "6", "6", "6", "6", "6", "58", "6", "6", "6…
## $ StatusCode           <chr> "FINISHED", "FINISHED", "FINISHED", "FINISH…
## $ ProjectCode          <chr> "PC2", "PC2", "PC2", "PC2", "PC2", "PC9", "…
## $ ProjectBreakdownCode <chr> "PBC42", "PBC21", "PBC75", "PBC42", "PBC21"…
## $ Category             <chr> "Development", "Development", "Operational"…
## $ SubCategory          <chr> "Enhancement", "Enhancement", "In House Sup…
## $ HoursEstimate        <dbl> 14.00, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, …
## $ HoursActual          <dbl> 1.75, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7…
## $ DeveloperID          <chr> "58", "42", "58", "42", "13", "13", "43", "…
## $ DeveloperHoursActual <dbl> 1.75, 7.00, 0.70, 0.70, 3.50, 7.00, 7.00, 7…
## $ TaskPerformance      <dbl> 12.25, 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.…

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()

Dados por time

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

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

Para responder a perguntar acima, temos que primeiro plotar um gráfico de pontos para assim visualizarmos uma relação entre horas estimadas e horas reais.

estimativas %>% 
    ggplot(mapping  = aes(x = HoursEstimate, y = HoursActual)) +
    geom_point(color = "black", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais") + 
    theme(plot.title = element_text(hjust = 0.5))

Após observar o gráfico acima, não é possível assumir muita coisa. Devido ao fato de que os dados estão estão bem concentrados entre as áreas de 0 e 125, a relação aparentemente não é linear. Para deixar os dados mais visualizáveis, é possível calcular o valor logaritmo de cada variável para assim estender um pouco as escalas.

estimativas %>% 
    ggplot(mapping = aes(x = log(HoursEstimate), y = log(HoursActual))) +
    geom_point(color = "black", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais (log)") + 
    theme(plot.title = element_text(hjust = 0.5))

Levando em conta o gráfico acima, dá para assumir que há uma relação entre as duas variáveis. Apesar do formato do gráfico se aproximar de uma relação linear, não podemos afirmar isso devido ao fato de que as escalas foram modificadas. Para concluirmos mais precisamente as características da relação, nós vamos calcular os seguintes coeficientes de correlação tradicionais:

correlacoesTodo <- estimativas %>% 
    summarise(pearson = cor(HoursEstimate, HoursActual, method = "pearson"),
              kendall = cor(HoursEstimate, HoursActual, method = "kendall"),
              spearman = cor(HoursEstimate, HoursActual, method = "spearman"))
correlacoesTodo
## # A tibble: 1 x 3
##   pearson kendall spearman
##     <dbl>   <dbl>    <dbl>
## 1   0.316   0.696    0.826

Após analisar os resultados acima, vemos que a coeficiente de Pearson deu um valor significativamente distante dos outros coeficientes, isso acontece devido ao fato de que ela não desconsidera outliers e que a relação entre as nossas variáveis não é linear. Por isso, ela não retorna um resultado significativo para a nossa análise. Partindo para os demais coeficientes, vemos que o coeficiente de Kendall é de aproximadamente 0.7, que está entre o intervalo de 0.7 até 0.9, indicando que é uma relação forte. Assim como Kendall, o coeficiente de Spearman tem um valor de 0.83 aproximadamente, indicando também uma relação forte entre Horas Estimadas e Horas Reais. Sendo assim, podemos afirmar que a relação entre as variáveis é forte e positiva, considerando a empresa como um todo.

Nas próximas etapas, iremos dividir em categorias para analisarmos especificamente a relação das Horas Estimadas e Horas Reais em cada categoria.

estimativasManagement <- estimativas %>% 
    filter(Category == "Management")
estimativasManagement %>%
    ggplot(mapping = aes(x = HoursEstimate, y = HoursActual)) +
    geom_point(color = "darkblue", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais (Management)") + 
    theme(plot.title = element_text(hjust = 0.5))

estimativasManagement %>%
    ggplot(mapping = aes(x = log(HoursEstimate), y = log(HoursActual))) +
    geom_point(color = "darkblue", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais",  title = "Relação entre Horas Estimadas e Horas Reais (log, Mangement)") + 
    theme(plot.title = element_text(hjust = 0.5))

correlacoesManagement <- estimativasManagement %>% 
    summarise(pearson = cor(HoursActual, HoursEstimate, method = "pearson"),
              kendall = cor(HoursActual, HoursEstimate, method = "kendall"),
              spearman = cor(HoursActual, HoursEstimate, method = "spearman"))
correlacoesManagement
## # A tibble: 1 x 3
##   pearson kendall spearman
##     <dbl>   <dbl>    <dbl>
## 1   0.456   0.635    0.753

Assim como na análise da empresa como um todo, os dados se concentram na parte inicial, nesse caso no intervalo entre 0 e 50. O gráfico também é similar quando calculamos o logaritmo de cada dado, afirmando uma relação entre as duas variáveis. Partindo para o cálculo dos coeficientes de correlação, vimos acontecer a mesma coisa no coeficiente de Pearson, por isso vamos levar em conta apenas os demais coeficientes. Kendall tem um resultado moderado (0.63), enquanto Spearman tem um resultado forte (0.75), por isso a relação entre as variáveis considerando a categoria de “Mangement” é de moderada para forte.

estimativasDevelopment <- estimativas %>% 
    filter(Category == "Development")
estimativasDevelopment %>%
    ggplot(mapping = aes(x = HoursEstimate, y = HoursActual)) +
    geom_point(color = "darkorange", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais (Development)") + 
    theme(plot.title = element_text(hjust = 0.5))

estimativasDevelopment %>%
    ggplot(mapping = aes(x = log(HoursEstimate), y = log(HoursActual))) +
    geom_point(color = "darkorange", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais (log, Development)") + 
    theme(plot.title = element_text(hjust = 0.5))

correlacoesDevelopment <- estimativasDevelopment %>% 
    summarise(pearson = cor(HoursEstimate, HoursActual, method = "pearson"),
              kendall = cor(HoursEstimate, HoursActual, method = "kendall"),
              spearman = cor(HoursEstimate, HoursActual, method = "spearman"))
correlacoesDevelopment
## # A tibble: 1 x 3
##   pearson kendall spearman
##     <dbl>   <dbl>    <dbl>
## 1   0.377   0.700    0.835

Em relação aos gráficos, o cenário se repete quanto à categoria de “Management”. Já nos resultados obtidos nos coeficientes diferentemente da categoria anterior, obtemos os coeficientes de Kendall e Spearman (0.7 e 0.83) indicando uma relação forte entre as variáveis, quando considerando a categoria “Development”.

estimativasOperational <- estimativas %>% 
    filter(Category == "Operational")
estimativasOperational %>%
    ggplot(mapping = aes(x = HoursEstimate, y = HoursActual)) +
    geom_point(color = "darkgreen", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais (Operational)") + 
    theme(plot.title = element_text(hjust = 0.5))

estimativasOperational %>%
    ggplot(mapping = aes(x = log(HoursEstimate), y = log(HoursActual))) +
    geom_point(color = "darkgreen", alpha = .3) +
    labs(x = "Horas Estimadas", y = "Horas Reais", title = "Relação entre Horas Estimadas e Horas Reais (log, Development)") + 
    theme(plot.title = element_text(hjust = 0.5))

correlacoesOperational <- estimativasOperational %>% 
    summarise(pearson = cor(HoursEstimate, HoursActual, method = "pearson"),
              kendall = cor(HoursEstimate, HoursActual, method = "kendall"),
              spearman = cor(HoursEstimate, HoursActual, method = "spearman"))
correlacoesOperational
## # A tibble: 1 x 3
##   pearson kendall spearman
##     <dbl>   <dbl>    <dbl>
## 1   0.159   0.729    0.842

Em relação a categoria “Operational”, o mesmo cenário se repete. No entanto, em relação aos coeficientes, tanto o de Kendall (0.73) quanto o de Spearman (0.84) obteram um resultado maior, indicanto uma relação mais forte entre Horas Estimadas e Horas Reais.

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

Para respondemos a questão acima, iremos repetir os passos da questão anterior. No entanto, considerando as variáveis de “devs” e “erro_medio_abs”. Desse modo, plotaremos novamente um gráfico de pontos para analisar se há alguma relação entre as variáveis.

por_time %>% 
    ggplot(aes(x = devs, y = erro_medio_abs, size = estimativas, alpha = .8, color = "darkred")) +
    geom_point() +
    labs(x = "Número de Desenvolvedores", y = "Erro Média de Estimativas", title = "Relação entre Número de Desenvolvedores e Erro Médio") + 
    theme(plot.title = element_text(hjust = 0.5))

Levando em conta o gráfico acima, novamente não podemos assumir muita coisa. Apesar de não dar para afirmar se há uma relação ou não entre as variáveis, podemos visualizar que os dados não são lineares. Para obtermos as características da correlação, vamos calcular os mesmos coeficientes da questão anterior.

correlacaoErro <- por_time %>% 
    summarise(pearson = cor(devs, erro_medio_abs, method = "pearson"),
              kendall = cor(devs, erro_medio_abs, method = "kendall"),
              spearman = cor(devs, erro_medio_abs, method = "spearman"))

correlacaoErro
## # A tibble: 1 x 3
##   pearson kendall spearman
##     <dbl>   <dbl>    <dbl>
## 1  -0.137  0.0324   0.0438

Analisando os coeficientes acima, temos um cenário diferente dos analisandos anteriormente. Dessa vez, todos os coeficientes obteram um resultado abaixo de 0.5, indicando uma relação fraca entre as variáveis. Além disso, o coeficiente de Pearson obteve um resultado negativo, sendo que Kendall (0.03) e Spearman (0.04) obtiveram resultados positivos, mesmo que próximos a 0. Por isso, não podemos afirmar que equipes com mais desenvolvedores produzem estimativas com mais ou menos erros do que equipes menores, levando em conta que as variáveis tem uma relação fraca, indicando que as variáveis aparentemente são independentes.